@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.
- package/dist/brainyrich/BrainyRichRoot.js +55 -90
- package/dist/brainyrich/BrainyRichRoot.js.map +1 -1
- package/dist/brainyrich/BrainyRichRoutes.js +15 -35
- package/dist/brainyrich/BrainyRichRoutes.js.map +1 -1
- package/dist/brainyrich/components/ActorName.js +38 -0
- package/dist/brainyrich/components/ActorName.js.map +1 -0
- package/dist/brainyrich/components/ConfirmDialog.js +25 -0
- package/dist/brainyrich/components/ConfirmDialog.js.map +1 -0
- package/dist/brainyrich/components/LoadMore.js +24 -0
- package/dist/brainyrich/components/LoadMore.js.map +1 -0
- package/dist/brainyrich/components/index.js +5 -0
- package/dist/brainyrich/components/notify.js +38 -0
- package/dist/brainyrich/components/notify.js.map +1 -0
- package/dist/brainyrich/components/pickers.js +232 -0
- package/dist/brainyrich/components/pickers.js.map +1 -0
- package/dist/brainyrich/components/reuse/CommentThread.js +208 -0
- package/dist/brainyrich/components/reuse/CommentThread.js.map +1 -0
- package/dist/brainyrich/components/reuse/DocumentsPanel.js +237 -0
- package/dist/brainyrich/components/reuse/DocumentsPanel.js.map +1 -0
- package/dist/brainyrich/components/reuse/TagField.js +206 -0
- package/dist/brainyrich/components/reuse/TagField.js.map +1 -0
- package/dist/brainyrich/components/reuse/transport.js +24 -0
- package/dist/brainyrich/components/reuse/transport.js.map +1 -0
- package/dist/brainyrich/hooks/useBrainyRichApi.js +815 -0
- package/dist/brainyrich/hooks/useBrainyRichApi.js.map +1 -0
- package/dist/brainyrich/index.js +0 -1
- package/dist/brainyrich/pages/AccountsPage.js +743 -160
- package/dist/brainyrich/pages/AccountsPage.js.map +1 -1
- package/dist/brainyrich/pages/AiAssistantPage.js +556 -363
- package/dist/brainyrich/pages/AiAssistantPage.js.map +1 -1
- package/dist/brainyrich/pages/AnalyticsPage.js +601 -268
- package/dist/brainyrich/pages/AnalyticsPage.js.map +1 -1
- package/dist/brainyrich/pages/DashboardPage.js +375 -231
- package/dist/brainyrich/pages/DashboardPage.js.map +1 -1
- package/dist/brainyrich/pages/FamilyPage.js +599 -337
- package/dist/brainyrich/pages/FamilyPage.js.map +1 -1
- package/dist/brainyrich/pages/GoalsPage.js +810 -141
- package/dist/brainyrich/pages/GoalsPage.js.map +1 -1
- package/dist/brainyrich/pages/InvestmentsPage.js +410 -311
- package/dist/brainyrich/pages/InvestmentsPage.js.map +1 -1
- package/dist/brainyrich/pages/PortfoliosPage.js +867 -156
- package/dist/brainyrich/pages/PortfoliosPage.js.map +1 -1
- package/dist/brainyrich/pages/ReportsPage.js +421 -251
- package/dist/brainyrich/pages/ReportsPage.js.map +1 -1
- package/dist/brainyrich/pages/RiskPage.js +557 -194
- package/dist/brainyrich/pages/RiskPage.js.map +1 -1
- package/dist/brainyrich/pages/TaxPage.js +655 -221
- package/dist/brainyrich/pages/TaxPage.js.map +1 -1
- package/dist/brainyrich/pages/_shared.js +222 -41
- package/dist/brainyrich/pages/_shared.js.map +1 -1
- package/dist/index.js +2 -3
- package/dist/node_modules/sonner/dist/index.js +163 -0
- package/dist/node_modules/sonner/dist/index.js.map +1 -0
- package/package.json +3 -2
- package/dist/brainyrich/pages/AdvisorsPage.js +0 -375
- package/dist/brainyrich/pages/AdvisorsPage.js.map +0 -1
- package/dist/brainyrich/pages/AssistantPage.js +0 -332
- package/dist/brainyrich/pages/AssistantPage.js.map +0 -1
- package/dist/brainyrich/pages/EstatePage.js +0 -269
- package/dist/brainyrich/pages/EstatePage.js.map +0 -1
- package/dist/brainyrich/pages/InsurancePage.js +0 -181
- package/dist/brainyrich/pages/InsurancePage.js.map +0 -1
- package/dist/brainyrich/pages/MarketplacePage.js +0 -450
- package/dist/brainyrich/pages/MarketplacePage.js.map +0 -1
- package/dist/brainyrich/store/brainyrichStore.js +0 -272
- package/dist/brainyrich/store/brainyrichStore.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../src/brainyrich/pages/DashboardPage.tsx"],"sourcesContent":["import {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Button,\n Badge,\n} from '@burdenoff/fe-libs/ui';\nimport {\n TrendingUp,\n Target,\n Bell,\n Briefcase,\n ArrowUpRight,\n ArrowDownRight,\n BarChart3,\n Wallet,\n} from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useBrainyRichStore } from '../store/brainyrichStore';\nimport { tWithFallback } from '../utils/i18n';\nimport { SectionShell, KpiGrid, formatMoney, statusBadgeVariant } from './_shared';\n\nconst marketIndices = [\n { name: 'S&P 500', value: '5,321.08', change: '+1.2%', positive: true },\n { name: 'NIFTY 50', value: '23,851.40', change: '+0.8%', positive: true },\n { name: 'NASDAQ', value: '16,742.39', change: '-0.3%', positive: false },\n];\n\nexport function DashboardPage() {\n const { t } = useI18n();\n const { metrics, workItems, portfolios, holdings, goals } = useBrainyRichStore();\n const translate = (key: string, fallback: string, params?: Record<string, string | number>) =>\n tWithFallback(t, key, fallback, params);\n\n const translatedMetrics = metrics.map((metric) => ({\n ...metric,\n label:\n metric.label === 'Net Worth'\n ? translate('brainyrich.dashboard.metrics.netWorth', 'Net Worth')\n : metric.label === 'Invested Assets'\n ? translate('brainyrich.dashboard.metrics.investedAssets', 'Invested Assets')\n : metric.label === 'Liquidity'\n ? translate('brainyrich.dashboard.metrics.liquidity', 'Liquidity')\n : metric.label === 'Goal Completion'\n ? translate('brainyrich.dashboard.metrics.goalCompletion', 'Goal Completion')\n : metric.label,\n }));\n\n const totalPortfolioValue = portfolios.reduce((s, p) => s + p.value, 0);\n const overallGoalPct = goals.length\n ? Math.round(\n goals.reduce((s, g) => s + (g.currentAmount / g.targetAmount) * 100, 0) / goals.length\n )\n : 0;\n\n return (\n <SectionShell\n title={translate('brainyrich.dashboard.title', 'Wealth Dashboard')}\n description={translate(\n 'brainyrich.dashboard.description',\n 'Your consolidated financial overview at a glance'\n )}\n actionLabel={translate('brainyrich.dashboard.actions.healthCheck', 'Run Health Check')}\n badges={[translate('brainyrich.dashboard.badges.liveData', 'Live Data')]}\n >\n {/* KPI row */}\n <KpiGrid items={translatedMetrics} />\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Portfolio summary */}\n <Card className=\"lg:col-span-2\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Briefcase className=\"h-5 w-5\" />\n {translate('brainyrich.dashboard.sections.portfolioSnapshot', 'Portfolio Snapshot')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.dashboard.sections.portfolioSnapshotDescription',\n 'Current allocation across strategies'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex items-baseline justify-between\">\n <span className=\"text-2xl font-bold\">{formatMoney(totalPortfolioValue)}</span>\n <span className=\"text-sm text-emerald-600 flex items-center gap-1\">\n <TrendingUp className=\"h-3 w-3\" />\n {translate('brainyrich.dashboard.weightedYtdPrefix', 'Weighted YTD +')}\n {(\n portfolios.reduce((s, p) => s + p.ytdReturnPct * p.value, 0) / totalPortfolioValue\n ).toFixed(1)}\n %\n </span>\n </div>\n {portfolios.map((p) => {\n const pct = Math.round((p.value / totalPortfolioValue) * 100);\n return (\n <div key={p.id} className=\"space-y-1\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"font-medium\">{p.name}</span>\n <span>\n {formatMoney(p.value)} ({pct}%)\n </span>\n </div>\n <div className=\"h-2 rounded bg-muted overflow-hidden\">\n <div className=\"h-2 rounded bg-primary\" style={{ width: `${pct}%` }} />\n </div>\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span>\n {translate('brainyrich.dashboard.portfolio.ytdPrefix', 'YTD +')}\n {p.ytdReturnPct}%\n </span>\n <Badge\n variant={\n p.risk === 'High'\n ? 'destructive'\n : p.risk === 'Moderate'\n ? 'secondary'\n : 'outline'\n }\n className=\"text-[10px]\"\n >\n {p.risk}\n </Badge>\n </div>\n </div>\n );\n })}\n </CardContent>\n </Card>\n\n {/* Market indices */}\n <div className=\"space-y-4\">\n <Card>\n <CardHeader className=\"pb-3\">\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <BarChart3 className=\"h-4 w-4\" />\n {translate('brainyrich.dashboard.sections.marketSummary', 'Market Summary')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {marketIndices.map((idx) => (\n <div key={idx.name} className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">{idx.name}</span>\n <div className=\"text-right\">\n <div className=\"text-sm\">{idx.value}</div>\n <div\n className={`text-xs flex items-center gap-0.5 ${idx.positive ? 'text-emerald-600' : 'text-red-600'}`}\n >\n {idx.positive ? (\n <ArrowUpRight className=\"h-3 w-3\" />\n ) : (\n <ArrowDownRight className=\"h-3 w-3\" />\n )}\n {idx.change}\n </div>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader className=\"pb-3\">\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Target className=\"h-4 w-4\" />\n {translate('brainyrich.dashboard.sections.goalProgress', 'Goal Progress')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <div className=\"text-center\">\n <span className=\"text-3xl font-bold\">{overallGoalPct}%</span>\n <p className=\"text-xs text-muted-foreground mt-1\">\n {translate(\n 'brainyrich.dashboard.goalProgress.averageCompletion',\n 'Average goal completion'\n )}\n </p>\n </div>\n {goals.map((g) => {\n const pct = Math.round((g.currentAmount / g.targetAmount) * 100);\n return (\n <div key={g.id} className=\"space-y-1\">\n <div className=\"flex justify-between text-xs\">\n <span>{g.title}</span>\n <span>{pct}%</span>\n </div>\n <div className=\"h-1.5 rounded bg-muted overflow-hidden\">\n <div className=\"h-1.5 rounded bg-emerald-500\" style={{ width: `${pct}%` }} />\n </div>\n </div>\n );\n })}\n </CardContent>\n </Card>\n </div>\n </div>\n\n {/* Top holdings row */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wallet className=\"h-5 w-5\" />\n {translate('brainyrich.dashboard.sections.topHoldings', 'Top Holdings')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.dashboard.sections.topHoldingsDescription',\n 'Highest-value positions across all portfolios'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n {holdings.map((h) => (\n <div\n key={h.symbol}\n className=\"flex items-center justify-between rounded-lg border p-3\"\n >\n <div>\n <p className=\"font-semibold text-sm\">{h.symbol}</p>\n <p className=\"text-xs text-muted-foreground\">{h.sector}</p>\n </div>\n <div className=\"text-right\">\n <p className=\"text-sm font-medium\">{formatMoney(h.marketValue)}</p>\n <p\n className={`text-xs ${h.changePct >= 0 ? 'text-emerald-600' : 'text-red-600'}`}\n >\n {h.changePct >= 0 ? '+' : ''}\n {h.changePct}%\n </p>\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n\n {/* Work items */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Bell className=\"h-5 w-5\" />\n {translate('brainyrich.dashboard.sections.activeWorkItems', 'Active Work Items')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.dashboard.sections.activeWorkItemsDescription',\n 'Tasks and initiatives from your wealth operations teams'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {workItems.map((w) => (\n <div key={w.id} className=\"flex items-center justify-between rounded-lg border p-3\">\n <div className=\"space-y-0.5\">\n <p className=\"text-sm font-medium\">{w.title}</p>\n <p className=\"text-xs text-muted-foreground\">\n {w.owner} · {w.updatedAt}\n </p>\n </div>\n <Badge variant={statusBadgeVariant(w.status)}>{w.status.replace('_', ' ')}</Badge>\n </div>\n ))}\n </CardContent>\n </Card>\n\n {/* Quick action strip */}\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n {[\n {\n label: translate(\n 'brainyrich.dashboard.quickActions.placeTradeOrder',\n 'Place Trade Order'\n ),\n desc: translate(\n 'brainyrich.dashboard.quickActions.placeTradeOrderDesc',\n 'Buy or sell securities'\n ),\n },\n {\n label: translate(\n 'brainyrich.dashboard.quickActions.linkNewAccount',\n 'Link New Account'\n ),\n desc: translate(\n 'brainyrich.dashboard.quickActions.linkNewAccountDesc',\n 'Connect a financial account'\n ),\n },\n {\n label: translate('brainyrich.dashboard.quickActions.generateReport', 'Generate Report'),\n desc: translate(\n 'brainyrich.dashboard.quickActions.generateReportDesc',\n 'Create a wealth snapshot'\n ),\n },\n {\n label: translate('brainyrich.dashboard.quickActions.askWealthAi', 'Ask Wealth AI'),\n desc: translate(\n 'brainyrich.dashboard.quickActions.askWealthAiDesc',\n 'Get personalized advice'\n ),\n },\n ].map((a) => (\n <Button\n key={a.label}\n variant=\"outline\"\n className=\"h-auto flex-col items-start p-4 text-left\"\n >\n <span className=\"font-medium text-sm\">{a.label}</span>\n <span className=\"text-xs text-muted-foreground\">{a.desc}</span>\n </Button>\n ))}\n </div>\n </SectionShell>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../src/brainyrich/pages/DashboardPage.tsx"],"sourcesContent":["import { useMemo, useState, type FormEvent } from 'react';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Button,\n Badge,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Target,\n Bell,\n Briefcase,\n Wallet,\n PlusCircle,\n MoreHorizontal,\n Check,\n X,\n CircleCheck,\n} from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport {\n useNetWorthSummary,\n usePortfolios,\n useGoals,\n useInsights,\n useCreateAccount,\n useAcknowledgeInsight,\n useDismissInsight,\n useResolveInsight,\n} from '../hooks/useBrainyRichApi';\nimport type { BraAccountType, BraCreateAccountInput, BraInsight } from '../types/bra';\nimport { HouseholdPicker, ConfirmDialog } from '../components';\nimport {\n SectionShell,\n KpiGrid,\n AllocationBars,\n EmptyState,\n LoadingState,\n ErrorState,\n formatMoney,\n formatDate,\n statusBadgeVariant,\n type KpiItem,\n type AllocationDatum,\n} from './_shared';\n\nconst ACCOUNT_TYPES: BraAccountType[] = [\n 'BANK',\n 'BROKERAGE',\n 'RETIREMENT',\n 'CASH',\n 'CRYPTO',\n 'REAL_ESTATE',\n 'ALTERNATIVE',\n 'LIABILITY',\n];\n\nexport function DashboardPage() {\n const { t } = useI18n();\n const translate = (key: string, fallback: string, params?: Record<string, string | number>) =>\n tWithFallback(t, key, fallback, params);\n\n const summaryQuery = useNetWorthSummary();\n const portfoliosQuery = usePortfolios();\n const goalsQuery = useGoals();\n const insightsQuery = useInsights({ status: 'OPEN' });\n\n const summary = summaryQuery.data;\n const currency = summary?.currency ?? 'USD';\n\n const kpis: KpiItem[] = summary\n ? [\n {\n label: translate('brainyrich.dashboard.metrics.netWorth', 'Net Worth'),\n value: formatMoney(summary.totalNetWorth, currency),\n },\n {\n label: translate('brainyrich.dashboard.metrics.investedAssets', 'Invested Assets'),\n value: formatMoney(summary.totalMarketValue, currency),\n },\n {\n label: translate('brainyrich.dashboard.metrics.liquidity', 'Cash & Liquidity'),\n value: formatMoney(summary.totalCash, currency),\n },\n {\n label: translate('brainyrich.dashboard.metrics.accounts', 'Linked Accounts'),\n value: String(summary.accountCount),\n },\n ]\n : [];\n\n const allocation: AllocationDatum[] = useMemo(() => {\n if (!summary) return [];\n const total = summary.byAssetClass.reduce((sum, row) => sum + row.marketValue, 0);\n if (total <= 0) return [];\n return summary.byAssetClass\n .slice()\n .sort((a, b) => b.marketValue - a.marketValue)\n .map((row) => ({\n label: row.assetClass.replace(/_/g, ' '),\n value: (row.marketValue / total) * 100,\n caption: formatMoney(row.marketValue, currency),\n }));\n }, [summary, currency]);\n\n const topPortfolios = portfoliosQuery.data.slice(0, 5);\n const topGoals = goalsQuery.data.slice(0, 5);\n const openInsights = insightsQuery.data.slice(0, 6);\n\n return (\n <SectionShell\n title={translate('brainyrich.dashboard.title', 'Wealth Dashboard')}\n description={translate(\n 'brainyrich.dashboard.description',\n 'Your consolidated financial overview at a glance'\n )}\n actions={<NewAccountDialog translate={translate} />}\n >\n {/* KPI row — net-worth overview */}\n {summaryQuery.isLoading ? (\n <LoadingState rows={1} />\n ) : summaryQuery.isError ? (\n <ErrorState\n title={translate('brainyrich.dashboard.netWorthError', 'Could not load net worth')}\n onRetry={() => summaryQuery.refetch()}\n />\n ) : summary ? (\n <KpiGrid items={kpis} />\n ) : (\n <EmptyState\n icon={<Wallet className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.dashboard.noSummary', 'No financial data yet')}\n description={translate(\n 'brainyrich.dashboard.noSummaryDesc',\n 'Link your first account to see your net worth here.'\n )}\n />\n )}\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Asset allocation */}\n <Card className=\"lg:col-span-2\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Briefcase className=\"h-5 w-5\" aria-hidden=\"true\" />\n {translate('brainyrich.dashboard.sections.assetAllocation', 'Asset Allocation')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.dashboard.sections.assetAllocationDescription',\n 'Market value distributed across asset classes'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {summaryQuery.isLoading ? (\n <LoadingState rows={3} />\n ) : summaryQuery.isError ? (\n <ErrorState onRetry={() => summaryQuery.refetch()} />\n ) : allocation.length > 0 ? (\n <AllocationBars data={allocation} />\n ) : (\n <EmptyState\n icon={<Briefcase className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.dashboard.noAllocation', 'No holdings to allocate')}\n description={translate(\n 'brainyrich.dashboard.noAllocationDesc',\n 'Add holdings to your accounts to see how your wealth is allocated.'\n )}\n />\n )}\n </CardContent>\n </Card>\n\n {/* Goals mini-list */}\n <Card>\n <CardHeader className=\"pb-3\">\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Target className=\"h-4 w-4\" aria-hidden=\"true\" />\n {translate('brainyrich.dashboard.sections.goals', 'Goals')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {goalsQuery.isLoading ? (\n <LoadingState rows={3} />\n ) : goalsQuery.isError ? (\n <ErrorState onRetry={() => goalsQuery.refetch()} />\n ) : topGoals.length > 0 ? (\n topGoals.map((goal) => (\n <div\n key={goal.id}\n className=\"flex items-start justify-between gap-2 rounded-lg border border-border-subtle p-3\"\n >\n <div className=\"min-w-0 space-y-0.5\">\n <p className=\"truncate text-sm font-medium text-text-primary\">{goal.name}</p>\n <p className=\"text-xs text-text-secondary\">\n {formatMoney(goal.targetAmount, goal.currency)}\n {' · '}\n {formatDate(goal.targetDate)}\n </p>\n </div>\n <Badge variant={statusBadgeVariant(goal.projection)} className=\"shrink-0\">\n {goal.projection.replace(/_/g, ' ')}\n </Badge>\n </div>\n ))\n ) : (\n <EmptyState\n icon={<Target className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.dashboard.noGoals', 'No goals yet')}\n description={translate(\n 'brainyrich.dashboard.noGoalsDesc',\n 'Set a financial goal to start tracking progress.'\n )}\n />\n )}\n </CardContent>\n </Card>\n </div>\n\n {/* Portfolios mini-list */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wallet className=\"h-5 w-5\" aria-hidden=\"true\" />\n {translate('brainyrich.dashboard.sections.portfolios', 'Portfolios')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.dashboard.sections.portfoliosDescription',\n 'Your active investment strategies'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {portfoliosQuery.isLoading ? (\n <LoadingState rows={3} />\n ) : portfoliosQuery.isError ? (\n <ErrorState onRetry={() => portfoliosQuery.refetch()} />\n ) : topPortfolios.length > 0 ? (\n <div className=\"grid gap-3 sm:grid-cols-2\">\n {topPortfolios.map((portfolio) => (\n <div\n key={portfolio.id}\n className=\"flex items-start justify-between gap-2 rounded-lg border border-border-subtle p-3\"\n >\n <div className=\"min-w-0 space-y-0.5\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {portfolio.name}\n </p>\n {portfolio.description ? (\n <p className=\"truncate text-xs text-text-secondary\">\n {portfolio.description}\n </p>\n ) : (\n <p className=\"text-xs text-text-secondary\">{portfolio.baseCurrency}</p>\n )}\n </div>\n <Badge variant={statusBadgeVariant(portfolio.status)} className=\"shrink-0\">\n {portfolio.status}\n </Badge>\n </div>\n ))}\n </div>\n ) : (\n <EmptyState\n icon={<Wallet className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.dashboard.noPortfolios', 'No portfolios yet')}\n description={translate(\n 'brainyrich.dashboard.noPortfoliosDesc',\n 'Create a portfolio to organize your investment strategy.'\n )}\n />\n )}\n </CardContent>\n </Card>\n\n {/* Needs attention — open insights */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Bell className=\"h-5 w-5\" aria-hidden=\"true\" />\n {translate('brainyrich.dashboard.sections.needsAttention', 'Needs Attention')}\n </CardTitle>\n <CardDescription>\n {translate(\n 'brainyrich.dashboard.sections.needsAttentionDescription',\n 'Open insights that may require action'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {insightsQuery.isLoading ? (\n <LoadingState rows={3} />\n ) : insightsQuery.isError ? (\n <ErrorState onRetry={() => insightsQuery.refetch()} />\n ) : openInsights.length > 0 ? (\n openInsights.map((insight) => (\n <InsightRow key={insight.id} insight={insight} translate={translate} />\n ))\n ) : (\n <EmptyState\n icon={<CircleCheck className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.dashboard.noInsights', 'All clear')}\n description={translate(\n 'brainyrich.dashboard.noInsightsDesc',\n 'There are no open insights that need your attention.'\n )}\n />\n )}\n </CardContent>\n </Card>\n </SectionShell>\n );\n}\n\ntype Translate = (\n key: string,\n fallback: string,\n params?: Record<string, string | number>\n) => string;\n\n// ============================================================================\n// Insight row with acknowledge / dismiss / resolve actions\n// ============================================================================\n\nfunction InsightRow({ insight, translate }: { insight: BraInsight; translate: Translate }) {\n const acknowledge = useAcknowledgeInsight();\n const dismiss = useDismissInsight();\n const resolve = useResolveInsight();\n const [confirmDismiss, setConfirmDismiss] = useState(false);\n const pending = acknowledge.isPending || dismiss.isPending || resolve.isPending;\n\n return (\n <div className=\"flex items-start justify-between gap-3 rounded-lg border border-border-subtle p-3\">\n <div className=\"min-w-0 space-y-1\">\n <div className=\"flex items-center gap-2\">\n <Badge variant={statusBadgeVariant(insight.severity)}>{insight.severity}</Badge>\n <span className=\"text-xs text-text-secondary\">{insight.type.replace(/_/g, ' ')}</span>\n </div>\n <p className=\"text-sm font-medium text-text-primary\">{insight.title}</p>\n {insight.detail ? <p className=\"text-xs text-text-secondary\">{insight.detail}</p> : null}\n </div>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"shrink-0\"\n disabled={pending}\n aria-label={translate('brainyrich.dashboard.insightActions', 'Insight actions')}\n >\n <MoreHorizontal className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onSelect={() => acknowledge.mutate(insight.id)}>\n <Check className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.dashboard.insight.acknowledge', 'Acknowledge')}\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => resolve.mutate(insight.id)}>\n <CircleCheck className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.dashboard.insight.resolve', 'Resolve')}\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => setConfirmDismiss(true)}>\n <X className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.dashboard.insight.dismiss', 'Dismiss')}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n <ConfirmDialog\n open={confirmDismiss}\n onOpenChange={setConfirmDismiss}\n title={translate('brainyrich.dashboard.insight.dismissTitle', 'Dismiss this insight?')}\n description={translate(\n 'brainyrich.dashboard.insight.dismissDescription',\n 'It will be removed from Needs Attention. You can still find it in the full insights list.'\n )}\n confirmLabel={translate('brainyrich.dashboard.insight.dismiss', 'Dismiss')}\n pendingLabel={translate('brainyrich.dashboard.insight.dismissing', 'Dismissing…')}\n destructive\n pending={dismiss.isPending}\n onConfirm={() =>\n dismiss.mutate(insight.id, {\n onSuccess: () => setConfirmDismiss(false),\n })\n }\n />\n </div>\n );\n}\n\n// ============================================================================\n// New account dialog — primary create action\n// ============================================================================\n\nfunction NewAccountDialog({ translate }: { translate: Translate }) {\n const [open, setOpen] = useState(false);\n const [name, setName] = useState('');\n const [type, setType] = useState<BraAccountType>('BROKERAGE');\n const [institution, setInstitution] = useState('');\n const [cashBalance, setCashBalance] = useState('');\n const [currency, setCurrency] = useState('USD');\n const [householdId, setHouseholdId] = useState<string | null>(null);\n\n const createAccount = useCreateAccount();\n const trimmedName = name.trim();\n const canSubmit = trimmedName.length > 0 && !createAccount.isPending;\n\n const reset = () => {\n setName('');\n setType('BROKERAGE');\n setInstitution('');\n setCashBalance('');\n setCurrency('USD');\n setHouseholdId(null);\n createAccount.reset();\n };\n\n const handleSubmit = (event: FormEvent) => {\n event.preventDefault();\n if (!canSubmit) return;\n const parsedCash = Number.parseFloat(cashBalance);\n const input: BraCreateAccountInput = {\n name: trimmedName,\n type,\n currency: currency.trim() || 'USD',\n isManual: true,\n ...(institution.trim() ? { institution: institution.trim() } : {}),\n ...(Number.isFinite(parsedCash) ? { cashBalance: parsedCash } : {}),\n ...(householdId ? { householdId } : {}),\n };\n createAccount.mutate(input, {\n onSuccess: () => {\n reset();\n setOpen(false);\n },\n });\n };\n\n return (\n <Dialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (!next) reset();\n }}\n >\n <Button size=\"sm\" onClick={() => setOpen(true)}>\n <PlusCircle className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.dashboard.actions.newAccount', 'New Account')}\n </Button>\n <DialogContent>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <DialogHeader>\n <DialogTitle>\n {translate('brainyrich.dashboard.newAccount.title', 'New Account')}\n </DialogTitle>\n <DialogDescription>\n {translate(\n 'brainyrich.dashboard.newAccount.description',\n 'Add a manual account to track alongside your linked institutions.'\n )}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"bra-account-name\">\n {translate('brainyrich.dashboard.newAccount.name', 'Account name')}\n </Label>\n <Input\n id=\"bra-account-name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={translate(\n 'brainyrich.dashboard.newAccount.namePlaceholder',\n 'e.g. Fidelity Brokerage'\n )}\n required\n autoFocus\n />\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"bra-account-type\">\n {translate('brainyrich.dashboard.newAccount.type', 'Type')}\n </Label>\n <Select value={type} onValueChange={(value) => setType(value as BraAccountType)}>\n <SelectTrigger id=\"bra-account-type\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {ACCOUNT_TYPES.map((accountType) => (\n <SelectItem key={accountType} value={accountType}>\n {accountType.replace(/_/g, ' ')}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"bra-account-currency\">\n {translate('brainyrich.dashboard.newAccount.currency', 'Currency')}\n </Label>\n <Input\n id=\"bra-account-currency\"\n value={currency}\n onChange={(e) => setCurrency(e.target.value.toUpperCase())}\n maxLength={3}\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"bra-account-institution\">\n {translate('brainyrich.dashboard.newAccount.institution', 'Institution (optional)')}\n </Label>\n <Input\n id=\"bra-account-institution\"\n value={institution}\n onChange={(e) => setInstitution(e.target.value)}\n placeholder={translate(\n 'brainyrich.dashboard.newAccount.institutionPlaceholder',\n 'e.g. Fidelity'\n )}\n />\n </div>\n\n <HouseholdPicker\n id=\"bra-account-household\"\n value={householdId}\n onChange={setHouseholdId}\n label={translate('brainyrich.dashboard.newAccount.household', 'Household (optional)')}\n noneLabel={translate('brainyrich.dashboard.newAccount.noHousehold', 'No household')}\n disabled={createAccount.isPending}\n />\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"bra-account-cash\">\n {translate('brainyrich.dashboard.newAccount.cash', 'Cash balance (optional)')}\n </Label>\n <Input\n id=\"bra-account-cash\"\n type=\"number\"\n inputMode=\"decimal\"\n step=\"0.01\"\n value={cashBalance}\n onChange={(e) => setCashBalance(e.target.value)}\n placeholder=\"0.00\"\n />\n </div>\n\n {createAccount.isError ? (\n <p className=\"text-sm text-status-error-text\">\n {createAccount.error instanceof Error\n ? createAccount.error.message\n : translate('brainyrich.dashboard.newAccount.error', 'Could not create account.')}\n </p>\n ) : null}\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setOpen(false)}\n disabled={createAccount.isPending}\n >\n {translate('brainyrich.common.cancel', 'Cancel')}\n </Button>\n <Button type=\"submit\" disabled={!canSubmit}>\n {createAccount.isPending\n ? translate('brainyrich.dashboard.newAccount.creating', 'Creating…')\n : translate('brainyrich.dashboard.newAccount.create', 'Create account')}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAkEA,IAAM,KAAkC;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,KAAgB;CAC9B,IAAM,EAAE,MAAM,GAAS,EACjB,KAAa,GAAa,GAAkB,MAChD,EAAc,GAAG,GAAK,GAAU,EAAO,EAEnC,IAAe,GAAoB,EACnC,IAAkB,GAAe,EACjC,IAAa,GAAU,EACvB,IAAgB,EAAY,EAAE,QAAQ,QAAQ,CAAC,EAE/C,IAAU,EAAa,MACvB,IAAW,GAAS,YAAY,OAEhC,IAAkB,IACpB;EACE;GACE,OAAO,EAAU,yCAAyC,YAAY;GACtE,OAAO,EAAY,EAAQ,eAAe,EAAS;GACpD;EACD;GACE,OAAO,EAAU,+CAA+C,kBAAkB;GAClF,OAAO,EAAY,EAAQ,kBAAkB,EAAS;GACvD;EACD;GACE,OAAO,EAAU,0CAA0C,mBAAmB;GAC9E,OAAO,EAAY,EAAQ,WAAW,EAAS;GAChD;EACD;GACE,OAAO,EAAU,yCAAyC,kBAAkB;GAC5E,OAAO,OAAO,EAAQ,aAAa;GACpC;EACF,GACD,EAAE,EAEA,IAAgC,QAAc;AAClD,MAAI,CAAC,EAAS,QAAO,EAAE;EACvB,IAAM,IAAQ,EAAQ,aAAa,QAAQ,GAAK,MAAQ,IAAM,EAAI,aAAa,EAAE;AAEjF,SADI,KAAS,IAAU,EAAE,GAClB,EAAQ,aACZ,OAAO,CACP,MAAM,GAAG,MAAM,EAAE,cAAc,EAAE,YAAY,CAC7C,KAAK,OAAS;GACb,OAAO,EAAI,WAAW,QAAQ,MAAM,IAAI;GACxC,OAAQ,EAAI,cAAc,IAAS;GACnC,SAAS,EAAY,EAAI,aAAa,EAAS;GAChD,EAAE;IACJ,CAAC,GAAS,EAAS,CAAC,EAEjB,IAAgB,EAAgB,KAAK,MAAM,GAAG,EAAE,EAChD,IAAW,EAAW,KAAK,MAAM,GAAG,EAAE,EACtC,IAAe,EAAc,KAAK,MAAM,GAAG,EAAE;AAEnD,QACE,kBAAC,GAAD;EACE,OAAO,EAAU,8BAA8B,mBAAmB;EAClE,aAAa,EACX,oCACA,mDACD;EACD,SAAS,kBAAC,IAAD,EAA6B,cAAa,CAAA;YANrD;GASG,EAAa,YACZ,kBAAC,GAAD,EAAc,MAAM,GAAK,CAAA,GACvB,EAAa,UACf,kBAAC,GAAD;IACE,OAAO,EAAU,sCAAsC,2BAA2B;IAClF,eAAe,EAAa,SAAS;IACrC,CAAA,GACA,IACF,kBAAC,GAAD,EAAS,OAAO,GAAQ,CAAA,GAExB,kBAAC,GAAD;IACE,MAAM,kBAAC,GAAD;KAAQ,WAAU;KAAS,eAAY;KAAS,CAAA;IACtD,OAAO,EAAU,kCAAkC,wBAAwB;IAC3E,aAAa,EACX,sCACA,sDACD;IACD,CAAA;GAGJ,kBAAC,OAAD;IAAK,WAAU;cAAf,CAEE,kBAAC,GAAD;KAAM,WAAU;eAAhB,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MAAW,WAAU;gBAArB,CACE,kBAAC,GAAD;OAAW,WAAU;OAAU,eAAY;OAAS,CAAA,EACnD,EAAU,iDAAiD,mBAAmB,CACrE;SACZ,kBAAC,GAAD,EAAA,UACG,EACC,4DACA,gDACD,EACe,CAAA,CACP,EAAA,CAAA,EACb,kBAAC,GAAD,EAAA,UACG,EAAa,YACZ,kBAAC,GAAD,EAAc,MAAM,GAAK,CAAA,GACvB,EAAa,UACf,kBAAC,GAAD,EAAY,eAAe,EAAa,SAAS,EAAI,CAAA,GACnD,EAAW,SAAS,IACtB,kBAAC,GAAD,EAAgB,MAAM,GAAc,CAAA,GAEpC,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD;OAAW,WAAU;OAAS,eAAY;OAAS,CAAA;MACzD,OAAO,EAAU,qCAAqC,0BAA0B;MAChF,aAAa,EACX,yCACA,qEACD;MACD,CAAA,EAEQ,CAAA,CACT;QAGP,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;KAAY,WAAU;eACpB,kBAAC,GAAD;MAAW,WAAU;gBAArB,CACE,kBAAC,GAAD;OAAQ,WAAU;OAAU,eAAY;OAAS,CAAA,EAChD,EAAU,uCAAuC,QAAQ,CAChD;;KACD,CAAA,EACb,kBAAC,GAAD;KAAa,WAAU;eACpB,EAAW,YACV,kBAAC,GAAD,EAAc,MAAM,GAAK,CAAA,GACvB,EAAW,UACb,kBAAC,GAAD,EAAY,eAAe,EAAW,SAAS,EAAI,CAAA,GACjD,EAAS,SAAS,IACpB,EAAS,KAAK,MACZ,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAkD,EAAK;QAAS,CAAA,EAC7E,kBAAC,KAAD;QAAG,WAAU;kBAAb;SACG,EAAY,EAAK,cAAc,EAAK,SAAS;SAC7C;SACA,EAAW,EAAK,WAAW;SAC1B;UACA;UACN,kBAAC,GAAD;OAAO,SAAS,EAAmB,EAAK,WAAW;OAAE,WAAU;iBAC5D,EAAK,WAAW,QAAQ,MAAM,IAAI;OAC7B,CAAA,CACJ;QAdC,EAAK,GAcN,CACN,GAEF,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD;OAAQ,WAAU;OAAS,eAAY;OAAS,CAAA;MACtD,OAAO,EAAU,gCAAgC,eAAe;MAChE,aAAa,EACX,oCACA,mDACD;MACD,CAAA;KAEQ,CAAA,CACT,EAAA,CAAA,CACH;;GAGN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;IAAW,WAAU;cAArB,CACE,kBAAC,GAAD;KAAQ,WAAU;KAAU,eAAY;KAAS,CAAA,EAChD,EAAU,4CAA4C,aAAa,CAC1D;OACZ,kBAAC,GAAD,EAAA,UACG,EACC,uDACA,oCACD,EACe,CAAA,CACP,EAAA,CAAA,EACb,kBAAC,GAAD,EAAA,UACG,EAAgB,YACf,kBAAC,GAAD,EAAc,MAAM,GAAK,CAAA,GACvB,EAAgB,UAClB,kBAAC,GAAD,EAAY,eAAe,EAAgB,SAAS,EAAI,CAAA,GACtD,EAAc,SAAS,IACzB,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAc,KAAK,MAClB,kBAAC,OAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAU;OACT,CAAA,EACH,EAAU,cACT,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAU;OACT,CAAA,GAEJ,kBAAC,KAAD;OAAG,WAAU;iBAA+B,EAAU;OAAiB,CAAA,CAErE;SACN,kBAAC,GAAD;MAAO,SAAS,EAAmB,EAAU,OAAO;MAAE,WAAU;gBAC7D,EAAU;MACL,CAAA,CACJ;OAlBC,EAAU,GAkBX,CACN;IACE,CAAA,GAEN,kBAAC,GAAD;IACE,MAAM,kBAAC,GAAD;KAAQ,WAAU;KAAS,eAAY;KAAS,CAAA;IACtD,OAAO,EAAU,qCAAqC,oBAAoB;IAC1E,aAAa,EACX,yCACA,2DACD;IACD,CAAA,EAEQ,CAAA,CACT,EAAA,CAAA;GAGP,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;IAAW,WAAU;cAArB,CACE,kBAAC,GAAD;KAAM,WAAU;KAAU,eAAY;KAAS,CAAA,EAC9C,EAAU,gDAAgD,kBAAkB,CACnE;OACZ,kBAAC,GAAD,EAAA,UACG,EACC,2DACA,wCACD,EACe,CAAA,CACP,EAAA,CAAA,EACb,kBAAC,GAAD;IAAa,WAAU;cACpB,EAAc,YACb,kBAAC,GAAD,EAAc,MAAM,GAAK,CAAA,GACvB,EAAc,UAChB,kBAAC,GAAD,EAAY,eAAe,EAAc,SAAS,EAAI,CAAA,GACpD,EAAa,SAAS,IACxB,EAAa,KAAK,MAChB,kBAAC,IAAD;KAAsC;KAAoB;KAAa,EAAtD,EAAQ,GAA8C,CACvE,GAEF,kBAAC,GAAD;KACE,MAAM,kBAAC,GAAD;MAAa,WAAU;MAAS,eAAY;MAAS,CAAA;KAC3D,OAAO,EAAU,mCAAmC,YAAY;KAChE,aAAa,EACX,uCACA,uDACD;KACD,CAAA;IAEQ,CAAA,CACT,EAAA,CAAA;GACM;;;AAcnB,SAAS,GAAW,EAAE,YAAS,gBAA4D;CACzF,IAAM,IAAc,GAAuB,EACrC,IAAU,GAAmB,EAC7B,IAAU,GAAmB,EAC7B,CAAC,GAAgB,KAAqB,EAAS,GAAM,EACrD,IAAU,EAAY,aAAa,EAAQ,aAAa,EAAQ;AAEtE,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAO,SAAS,EAAmB,EAAQ,SAAS;iBAAG,EAAQ;OAAiB,CAAA,EAChF,kBAAC,QAAD;OAAM,WAAU;iBAA+B,EAAQ,KAAK,QAAQ,MAAM,IAAI;OAAQ,CAAA,CAClF;;KACN,kBAAC,KAAD;MAAG,WAAU;gBAAyC,EAAQ;MAAU,CAAA;KACvE,EAAQ,SAAS,kBAAC,KAAD;MAAG,WAAU;gBAA+B,EAAQ;MAAW,CAAA,GAAG;KAChF;;GACN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;IAAqB,SAAA;cACnB,kBAAC,GAAD;KACE,SAAQ;KACR,MAAK;KACL,WAAU;KACV,UAAU;KACV,cAAY,EAAU,uCAAuC,kBAAkB;eAE/E,kBAAC,GAAD;MAAgB,WAAU;MAAS,eAAY;MAAS,CAAA;KACjD,CAAA;IACW,CAAA,EACtB,kBAAC,GAAD;IAAqB,OAAM;cAA3B;KACE,kBAAC,GAAD;MAAkB,gBAAgB,EAAY,OAAO,EAAQ,GAAG;gBAAhE,CACE,kBAAC,GAAD;OAAO,WAAU;OAAS,eAAY;OAAS,CAAA,EAC9C,EAAU,4CAA4C,cAAc,CACpD;;KACnB,kBAAC,GAAD;MAAkB,gBAAgB,EAAQ,OAAO,EAAQ,GAAG;gBAA5D,CACE,kBAAC,GAAD;OAAa,WAAU;OAAS,eAAY;OAAS,CAAA,EACpD,EAAU,wCAAwC,UAAU,CAC5C;;KACnB,kBAAC,GAAD;MAAkB,gBAAgB,EAAkB,GAAK;gBAAzD,CACE,kBAAC,GAAD;OAAG,WAAU;OAAS,eAAY;OAAS,CAAA,EAC1C,EAAU,wCAAwC,UAAU,CAC5C;;KACC;MACT,EAAA,CAAA;GAEf,kBAAC,GAAD;IACE,MAAM;IACN,cAAc;IACd,OAAO,EAAU,6CAA6C,wBAAwB;IACtF,aAAa,EACX,mDACA,4FACD;IACD,cAAc,EAAU,wCAAwC,UAAU;IAC1E,cAAc,EAAU,2CAA2C,cAAc;IACjF,aAAA;IACA,SAAS,EAAQ;IACjB,iBACE,EAAQ,OAAO,EAAQ,IAAI,EACzB,iBAAiB,EAAkB,GAAM,EAC1C,CAAC;IAEJ,CAAA;GACE;;;AAQV,SAAS,GAAiB,EAAE,gBAAuC;CACjE,IAAM,CAAC,GAAM,KAAW,EAAS,GAAM,EACjC,CAAC,GAAM,KAAW,EAAS,GAAG,EAC9B,CAAC,GAAM,KAAW,EAAyB,YAAY,EACvD,CAAC,GAAa,KAAkB,EAAS,GAAG,EAC5C,CAAC,GAAa,KAAkB,EAAS,GAAG,EAC5C,CAAC,GAAU,KAAe,EAAS,MAAM,EACzC,CAAC,GAAa,KAAkB,EAAwB,KAAK,EAE7D,IAAgB,GAAkB,EAClC,IAAc,EAAK,MAAM,EACzB,IAAY,EAAY,SAAS,KAAK,CAAC,EAAc,WAErD,UAAc;AAOlB,EANA,EAAQ,GAAG,EACX,EAAQ,YAAY,EACpB,EAAe,GAAG,EAClB,EAAe,GAAG,EAClB,EAAY,MAAM,EAClB,EAAe,KAAK,EACpB,EAAc,OAAO;;AAwBvB,QACE,kBAAC,GAAD;EACQ;EACN,eAAe,MAAS;AAEtB,GADA,EAAQ,EAAK,EACR,KAAM,GAAO;;YAJtB,CAOE,kBAAC,GAAD;GAAQ,MAAK;GAAK,eAAe,EAAQ,GAAK;aAA9C,CACE,kBAAC,GAAD;IAAY,WAAU;IAAS,eAAY;IAAS,CAAA,EACnD,EAAU,2CAA2C,cAAc,CAC7D;MACT,kBAAC,GAAD,EAAA,UACE,kBAAC,QAAD;GAAM,WAlCU,MAAqB;AAEzC,QADA,EAAM,gBAAgB,EAClB,CAAC,EAAW;IAChB,IAAM,IAAa,OAAO,WAAW,EAAY,EAC3C,IAA+B;KACnC,MAAM;KACN;KACA,UAAU,EAAS,MAAM,IAAI;KAC7B,UAAU;KACV,GAAI,EAAY,MAAM,GAAG,EAAE,aAAa,EAAY,MAAM,EAAE,GAAG,EAAE;KACjE,GAAI,OAAO,SAAS,EAAW,GAAG,EAAE,aAAa,GAAY,GAAG,EAAE;KAClE,GAAI,IAAc,EAAE,gBAAa,GAAG,EAAE;KACvC;AACD,MAAc,OAAO,GAAO,EAC1B,iBAAiB;AAEf,KADA,GAAO,EACP,EAAQ,GAAM;OAEjB,CAAC;;GAgBgC,WAAU;aAAxC;IACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACG,EAAU,yCAAyC,cAAc,EACtD,CAAA,EACd,kBAAC,GAAD,EAAA,UACG,EACC,+CACA,oEACD,EACiB,CAAA,CACP,EAAA,CAAA;IAEf,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAO,SAAQ;gBACZ,EAAU,wCAAwC,eAAe;MAC5D,CAAA,EACR,kBAAC,GAAD;MACE,IAAG;MACH,OAAO;MACP,WAAW,MAAM,EAAQ,EAAE,OAAO,MAAM;MACxC,aAAa,EACX,mDACA,0BACD;MACD,UAAA;MACA,WAAA;MACA,CAAA,CACE;;IAEN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAO,SAAQ;iBACZ,EAAU,wCAAwC,OAAO;OACpD,CAAA,EACR,kBAAC,GAAD;OAAQ,OAAO;OAAM,gBAAgB,MAAU,EAAQ,EAAwB;iBAA/E,CACE,kBAAC,IAAD;QAAe,IAAG;kBAChB,kBAAC,IAAD,EAAe,CAAA;QACD,CAAA,EAChB,kBAAC,IAAD,EAAA,UACG,GAAc,KAAK,MAClB,kBAAC,IAAD;QAA8B,OAAO;kBAClC,EAAY,QAAQ,MAAM,IAAI;QACpB,EAFI,EAEJ,CACb,EACY,CAAA,CACT;SACL;SAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAO,SAAQ;iBACZ,EAAU,4CAA4C,WAAW;OAC5D,CAAA,EACR,kBAAC,GAAD;OACE,IAAG;OACH,OAAO;OACP,WAAW,MAAM,EAAY,EAAE,OAAO,MAAM,aAAa,CAAC;OAC1D,WAAW;OACX,CAAA,CACE;QACF;;IAEN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAO,SAAQ;gBACZ,EAAU,+CAA+C,yBAAyB;MAC7E,CAAA,EACR,kBAAC,GAAD;MACE,IAAG;MACH,OAAO;MACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;MAC/C,aAAa,EACX,0DACA,gBACD;MACD,CAAA,CACE;;IAEN,kBAAC,GAAD;KACE,IAAG;KACH,OAAO;KACP,UAAU;KACV,OAAO,EAAU,6CAA6C,uBAAuB;KACrF,WAAW,EAAU,+CAA+C,eAAe;KACnF,UAAU,EAAc;KACxB,CAAA;IAEF,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAO,SAAQ;gBACZ,EAAU,wCAAwC,0BAA0B;MACvE,CAAA,EACR,kBAAC,GAAD;MACE,IAAG;MACH,MAAK;MACL,WAAU;MACV,MAAK;MACL,OAAO;MACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;MAC/C,aAAY;MACZ,CAAA,CACE;;IAEL,EAAc,UACb,kBAAC,KAAD;KAAG,WAAU;eACV,EAAc,iBAAiB,QAC5B,EAAc,MAAM,UACpB,EAAU,yCAAyC,4BAA4B;KACjF,CAAA,GACF;IAEJ,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,eAAe,EAAQ,GAAM;KAC7B,UAAU,EAAc;eAEvB,EAAU,4BAA4B,SAAS;KACzC,CAAA,EACT,kBAAC,GAAD;KAAQ,MAAK;KAAS,UAAU,CAAC;eAC9B,EAAc,YACX,EAAU,4CAA4C,YAAY,GAClE,EAAU,0CAA0C,iBAAiB;KAClE,CAAA,CACI,EAAA,CAAA;IACV;MACO,CAAA,CACT"}
|