@burdenoff/microfe-brainyrich 2026.828.1 → 2026.830.1
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.
- package/dist/brainyrich/BrainyRichRoot.d.ts.map +1 -1
- package/dist/brainyrich/BrainyRichRoot.js +59 -59
- package/dist/brainyrich/BrainyRichRoot.js.map +1 -1
- package/dist/brainyrich/components/viz.d.ts.map +1 -1
- package/dist/brainyrich/components/viz.js +149 -148
- package/dist/brainyrich/components/viz.js.map +1 -1
- package/dist/brainyrich/hooks/useTr.d.ts +17 -0
- package/dist/brainyrich/hooks/useTr.d.ts.map +1 -0
- package/dist/brainyrich/hooks/useTr.js +14 -0
- package/dist/brainyrich/hooks/useTr.js.map +1 -0
- package/dist/brainyrich/pages/AiAssistantPage.js +192 -192
- package/dist/brainyrich/pages/AiAssistantPage.js.map +1 -1
- package/dist/brainyrich/pages/AnalyticsPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/AnalyticsPage.js +253 -252
- package/dist/brainyrich/pages/AnalyticsPage.js.map +1 -1
- package/dist/brainyrich/pages/DashboardPage.js +115 -115
- package/dist/brainyrich/pages/DashboardPage.js.map +1 -1
- package/dist/brainyrich/pages/FamilyPage.js +59 -59
- package/dist/brainyrich/pages/FamilyPage.js.map +1 -1
- package/dist/brainyrich/pages/GoalsPage.js +285 -285
- package/dist/brainyrich/pages/GoalsPage.js.map +1 -1
- package/dist/brainyrich/pages/InvestmentsPage.js +18 -18
- package/dist/brainyrich/pages/InvestmentsPage.js.map +1 -1
- package/dist/brainyrich/pages/PortfoliosPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/PortfoliosPage.js +477 -471
- package/dist/brainyrich/pages/PortfoliosPage.js.map +1 -1
- package/dist/brainyrich/pages/ReportsPage.js +52 -52
- package/dist/brainyrich/pages/ReportsPage.js.map +1 -1
- package/dist/brainyrich/pages/RiskPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/RiskPage.js +272 -271
- package/dist/brainyrich/pages/RiskPage.js.map +1 -1
- package/dist/brainyrich/pages/TaxPage.d.ts.map +1 -1
- package/dist/brainyrich/pages/TaxPage.js +198 -197
- package/dist/brainyrich/pages/TaxPage.js.map +1 -1
- package/dist/brainyrich/pages/_shared.d.ts.map +1 -1
- package/dist/brainyrich/pages/_shared.js +84 -82
- package/dist/brainyrich/pages/_shared.js.map +1 -1
- package/dist/brainyrich/types/bra.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaxPage.js","names":[],"sources":["../../../src/brainyrich/pages/TaxPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport {\n ArrowDownRight,\n ArrowUpRight,\n Check,\n Coins,\n Landmark,\n MoreHorizontal,\n Receipt,\n ReceiptText,\n Scissors,\n ShieldCheck,\n Sparkles,\n TrendingDown,\n TrendingUp,\n X,\n} from 'lucide-react';\nimport {\n usePagedInsights,\n useAllTransactions,\n useAllAccounts,\n usePortfolios,\n useHoldings,\n useCreateInsight,\n useAcknowledgeInsight,\n useDismissInsight,\n useResolveInsight,\n} from '../hooks/useBrainyRichApi';\nimport {\n LoadMore,\n ConfirmDialog,\n DonutChart,\n MiniAreaChart,\n ProgressRing,\n LifecycleStepper,\n StatTile,\n GlassCard,\n FadeIn,\n type DonutDatum,\n type VizTone,\n} from '../components';\nimport type {\n BraAccount,\n BraAssetClass,\n BraHolding,\n BraInsight,\n BraInsightSeverity,\n} from '../types/bra';\nimport {\n SectionShell,\n AllocationBars,\n EmptyState,\n LoadingState,\n ErrorState,\n formatMoney,\n formatDate,\n statusBadgeVariant,\n deltaToneClass,\n} from './_shared';\n\n// ============================================================================\n// Domain helpers (derived from the SDL, never fabricated data)\n// ============================================================================\n\nconst SEVERITIES: BraInsightSeverity[] = ['INFO', 'LOW', 'MEDIUM', 'HIGH', 'CRITICAL'];\n\n/** Turn an UPPER_SNAKE enum member into a readable label. */\nfunction humanize(value: string): string {\n return value\n .toLowerCase()\n .split('_')\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\n/** Unrealized P/L for a holding = server market value − cost basis. */\nfunction unrealized(h: BraHolding): number {\n return h.marketValue - h.costBasis;\n}\n\n/** Severity → semantic viz tone (color is never the only signal). */\nfunction severityTone(sev: BraInsightSeverity): VizTone {\n switch (sev) {\n case 'CRITICAL':\n return 'error';\n case 'HIGH':\n return 'warning';\n case 'MEDIUM':\n return 'info';\n case 'LOW':\n return 'teal';\n default:\n return 'neutral';\n }\n}\n\n/** A real holding sitting at an unrealized loss — a tax-loss-harvest candidate. */\ninterface HarvestCandidate {\n holding: BraHolding;\n accountId: string;\n accountName: string;\n loss: number; // negative\n}\n\n// ============================================================================\n// Page\n// ============================================================================\n\ninterface InsightFormState {\n title: string;\n detail: string;\n severity: BraInsightSeverity;\n /** Encoded as `${subjectType}:${id}` from the subject picker. */\n subject: string;\n}\n\nconst EMPTY_INSIGHT_FORM: InsightFormState = {\n title: '',\n detail: '',\n severity: 'MEDIUM',\n subject: '',\n};\n\nexport function TaxPage() {\n // Insights are a *Connection — paginate with LoadMore. Tax-opportunity\n // insights are client-filtered (the list query has no `type` argument).\n const {\n items: insights,\n hasMore: insightsHasMore,\n loadMore: loadMoreInsights,\n isLoading: insightsLoading,\n isFetchingNextPage: insightsFetchingMore,\n isError: insightsError,\n refetch: refetchInsights,\n } = usePagedInsights();\n\n // Realized activity + income aggregated over the FULL transaction set\n // (not a truncated first page) via the fetch-all helper.\n const {\n data: transactions,\n isLoading: txLoading,\n isError: txError,\n refetch: refetchTransactions,\n } = useAllTransactions();\n\n // ALL accounts (with holdings) — drives the portfolio-wide unrealized total.\n const { data: accounts, isLoading: accountsLoading } = useAllAccounts();\n const { data: portfolios } = usePortfolios();\n\n const createInsight = useCreateInsight();\n const acknowledgeInsight = useAcknowledgeInsight();\n const dismissInsight = useDismissInsight();\n const resolveInsight = useResolveInsight();\n\n const [createOpen, setCreateOpen] = useState(false);\n const [form, setForm] = useState<InsightFormState>(EMPTY_INSIGHT_FORM);\n const [formError, setFormError] = useState<string | null>(null);\n const [dismissTarget, setDismissTarget] = useState<BraInsight | null>(null);\n\n // ---- Tax-opportunity insights (client-filtered — the list hook has no type arg) ----\n const taxInsights = useMemo(\n () => insights.filter((i) => i.type === 'TAX_OPPORTUNITY'),\n [insights]\n );\n const openTax = useMemo(() => taxInsights.filter((i) => i.status === 'OPEN'), [taxInsights]);\n\n // Open-tax severity mix drives the signal donut (real counts, no fabrication).\n const severityMix = useMemo<DonutDatum[]>(() => {\n const order: BraInsightSeverity[] = ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW', 'INFO'];\n return order\n .map((sev) => ({\n label: humanize(sev),\n value: openTax.filter((i) => i.severity === sev).length,\n tone: severityTone(sev),\n }))\n .filter((d) => d.value > 0);\n }, [openTax]);\n\n // ---- Realized activity partitioned from real transactions ----\n const sells = useMemo(() => transactions.filter((t) => t.type === 'SELL'), [transactions]);\n const income = useMemo(\n () => transactions.filter((t) => t.type === 'DIVIDEND' || t.type === 'INTEREST'),\n [transactions]\n );\n const realizedProceeds = sells.reduce((sum, t) => sum + t.amount, 0);\n const investmentIncome = income.reduce((sum, t) => sum + t.amount, 0);\n const moneyCurrency = sells[0]?.currency ?? income[0]?.currency ?? 'USD';\n\n // Cumulative realized-proceeds series over trade dates (spark + area chart).\n const proceedsSeries = useMemo(() => {\n const sorted = [...sells].sort(\n (a, b) => new Date(a.tradeDate).getTime() - new Date(b.tradeDate).getTime()\n );\n return sorted.reduce<{ x: string; y: number }[]>((acc, t) => {\n const prev = acc.length > 0 ? acc[acc.length - 1].y : 0;\n acc.push({ x: formatDate(t.tradeDate), y: prev + t.amount });\n return acc;\n }, []);\n }, [sells]);\n const proceedsSpark = proceedsSeries.map((p) => p.y);\n\n // ---- Portfolio-wide unrealized P/L across EVERY account's holdings ----\n const totalUnrealizedAll = useMemo(\n () => accounts.reduce((sum, a) => sum + a.holdings.reduce((s, h) => s + unrealized(h), 0), 0),\n [accounts]\n );\n const unrealizedCurrency = accounts[0]?.currency ?? moneyCurrency;\n\n // ---- Tax-loss-harvest candidates: every holding at an unrealized loss ----\n const harvestCandidates = useMemo<HarvestCandidate[]>(\n () =>\n accounts\n .flatMap((a) =>\n a.holdings\n .filter((h) => unrealized(h) < 0)\n .map((h) => ({\n holding: h,\n accountId: a.id,\n accountName: a.name,\n loss: unrealized(h),\n }))\n )\n .sort((a, b) => a.loss - b.loss),\n [accounts]\n );\n const harvestableLoss = harvestCandidates.reduce((sum, c) => sum + c.loss, 0);\n const harvestCurrency = harvestCandidates[0]?.holding.currency ?? unrealizedCurrency;\n\n const canCreate = accounts.length > 0 || portfolios.length > 0;\n\n function openCreate() {\n setForm(EMPTY_INSIGHT_FORM);\n setFormError(null);\n setCreateOpen(true);\n }\n\n /** Flag a rebalance/harvest proposal against the candidate's real account. */\n function startProposal(c: HarvestCandidate) {\n setForm({\n title: `Harvest ${c.holding.symbol} loss`,\n detail: `Tax-loss-harvest candidate: ${c.holding.symbol} is sitting at an unrealized loss of ${formatMoney(\n c.loss,\n c.holding.currency\n )}. Create a rebalance proposal to realize the loss while holding the target allocation.`,\n severity: 'MEDIUM',\n subject: `account:${c.accountId}`,\n });\n setFormError(null);\n setCreateOpen(true);\n }\n\n function submitCreate() {\n const title = form.title.trim();\n if (!title) {\n setFormError('A title is required.');\n return;\n }\n if (!form.subject) {\n setFormError('Select the account or portfolio this opportunity applies to.');\n return;\n }\n const [subjectType, subjectId] = form.subject.split(':');\n if (!subjectType || !subjectId) {\n setFormError('Select a valid subject.');\n return;\n }\n createInsight.mutate(\n {\n type: 'TAX_OPPORTUNITY',\n severity: form.severity,\n title,\n detail: form.detail.trim() || null,\n subjectId,\n subjectType,\n },\n {\n onSuccess: () => {\n setCreateOpen(false);\n setForm(EMPTY_INSIGHT_FORM);\n },\n onError: (err: unknown) => {\n setFormError(err instanceof Error ? err.message : 'Could not create the tax insight.');\n },\n }\n );\n }\n\n const insightPending =\n acknowledgeInsight.isPending || dismissInsight.isPending || resolveInsight.isPending;\n\n return (\n <SectionShell\n title=\"Tax Center\"\n description=\"Act on tax-opportunity insights and review unrealized and realized gains — all from your live portfolio data.\"\n badges={[`${openTax.length} open opportunit${openTax.length === 1 ? 'y' : 'ies'}`]}\n actionLabel=\"New tax insight\"\n onAction={openCreate}\n >\n {/* ---------------- Premium KPI band ---------------- */}\n <FadeIn>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5\">\n <StatTile\n label=\"Open opportunities\"\n value={String(openTax.length)}\n icon={<Sparkles className=\"size-4\" aria-hidden=\"true\" />}\n glow\n />\n <StatTile\n label=\"Realized proceeds\"\n value={formatMoney(realizedProceeds, moneyCurrency)}\n icon={<Landmark className=\"size-4\" aria-hidden=\"true\" />}\n spark={proceedsSpark.length > 1 ? proceedsSpark : undefined}\n sparkTone=\"brand\"\n />\n <StatTile\n label=\"Investment income\"\n value={formatMoney(investmentIncome, moneyCurrency)}\n icon={<Coins className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label=\"Harvestable loss\"\n value={accountsLoading ? '—' : formatMoney(harvestableLoss, harvestCurrency)}\n icon={<Scissors className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label=\"Unrealized P/L\"\n value={accountsLoading ? '—' : formatMoney(totalUnrealizedAll, unrealizedCurrency)}\n deltaTone={totalUnrealizedAll >= 0 ? 'positive' : 'negative'}\n icon={\n totalUnrealizedAll >= 0 ? (\n <TrendingUp className=\"size-4\" aria-hidden=\"true\" />\n ) : (\n <TrendingDown className=\"size-4\" aria-hidden=\"true\" />\n )\n }\n />\n </div>\n </FadeIn>\n\n <Tabs defaultValue=\"opportunities\" className=\"space-y-4\">\n <TabsList className=\"grid w-full grid-cols-2 sm:grid-cols-4\">\n <TabsTrigger value=\"opportunities\">Opportunities</TabsTrigger>\n <TabsTrigger value=\"harvest\">Harvest</TabsTrigger>\n <TabsTrigger value=\"unrealized\">Unrealized</TabsTrigger>\n <TabsTrigger value=\"realized\">Realized</TabsTrigger>\n </TabsList>\n\n {/* ---------------- Tax opportunities ---------------- */}\n <TabsContent value=\"opportunities\">\n <div className=\"grid gap-4 lg:grid-cols-3\">\n <Card className=\"lg:col-span-2\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Sparkles className=\"h-5 w-5\" aria-hidden=\"true\" />\n Tax-opportunity insights\n </CardTitle>\n <CardDescription>\n Tax-loss harvesting and other tax signals detected across your accounts and\n portfolios.\n </CardDescription>\n </CardHeader>\n <CardContent>\n {insightsLoading ? (\n <LoadingState />\n ) : insightsError ? (\n <ErrorState onRetry={() => refetchInsights()} />\n ) : taxInsights.length === 0 ? (\n <EmptyState\n icon={<Receipt className=\"size-6\" aria-hidden=\"true\" />}\n title=\"No tax opportunities yet\"\n description=\"Tax-opportunity insights appear here as the backend generates them from your holdings. You can also flag one manually.\"\n action={\n canCreate ? (\n <Button size=\"sm\" onClick={openCreate}>\n <Sparkles className=\"size-4\" aria-hidden=\"true\" />\n New tax insight\n </Button>\n ) : undefined\n }\n />\n ) : (\n <div className=\"space-y-3\">\n {taxInsights.map((insight, i) => (\n <FadeIn key={insight.id} index={i}>\n <TaxInsightRow\n insight={insight}\n actionPending={insightPending}\n onAcknowledge={() => acknowledgeInsight.mutate(insight.id)}\n onResolve={() => resolveInsight.mutate(insight.id)}\n onDismiss={() => setDismissTarget(insight)}\n />\n </FadeIn>\n ))}\n <LoadMore\n hasMore={insightsHasMore}\n onClick={loadMoreInsights}\n loading={insightsFetchingMore}\n label=\"Load more insights\"\n />\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Signal mix + TLH lifecycle */}\n <div className=\"space-y-4\">\n <GlassCard glow>\n <div className=\"space-y-1\">\n <p className=\"text-sm font-semibold text-text-primary\">Open-signal mix</p>\n <p className=\"text-xs text-text-secondary\">\n Live tax opportunities grouped by severity.\n </p>\n </div>\n <div className=\"mt-4\">\n {severityMix.length === 0 ? (\n <p className=\"py-6 text-center text-sm text-text-secondary\">\n No open opportunities.\n </p>\n ) : (\n <DonutChart\n data={severityMix}\n centerValue={String(openTax.length)}\n centerLabel=\"open\"\n valueFormatter={(v) => `${v} signal${v === 1 ? '' : 's'}`}\n />\n )}\n </div>\n </GlassCard>\n\n <GlassCard>\n <p className=\"text-sm font-semibold text-text-primary\">Harvesting workflow</p>\n <p className=\"mb-4 mt-1 text-xs text-text-secondary\">\n How a loss becomes a realized tax benefit.\n </p>\n <LifecycleStepper\n steps={['Detect', 'Review', 'Proposal', 'Execute']}\n current=\"Review\"\n />\n </GlassCard>\n </div>\n </div>\n </TabsContent>\n\n {/* ---------------- Harvest candidates ---------------- */}\n <TabsContent value=\"harvest\">\n <HarvestCandidatesTab\n candidates={harvestCandidates}\n harvestableLoss={harvestableLoss}\n currency={harvestCurrency}\n loading={accountsLoading}\n canCreate={canCreate}\n onCreateProposal={startProposal}\n />\n </TabsContent>\n\n {/* ---------------- Unrealized gains ---------------- */}\n <TabsContent value=\"unrealized\">\n <UnrealizedGainsTab accounts={accounts} />\n </TabsContent>\n\n {/* ---------------- Realized activity ---------------- */}\n <TabsContent value=\"realized\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <ReceiptText className=\"h-5 w-5\" aria-hidden=\"true\" />\n Realized activity\n </CardTitle>\n <CardDescription>\n Realized sales, dividends and interest — the taxable events recorded on your\n accounts.\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n {txLoading ? (\n <LoadingState />\n ) : txError ? (\n <ErrorState onRetry={() => refetchTransactions()} />\n ) : sells.length === 0 && income.length === 0 ? (\n <EmptyState\n icon={<ReceiptText className=\"size-6\" aria-hidden=\"true\" />}\n title=\"No taxable activity recorded\"\n description=\"Sales, dividends and interest show up here once transactions are recorded against your accounts.\"\n />\n ) : (\n <>\n {proceedsSeries.length > 1 ? (\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-4\">\n <p className=\"text-sm font-semibold text-text-primary\">\n Cumulative realized proceeds\n </p>\n <p className=\"mb-3 text-xs text-text-secondary\">\n Running total of sale proceeds over trade dates.\n </p>\n <MiniAreaChart\n data={proceedsSeries}\n tone=\"brand\"\n valueFormatter={(v) => formatMoney(v, moneyCurrency)}\n />\n </div>\n ) : null}\n\n {/* Realized sales */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Landmark className=\"size-4 text-text-secondary\" aria-hidden=\"true\" />\n <h3 className=\"text-sm font-semibold text-text-primary\">Realized sales</h3>\n <Badge variant=\"secondary\">{sells.length}</Badge>\n </div>\n {sells.length === 0 ? (\n <p className=\"text-sm text-text-secondary\">No sales recorded.</p>\n ) : (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Symbol</TableHead>\n <TableHead className=\"text-right\">Quantity</TableHead>\n <TableHead className=\"text-right\">Price</TableHead>\n <TableHead className=\"text-right\">Proceeds</TableHead>\n <TableHead>Trade date</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {sells.map((t) => (\n <TableRow key={t.id}>\n <TableCell className=\"font-medium text-text-primary\">\n {t.symbol ?? '—'}\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {t.quantity}\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {formatMoney(t.price, t.currency)}\n </TableCell>\n <TableCell className=\"text-right font-medium text-text-primary\">\n {formatMoney(t.amount, t.currency)}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(t.tradeDate)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )}\n </div>\n\n {/* Investment income */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Coins className=\"size-4 text-text-secondary\" aria-hidden=\"true\" />\n <h3 className=\"text-sm font-semibold text-text-primary\">\n Dividends & interest\n </h3>\n <Badge variant=\"secondary\">{income.length}</Badge>\n </div>\n {income.length === 0 ? (\n <p className=\"text-sm text-text-secondary\">No income recorded.</p>\n ) : (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Type</TableHead>\n <TableHead>Symbol</TableHead>\n <TableHead className=\"text-right\">Amount</TableHead>\n <TableHead>Trade date</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {income.map((t) => (\n <TableRow key={t.id}>\n <TableCell>\n <Badge variant=\"outline\">{humanize(t.type)}</Badge>\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {t.symbol ?? '—'}\n </TableCell>\n <TableCell className=\"text-right font-medium text-status-success-text\">\n {formatMoney(t.amount, t.currency)}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(t.tradeDate)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )}\n </div>\n </>\n )}\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n\n {/* ---------------- Create tax insight dialog ---------------- */}\n <Dialog\n open={createOpen}\n onOpenChange={(open) => {\n setCreateOpen(open);\n if (!open) setFormError(null);\n }}\n >\n <DialogContent className=\"max-h-[90vh] overflow-y-auto sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle>New tax insight</DialogTitle>\n <DialogDescription>\n Flag a tax opportunity against one of your accounts or portfolios.\n </DialogDescription>\n </DialogHeader>\n\n {!canCreate ? (\n <EmptyState\n title=\"No subject available\"\n description=\"Create an account or portfolio first, then flag a tax opportunity against it.\"\n />\n ) : (\n <div className=\"space-y-4 py-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"tax-title\">Title</Label>\n <Input\n id=\"tax-title\"\n value={form.title}\n onChange={(e) => setForm((f) => ({ ...f, title: e.target.value }))}\n placeholder=\"e.g. Harvest losses in tech holdings\"\n />\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"tax-severity\">Severity</Label>\n <Select\n value={form.severity}\n onValueChange={(v) =>\n setForm((f) => ({ ...f, severity: v as BraInsightSeverity }))\n }\n >\n <SelectTrigger id=\"tax-severity\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {SEVERITIES.map((s) => (\n <SelectItem key={s} value={s}>\n {humanize(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"tax-subject\">Applies to</Label>\n <Select\n value={form.subject}\n onValueChange={(v) => setForm((f) => ({ ...f, subject: v }))}\n >\n <SelectTrigger id=\"tax-subject\">\n <SelectValue placeholder=\"Select subject\" />\n </SelectTrigger>\n <SelectContent>\n {portfolios.map((p) => (\n <SelectItem key={`portfolio:${p.id}`} value={`portfolio:${p.id}`}>\n Portfolio · {p.name}\n </SelectItem>\n ))}\n {accounts.map((a) => (\n <SelectItem key={`account:${a.id}`} value={`account:${a.id}`}>\n Account · {a.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"tax-detail\">Detail</Label>\n <Textarea\n id=\"tax-detail\"\n value={form.detail}\n onChange={(e) => setForm((f) => ({ ...f, detail: e.target.value }))}\n rows={3}\n placeholder=\"What is the opportunity and how should it be actioned?\"\n />\n </div>\n\n {formError ? (\n <p className=\"text-sm text-status-error-text\" role=\"alert\">\n {formError}\n </p>\n ) : null}\n </div>\n )}\n\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"outline\" disabled={createInsight.isPending}>\n Cancel\n </Button>\n </DialogClose>\n <Button\n onClick={submitCreate}\n disabled={\n !canCreate || !form.title.trim() || !form.subject || createInsight.isPending\n }\n >\n {createInsight.isPending ? 'Creating…' : 'Create insight'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* ---------------- Dismiss confirmation ---------------- */}\n <ConfirmDialog\n open={Boolean(dismissTarget)}\n onOpenChange={(open) => {\n if (!open) setDismissTarget(null);\n }}\n title=\"Dismiss tax insight?\"\n description={\n dismissTarget ? (\n <>\n “{dismissTarget.title}” will be marked as dismissed and removed from your\n open opportunities. This does not delete the underlying holdings or transactions.\n </>\n ) : undefined\n }\n confirmLabel=\"Dismiss insight\"\n pendingLabel=\"Dismissing…\"\n destructive\n pending={dismissInsight.isPending}\n onConfirm={() => {\n if (!dismissTarget) return;\n dismissInsight.mutate(dismissTarget.id, {\n onSuccess: () => setDismissTarget(null),\n });\n }}\n />\n </SectionShell>\n );\n}\n\n// ============================================================================\n// Harvest candidates tab — real holdings at an unrealized loss (TLH)\n// ============================================================================\n\nfunction HarvestCandidatesTab({\n candidates,\n harvestableLoss,\n currency,\n loading,\n canCreate,\n onCreateProposal,\n}: {\n candidates: HarvestCandidate[];\n harvestableLoss: number;\n currency: string;\n loading: boolean;\n canCreate: boolean;\n onCreateProposal: (c: HarvestCandidate) => void;\n}) {\n // Each candidate's share of the total harvestable loss (real proportion).\n const contributors = useMemo(\n () =>\n candidates.slice(0, 6).map((c) => ({\n label: c.holding.symbol,\n value: harvestableLoss === 0 ? 0 : (c.loss / harvestableLoss) * 100,\n tone: 'negative' as const,\n caption: formatMoney(c.loss, c.holding.currency),\n })),\n [candidates, harvestableLoss]\n );\n\n if (loading) {\n return (\n <Card>\n <CardContent className=\"pt-6\">\n <LoadingState />\n </CardContent>\n </Card>\n );\n }\n\n return (\n <div className=\"grid gap-4 lg:grid-cols-3\">\n <Card className=\"lg:col-span-2\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Scissors className=\"h-5 w-5\" aria-hidden=\"true\" />\n Harvest candidates\n </CardTitle>\n <CardDescription>\n Holdings sitting at an unrealized loss — sell to realize the loss and offset gains.\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {candidates.length === 0 ? (\n <EmptyState\n icon={<Scissors className=\"size-6\" aria-hidden=\"true\" />}\n title=\"No harvest candidates\"\n description=\"Every holding is currently at or above its cost basis — there is nothing to harvest right now.\"\n />\n ) : (\n <>\n {contributors.length > 0 ? (\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-4\">\n <p className=\"mb-3 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Loss by holding\n </p>\n <AllocationBars data={contributors} />\n </div>\n ) : null}\n\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Symbol</TableHead>\n <TableHead>Account</TableHead>\n <TableHead className=\"text-right\">Qty</TableHead>\n <TableHead className=\"text-right\">Market value</TableHead>\n <TableHead className=\"text-right\">Unrealized loss</TableHead>\n <TableHead className=\"text-right\">Action</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {candidates.map((c) => (\n <TableRow key={c.holding.id}>\n <TableCell>\n <p className=\"font-medium text-text-primary\">{c.holding.symbol}</p>\n {c.holding.name ? (\n <p className=\"text-xs text-text-secondary\">{c.holding.name}</p>\n ) : null}\n </TableCell>\n <TableCell className=\"text-text-secondary\">{c.accountName}</TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {c.holding.quantity}\n </TableCell>\n <TableCell className=\"text-right text-text-primary\">\n {formatMoney(c.holding.marketValue, c.holding.currency)}\n </TableCell>\n <TableCell className=\"text-right\">\n <GainLoss value={c.loss} currency={c.holding.currency} />\n </TableCell>\n <TableCell className=\"text-right\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={!canCreate}\n onClick={() => onCreateProposal(c)}\n >\n Create proposal\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </>\n )}\n </CardContent>\n </Card>\n\n {/* Harvestable-loss hero + proposal CTA */}\n <div className=\"space-y-4\">\n <GlassCard glow>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Estimated harvestable loss\n </p>\n <p className=\"mt-1 text-3xl font-semibold text-status-error-text\">\n {formatMoney(harvestableLoss, currency)}\n </p>\n <p className=\"mt-1 text-xs text-text-secondary\">\n Across {candidates.length} holding{candidates.length === 1 ? '' : 's'} below cost basis.\n </p>\n <div className=\"mt-4\">\n <Button\n className=\"w-full\"\n disabled={!canCreate || candidates.length === 0}\n onClick={() => {\n if (candidates[0]) onCreateProposal(candidates[0]);\n }}\n >\n <Scissors className=\"size-4\" aria-hidden=\"true\" />\n Create rebalance proposal\n </Button>\n </div>\n </GlassCard>\n\n <GlassCard>\n <p className=\"text-sm font-semibold text-text-primary\">Suggested workflow</p>\n <p className=\"mb-4 mt-1 text-xs text-text-secondary\">\n Realize losses while holding your target allocation. Confirm wash-sale windows before\n executing.\n </p>\n <LifecycleStepper\n steps={['Detect', 'Review', 'Proposal', 'Execute']}\n current=\"Proposal\"\n />\n </GlassCard>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Unrealized gains tab — per-account holdings P/L (real market value − cost basis)\n// ============================================================================\n\nfunction UnrealizedGainsTab({ accounts }: { accounts: BraAccount[] }) {\n const [accountId, setAccountId] = useState<string>('');\n const selectedId = accountId || accounts[0]?.id;\n const selectedAccount = accounts.find((a) => a.id === selectedId);\n\n const { data: holdings, isLoading, isError, refetch } = useHoldings({ accountId: selectedId });\n\n const currency = selectedAccount?.currency ?? holdings[0]?.currency ?? 'USD';\n\n const totalUnrealized = holdings.reduce((sum, h) => sum + unrealized(h), 0);\n const gainers = holdings.filter((h) => unrealized(h) > 0).length;\n const losers = holdings.filter((h) => unrealized(h) < 0).length;\n\n // Group holdings by asset class with subtotals (grouped, colored by gain/loss).\n const groups = useMemo(() => {\n const map = new Map<BraAssetClass, BraHolding[]>();\n for (const h of holdings) {\n const arr = map.get(h.assetClass) ?? [];\n arr.push(h);\n map.set(h.assetClass, arr);\n }\n return Array.from(map.entries());\n }, [holdings]);\n\n // Market-value allocation by asset class for the donut (real values).\n const allocation = useMemo<DonutDatum[]>(\n () =>\n groups\n .map(([assetClass, rows]) => ({\n label: humanize(assetClass),\n value: rows.reduce((sum, h) => sum + h.marketValue, 0),\n }))\n .filter((d) => d.value > 0),\n [groups]\n );\n const totalMarketValue = allocation.reduce((sum, d) => sum + d.value, 0);\n\n if (accounts.length === 0) {\n return (\n <Card>\n <CardContent className=\"pt-6\">\n <EmptyState\n icon={<TrendingUp className=\"size-6\" aria-hidden=\"true\" />}\n title=\"No accounts yet\"\n description=\"Add an account with holdings to see unrealized gains and losses.\"\n />\n </CardContent>\n </Card>\n );\n }\n\n return (\n <Card>\n <CardHeader className=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between\">\n <div>\n <CardTitle className=\"flex items-center gap-2\">\n <TrendingUp className=\"h-5 w-5\" aria-hidden=\"true\" />\n Unrealized gains & losses\n </CardTitle>\n <CardDescription>\n Market value minus cost basis for each holding in the selected account.\n </CardDescription>\n </div>\n <div className=\"w-full md:w-64\">\n <Label htmlFor=\"unrealized-account\" className=\"sr-only\">\n Account\n </Label>\n <Select value={selectedId ?? ''} onValueChange={setAccountId}>\n <SelectTrigger id=\"unrealized-account\">\n <SelectValue placeholder=\"Select account\" />\n </SelectTrigger>\n <SelectContent>\n {accounts.map((a) => (\n <SelectItem key={a.id} value={a.id}>\n {a.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {isLoading ? (\n <LoadingState />\n ) : isError ? (\n <ErrorState onRetry={() => refetch()} />\n ) : holdings.length === 0 ? (\n <EmptyState\n icon={<TrendingUp className=\"size-6\" aria-hidden=\"true\" />}\n title=\"No holdings in this account\"\n description=\"Unrealized gains appear once this account has holdings with a cost basis.\"\n />\n ) : (\n <>\n <div className=\"grid gap-4 lg:grid-cols-3\">\n <div className=\"grid grid-cols-2 gap-3 lg:col-span-2\">\n <StatTile\n label=\"Unrealized P/L\"\n value={formatMoney(totalUnrealized, currency)}\n deltaTone={totalUnrealized >= 0 ? 'positive' : 'negative'}\n icon={\n totalUnrealized >= 0 ? (\n <TrendingUp className=\"size-4\" aria-hidden=\"true\" />\n ) : (\n <TrendingDown className=\"size-4\" aria-hidden=\"true\" />\n )\n }\n />\n <StatTile label=\"Holdings\" value={String(holdings.length)} />\n <StatTile\n label=\"Gainers\"\n value={String(gainers)}\n icon={<ArrowUpRight className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label=\"Losers\"\n value={String(losers)}\n icon={<ArrowDownRight className=\"size-4\" aria-hidden=\"true\" />}\n />\n </div>\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-4\">\n <p className=\"mb-2 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Allocation by asset class\n </p>\n <DonutChart\n data={allocation}\n legend={false}\n height={180}\n centerValue={formatMoney(totalMarketValue, currency)}\n centerLabel=\"market value\"\n valueFormatter={(v) => formatMoney(v, currency)}\n />\n </div>\n </div>\n\n <div className=\"space-y-6\">\n {groups.map(([assetClass, rows]) => {\n const groupTotal = rows.reduce((sum, h) => sum + unrealized(h), 0);\n return (\n <div key={assetClass} className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {humanize(assetClass)}\n </h3>\n <Badge variant=\"secondary\">{rows.length}</Badge>\n </div>\n <GainLoss value={groupTotal} currency={currency} />\n </div>\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Symbol</TableHead>\n <TableHead className=\"text-right\">Quantity</TableHead>\n <TableHead className=\"text-right\">Cost basis</TableHead>\n <TableHead className=\"text-right\">Market value</TableHead>\n <TableHead className=\"text-right\">Unrealized</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((h) => (\n <TableRow key={h.id}>\n <TableCell>\n <p className=\"font-medium text-text-primary\">{h.symbol}</p>\n {h.name ? (\n <p className=\"text-xs text-text-secondary\">{h.name}</p>\n ) : null}\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {h.quantity}\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {formatMoney(h.costBasis, h.currency)}\n </TableCell>\n <TableCell className=\"text-right text-text-primary\">\n {formatMoney(h.marketValue, h.currency)}\n </TableCell>\n <TableCell className=\"text-right\">\n <GainLoss value={unrealized(h)} currency={h.currency} />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </div>\n );\n })}\n </div>\n </>\n )}\n </CardContent>\n </Card>\n );\n}\n\n/** Signed money with an arrow icon + semantic color (color is never the only signal). */\nfunction GainLoss({ value, currency }: { value: number; currency: string }) {\n const positive = value > 0;\n const negative = value < 0;\n const Icon = positive ? ArrowUpRight : negative ? ArrowDownRight : TrendingDown;\n const sign = positive ? '+' : '';\n return (\n <span\n className={`inline-flex items-center justify-end gap-1 font-semibold ${deltaToneClass(value)}`}\n >\n {value !== 0 ? <Icon className=\"size-4\" aria-hidden=\"true\" /> : null}\n {sign}\n {formatMoney(value, currency)}\n </span>\n );\n}\n\n// ============================================================================\n// Tax-insight row (acknowledge / resolve / dismiss)\n// ============================================================================\n\nfunction TaxInsightRow({\n insight,\n actionPending,\n onAcknowledge,\n onResolve,\n onDismiss,\n}: {\n insight: BraInsight;\n actionPending: boolean;\n onAcknowledge: () => void;\n onResolve: () => void;\n onDismiss: () => void;\n}) {\n const terminal = insight.status === 'RESOLVED' || insight.status === 'DISMISSED';\n return (\n <div className=\"flex items-start justify-between gap-4 rounded-lg border border-border-subtle bg-bg-surface p-4 transition-shadow motion-safe:hover:shadow-[var(--shadow-pop-hover,var(--shadow-elevation-2))]\">\n <div className=\"min-w-0 space-y-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"font-medium text-text-primary\">{insight.title}</p>\n <Badge variant={statusBadgeVariant(insight.severity)}>{humanize(insight.severity)}</Badge>\n <Badge variant={statusBadgeVariant(insight.status)}>{humanize(insight.status)}</Badge>\n </div>\n {insight.detail ? <p className=\"text-sm text-text-secondary\">{insight.detail}</p> : null}\n <p className=\"text-xs text-text-muted\">\n {humanize(insight.subjectType)} · Detected {formatDate(insight.createdAt)}\n </p>\n </div>\n {terminal ? (\n <span className=\"mt-1 text-xs text-text-muted\">Closed</span>\n ) : (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Actions for ${insight.title}`}\n disabled={actionPending}\n >\n <MoreHorizontal className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>Actions</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {insight.status === 'OPEN' ? (\n <DropdownMenuItem onClick={onAcknowledge}>\n <Check className=\"size-4\" aria-hidden=\"true\" />\n Acknowledge\n </DropdownMenuItem>\n ) : null}\n <DropdownMenuItem onClick={onResolve}>\n <ShieldCheck className=\"size-4\" aria-hidden=\"true\" />\n Resolve\n </DropdownMenuItem>\n <DropdownMenuItem className=\"text-status-error-text\" onClick={onDismiss}>\n <X className=\"size-4\" aria-hidden=\"true\" />\n Dismiss\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TaxPage.js","names":[],"sources":["../../../src/brainyrich/pages/TaxPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n ResponsiveDialog,\n ResponsiveDialogClose,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport {\n ArrowDownRight,\n ArrowUpRight,\n Check,\n Coins,\n Landmark,\n MoreHorizontal,\n Receipt,\n ReceiptText,\n Scissors,\n ShieldCheck,\n Sparkles,\n TrendingDown,\n TrendingUp,\n X,\n} from 'lucide-react';\nimport {\n usePagedInsights,\n useAllTransactions,\n useAllAccounts,\n usePortfolios,\n useHoldings,\n useCreateInsight,\n useAcknowledgeInsight,\n useDismissInsight,\n useResolveInsight,\n} from '../hooks/useBrainyRichApi';\nimport {\n LoadMore,\n ConfirmDialog,\n DonutChart,\n MiniAreaChart,\n LifecycleStepper,\n StatTile,\n GlassCard,\n FadeIn,\n type DonutDatum,\n type VizTone,\n} from '../components';\nimport type {\n BraAccount,\n BraAssetClass,\n BraHolding,\n BraInsight,\n BraInsightSeverity,\n} from '../types/bra';\nimport {\n SectionShell,\n AllocationBars,\n EmptyState,\n LoadingState,\n ErrorState,\n formatMoney,\n formatDate,\n statusBadgeVariant,\n deltaToneClass,\n} from './_shared';\nimport { useTr } from '../hooks/useTr';\n\n// ============================================================================\n// Domain helpers (derived from the SDL, never fabricated data)\n// ============================================================================\n\nconst SEVERITIES: BraInsightSeverity[] = ['INFO', 'LOW', 'MEDIUM', 'HIGH', 'CRITICAL'];\n\n/** Turn an UPPER_SNAKE enum member into a readable label. */\nfunction humanize(value: string): string {\n return value\n .toLowerCase()\n .split('_')\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\n/** Unrealized P/L for a holding = server market value − cost basis. */\nfunction unrealized(h: BraHolding): number {\n return h.marketValue - h.costBasis;\n}\n\n/** Severity → semantic viz tone (color is never the only signal). */\nfunction severityTone(sev: BraInsightSeverity): VizTone {\n switch (sev) {\n case 'CRITICAL':\n return 'error';\n case 'HIGH':\n return 'warning';\n case 'MEDIUM':\n return 'info';\n case 'LOW':\n return 'teal';\n default:\n return 'neutral';\n }\n}\n\n/** A real holding sitting at an unrealized loss — a tax-loss-harvest candidate. */\ninterface HarvestCandidate {\n holding: BraHolding;\n accountId: string;\n accountName: string;\n loss: number; // negative\n}\n\n// ============================================================================\n// Page\n// ============================================================================\n\ninterface InsightFormState {\n title: string;\n detail: string;\n severity: BraInsightSeverity;\n /** Encoded as `${subjectType}:${id}` from the subject picker. */\n subject: string;\n}\n\nconst EMPTY_INSIGHT_FORM: InsightFormState = {\n title: '',\n detail: '',\n severity: 'MEDIUM',\n subject: '',\n};\n\nexport function TaxPage() {\n const tr = useTr();\n // Insights are a *Connection — paginate with LoadMore. Tax-opportunity\n // insights are client-filtered (the list query has no `type` argument).\n const {\n items: insights,\n hasMore: insightsHasMore,\n loadMore: loadMoreInsights,\n isLoading: insightsLoading,\n isFetchingNextPage: insightsFetchingMore,\n isError: insightsError,\n refetch: refetchInsights,\n } = usePagedInsights();\n\n // Realized activity + income aggregated over the FULL transaction set\n // (not a truncated first page) via the fetch-all helper.\n const {\n data: transactions,\n isLoading: txLoading,\n isError: txError,\n refetch: refetchTransactions,\n } = useAllTransactions();\n\n // ALL accounts (with holdings) — drives the portfolio-wide unrealized total.\n const { data: accounts, isLoading: accountsLoading } = useAllAccounts();\n const { data: portfolios } = usePortfolios();\n\n const createInsight = useCreateInsight();\n const acknowledgeInsight = useAcknowledgeInsight();\n const dismissInsight = useDismissInsight();\n const resolveInsight = useResolveInsight();\n\n const [createOpen, setCreateOpen] = useState(false);\n const [form, setForm] = useState<InsightFormState>(EMPTY_INSIGHT_FORM);\n const [formError, setFormError] = useState<string | null>(null);\n const [dismissTarget, setDismissTarget] = useState<BraInsight | null>(null);\n\n // ---- Tax-opportunity insights (client-filtered — the list hook has no type arg) ----\n const taxInsights = useMemo(\n () => insights.filter((i) => i.type === 'TAX_OPPORTUNITY'),\n [insights]\n );\n const openTax = useMemo(() => taxInsights.filter((i) => i.status === 'OPEN'), [taxInsights]);\n\n // Open-tax severity mix drives the signal donut (real counts, no fabrication).\n const severityMix = useMemo<DonutDatum[]>(() => {\n const order: BraInsightSeverity[] = ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW', 'INFO'];\n return order\n .map((sev) => ({\n label: humanize(sev),\n value: openTax.filter((i) => i.severity === sev).length,\n tone: severityTone(sev),\n }))\n .filter((d) => d.value > 0);\n }, [openTax]);\n\n // ---- Realized activity partitioned from real transactions ----\n const sells = useMemo(() => transactions.filter((t) => t.type === 'SELL'), [transactions]);\n const income = useMemo(\n () => transactions.filter((t) => t.type === 'DIVIDEND' || t.type === 'INTEREST'),\n [transactions]\n );\n const realizedProceeds = sells.reduce((sum, t) => sum + t.amount, 0);\n const investmentIncome = income.reduce((sum, t) => sum + t.amount, 0);\n const moneyCurrency = sells[0]?.currency ?? income[0]?.currency ?? 'USD';\n\n // Cumulative realized-proceeds series over trade dates (spark + area chart).\n const proceedsSeries = useMemo(() => {\n const sorted = [...sells].sort(\n (a, b) => new Date(a.tradeDate).getTime() - new Date(b.tradeDate).getTime()\n );\n return sorted.reduce<{ x: string; y: number }[]>((acc, t) => {\n const prev = acc.length > 0 ? acc[acc.length - 1].y : 0;\n acc.push({ x: formatDate(t.tradeDate), y: prev + t.amount });\n return acc;\n }, []);\n }, [sells]);\n const proceedsSpark = proceedsSeries.map((p) => p.y);\n\n // ---- Portfolio-wide unrealized P/L across EVERY account's holdings ----\n const totalUnrealizedAll = useMemo(\n () => accounts.reduce((sum, a) => sum + a.holdings.reduce((s, h) => s + unrealized(h), 0), 0),\n [accounts]\n );\n const unrealizedCurrency = accounts[0]?.currency ?? moneyCurrency;\n\n // ---- Tax-loss-harvest candidates: every holding at an unrealized loss ----\n const harvestCandidates = useMemo<HarvestCandidate[]>(\n () =>\n accounts\n .flatMap((a) =>\n a.holdings\n .filter((h) => unrealized(h) < 0)\n .map((h) => ({\n holding: h,\n accountId: a.id,\n accountName: a.name,\n loss: unrealized(h),\n }))\n )\n .sort((a, b) => a.loss - b.loss),\n [accounts]\n );\n const harvestableLoss = harvestCandidates.reduce((sum, c) => sum + c.loss, 0);\n const harvestCurrency = harvestCandidates[0]?.holding.currency ?? unrealizedCurrency;\n\n const canCreate = accounts.length > 0 || portfolios.length > 0;\n\n function openCreate() {\n setForm(EMPTY_INSIGHT_FORM);\n setFormError(null);\n setCreateOpen(true);\n }\n\n /** Flag a rebalance/harvest proposal against the candidate's real account. */\n function startProposal(c: HarvestCandidate) {\n setForm({\n title: `Harvest ${c.holding.symbol} loss`,\n detail: `Tax-loss-harvest candidate: ${c.holding.symbol} is sitting at an unrealized loss of ${formatMoney(\n c.loss,\n c.holding.currency\n )}. Create a rebalance proposal to realize the loss while holding the target allocation.`,\n severity: 'MEDIUM',\n subject: `account:${c.accountId}`,\n });\n setFormError(null);\n setCreateOpen(true);\n }\n\n function submitCreate() {\n const title = form.title.trim();\n if (!title) {\n setFormError('A title is required.');\n return;\n }\n if (!form.subject) {\n setFormError('Select the account or portfolio this opportunity applies to.');\n return;\n }\n const [subjectType, subjectId] = form.subject.split(':');\n if (!subjectType || !subjectId) {\n setFormError('Select a valid subject.');\n return;\n }\n createInsight.mutate(\n {\n type: 'TAX_OPPORTUNITY',\n severity: form.severity,\n title,\n detail: form.detail.trim() || null,\n subjectId,\n subjectType,\n },\n {\n onSuccess: () => {\n setCreateOpen(false);\n setForm(EMPTY_INSIGHT_FORM);\n },\n onError: (err: unknown) => {\n setFormError(err instanceof Error ? err.message : 'Could not create the tax insight.');\n },\n }\n );\n }\n\n const insightPending =\n acknowledgeInsight.isPending || dismissInsight.isPending || resolveInsight.isPending;\n\n return (\n <SectionShell\n title=\"Tax Center\"\n description=\"Act on tax-opportunity insights and review unrealized and realized gains — all from your live portfolio data.\"\n badges={[`${openTax.length} open opportunit${openTax.length === 1 ? 'y' : 'ies'}`]}\n actionLabel=\"New tax insight\"\n onAction={openCreate}\n >\n {/* ---------------- Premium KPI band ---------------- */}\n <FadeIn>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5\">\n <StatTile\n label=\"Open opportunities\"\n value={String(openTax.length)}\n icon={<Sparkles className=\"size-4\" aria-hidden=\"true\" />}\n glow\n />\n <StatTile\n label=\"Realized proceeds\"\n value={formatMoney(realizedProceeds, moneyCurrency)}\n icon={<Landmark className=\"size-4\" aria-hidden=\"true\" />}\n spark={proceedsSpark.length > 1 ? proceedsSpark : undefined}\n sparkTone=\"brand\"\n />\n <StatTile\n label=\"Investment income\"\n value={formatMoney(investmentIncome, moneyCurrency)}\n icon={<Coins className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label=\"Harvestable loss\"\n value={accountsLoading ? '—' : formatMoney(harvestableLoss, harvestCurrency)}\n icon={<Scissors className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label=\"Unrealized P/L\"\n value={accountsLoading ? '—' : formatMoney(totalUnrealizedAll, unrealizedCurrency)}\n deltaTone={totalUnrealizedAll >= 0 ? 'positive' : 'negative'}\n icon={\n totalUnrealizedAll >= 0 ? (\n <TrendingUp className=\"size-4\" aria-hidden=\"true\" />\n ) : (\n <TrendingDown className=\"size-4\" aria-hidden=\"true\" />\n )\n }\n />\n </div>\n </FadeIn>\n\n <Tabs defaultValue=\"opportunities\" className=\"space-y-4\">\n <TabsList className=\"grid w-full grid-cols-2 sm:grid-cols-4\">\n <TabsTrigger value=\"opportunities\">\n {tr('brainyrich.tax.tabs.opportunities', 'Opportunities')}\n </TabsTrigger>\n <TabsTrigger value=\"harvest\">{tr('brainyrich.tax.tabs.harvest', 'Harvest')}</TabsTrigger>\n <TabsTrigger value=\"unrealized\">\n {tr('brainyrich.tax.tabs.unrealized', 'Unrealized')}\n </TabsTrigger>\n <TabsTrigger value=\"realized\">\n {tr('brainyrich.tax.tabs.realized', 'Realized')}\n </TabsTrigger>\n </TabsList>\n\n {/* ---------------- Tax opportunities ---------------- */}\n <TabsContent value=\"opportunities\">\n <div className=\"grid gap-4 lg:grid-cols-3\">\n <Card className=\"lg:col-span-2\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Sparkles className=\"h-5 w-5\" aria-hidden=\"true\" />\n {tr('brainyrich.tax.opportunities.title', 'Tax-opportunity insights')}\n </CardTitle>\n <CardDescription>\n {tr(\n 'brainyrich.tax.opportunities.description',\n 'Tax-loss harvesting and other tax signals detected across your accounts and portfolios.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {insightsLoading ? (\n <LoadingState />\n ) : insightsError ? (\n <ErrorState onRetry={() => refetchInsights()} />\n ) : taxInsights.length === 0 ? (\n <EmptyState\n icon={<Receipt className=\"size-6\" aria-hidden=\"true\" />}\n title=\"No tax opportunities yet\"\n description=\"Tax-opportunity insights appear here as the backend generates them from your holdings. You can also flag one manually.\"\n action={\n canCreate ? (\n <Button size=\"sm\" onClick={openCreate}>\n <Sparkles className=\"size-4\" aria-hidden=\"true\" />\n New tax insight\n </Button>\n ) : undefined\n }\n />\n ) : (\n <div className=\"space-y-3\">\n {taxInsights.map((insight, i) => (\n <FadeIn key={insight.id} index={i}>\n <TaxInsightRow\n insight={insight}\n actionPending={insightPending}\n onAcknowledge={() => acknowledgeInsight.mutate(insight.id)}\n onResolve={() => resolveInsight.mutate(insight.id)}\n onDismiss={() => setDismissTarget(insight)}\n />\n </FadeIn>\n ))}\n <LoadMore\n hasMore={insightsHasMore}\n onClick={loadMoreInsights}\n loading={insightsFetchingMore}\n label=\"Load more insights\"\n />\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Signal mix + TLH lifecycle */}\n <div className=\"space-y-4\">\n <GlassCard glow>\n <div className=\"space-y-1\">\n <p className=\"text-sm font-semibold text-text-primary\">Open-signal mix</p>\n <p className=\"text-xs text-text-secondary\">\n Live tax opportunities grouped by severity.\n </p>\n </div>\n <div className=\"mt-4\">\n {severityMix.length === 0 ? (\n <p className=\"py-6 text-center text-sm text-text-secondary\">\n No open opportunities.\n </p>\n ) : (\n <DonutChart\n data={severityMix}\n centerValue={String(openTax.length)}\n centerLabel=\"open\"\n valueFormatter={(v) => `${v} signal${v === 1 ? '' : 's'}`}\n />\n )}\n </div>\n </GlassCard>\n\n <GlassCard>\n <p className=\"text-sm font-semibold text-text-primary\">Harvesting workflow</p>\n <p className=\"mb-4 mt-1 text-xs text-text-secondary\">\n How a loss becomes a realized tax benefit.\n </p>\n <LifecycleStepper\n steps={['Detect', 'Review', 'Proposal', 'Execute']}\n current=\"Review\"\n />\n </GlassCard>\n </div>\n </div>\n </TabsContent>\n\n {/* ---------------- Harvest candidates ---------------- */}\n <TabsContent value=\"harvest\">\n <HarvestCandidatesTab\n candidates={harvestCandidates}\n harvestableLoss={harvestableLoss}\n currency={harvestCurrency}\n loading={accountsLoading}\n canCreate={canCreate}\n onCreateProposal={startProposal}\n />\n </TabsContent>\n\n {/* ---------------- Unrealized gains ---------------- */}\n <TabsContent value=\"unrealized\">\n <UnrealizedGainsTab accounts={accounts} />\n </TabsContent>\n\n {/* ---------------- Realized activity ---------------- */}\n <TabsContent value=\"realized\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <ReceiptText className=\"h-5 w-5\" aria-hidden=\"true\" />\n Realized activity\n </CardTitle>\n <CardDescription>\n Realized sales, dividends and interest — the taxable events recorded on your\n accounts.\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n {txLoading ? (\n <LoadingState />\n ) : txError ? (\n <ErrorState onRetry={() => refetchTransactions()} />\n ) : sells.length === 0 && income.length === 0 ? (\n <EmptyState\n icon={<ReceiptText className=\"size-6\" aria-hidden=\"true\" />}\n title=\"No taxable activity recorded\"\n description=\"Sales, dividends and interest show up here once transactions are recorded against your accounts.\"\n />\n ) : (\n <>\n {proceedsSeries.length > 1 ? (\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-4\">\n <p className=\"text-sm font-semibold text-text-primary\">\n Cumulative realized proceeds\n </p>\n <p className=\"mb-3 text-xs text-text-secondary\">\n Running total of sale proceeds over trade dates.\n </p>\n <MiniAreaChart\n data={proceedsSeries}\n tone=\"brand\"\n valueFormatter={(v) => formatMoney(v, moneyCurrency)}\n />\n </div>\n ) : null}\n\n {/* Realized sales */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Landmark className=\"size-4 text-text-secondary\" aria-hidden=\"true\" />\n <h3 className=\"text-sm font-semibold text-text-primary\">Realized sales</h3>\n <Badge variant=\"secondary\">{sells.length}</Badge>\n </div>\n {sells.length === 0 ? (\n <p className=\"text-sm text-text-secondary\">No sales recorded.</p>\n ) : (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Symbol</TableHead>\n <TableHead className=\"text-right\">Quantity</TableHead>\n <TableHead className=\"text-right\">Price</TableHead>\n <TableHead className=\"text-right\">Proceeds</TableHead>\n <TableHead>Trade date</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {sells.map((t) => (\n <TableRow key={t.id}>\n <TableCell className=\"font-medium text-text-primary\">\n {t.symbol ?? '—'}\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {t.quantity}\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {formatMoney(t.price, t.currency)}\n </TableCell>\n <TableCell className=\"text-right font-medium text-text-primary\">\n {formatMoney(t.amount, t.currency)}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(t.tradeDate)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )}\n </div>\n\n {/* Investment income */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Coins className=\"size-4 text-text-secondary\" aria-hidden=\"true\" />\n <h3 className=\"text-sm font-semibold text-text-primary\">\n Dividends & interest\n </h3>\n <Badge variant=\"secondary\">{income.length}</Badge>\n </div>\n {income.length === 0 ? (\n <p className=\"text-sm text-text-secondary\">No income recorded.</p>\n ) : (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Type</TableHead>\n <TableHead>Symbol</TableHead>\n <TableHead className=\"text-right\">Amount</TableHead>\n <TableHead>Trade date</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {income.map((t) => (\n <TableRow key={t.id}>\n <TableCell>\n <Badge variant=\"outline\">{humanize(t.type)}</Badge>\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {t.symbol ?? '—'}\n </TableCell>\n <TableCell className=\"text-right font-medium text-status-success-text\">\n {formatMoney(t.amount, t.currency)}\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {formatDate(t.tradeDate)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n )}\n </div>\n </>\n )}\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n\n {/* ---------------- Create tax insight dialog ---------------- */}\n <ResponsiveDialog\n open={createOpen}\n onOpenChange={(open) => {\n setCreateOpen(open);\n if (!open) setFormError(null);\n }}\n >\n <ResponsiveDialogContent className=\"max-h-[90vh] overflow-y-auto sm:max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New tax insight</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Flag a tax opportunity against one of your accounts or portfolios.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n {!canCreate ? (\n <EmptyState\n title=\"No subject available\"\n description=\"Create an account or portfolio first, then flag a tax opportunity against it.\"\n />\n ) : (\n <div className=\"space-y-4 py-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"tax-title\">Title</Label>\n <Input\n id=\"tax-title\"\n value={form.title}\n onChange={(e) => setForm((f) => ({ ...f, title: e.target.value }))}\n placeholder=\"e.g. Harvest losses in tech holdings\"\n />\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"tax-severity\">Severity</Label>\n <Select\n value={form.severity}\n onValueChange={(v) =>\n setForm((f) => ({ ...f, severity: v as BraInsightSeverity }))\n }\n >\n <SelectTrigger id=\"tax-severity\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {SEVERITIES.map((s) => (\n <SelectItem key={s} value={s}>\n {humanize(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"tax-subject\">Applies to</Label>\n <Select\n value={form.subject}\n onValueChange={(v) => setForm((f) => ({ ...f, subject: v }))}\n >\n <SelectTrigger id=\"tax-subject\">\n <SelectValue placeholder=\"Select subject\" />\n </SelectTrigger>\n <SelectContent>\n {portfolios.map((p) => (\n <SelectItem key={`portfolio:${p.id}`} value={`portfolio:${p.id}`}>\n Portfolio · {p.name}\n </SelectItem>\n ))}\n {accounts.map((a) => (\n <SelectItem key={`account:${a.id}`} value={`account:${a.id}`}>\n Account · {a.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"tax-detail\">Detail</Label>\n <Textarea\n id=\"tax-detail\"\n value={form.detail}\n onChange={(e) => setForm((f) => ({ ...f, detail: e.target.value }))}\n rows={3}\n placeholder=\"What is the opportunity and how should it be actioned?\"\n />\n </div>\n\n {formError ? (\n <p className=\"text-sm text-status-error-text\" role=\"alert\">\n {formError}\n </p>\n ) : null}\n </div>\n )}\n\n <ResponsiveDialogFooter>\n <ResponsiveDialogClose asChild>\n <Button variant=\"outline\" disabled={createInsight.isPending}>\n Cancel\n </Button>\n </ResponsiveDialogClose>\n <Button\n onClick={submitCreate}\n disabled={\n !canCreate || !form.title.trim() || !form.subject || createInsight.isPending\n }\n >\n {createInsight.isPending ? 'Creating…' : 'Create insight'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* ---------------- Dismiss confirmation ---------------- */}\n <ConfirmDialog\n open={Boolean(dismissTarget)}\n onOpenChange={(open) => {\n if (!open) setDismissTarget(null);\n }}\n title=\"Dismiss tax insight?\"\n description={\n dismissTarget ? (\n <>\n “{dismissTarget.title}” will be marked as dismissed and removed from your\n open opportunities. This does not delete the underlying holdings or transactions.\n </>\n ) : undefined\n }\n confirmLabel=\"Dismiss insight\"\n pendingLabel=\"Dismissing…\"\n destructive\n pending={dismissInsight.isPending}\n onConfirm={() => {\n if (!dismissTarget) return;\n dismissInsight.mutate(dismissTarget.id, {\n onSuccess: () => setDismissTarget(null),\n });\n }}\n />\n </SectionShell>\n );\n}\n\n// ============================================================================\n// Harvest candidates tab — real holdings at an unrealized loss (TLH)\n// ============================================================================\n\nfunction HarvestCandidatesTab({\n candidates,\n harvestableLoss,\n currency,\n loading,\n canCreate,\n onCreateProposal,\n}: {\n candidates: HarvestCandidate[];\n harvestableLoss: number;\n currency: string;\n loading: boolean;\n canCreate: boolean;\n onCreateProposal: (c: HarvestCandidate) => void;\n}) {\n // Each candidate's share of the total harvestable loss (real proportion).\n const contributors = useMemo(\n () =>\n candidates.slice(0, 6).map((c) => ({\n label: c.holding.symbol,\n value: harvestableLoss === 0 ? 0 : (c.loss / harvestableLoss) * 100,\n tone: 'negative' as const,\n caption: formatMoney(c.loss, c.holding.currency),\n })),\n [candidates, harvestableLoss]\n );\n\n if (loading) {\n return (\n <Card>\n <CardContent className=\"pt-6\">\n <LoadingState />\n </CardContent>\n </Card>\n );\n }\n\n return (\n <div className=\"grid gap-4 lg:grid-cols-3\">\n <Card className=\"lg:col-span-2\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Scissors className=\"h-5 w-5\" aria-hidden=\"true\" />\n Harvest candidates\n </CardTitle>\n <CardDescription>\n Holdings sitting at an unrealized loss — sell to realize the loss and offset gains.\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {candidates.length === 0 ? (\n <EmptyState\n icon={<Scissors className=\"size-6\" aria-hidden=\"true\" />}\n title=\"No harvest candidates\"\n description=\"Every holding is currently at or above its cost basis — there is nothing to harvest right now.\"\n />\n ) : (\n <>\n {contributors.length > 0 ? (\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-4\">\n <p className=\"mb-3 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Loss by holding\n </p>\n <AllocationBars data={contributors} />\n </div>\n ) : null}\n\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Symbol</TableHead>\n <TableHead>Account</TableHead>\n <TableHead className=\"text-right\">Qty</TableHead>\n <TableHead className=\"text-right\">Market value</TableHead>\n <TableHead className=\"text-right\">Unrealized loss</TableHead>\n <TableHead className=\"text-right\">Action</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {candidates.map((c) => (\n <TableRow key={c.holding.id}>\n <TableCell>\n <p className=\"font-medium text-text-primary\">{c.holding.symbol}</p>\n {c.holding.name ? (\n <p className=\"text-xs text-text-secondary\">{c.holding.name}</p>\n ) : null}\n </TableCell>\n <TableCell className=\"text-text-secondary\">{c.accountName}</TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {c.holding.quantity}\n </TableCell>\n <TableCell className=\"text-right text-text-primary\">\n {formatMoney(c.holding.marketValue, c.holding.currency)}\n </TableCell>\n <TableCell className=\"text-right\">\n <GainLoss value={c.loss} currency={c.holding.currency} />\n </TableCell>\n <TableCell className=\"text-right\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n disabled={!canCreate}\n onClick={() => onCreateProposal(c)}\n >\n Create proposal\n </Button>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </>\n )}\n </CardContent>\n </Card>\n\n {/* Harvestable-loss hero + proposal CTA */}\n <div className=\"space-y-4\">\n <GlassCard glow>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Estimated harvestable loss\n </p>\n <p className=\"mt-1 text-3xl font-semibold text-status-error-text\">\n {formatMoney(harvestableLoss, currency)}\n </p>\n <p className=\"mt-1 text-xs text-text-secondary\">\n Across {candidates.length} holding{candidates.length === 1 ? '' : 's'} below cost basis.\n </p>\n <div className=\"mt-4\">\n <Button\n className=\"w-full\"\n disabled={!canCreate || candidates.length === 0}\n onClick={() => {\n if (candidates[0]) onCreateProposal(candidates[0]);\n }}\n >\n <Scissors className=\"size-4\" aria-hidden=\"true\" />\n Create rebalance proposal\n </Button>\n </div>\n </GlassCard>\n\n <GlassCard>\n <p className=\"text-sm font-semibold text-text-primary\">Suggested workflow</p>\n <p className=\"mb-4 mt-1 text-xs text-text-secondary\">\n Realize losses while holding your target allocation. Confirm wash-sale windows before\n executing.\n </p>\n <LifecycleStepper\n steps={['Detect', 'Review', 'Proposal', 'Execute']}\n current=\"Proposal\"\n />\n </GlassCard>\n </div>\n </div>\n );\n}\n\n// ============================================================================\n// Unrealized gains tab — per-account holdings P/L (real market value − cost basis)\n// ============================================================================\n\nfunction UnrealizedGainsTab({ accounts }: { accounts: BraAccount[] }) {\n const [accountId, setAccountId] = useState<string>('');\n const selectedId = accountId || accounts[0]?.id;\n const selectedAccount = accounts.find((a) => a.id === selectedId);\n\n const { data: holdings, isLoading, isError, refetch } = useHoldings({ accountId: selectedId });\n\n const currency = selectedAccount?.currency ?? holdings[0]?.currency ?? 'USD';\n\n const totalUnrealized = holdings.reduce((sum, h) => sum + unrealized(h), 0);\n const gainers = holdings.filter((h) => unrealized(h) > 0).length;\n const losers = holdings.filter((h) => unrealized(h) < 0).length;\n\n // Group holdings by asset class with subtotals (grouped, colored by gain/loss).\n const groups = useMemo(() => {\n const map = new Map<BraAssetClass, BraHolding[]>();\n for (const h of holdings) {\n const arr = map.get(h.assetClass) ?? [];\n arr.push(h);\n map.set(h.assetClass, arr);\n }\n return Array.from(map.entries());\n }, [holdings]);\n\n // Market-value allocation by asset class for the donut (real values).\n const allocation = useMemo<DonutDatum[]>(\n () =>\n groups\n .map(([assetClass, rows]) => ({\n label: humanize(assetClass),\n value: rows.reduce((sum, h) => sum + h.marketValue, 0),\n }))\n .filter((d) => d.value > 0),\n [groups]\n );\n const totalMarketValue = allocation.reduce((sum, d) => sum + d.value, 0);\n\n if (accounts.length === 0) {\n return (\n <Card>\n <CardContent className=\"pt-6\">\n <EmptyState\n icon={<TrendingUp className=\"size-6\" aria-hidden=\"true\" />}\n title=\"No accounts yet\"\n description=\"Add an account with holdings to see unrealized gains and losses.\"\n />\n </CardContent>\n </Card>\n );\n }\n\n return (\n <Card>\n <CardHeader className=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between\">\n <div>\n <CardTitle className=\"flex items-center gap-2\">\n <TrendingUp className=\"h-5 w-5\" aria-hidden=\"true\" />\n Unrealized gains & losses\n </CardTitle>\n <CardDescription>\n Market value minus cost basis for each holding in the selected account.\n </CardDescription>\n </div>\n <div className=\"w-full md:w-64\">\n <Label htmlFor=\"unrealized-account\" className=\"sr-only\">\n Account\n </Label>\n <Select value={selectedId ?? ''} onValueChange={setAccountId}>\n <SelectTrigger id=\"unrealized-account\">\n <SelectValue placeholder=\"Select account\" />\n </SelectTrigger>\n <SelectContent>\n {accounts.map((a) => (\n <SelectItem key={a.id} value={a.id}>\n {a.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {isLoading ? (\n <LoadingState />\n ) : isError ? (\n <ErrorState onRetry={() => refetch()} />\n ) : holdings.length === 0 ? (\n <EmptyState\n icon={<TrendingUp className=\"size-6\" aria-hidden=\"true\" />}\n title=\"No holdings in this account\"\n description=\"Unrealized gains appear once this account has holdings with a cost basis.\"\n />\n ) : (\n <>\n <div className=\"grid gap-4 lg:grid-cols-3\">\n <div className=\"grid grid-cols-2 gap-3 lg:col-span-2\">\n <StatTile\n label=\"Unrealized P/L\"\n value={formatMoney(totalUnrealized, currency)}\n deltaTone={totalUnrealized >= 0 ? 'positive' : 'negative'}\n icon={\n totalUnrealized >= 0 ? (\n <TrendingUp className=\"size-4\" aria-hidden=\"true\" />\n ) : (\n <TrendingDown className=\"size-4\" aria-hidden=\"true\" />\n )\n }\n />\n <StatTile label=\"Holdings\" value={String(holdings.length)} />\n <StatTile\n label=\"Gainers\"\n value={String(gainers)}\n icon={<ArrowUpRight className=\"size-4\" aria-hidden=\"true\" />}\n />\n <StatTile\n label=\"Losers\"\n value={String(losers)}\n icon={<ArrowDownRight className=\"size-4\" aria-hidden=\"true\" />}\n />\n </div>\n <div className=\"rounded-xl border border-border-subtle bg-bg-surface p-4\">\n <p className=\"mb-2 text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Allocation by asset class\n </p>\n <DonutChart\n data={allocation}\n legend={false}\n height={180}\n centerValue={formatMoney(totalMarketValue, currency)}\n centerLabel=\"market value\"\n valueFormatter={(v) => formatMoney(v, currency)}\n />\n </div>\n </div>\n\n <div className=\"space-y-6\">\n {groups.map(([assetClass, rows]) => {\n const groupTotal = rows.reduce((sum, h) => sum + unrealized(h), 0);\n return (\n <div key={assetClass} className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {humanize(assetClass)}\n </h3>\n <Badge variant=\"secondary\">{rows.length}</Badge>\n </div>\n <GainLoss value={groupTotal} currency={currency} />\n </div>\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Symbol</TableHead>\n <TableHead className=\"text-right\">Quantity</TableHead>\n <TableHead className=\"text-right\">Cost basis</TableHead>\n <TableHead className=\"text-right\">Market value</TableHead>\n <TableHead className=\"text-right\">Unrealized</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((h) => (\n <TableRow key={h.id}>\n <TableCell>\n <p className=\"font-medium text-text-primary\">{h.symbol}</p>\n {h.name ? (\n <p className=\"text-xs text-text-secondary\">{h.name}</p>\n ) : null}\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {h.quantity}\n </TableCell>\n <TableCell className=\"text-right text-text-secondary\">\n {formatMoney(h.costBasis, h.currency)}\n </TableCell>\n <TableCell className=\"text-right text-text-primary\">\n {formatMoney(h.marketValue, h.currency)}\n </TableCell>\n <TableCell className=\"text-right\">\n <GainLoss value={unrealized(h)} currency={h.currency} />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </div>\n );\n })}\n </div>\n </>\n )}\n </CardContent>\n </Card>\n );\n}\n\n/** Signed money with an arrow icon + semantic color (color is never the only signal). */\nfunction GainLoss({ value, currency }: { value: number; currency: string }) {\n const positive = value > 0;\n const negative = value < 0;\n const Icon = positive ? ArrowUpRight : negative ? ArrowDownRight : TrendingDown;\n const sign = positive ? '+' : '';\n return (\n <span\n className={`inline-flex items-center justify-end gap-1 font-semibold ${deltaToneClass(value)}`}\n >\n {value !== 0 ? <Icon className=\"size-4\" aria-hidden=\"true\" /> : null}\n {sign}\n {formatMoney(value, currency)}\n </span>\n );\n}\n\n// ============================================================================\n// Tax-insight row (acknowledge / resolve / dismiss)\n// ============================================================================\n\nfunction TaxInsightRow({\n insight,\n actionPending,\n onAcknowledge,\n onResolve,\n onDismiss,\n}: {\n insight: BraInsight;\n actionPending: boolean;\n onAcknowledge: () => void;\n onResolve: () => void;\n onDismiss: () => void;\n}) {\n const terminal = insight.status === 'RESOLVED' || insight.status === 'DISMISSED';\n return (\n <div className=\"flex items-start justify-between gap-4 rounded-lg border border-border-subtle bg-bg-surface p-4 transition-shadow motion-safe:hover:shadow-[var(--shadow-pop-hover,var(--shadow-elevation-2))]\">\n <div className=\"min-w-0 space-y-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"font-medium text-text-primary\">{insight.title}</p>\n <Badge variant={statusBadgeVariant(insight.severity)}>{humanize(insight.severity)}</Badge>\n <Badge variant={statusBadgeVariant(insight.status)}>{humanize(insight.status)}</Badge>\n </div>\n {insight.detail ? <p className=\"text-sm text-text-secondary\">{insight.detail}</p> : null}\n <p className=\"text-xs text-text-muted\">\n {humanize(insight.subjectType)} · Detected {formatDate(insight.createdAt)}\n </p>\n </div>\n {terminal ? (\n <span className=\"mt-1 text-xs text-text-muted\">Closed</span>\n ) : (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Actions for ${insight.title}`}\n disabled={actionPending}\n >\n <MoreHorizontal className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel>Actions</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {insight.status === 'OPEN' ? (\n <DropdownMenuItem onClick={onAcknowledge}>\n <Check className=\"size-4\" aria-hidden=\"true\" />\n Acknowledge\n </DropdownMenuItem>\n ) : null}\n <DropdownMenuItem onClick={onResolve}>\n <ShieldCheck className=\"size-4\" aria-hidden=\"true\" />\n Resolve\n </DropdownMenuItem>\n <DropdownMenuItem className=\"text-status-error-text\" onClick={onDismiss}>\n <X className=\"size-4\" aria-hidden=\"true\" />\n Dismiss\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/pages/_shared.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/pages/_shared.tsx"],"names":[],"mappings":"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"}
|