@burdenoff/microfe-brainyrich 2026.525.1 → 2026.706.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.
Files changed (66) hide show
  1. package/dist/brainyrich/BrainyRichRoot.js +55 -90
  2. package/dist/brainyrich/BrainyRichRoot.js.map +1 -1
  3. package/dist/brainyrich/BrainyRichRoutes.js +15 -35
  4. package/dist/brainyrich/BrainyRichRoutes.js.map +1 -1
  5. package/dist/brainyrich/components/ActorName.js +38 -0
  6. package/dist/brainyrich/components/ActorName.js.map +1 -0
  7. package/dist/brainyrich/components/ConfirmDialog.js +25 -0
  8. package/dist/brainyrich/components/ConfirmDialog.js.map +1 -0
  9. package/dist/brainyrich/components/LoadMore.js +24 -0
  10. package/dist/brainyrich/components/LoadMore.js.map +1 -0
  11. package/dist/brainyrich/components/index.js +5 -0
  12. package/dist/brainyrich/components/notify.js +38 -0
  13. package/dist/brainyrich/components/notify.js.map +1 -0
  14. package/dist/brainyrich/components/pickers.js +232 -0
  15. package/dist/brainyrich/components/pickers.js.map +1 -0
  16. package/dist/brainyrich/components/reuse/CommentThread.js +208 -0
  17. package/dist/brainyrich/components/reuse/CommentThread.js.map +1 -0
  18. package/dist/brainyrich/components/reuse/DocumentsPanel.js +237 -0
  19. package/dist/brainyrich/components/reuse/DocumentsPanel.js.map +1 -0
  20. package/dist/brainyrich/components/reuse/TagField.js +206 -0
  21. package/dist/brainyrich/components/reuse/TagField.js.map +1 -0
  22. package/dist/brainyrich/components/reuse/transport.js +24 -0
  23. package/dist/brainyrich/components/reuse/transport.js.map +1 -0
  24. package/dist/brainyrich/hooks/useBrainyRichApi.js +815 -0
  25. package/dist/brainyrich/hooks/useBrainyRichApi.js.map +1 -0
  26. package/dist/brainyrich/index.js +0 -1
  27. package/dist/brainyrich/pages/AccountsPage.js +743 -160
  28. package/dist/brainyrich/pages/AccountsPage.js.map +1 -1
  29. package/dist/brainyrich/pages/AiAssistantPage.js +556 -363
  30. package/dist/brainyrich/pages/AiAssistantPage.js.map +1 -1
  31. package/dist/brainyrich/pages/AnalyticsPage.js +601 -268
  32. package/dist/brainyrich/pages/AnalyticsPage.js.map +1 -1
  33. package/dist/brainyrich/pages/DashboardPage.js +375 -231
  34. package/dist/brainyrich/pages/DashboardPage.js.map +1 -1
  35. package/dist/brainyrich/pages/FamilyPage.js +599 -337
  36. package/dist/brainyrich/pages/FamilyPage.js.map +1 -1
  37. package/dist/brainyrich/pages/GoalsPage.js +810 -141
  38. package/dist/brainyrich/pages/GoalsPage.js.map +1 -1
  39. package/dist/brainyrich/pages/InvestmentsPage.js +410 -311
  40. package/dist/brainyrich/pages/InvestmentsPage.js.map +1 -1
  41. package/dist/brainyrich/pages/PortfoliosPage.js +867 -156
  42. package/dist/brainyrich/pages/PortfoliosPage.js.map +1 -1
  43. package/dist/brainyrich/pages/ReportsPage.js +421 -251
  44. package/dist/brainyrich/pages/ReportsPage.js.map +1 -1
  45. package/dist/brainyrich/pages/RiskPage.js +557 -194
  46. package/dist/brainyrich/pages/RiskPage.js.map +1 -1
  47. package/dist/brainyrich/pages/TaxPage.js +655 -221
  48. package/dist/brainyrich/pages/TaxPage.js.map +1 -1
  49. package/dist/brainyrich/pages/_shared.js +222 -41
  50. package/dist/brainyrich/pages/_shared.js.map +1 -1
  51. package/dist/index.js +2 -3
  52. package/dist/node_modules/sonner/dist/index.js +163 -0
  53. package/dist/node_modules/sonner/dist/index.js.map +1 -0
  54. package/package.json +3 -2
  55. package/dist/brainyrich/pages/AdvisorsPage.js +0 -375
  56. package/dist/brainyrich/pages/AdvisorsPage.js.map +0 -1
  57. package/dist/brainyrich/pages/AssistantPage.js +0 -332
  58. package/dist/brainyrich/pages/AssistantPage.js.map +0 -1
  59. package/dist/brainyrich/pages/EstatePage.js +0 -269
  60. package/dist/brainyrich/pages/EstatePage.js.map +0 -1
  61. package/dist/brainyrich/pages/InsurancePage.js +0 -181
  62. package/dist/brainyrich/pages/InsurancePage.js.map +0 -1
  63. package/dist/brainyrich/pages/MarketplacePage.js +0 -450
  64. package/dist/brainyrich/pages/MarketplacePage.js.map +0 -1
  65. package/dist/brainyrich/store/brainyrichStore.js +0 -272
  66. package/dist/brainyrich/store/brainyrichStore.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"FamilyPage.js","names":[],"sources":["../../../src/brainyrich/pages/FamilyPage.tsx"],"sourcesContent":["import {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Badge,\n Button,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Users,\n UserPlus,\n Shield,\n Target,\n TrendingUp,\n CheckCircle,\n AlertTriangle,\n} from 'lucide-react';\nimport { useBrainyRichStore } from '../store/brainyrichStore';\nimport { SectionShell, KpiGrid, formatMoney } from './_shared';\n\nconst familyMembers = [\n {\n id: 'f1',\n name: 'Vikram Raghavan',\n role: 'Primary Owner',\n status: 'Active',\n permissions: 'Full Access',\n lastActive: 'Just now',\n },\n {\n id: 'f2',\n name: 'Priya Raghavan',\n role: 'Spouse',\n status: 'Active',\n permissions: 'Financial Planning, View Accounts',\n lastActive: '30 min ago',\n },\n {\n id: 'f3',\n name: 'Aditya Raghavan',\n role: 'Child',\n status: 'Active',\n permissions: 'View Goals, Education Fund',\n lastActive: '2 hrs ago',\n },\n {\n id: 'f4',\n name: 'Kavya Raghavan',\n role: 'Child',\n status: 'Pending',\n permissions: 'View Goals, Education Fund',\n lastActive: 'Invited',\n },\n];\n\nconst familyGoals = [\n {\n id: 'fg1',\n title: 'Emergency Fund',\n category: 'Safety Net',\n target: 600000,\n current: 540000,\n status: 'On Track',\n assignees: ['Vikram', 'Priya'],\n },\n {\n id: 'fg2',\n title: \"Aditya's College Fund\",\n category: 'Education',\n target: 2500000,\n current: 1180000,\n status: 'On Track',\n assignees: ['Vikram', 'Priya', 'Aditya'],\n },\n {\n id: 'fg3',\n title: 'Family Vacation - Japan',\n category: 'Lifestyle',\n target: 400000,\n current: 310000,\n status: 'On Track',\n assignees: ['Vikram', 'Priya'],\n },\n {\n id: 'fg4',\n title: 'Home Renovation',\n category: 'Home',\n target: 1200000,\n current: 380000,\n status: 'Behind',\n assignees: ['Vikram', 'Priya'],\n },\n];\n\nexport function FamilyPage() {\n const { goals } = useBrainyRichStore();\n\n return (\n <SectionShell\n title=\"Family Wealth Hub\"\n description=\"Collaborative financial planning for your family members\"\n actionLabel=\"Invite Member\"\n badges={['4 Family Members']}\n >\n <KpiGrid\n items={[\n { label: 'Active Members', value: '3/4', trend: '1 pending invite' },\n { label: 'Family Net Worth', value: formatMoney(2450000), trend: '+6.2% YTD' },\n {\n label: 'Family Goals',\n value: `${familyGoals.filter((g) => g.status === 'On Track').length}/${familyGoals.length}`,\n trend: 'On track',\n },\n { label: 'Monthly Budget', value: formatMoney(95000), trend: 'Shared allocation' },\n ]}\n />\n\n <Tabs defaultValue=\"overview\" className=\"space-y-4\">\n <TabsList className=\"grid w-full grid-cols-3\">\n <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n <TabsTrigger value=\"members\">Members</TabsTrigger>\n <TabsTrigger value=\"goals\">Family Goals</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"overview\" className=\"space-y-4\">\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <TrendingUp className=\"h-4 w-4\" />\n Recent Family Activity\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {[\n {\n member: 'Priya Raghavan',\n action: 'Updated emergency fund goal',\n time: '2 hours ago',\n },\n {\n member: 'Vikram Raghavan',\n action: 'Added $5,000 to vacation savings',\n time: '1 day ago',\n },\n {\n member: 'Aditya Raghavan',\n action: 'Checked college fund progress',\n time: '2 days ago',\n },\n {\n member: 'Priya Raghavan',\n action: 'Invited Kavya to family account',\n time: '3 days ago',\n },\n ].map((a, i) => (\n <div key={i} className=\"flex items-center gap-3 rounded-lg border p-2.5\">\n <div className=\"flex h-8 w-8 items-center justify-center rounded-full bg-blue-100 text-xs font-bold text-blue-600\">\n {a.member\n .split(' ')\n .map((n) => n[0])\n .join('')}\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium\">{a.member}</p>\n <p className=\"text-xs text-muted-foreground\">{a.action}</p>\n </div>\n <span className=\"text-xs text-muted-foreground\">{a.time}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Target className=\"h-4 w-4\" />\n Goal Progress Summary\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {familyGoals.map((g) => {\n const pct = Math.round((g.current / g.target) * 100);\n return (\n <div key={g.id} className=\"space-y-1\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"font-medium\">{g.title}</span>\n <span>{pct}%</span>\n </div>\n <div className=\"h-2 rounded bg-muted overflow-hidden\">\n <div\n className={`h-2 rounded ${g.status === 'On Track' ? 'bg-emerald-500' : 'bg-yellow-500'}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n <div className=\"flex justify-between text-xs text-muted-foreground\">\n <span>{formatMoney(g.current)}</span>\n <span>{formatMoney(g.target)}</span>\n </div>\n </div>\n );\n })}\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Family Financial Health</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n {[\n {\n icon: CheckCircle,\n label: 'Emergency Fund',\n detail: '90% funded',\n color: 'bg-emerald-50 text-emerald-600',\n },\n {\n icon: TrendingUp,\n label: 'Savings Rate',\n detail: '24% monthly',\n color: 'bg-blue-50 text-blue-600',\n },\n {\n icon: AlertTriangle,\n label: 'Insurance Review',\n detail: 'Due for update',\n color: 'bg-yellow-50 text-yellow-600',\n },\n ].map((item) => (\n <div\n key={item.label}\n className={`text-center p-4 rounded-lg ${item.color.split(' ')[0]}`}\n >\n <item.icon className={`h-7 w-7 mx-auto mb-2 ${item.color.split(' ')[1]}`} />\n <p className=\"font-semibold text-sm\">{item.label}</p>\n <p className=\"text-xs text-muted-foreground\">{item.detail}</p>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"members\" className=\"space-y-4\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <div>\n <CardTitle>Family Members</CardTitle>\n <CardDescription>Manage access and permissions</CardDescription>\n </div>\n <Button size=\"sm\">\n <UserPlus className=\"mr-1 h-4 w-4\" />\n Invite\n </Button>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {familyMembers.map((m) => (\n <div key={m.id} className=\"flex items-center justify-between rounded-lg border p-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-blue-100 font-bold text-sm text-blue-600\">\n {m.name\n .split(' ')\n .map((n) => n[0])\n .join('')}\n </div>\n <div>\n <p className=\"font-medium text-sm\">{m.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {m.role} &middot; {m.permissions}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Badge variant={m.status === 'Active' ? 'default' : 'secondary'}>\n {m.status}\n </Badge>\n <span className=\"text-xs text-muted-foreground\">{m.lastActive}</span>\n <Button variant=\"outline\" size=\"sm\">\n <Shield className=\"h-3 w-3\" />\n </Button>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"goals\" className=\"space-y-4\">\n {familyGoals.map((g) => {\n const pct = Math.round((g.current / g.target) * 100);\n return (\n <Card key={g.id}>\n <CardContent className=\"p-4 space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div>\n <p className=\"font-semibold\">{g.title}</p>\n <p className=\"text-xs text-muted-foreground\">\n {g.category} &middot; Assigned to: {g.assignees.join(', ')}\n </p>\n </div>\n <Badge variant={g.status === 'On Track' ? 'default' : 'secondary'}>\n {g.status}\n </Badge>\n </div>\n <div className=\"h-3 rounded bg-muted overflow-hidden\">\n <div\n className={`h-3 rounded ${g.status === 'On Track' ? 'bg-emerald-500' : 'bg-yellow-500'}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n <div className=\"flex justify-between text-sm\">\n <span>{formatMoney(g.current)} saved</span>\n <span className=\"font-medium\">\n {pct}% of {formatMoney(g.target)}\n </span>\n </div>\n </CardContent>\n </Card>\n );\n })}\n </TabsContent>\n </Tabs>\n </SectionShell>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FamilyPage.js","names":[],"sources":["../../../src/brainyrich/pages/FamilyPage.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Users,\n MoreHorizontal,\n Pencil,\n Archive,\n Eye,\n Mail,\n Wallet,\n Target,\n Briefcase,\n} from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport {\n usePagedHouseholds,\n useHousehold,\n useCreateHousehold,\n useUpdateHousehold,\n useArchiveHousehold,\n useAccounts,\n usePortfolios,\n useGoals,\n} from '../hooks/useBrainyRichApi';\nimport { ConfirmDialog, LoadMore, ActorName } from '../components';\nimport { TagField } from '../components/reuse/TagField';\nimport { DocumentsPanel } from '../components/reuse/DocumentsPanel';\nimport { CommentThread } from '../components/reuse/CommentThread';\nimport type {\n BraHousehold,\n BraHouseholdStatus,\n BraRiskProfile,\n BraCreateHouseholdInput,\n BraUpdateHouseholdInput,\n} from '../types/bra';\nimport {\n SectionShell,\n KpiGrid,\n EmptyState,\n LoadingState,\n ErrorState,\n formatMoney,\n formatDate,\n statusBadgeVariant,\n} from './_shared';\n\nconst STATUS_OPTIONS: BraHouseholdStatus[] = ['PROSPECT', 'ONBOARDING', 'ACTIVE', 'INACTIVE'];\nconst RISK_OPTIONS: BraRiskProfile[] = [\n 'CONSERVATIVE',\n 'MODERATE',\n 'BALANCED',\n 'GROWTH',\n 'AGGRESSIVE',\n];\nconst CURRENCY_OPTIONS = ['USD', 'EUR', 'GBP', 'INR', 'AED', 'SGD'];\n\ninterface HouseholdFormState {\n name: string;\n status: BraHouseholdStatus;\n riskProfile: BraRiskProfile;\n currency: string;\n advisorId: string;\n primaryContactName: string;\n primaryContactEmail: string;\n notes: string;\n tags: string;\n}\n\nconst emptyForm: HouseholdFormState = {\n name: '',\n status: 'PROSPECT',\n riskProfile: 'BALANCED',\n currency: 'USD',\n advisorId: '',\n primaryContactName: '',\n primaryContactEmail: '',\n notes: '',\n tags: '',\n};\n\nfunction toTags(raw: string): string[] {\n return raw\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean);\n}\n\nexport function FamilyPage() {\n const { t } = useI18n();\n const tr = (key: string, fallback: string, params?: Record<string, string | number>) =>\n tWithFallback(t, key, fallback, params);\n\n const {\n items: households,\n hasMore,\n loadMore,\n isLoading,\n isFetchingNextPage,\n isError,\n refetch,\n } = usePagedHouseholds();\n\n const createHousehold = useCreateHousehold();\n const updateHousehold = useUpdateHousehold();\n const archiveHousehold = useArchiveHousehold();\n\n const [formOpen, setFormOpen] = useState(false);\n const [editing, setEditing] = useState<BraHousehold | null>(null);\n const [form, setForm] = useState<HouseholdFormState>(emptyForm);\n const [detailId, setDetailId] = useState<string | undefined>(undefined);\n const [archiveTarget, setArchiveTarget] = useState<BraHousehold | null>(null);\n\n const setField = <K extends keyof HouseholdFormState>(key: K, value: HouseholdFormState[K]) =>\n setForm((prev) => ({ ...prev, [key]: value }));\n\n const openCreate = () => {\n setEditing(null);\n setForm(emptyForm);\n setFormOpen(true);\n };\n\n const openEdit = (h: BraHousehold) => {\n setEditing(h);\n setForm({\n name: h.name,\n status: h.status,\n riskProfile: h.riskProfile,\n currency: h.currency,\n advisorId: h.advisorId ?? '',\n primaryContactName: h.primaryContactName ?? '',\n primaryContactEmail: h.primaryContactEmail ?? '',\n notes: h.notes ?? '',\n tags: h.tags.join(', '),\n });\n setFormOpen(true);\n };\n\n const kpis = useMemo(() => {\n const total = households.length;\n const active = households.filter((h) => h.status === 'ACTIVE').length;\n const pipeline = households.filter(\n (h) => h.status === 'PROSPECT' || h.status === 'ONBOARDING'\n ).length;\n const aum = households.reduce((sum, h) => sum + (Number.isFinite(h.aum) ? h.aum : 0), 0);\n const currency = households[0]?.currency ?? 'USD';\n return { total, active, pipeline, aum, currency };\n }, [households]);\n\n const submitting = createHousehold.isPending || updateHousehold.isPending;\n const canSubmit = form.name.trim().length > 0 && !submitting;\n\n const handleSubmit = () => {\n if (!canSubmit) return;\n if (editing) {\n const input: BraUpdateHouseholdInput = {\n name: form.name.trim(),\n status: form.status,\n riskProfile: form.riskProfile,\n currency: form.currency,\n primaryContactName: form.primaryContactName.trim() || null,\n primaryContactEmail: form.primaryContactEmail.trim() || null,\n notes: form.notes.trim() || null,\n tags: toTags(form.tags),\n };\n updateHousehold.mutate({ id: editing.id, input }, { onSuccess: () => setFormOpen(false) });\n } else {\n const input: BraCreateHouseholdInput = {\n name: form.name.trim(),\n status: form.status,\n riskProfile: form.riskProfile,\n currency: form.currency,\n primaryContactName: form.primaryContactName.trim() || null,\n primaryContactEmail: form.primaryContactEmail.trim() || null,\n notes: form.notes.trim() || null,\n tags: toTags(form.tags),\n };\n if (form.advisorId.trim()) input.advisorId = form.advisorId.trim();\n createHousehold.mutate(input, { onSuccess: () => setFormOpen(false) });\n }\n };\n\n return (\n <SectionShell\n title={tr('brainyrich.households.title', 'Households')}\n description={tr(\n 'brainyrich.households.description',\n 'Client households and family units under advisement'\n )}\n badges={\n households.length\n ? [tr('brainyrich.households.count', '{count} households', { count: households.length })]\n : []\n }\n actionLabel={tr('brainyrich.households.new', 'New household')}\n onAction={openCreate}\n >\n <KpiGrid\n items={[\n {\n label: tr('brainyrich.households.kpi.total', 'Households'),\n value: String(kpis.total),\n },\n {\n label: tr('brainyrich.households.kpi.active', 'Active'),\n value: String(kpis.active),\n },\n {\n label: tr('brainyrich.households.kpi.pipeline', 'In pipeline'),\n value: String(kpis.pipeline),\n trend: tr('brainyrich.households.kpi.pipelineHint', 'Prospect + onboarding'),\n },\n {\n label: tr('brainyrich.households.kpi.aum', 'Total AUM'),\n value: formatMoney(kpis.aum, kpis.currency),\n },\n ]}\n />\n\n {isLoading ? (\n <LoadingState rows={5} />\n ) : isError ? (\n <ErrorState\n title={tr('brainyrich.households.error.title', 'Could not load households')}\n onRetry={() => refetch()}\n />\n ) : households.length === 0 ? (\n <EmptyState\n icon={<Users className=\"size-6\" aria-hidden=\"true\" />}\n title={tr('brainyrich.households.empty.title', 'No households yet')}\n description={tr(\n 'brainyrich.households.empty.description',\n 'Create your first client household to start organizing accounts, portfolios and goals.'\n )}\n action={\n <Button size=\"sm\" onClick={openCreate}>\n {tr('brainyrich.households.new', 'New household')}\n </Button>\n }\n />\n ) : (\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{tr('brainyrich.households.col.name', 'Household')}</TableHead>\n <TableHead>{tr('brainyrich.households.col.status', 'Status')}</TableHead>\n <TableHead>{tr('brainyrich.households.col.risk', 'Risk profile')}</TableHead>\n <TableHead>\n {tr('brainyrich.households.col.contact', 'Primary contact')}\n </TableHead>\n <TableHead className=\"text-right\">\n {tr('brainyrich.households.col.aum', 'AUM')}\n </TableHead>\n <TableHead className=\"w-12 text-right\">\n <span className=\"sr-only\">\n {tr('brainyrich.households.col.actions', 'Actions')}\n </span>\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {households.map((h) => (\n <TableRow key={h.id}>\n <TableCell>\n <button\n type=\"button\"\n className=\"text-left font-medium text-text-primary hover:underline\"\n onClick={() => setDetailId(h.id)}\n >\n {h.name}\n </button>\n {h.tags.length > 0 ? (\n <div className=\"mt-1 flex flex-wrap gap-1\">\n {h.tags.map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n ) : null}\n </TableCell>\n <TableCell>\n <Badge variant={statusBadgeVariant(h.status)}>{h.status}</Badge>\n </TableCell>\n <TableCell>\n <Badge variant=\"secondary\">{h.riskProfile}</Badge>\n </TableCell>\n <TableCell>\n {h.primaryContactName ? (\n <div className=\"space-y-0.5\">\n <p className=\"text-sm text-text-primary\">{h.primaryContactName}</p>\n {h.primaryContactEmail ? (\n <p className=\"flex items-center gap-1 text-xs text-text-secondary\">\n <Mail className=\"size-3\" aria-hidden=\"true\" />\n {h.primaryContactEmail}\n </p>\n ) : null}\n </div>\n ) : (\n <span className=\"text-sm text-text-muted\">—</span>\n )}\n </TableCell>\n <TableCell className=\"text-right font-medium text-text-primary\">\n {formatMoney(h.aum, h.currency)}\n </TableCell>\n <TableCell className=\"text-right\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={tr('brainyrich.households.rowMenu', 'Household actions')}\n >\n <MoreHorizontal className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setDetailId(h.id)}>\n <Eye className=\"size-4\" aria-hidden=\"true\" />\n {tr('brainyrich.households.action.view', 'View details')}\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => openEdit(h)}>\n <Pencil className=\"size-4\" aria-hidden=\"true\" />\n {tr('brainyrich.households.action.edit', 'Edit')}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"text-status-error-text focus:text-status-error-text\"\n onClick={() => setArchiveTarget(h)}\n >\n <Archive className=\"size-4\" aria-hidden=\"true\" />\n {tr('brainyrich.households.action.archive', 'Archive')}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </CardContent>\n </Card>\n )}\n\n {!isLoading && !isError && households.length > 0 ? (\n <LoadMore\n hasMore={hasMore}\n onClick={loadMore}\n loading={isFetchingNextPage}\n label={tr('brainyrich.households.loadMore', 'Load more households')}\n />\n ) : null}\n\n <HouseholdFormDialog\n open={formOpen}\n onOpenChange={setFormOpen}\n editing={editing}\n form={form}\n setField={setField}\n onSubmit={handleSubmit}\n canSubmit={canSubmit}\n submitting={submitting}\n tr={tr}\n />\n\n <HouseholdDetailSheet\n householdId={detailId}\n onClose={() => setDetailId(undefined)}\n onEdit={(h) => {\n setDetailId(undefined);\n openEdit(h);\n }}\n tr={tr}\n />\n\n <ConfirmDialog\n open={Boolean(archiveTarget)}\n onOpenChange={(o) => (!o ? setArchiveTarget(null) : undefined)}\n title={tr('brainyrich.households.archive.title', 'Archive household?')}\n description={tr(\n 'brainyrich.households.archive.description',\n 'Archiving “{name}” removes it from the active list. You can still access its records, but it will no longer appear here.',\n { name: archiveTarget?.name ?? '' }\n )}\n confirmLabel={tr('brainyrich.households.action.archive', 'Archive')}\n pendingLabel={tr('brainyrich.households.archive.pending', 'Archiving…')}\n destructive\n pending={archiveHousehold.isPending}\n onConfirm={() => {\n if (!archiveTarget) return;\n archiveHousehold.mutate(archiveTarget.id, {\n onSuccess: () => setArchiveTarget(null),\n });\n }}\n />\n </SectionShell>\n );\n}\n\n// ============================================================================\n// Create / edit dialog\n// ============================================================================\n\ninterface HouseholdFormDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n editing: BraHousehold | null;\n form: HouseholdFormState;\n setField: <K extends keyof HouseholdFormState>(key: K, value: HouseholdFormState[K]) => void;\n onSubmit: () => void;\n canSubmit: boolean;\n submitting: boolean;\n tr: (key: string, fallback: string, params?: Record<string, string | number>) => string;\n}\n\nfunction HouseholdFormDialog({\n open,\n onOpenChange,\n editing,\n form,\n setField,\n onSubmit,\n canSubmit,\n submitting,\n tr,\n}: HouseholdFormDialogProps) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-h-[90vh] overflow-y-auto sm:max-w-lg\">\n <DialogHeader>\n <DialogTitle>\n {editing\n ? tr('brainyrich.households.form.editTitle', 'Edit household')\n : tr('brainyrich.households.form.createTitle', 'New household')}\n </DialogTitle>\n <DialogDescription>\n {tr(\n 'brainyrich.households.form.subtitle',\n 'A household groups a client family’s accounts, portfolios and goals.'\n )}\n </DialogDescription>\n </DialogHeader>\n\n <form\n className=\"space-y-4\"\n onSubmit={(e) => {\n e.preventDefault();\n onSubmit();\n }}\n >\n <div className=\"space-y-2\">\n <Label htmlFor=\"hh-name\">{tr('brainyrich.households.form.name', 'Name')} *</Label>\n <Input\n id=\"hh-name\"\n value={form.name}\n onChange={(e) => setField('name', e.target.value)}\n placeholder={tr('brainyrich.households.form.namePh', 'e.g. The Raghavan Family')}\n required\n />\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>{tr('brainyrich.households.form.status', 'Status')}</Label>\n <Select\n value={form.status}\n onValueChange={(v) => setField('status', v as BraHouseholdStatus)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {STATUS_OPTIONS.map((s) => (\n <SelectItem key={s} value={s}>\n {s}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <Label>{tr('brainyrich.households.form.risk', 'Risk profile')}</Label>\n <Select\n value={form.riskProfile}\n onValueChange={(v) => setField('riskProfile', v as BraRiskProfile)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {RISK_OPTIONS.map((r) => (\n <SelectItem key={r} value={r}>\n {r}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"hh-contact-name\">\n {tr('brainyrich.households.form.contactName', 'Primary contact')}\n </Label>\n <Input\n id=\"hh-contact-name\"\n value={form.primaryContactName}\n onChange={(e) => setField('primaryContactName', e.target.value)}\n placeholder={tr('brainyrich.households.form.contactNamePh', 'Full name')}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"hh-contact-email\">\n {tr('brainyrich.households.form.contactEmail', 'Contact email')}\n </Label>\n <Input\n id=\"hh-contact-email\"\n type=\"email\"\n value={form.primaryContactEmail}\n onChange={(e) => setField('primaryContactEmail', e.target.value)}\n placeholder=\"name@example.com\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>{tr('brainyrich.households.form.currency', 'Currency')}</Label>\n <Select value={form.currency} onValueChange={(v) => setField('currency', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {CURRENCY_OPTIONS.map((c) => (\n <SelectItem key={c} value={c}>\n {c}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {!editing ? (\n <div className=\"space-y-2\">\n <Label htmlFor=\"hh-advisor\">\n {tr('brainyrich.households.form.advisor', 'Advisor ID')}\n </Label>\n <Input\n id=\"hh-advisor\"\n value={form.advisorId}\n onChange={(e) => setField('advisorId', e.target.value)}\n placeholder={tr('brainyrich.households.form.advisorPh', 'Optional')}\n />\n </div>\n ) : null}\n </div>\n\n {editing ? (\n <TagField\n entityType=\"brainyrich-household\"\n entityId={editing.id}\n label={tr('brainyrich.households.form.tags', 'Tags')}\n />\n ) : (\n <div className=\"space-y-2\">\n <Label htmlFor=\"hh-tags\">{tr('brainyrich.households.form.tags', 'Tags')}</Label>\n <Input\n id=\"hh-tags\"\n value={form.tags}\n onChange={(e) => setField('tags', e.target.value)}\n placeholder={tr('brainyrich.households.form.tagsPh', 'Comma-separated')}\n />\n </div>\n )}\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"hh-notes\">{tr('brainyrich.households.form.notes', 'Notes')}</Label>\n <Textarea\n id=\"hh-notes\"\n value={form.notes}\n onChange={(e) => setField('notes', e.target.value)}\n rows={3}\n />\n </div>\n\n <DialogFooter>\n <DialogClose asChild>\n <Button type=\"button\" variant=\"outline\">\n {tr('brainyrich.common.cancel', 'Cancel')}\n </Button>\n </DialogClose>\n <Button type=\"submit\" disabled={!canSubmit}>\n {submitting\n ? tr('brainyrich.common.saving', 'Saving…')\n : editing\n ? tr('brainyrich.common.save', 'Save changes')\n : tr('brainyrich.households.form.create', 'Create household')}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\n// ============================================================================\n// Detail sheet\n// ============================================================================\n\ninterface HouseholdDetailSheetProps {\n householdId: string | undefined;\n onClose: () => void;\n onEdit: (h: BraHousehold) => void;\n tr: (key: string, fallback: string, params?: Record<string, string | number>) => string;\n}\n\nfunction HouseholdDetailSheet({ householdId, onClose, onEdit, tr }: HouseholdDetailSheetProps) {\n const { data: household, isLoading, isError, refetch } = useHousehold(householdId);\n const { data: accounts } = useAccounts(householdId ? { householdId } : {});\n const { data: portfolios } = usePortfolios(householdId ? { householdId } : {});\n const { data: goals } = useGoals(householdId ? { householdId } : {});\n\n const open = Boolean(householdId);\n\n return (\n <Sheet open={open} onOpenChange={(o) => (!o ? onClose() : undefined)}>\n <SheetContent className=\"w-full overflow-y-auto sm:max-w-md\">\n {isLoading ? (\n <div className=\"p-2\">\n <LoadingState rows={4} />\n </div>\n ) : isError ? (\n <ErrorState\n title={tr('brainyrich.households.detail.error', 'Could not load household')}\n onRetry={() => refetch()}\n />\n ) : !household ? (\n <EmptyState\n icon={<Users className=\"size-6\" aria-hidden=\"true\" />}\n title={tr('brainyrich.households.detail.missing', 'Household not found')}\n />\n ) : (\n <div className=\"space-y-6\">\n <SheetHeader className=\"space-y-2\">\n <SheetTitle>{household.name}</SheetTitle>\n <SheetDescription>\n {tr('brainyrich.households.detail.subtitle', 'Household overview')}\n </SheetDescription>\n <div className=\"flex flex-wrap items-center gap-2 pt-1\">\n <Badge variant={statusBadgeVariant(household.status)}>{household.status}</Badge>\n <Badge variant=\"secondary\">{household.riskProfile}</Badge>\n </div>\n </SheetHeader>\n\n <div className=\"grid grid-cols-3 gap-3\">\n <SummaryTile\n icon={<Wallet className=\"size-4\" aria-hidden=\"true\" />}\n label={tr('brainyrich.households.detail.accounts', 'Accounts')}\n value={String(accounts.length)}\n />\n <SummaryTile\n icon={<Briefcase className=\"size-4\" aria-hidden=\"true\" />}\n label={tr('brainyrich.households.detail.portfolios', 'Portfolios')}\n value={String(portfolios.length)}\n />\n <SummaryTile\n icon={<Target className=\"size-4\" aria-hidden=\"true\" />}\n label={tr('brainyrich.households.detail.goals', 'Goals')}\n value={String(goals.length)}\n />\n </div>\n\n <Card>\n <CardContent className=\"space-y-3 p-4 text-sm\">\n <DetailRow\n label={tr('brainyrich.households.detail.aum', 'AUM')}\n value={formatMoney(household.aum, household.currency)}\n />\n <DetailRow\n label={tr('brainyrich.households.form.currency', 'Currency')}\n value={household.currency}\n />\n <DetailRow\n label={tr('brainyrich.households.detail.contact', 'Primary contact')}\n value={household.primaryContactName ?? '—'}\n />\n <DetailRow\n label={tr('brainyrich.households.form.contactEmail', 'Contact email')}\n value={household.primaryContactEmail ?? '—'}\n />\n <div className=\"flex items-center justify-between gap-4\">\n <span className=\"text-text-secondary\">\n {tr('brainyrich.households.detail.advisor', 'Advisor')}\n </span>\n <span className=\"text-right font-medium text-text-primary\">\n {household.advisorId ? (\n <ActorName id={household.advisorId} />\n ) : (\n tr('brainyrich.common.unassigned', 'Unassigned')\n )}\n </span>\n </div>\n <DetailRow\n label={tr('brainyrich.households.detail.created', 'Created')}\n value={formatDate(household.createdAt)}\n />\n <DetailRow\n label={tr('brainyrich.households.detail.updated', 'Last updated')}\n value={formatDate(household.updatedAt)}\n />\n </CardContent>\n </Card>\n\n {household.tags.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\">\n {household.tags.map((tag) => (\n <Badge key={tag} variant=\"outline\">\n {tag}\n </Badge>\n ))}\n </div>\n ) : null}\n\n {household.notes ? (\n <div className=\"space-y-1\">\n <p className=\"text-xs font-medium text-text-secondary\">\n {tr('brainyrich.households.detail.summary', 'Summary')}\n </p>\n <p className=\"text-sm text-text-primary\">{household.notes}</p>\n </div>\n ) : null}\n\n <DocumentsPanel\n entityType=\"brainyrich-household\"\n entityId={household.id}\n heading={tr('brainyrich.households.detail.documents', 'Documents')}\n />\n\n <CommentThread\n entityType=\"brainyrich-household\"\n entityId={household.id}\n heading={tr('brainyrich.households.detail.discussion', 'Discussion')}\n />\n\n <Button variant=\"outline\" className=\"w-full\" onClick={() => onEdit(household)}>\n <Pencil className=\"size-4\" aria-hidden=\"true\" />\n {tr('brainyrich.households.action.edit', 'Edit')}\n </Button>\n </div>\n )}\n </SheetContent>\n </Sheet>\n );\n}\n\nfunction SummaryTile({ icon, label, value }: { icon: ReactNode; label: string; value: string }) {\n return (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3 text-center\">\n <div className=\"mx-auto mb-1 flex size-8 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n {icon}\n </div>\n <p className=\"text-lg font-semibold text-text-primary\">{value}</p>\n <p className=\"text-xs text-text-secondary\">{label}</p>\n </div>\n );\n}\n\nfunction DetailRow({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex items-center justify-between gap-4\">\n <span className=\"text-text-secondary\">{label}</span>\n <span className=\"text-right font-medium text-text-primary\">{value}</span>\n </div>\n );\n}\n"],"mappings":"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"}