@burdenoff/microfe-brainyrich 2026.1101.1 → 2026.1101.3

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 (72) hide show
  1. package/dist/brainyrich/BrainyRichRoot.d.ts.map +1 -1
  2. package/dist/brainyrich/BrainyRichRoot.js +22 -107
  3. package/dist/brainyrich/BrainyRichRoot.js.map +1 -1
  4. package/dist/brainyrich/BrainyRichRoutes.d.ts.map +1 -1
  5. package/dist/brainyrich/BrainyRichRoutes.js +65 -46
  6. package/dist/brainyrich/BrainyRichRoutes.js.map +1 -1
  7. package/dist/brainyrich/components/mobile/MobilePage.d.ts +44 -0
  8. package/dist/brainyrich/components/mobile/MobilePage.d.ts.map +1 -0
  9. package/dist/brainyrich/components/mobile/MobilePage.js +45 -0
  10. package/dist/brainyrich/components/mobile/MobilePage.js.map +1 -0
  11. package/dist/brainyrich/components/mobile/MobileTabBar.d.ts +20 -0
  12. package/dist/brainyrich/components/mobile/MobileTabBar.d.ts.map +1 -0
  13. package/dist/brainyrich/components/mobile/MobileTabBar.js +139 -0
  14. package/dist/brainyrich/components/mobile/MobileTabBar.js.map +1 -0
  15. package/dist/brainyrich/components/mobile/index.d.ts +8 -0
  16. package/dist/brainyrich/components/mobile/index.d.ts.map +1 -0
  17. package/dist/brainyrich/components/mobile/index.js +2 -0
  18. package/dist/brainyrich/hooks/useBrainyRichApi.d.ts +48 -12
  19. package/dist/brainyrich/hooks/useBrainyRichApi.d.ts.map +1 -1
  20. package/dist/brainyrich/hooks/useBrainyRichApi.js +120 -108
  21. package/dist/brainyrich/hooks/useBrainyRichApi.js.map +1 -1
  22. package/dist/brainyrich/hooks/useIsMobileViewport.d.ts +14 -0
  23. package/dist/brainyrich/hooks/useIsMobileViewport.d.ts.map +1 -0
  24. package/dist/brainyrich/hooks/useIsMobileViewport.js +23 -0
  25. package/dist/brainyrich/hooks/useIsMobileViewport.js.map +1 -0
  26. package/dist/brainyrich/navItems.d.ts +36 -0
  27. package/dist/brainyrich/navItems.d.ts.map +1 -0
  28. package/dist/brainyrich/navItems.js +54 -0
  29. package/dist/brainyrich/navItems.js.map +1 -0
  30. package/dist/brainyrich/pages/AccountsPage.d.ts.map +1 -1
  31. package/dist/brainyrich/pages/AccountsPage.js +411 -390
  32. package/dist/brainyrich/pages/AccountsPage.js.map +1 -1
  33. package/dist/brainyrich/pages/DashboardPage.d.ts.map +1 -1
  34. package/dist/brainyrich/pages/DashboardPage.js +223 -177
  35. package/dist/brainyrich/pages/DashboardPage.js.map +1 -1
  36. package/dist/brainyrich/pages/GoalsPage.d.ts.map +1 -1
  37. package/dist/brainyrich/pages/GoalsPage.js +560 -551
  38. package/dist/brainyrich/pages/GoalsPage.js.map +1 -1
  39. package/dist/brainyrich/pages/ReportsPage.d.ts.map +1 -1
  40. package/dist/brainyrich/pages/ReportsPage.js +145 -151
  41. package/dist/brainyrich/pages/ReportsPage.js.map +1 -1
  42. package/dist/brainyrich/pages/mobile/MobileAccountsView.d.ts +28 -0
  43. package/dist/brainyrich/pages/mobile/MobileAccountsView.d.ts.map +1 -0
  44. package/dist/brainyrich/pages/mobile/MobileAccountsView.js +139 -0
  45. package/dist/brainyrich/pages/mobile/MobileAccountsView.js.map +1 -0
  46. package/dist/brainyrich/pages/mobile/MobileDashboardView.d.ts +24 -0
  47. package/dist/brainyrich/pages/mobile/MobileDashboardView.d.ts.map +1 -0
  48. package/dist/brainyrich/pages/mobile/MobileDashboardView.js +245 -0
  49. package/dist/brainyrich/pages/mobile/MobileDashboardView.js.map +1 -0
  50. package/dist/brainyrich/pages/mobile/MobileGoalsView.d.ts +30 -0
  51. package/dist/brainyrich/pages/mobile/MobileGoalsView.d.ts.map +1 -0
  52. package/dist/brainyrich/pages/mobile/MobileGoalsView.js +180 -0
  53. package/dist/brainyrich/pages/mobile/MobileGoalsView.js.map +1 -0
  54. package/dist/brainyrich/pages/mobile/mobileShared.d.ts +24 -0
  55. package/dist/brainyrich/pages/mobile/mobileShared.d.ts.map +1 -0
  56. package/dist/brainyrich/pages/mobile/mobileShared.js +25 -0
  57. package/dist/brainyrich/pages/mobile/mobileShared.js.map +1 -0
  58. package/dist/brainyrich/pages/reports-csv.d.ts +2 -0
  59. package/dist/brainyrich/pages/reports-csv.d.ts.map +1 -0
  60. package/dist/brainyrich/pages/reports-csv.js +14 -0
  61. package/dist/brainyrich/pages/reports-csv.js.map +1 -0
  62. package/dist/brainyrich/utils/cn.js +10 -0
  63. package/dist/brainyrich/utils/cn.js.map +1 -0
  64. package/dist/brainyrich/utils/goalMetrics.d.ts +13 -0
  65. package/dist/brainyrich/utils/goalMetrics.d.ts.map +1 -0
  66. package/dist/brainyrich/utils/goalMetrics.js +20 -0
  67. package/dist/brainyrich/utils/goalMetrics.js.map +1 -0
  68. package/dist/test/brainyrichFixtures.d.ts +7 -0
  69. package/dist/test/brainyrichFixtures.d.ts.map +1 -0
  70. package/dist/test/viewport.d.ts +8 -0
  71. package/dist/test/viewport.d.ts.map +1 -0
  72. package/package.json +1 -1
@@ -0,0 +1,180 @@
1
+ import { LoadMore as e } from "../../components/LoadMore.js";
2
+ import { ProgressRing as t } from "../../components/viz.js";
3
+ import "../../components/index.js";
4
+ import { EmptyState as n, ErrorState as r, LoadingState as i, formatCompact as a, formatDate as o, formatMoney as s, formatPct as c } from "../_shared.js";
5
+ import { cn as l } from "../../utils/cn.js";
6
+ import { MobileFab as u, MobilePage as d } from "../../components/mobile/MobilePage.js";
7
+ import "../../components/mobile/index.js";
8
+ import { fundedPercent as f, goalTone as p } from "../../utils/goalMetrics.js";
9
+ import { MobileCard as m, projectionChipClass as h } from "./mobileShared.js";
10
+ import { Link2 as g, MoreHorizontal as _, Plus as v, RefreshCw as y, Target as b, Trash2 as x } from "lucide-react";
11
+ import { Fragment as S, jsx as C, jsxs as w } from "react/jsx-runtime";
12
+ import { Button as T, DropdownMenu as E, DropdownMenuContent as D, DropdownMenuItem as O, DropdownMenuSeparator as k, DropdownMenuTrigger as A } from "@burdenoff/fe-libs/ui";
13
+ //#region src/brainyrich/pages/mobile/MobileGoalsView.tsx
14
+ function j(e) {
15
+ return e.toLowerCase().split("_").map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ");
16
+ }
17
+ function M({ translate: M, goals: N, isLoading: P, isError: F, refetch: I, hasMore: L, loadMore: R, isFetchingNextPage: z, totals: B, currency: V, onCreate: H, onOpen: U, onEdit: W, onArchive: G }) {
18
+ let K = M("brainyrich.goals.actions.createGoal", "New goal");
19
+ return /* @__PURE__ */ C(d, {
20
+ tourId: "brainyrich-page-goals",
21
+ title: M("brainyrich.mobile.goals.title", "Goals"),
22
+ subtitle: M("brainyrich.mobile.goals.count", "{{count}} goals", { count: N.length }),
23
+ fab: /* @__PURE__ */ C(u, {
24
+ label: K,
25
+ icon: /* @__PURE__ */ C(v, {
26
+ className: "size-4",
27
+ "aria-hidden": "true"
28
+ }),
29
+ onClick: H
30
+ }),
31
+ children: P ? /* @__PURE__ */ C(i, { rows: 4 }) : F ? /* @__PURE__ */ C(r, {
32
+ title: M("brainyrich.goals.error.title", "Could not load goals"),
33
+ description: M("brainyrich.goals.error.description", "We could not reach the goals service. Please try again."),
34
+ onRetry: I
35
+ }) : N.length === 0 ? /* @__PURE__ */ C(n, {
36
+ icon: /* @__PURE__ */ C(b, {
37
+ className: "size-6",
38
+ "aria-hidden": "true"
39
+ }),
40
+ title: M("brainyrich.goals.empty.title", "No financial goals yet"),
41
+ description: M("brainyrich.goals.empty.description", "Create your first goal to start tracking progress toward a milestone.")
42
+ }) : /* @__PURE__ */ w(S, { children: [
43
+ /* @__PURE__ */ w(m, {
44
+ className: "grid grid-cols-3 divide-x divide-border-subtle p-0",
45
+ children: [
46
+ /* @__PURE__ */ w("div", {
47
+ className: "p-3",
48
+ children: [/* @__PURE__ */ C("p", {
49
+ className: "text-[11px] text-text-secondary",
50
+ children: M("brainyrich.goals.metrics.totalTarget", "Total target")
51
+ }), /* @__PURE__ */ C("p", {
52
+ className: "mt-0.5 truncate text-base font-semibold text-text-primary",
53
+ children: a(B.totalTarget, V)
54
+ })]
55
+ }),
56
+ /* @__PURE__ */ w("div", {
57
+ className: "p-3",
58
+ children: [/* @__PURE__ */ C("p", {
59
+ className: "text-[11px] text-text-secondary",
60
+ children: M("brainyrich.goals.card.monthly", "Monthly")
61
+ }), /* @__PURE__ */ C("p", {
62
+ className: "mt-0.5 truncate text-base font-semibold text-text-primary",
63
+ children: a(B.totalMonthly, V)
64
+ })]
65
+ }),
66
+ /* @__PURE__ */ w("div", {
67
+ className: "p-3",
68
+ children: [/* @__PURE__ */ C("p", {
69
+ className: "text-[11px] text-text-secondary",
70
+ children: M("brainyrich.goals.metrics.atRisk", "Needs attention")
71
+ }), /* @__PURE__ */ C("p", {
72
+ className: l("mt-0.5 text-base font-semibold", B.atRisk > 0 ? "text-status-error-text" : "text-text-primary"),
73
+ children: B.atRisk
74
+ })]
75
+ })
76
+ ]
77
+ }),
78
+ /* @__PURE__ */ C("ul", {
79
+ className: "space-y-3",
80
+ "aria-label": M("brainyrich.goals.title", "Financial Goals"),
81
+ children: N.map((e) => {
82
+ let n = f(e), r = e.status === "ACHIEVED";
83
+ return /* @__PURE__ */ C("li", { children: /* @__PURE__ */ w(m, {
84
+ className: "flex items-center gap-3 p-3",
85
+ children: [/* @__PURE__ */ w("button", {
86
+ type: "button",
87
+ onClick: () => U(e),
88
+ className: "flex min-h-16 min-w-0 flex-1 items-center gap-3 text-left",
89
+ "aria-label": M("brainyrich.mobile.goals.open", "Open {{name}}", { name: e.name }),
90
+ children: [/* @__PURE__ */ C(t, {
91
+ value: n,
92
+ tone: p(e.status, e.projection),
93
+ size: 64,
94
+ strokeWidth: 7,
95
+ label: M("brainyrich.goals.card.funded", "funded")
96
+ }), /* @__PURE__ */ w("span", {
97
+ className: "min-w-0 flex-1",
98
+ children: [
99
+ /* @__PURE__ */ C("span", {
100
+ className: "block truncate text-base font-medium text-text-primary",
101
+ children: e.name
102
+ }),
103
+ /* @__PURE__ */ w("span", {
104
+ className: "mt-1 flex flex-wrap items-center gap-2",
105
+ children: [/* @__PURE__ */ C("span", {
106
+ className: "text-sm tabular-nums text-text-secondary",
107
+ children: c(n, 0)
108
+ }), /* @__PURE__ */ C("span", {
109
+ className: l("rounded-md px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide", h(e)),
110
+ children: j(r ? e.status : e.projection)
111
+ })]
112
+ }),
113
+ /* @__PURE__ */ w("span", {
114
+ className: "mt-1 block truncate text-xs text-text-secondary",
115
+ children: [
116
+ s(e.targetAmount, e.currency),
117
+ " ·",
118
+ " ",
119
+ o(e.targetDate)
120
+ ]
121
+ })
122
+ ]
123
+ })]
124
+ }), /* @__PURE__ */ w(E, { children: [/* @__PURE__ */ C(A, {
125
+ asChild: !0,
126
+ children: /* @__PURE__ */ C(T, {
127
+ variant: "ghost",
128
+ size: "icon",
129
+ className: "size-11 shrink-0",
130
+ "aria-label": M("brainyrich.goals.actions.menu", "Goal actions"),
131
+ children: /* @__PURE__ */ C(_, {
132
+ className: "size-4",
133
+ "aria-hidden": "true"
134
+ })
135
+ })
136
+ }), /* @__PURE__ */ w(D, {
137
+ align: "end",
138
+ children: [
139
+ /* @__PURE__ */ w(O, {
140
+ onSelect: () => U(e),
141
+ children: [/* @__PURE__ */ C(g, {
142
+ className: "size-4",
143
+ "aria-hidden": "true"
144
+ }), M("brainyrich.goals.actions.manageFunding", "Manage funding")]
145
+ }),
146
+ /* @__PURE__ */ w(O, {
147
+ onSelect: () => W(e),
148
+ children: [/* @__PURE__ */ C(y, {
149
+ className: "size-4",
150
+ "aria-hidden": "true"
151
+ }), M("brainyrich.goals.actions.editGoal", "Edit goal")]
152
+ }),
153
+ /* @__PURE__ */ C(k, {}),
154
+ /* @__PURE__ */ w(O, {
155
+ className: "text-status-error-text focus:text-status-error-text",
156
+ onSelect: () => G(e),
157
+ children: [/* @__PURE__ */ C(x, {
158
+ className: "size-4",
159
+ "aria-hidden": "true"
160
+ }), M("brainyrich.goals.actions.archive", "Archive goal")]
161
+ })
162
+ ]
163
+ })] })]
164
+ }) }, e.id);
165
+ })
166
+ }),
167
+ /* @__PURE__ */ C(e, {
168
+ hasMore: L,
169
+ loading: z,
170
+ onClick: R,
171
+ label: M("brainyrich.goals.actions.loadMore", "Load more goals"),
172
+ loadingLabel: M("brainyrich.goals.actions.loadingMore", "Loading…")
173
+ })
174
+ ] })
175
+ });
176
+ }
177
+ //#endregion
178
+ export { M as MobileGoalsView };
179
+
180
+ //# sourceMappingURL=MobileGoalsView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MobileGoalsView.js","names":[],"sources":["../../../../src/brainyrich/pages/mobile/MobileGoalsView.tsx"],"sourcesContent":["import {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { Link2, MoreHorizontal, Plus, RefreshCw, Target, Trash2 } from 'lucide-react';\nimport type { BraGoal } from '../../types/bra';\nimport { LoadMore, ProgressRing } from '../../components';\nimport { MobileFab, MobilePage } from '../../components/mobile';\nimport { fundedPercent, goalTone } from '../../utils/goalMetrics';\nimport { cn } from '../../utils/cn';\nimport {\n EmptyState,\n ErrorState,\n LoadingState,\n formatCompact,\n formatDate,\n formatMoney,\n formatPct,\n} from '../_shared';\nimport { MobileCard, projectionChipClass, type Translate } from './mobileShared';\n\nexport interface MobileGoalsViewProps {\n translate: Translate;\n goals: BraGoal[];\n isLoading: boolean;\n isError: boolean;\n refetch: () => void;\n hasMore: boolean;\n loadMore: () => void;\n isFetchingNextPage: boolean;\n totals: { totalTarget: number; totalMonthly: number; atRisk: number };\n currency: string;\n onCreate: () => void;\n onOpen: (goal: BraGoal) => void;\n onEdit: (goal: BraGoal) => void;\n onArchive: (goal: BraGoal) => void;\n}\n\nfunction humanize(value: string): string {\n return value\n .toLowerCase()\n .split('_')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(' ');\n}\n\n/**\n * Phone goals list per `br-49-mobile-goals`: a simplified funding summary, one\n * card per goal with a progress ring and projection badge, and a floating\n * \"New goal\" button. Tapping a card opens the same detail and funding sheet\n * as desktop.\n */\nexport function MobileGoalsView({\n translate,\n goals,\n isLoading,\n isError,\n refetch,\n hasMore,\n loadMore,\n isFetchingNextPage,\n totals,\n currency,\n onCreate,\n onOpen,\n onEdit,\n onArchive,\n}: MobileGoalsViewProps) {\n const newGoalLabel = translate('brainyrich.goals.actions.createGoal', 'New goal');\n\n return (\n <MobilePage\n tourId=\"brainyrich-page-goals\"\n title={translate('brainyrich.mobile.goals.title', 'Goals')}\n subtitle={translate('brainyrich.mobile.goals.count', '{{count}} goals', {\n count: goals.length,\n })}\n fab={\n <MobileFab\n label={newGoalLabel}\n icon={<Plus className=\"size-4\" aria-hidden=\"true\" />}\n onClick={onCreate}\n />\n }\n >\n {isLoading ? (\n <LoadingState rows={4} />\n ) : isError ? (\n <ErrorState\n title={translate('brainyrich.goals.error.title', 'Could not load goals')}\n description={translate(\n 'brainyrich.goals.error.description',\n 'We could not reach the goals service. Please try again.'\n )}\n onRetry={refetch}\n />\n ) : goals.length === 0 ? (\n <EmptyState\n icon={<Target className=\"size-6\" aria-hidden=\"true\" />}\n title={translate('brainyrich.goals.empty.title', 'No financial goals yet')}\n description={translate(\n 'brainyrich.goals.empty.description',\n 'Create your first goal to start tracking progress toward a milestone.'\n )}\n />\n ) : (\n <>\n {/* Simplified funding summary */}\n <MobileCard className=\"grid grid-cols-3 divide-x divide-border-subtle p-0\">\n <div className=\"p-3\">\n <p className=\"text-[11px] text-text-secondary\">\n {translate('brainyrich.goals.metrics.totalTarget', 'Total target')}\n </p>\n <p className=\"mt-0.5 truncate text-base font-semibold text-text-primary\">\n {formatCompact(totals.totalTarget, currency)}\n </p>\n </div>\n <div className=\"p-3\">\n <p className=\"text-[11px] text-text-secondary\">\n {translate('brainyrich.goals.card.monthly', 'Monthly')}\n </p>\n <p className=\"mt-0.5 truncate text-base font-semibold text-text-primary\">\n {formatCompact(totals.totalMonthly, currency)}\n </p>\n </div>\n <div className=\"p-3\">\n <p className=\"text-[11px] text-text-secondary\">\n {translate('brainyrich.goals.metrics.atRisk', 'Needs attention')}\n </p>\n <p\n className={cn(\n 'mt-0.5 text-base font-semibold',\n totals.atRisk > 0 ? 'text-status-error-text' : 'text-text-primary'\n )}\n >\n {totals.atRisk}\n </p>\n </div>\n </MobileCard>\n\n <ul\n className=\"space-y-3\"\n aria-label={translate('brainyrich.goals.title', 'Financial Goals')}\n >\n {goals.map((goal) => {\n const pct = fundedPercent(goal);\n const achieved = goal.status === 'ACHIEVED';\n return (\n <li key={goal.id}>\n <MobileCard className=\"flex items-center gap-3 p-3\">\n <button\n type=\"button\"\n onClick={() => onOpen(goal)}\n className=\"flex min-h-16 min-w-0 flex-1 items-center gap-3 text-left\"\n aria-label={translate('brainyrich.mobile.goals.open', 'Open {{name}}', {\n name: goal.name,\n })}\n >\n <ProgressRing\n value={pct}\n tone={goalTone(goal.status, goal.projection)}\n size={64}\n strokeWidth={7}\n label={translate('brainyrich.goals.card.funded', 'funded')}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-base font-medium text-text-primary\">\n {goal.name}\n </span>\n <span className=\"mt-1 flex flex-wrap items-center gap-2\">\n <span className=\"text-sm tabular-nums text-text-secondary\">\n {formatPct(pct, 0)}\n </span>\n <span\n className={cn(\n 'rounded-md px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wide',\n projectionChipClass(goal)\n )}\n >\n {achieved ? humanize(goal.status) : humanize(goal.projection)}\n </span>\n </span>\n <span className=\"mt-1 block truncate text-xs text-text-secondary\">\n {formatMoney(goal.targetAmount, goal.currency)} ·{' '}\n {formatDate(goal.targetDate)}\n </span>\n </span>\n </button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-11 shrink-0\"\n aria-label={translate('brainyrich.goals.actions.menu', 'Goal actions')}\n >\n <MoreHorizontal className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onSelect={() => onOpen(goal)}>\n <Link2 className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.goals.actions.manageFunding', 'Manage funding')}\n </DropdownMenuItem>\n <DropdownMenuItem onSelect={() => onEdit(goal)}>\n <RefreshCw className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.goals.actions.editGoal', 'Edit goal')}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"text-status-error-text focus:text-status-error-text\"\n onSelect={() => onArchive(goal)}\n >\n <Trash2 className=\"size-4\" aria-hidden=\"true\" />\n {translate('brainyrich.goals.actions.archive', 'Archive goal')}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </MobileCard>\n </li>\n );\n })}\n </ul>\n\n <LoadMore\n hasMore={hasMore}\n loading={isFetchingNextPage}\n onClick={loadMore}\n label={translate('brainyrich.goals.actions.loadMore', 'Load more goals')}\n loadingLabel={translate('brainyrich.goals.actions.loadingMore', 'Loading…')}\n />\n </>\n )}\n </MobilePage>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { ReactNode } from 'react';
2
+ import { BraAccountType, BraGoal } from '../../types/bra';
3
+ export type Translate = (key: string, fallback: string, params?: Record<string, string | number>) => string;
4
+ /** The slice of a query result the mobile views render from. */
5
+ export interface MobileQueryState<T> {
6
+ data: T;
7
+ isLoading: boolean;
8
+ isError: boolean;
9
+ refetch: () => void;
10
+ }
11
+ /** Full-width, touch-friendly card surface used across the phone layouts. */
12
+ export declare function MobileCard({ children, className }: {
13
+ children: ReactNode;
14
+ className?: string;
15
+ }): import("react/jsx-runtime").JSX.Element;
16
+ /**
17
+ * Status-chip colours for a goal's projection. An achieved goal reads as a
18
+ * success regardless of its last projection. Colour is never the only signal:
19
+ * every chip also carries the projection label.
20
+ */
21
+ export declare function projectionChipClass(goal: Pick<BraGoal, 'status' | 'projection'>): string;
22
+ /** Account-type chip colours: liabilities read as errors, everything else neutral-brand. */
23
+ export declare function accountTypeChipClass(type: BraAccountType): string;
24
+ //# sourceMappingURL=mobileShared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobileShared.d.ts","sourceRoot":"","sources":["../../../../src/brainyrich/pages/mobile/mobileShared.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG/D,MAAM,MAAM,SAAS,GAAG,CACtB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KACrC,MAAM,CAAC;AAEZ,gEAAgE;AAChE,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAM9F;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,GAAG,YAAY,CAAC,GAAG,MAAM,CAYxF;AAED,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAIjE"}
@@ -0,0 +1,25 @@
1
+ import { cn as e } from "../../utils/cn.js";
2
+ import { jsx as t } from "react/jsx-runtime";
3
+ //#region src/brainyrich/pages/mobile/mobileShared.tsx
4
+ function n({ children: n, className: r }) {
5
+ return /* @__PURE__ */ t("div", {
6
+ className: e("rounded-2xl border border-border-subtle bg-bg-surface p-4", r),
7
+ children: n
8
+ });
9
+ }
10
+ function r(e) {
11
+ if (e.status === "ACHIEVED") return "bg-status-success-bg text-status-success-text";
12
+ switch (e.projection) {
13
+ case "AHEAD":
14
+ case "ON_TRACK": return "bg-status-success-bg text-status-success-text";
15
+ case "BEHIND": return "bg-status-warning-bg text-status-warning-text";
16
+ default: return "bg-status-error-bg text-status-error-text";
17
+ }
18
+ }
19
+ function i(e) {
20
+ return e === "LIABILITY" ? "bg-status-error-bg text-status-error-text" : e === "CRYPTO" ? "bg-status-warning-bg text-status-warning-text" : "bg-status-success-bg text-status-success-text";
21
+ }
22
+ //#endregion
23
+ export { n as MobileCard, i as accountTypeChipClass, r as projectionChipClass };
24
+
25
+ //# sourceMappingURL=mobileShared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobileShared.js","names":[],"sources":["../../../../src/brainyrich/pages/mobile/mobileShared.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { BraAccountType, BraGoal } from '../../types/bra';\nimport { cn } from '../../utils/cn';\n\nexport type Translate = (\n key: string,\n fallback: string,\n params?: Record<string, string | number>\n) => string;\n\n/** The slice of a query result the mobile views render from. */\nexport interface MobileQueryState<T> {\n data: T;\n isLoading: boolean;\n isError: boolean;\n refetch: () => void;\n}\n\n/** Full-width, touch-friendly card surface used across the phone layouts. */\nexport function MobileCard({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <div className={cn('rounded-2xl border border-border-subtle bg-bg-surface p-4', className)}>\n {children}\n </div>\n );\n}\n\n/**\n * Status-chip colours for a goal's projection. An achieved goal reads as a\n * success regardless of its last projection. Colour is never the only signal:\n * every chip also carries the projection label.\n */\nexport function projectionChipClass(goal: Pick<BraGoal, 'status' | 'projection'>): string {\n if (goal.status === 'ACHIEVED') return 'bg-status-success-bg text-status-success-text';\n switch (goal.projection) {\n case 'AHEAD':\n case 'ON_TRACK':\n return 'bg-status-success-bg text-status-success-text';\n case 'BEHIND':\n return 'bg-status-warning-bg text-status-warning-text';\n case 'AT_RISK':\n default:\n return 'bg-status-error-bg text-status-error-text';\n }\n}\n\n/** Account-type chip colours: liabilities read as errors, everything else neutral-brand. */\nexport function accountTypeChipClass(type: BraAccountType): string {\n if (type === 'LIABILITY') return 'bg-status-error-bg text-status-error-text';\n if (type === 'CRYPTO') return 'bg-status-warning-bg text-status-warning-text';\n return 'bg-status-success-bg text-status-success-text';\n}\n"],"mappings":";;;AAmBA,SAAgB,EAAW,EAAE,aAAU,gBAA0D;CAC/F,OACE,kBAAC,OAAD;EAAK,WAAW,EAAG,6DAA6D,CAAS;EACtF;CACE,CAAA;AAET;AAOA,SAAgB,EAAoB,GAAsD;CACxF,IAAI,EAAK,WAAW,YAAY,OAAO;CACvC,QAAQ,EAAK,YAAb;EACE,KAAK;EACL,KAAK,YACH,OAAO;EACT,KAAK,UACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAGA,SAAgB,EAAqB,GAA8B;CAGjE,OAFI,MAAS,cAAoB,8CAC7B,MAAS,WAAiB,kDACvB;AACT"}
@@ -0,0 +1,2 @@
1
+ export declare function toCsv(headers: string[], rows: (string | number)[][]): string;
2
+ //# sourceMappingURL=reports-csv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reports-csv.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/pages/reports-csv.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,GAAG,MAAM,CAiB5E"}
@@ -0,0 +1,14 @@
1
+ //#region src/brainyrich/pages/reports-csv.ts
2
+ function e(e, t) {
3
+ let n = (e) => {
4
+ let t = String(e ?? ""), n = 0;
5
+ for (; n < t.length && (t.charCodeAt(n) <= 32 || t.charCodeAt(n) === 127 || /\s/u.test(t[n]));) n += 1;
6
+ let r = typeof e == "string" && /^[=+\-@=+-@]/u.test(t.slice(n)), i = r ? `\t${t}` : t;
7
+ return r || /[",\r\n]/.test(i) ? `"${i.replace(/"/g, "\"\"")}"` : i;
8
+ };
9
+ return [e, ...t].map((e) => e.map(n).join(",")).join("\n");
10
+ }
11
+ //#endregion
12
+ export { e as toCsv };
13
+
14
+ //# sourceMappingURL=reports-csv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reports-csv.js","names":[],"sources":["../../../src/brainyrich/pages/reports-csv.ts"],"sourcesContent":["export function toCsv(headers: string[], rows: (string | number)[][]): string {\n const escape = (cell: string | number) => {\n const s = String(cell ?? '');\n // Reports target spreadsheet viewing. A quoted tab protects formula-like\n // text; numeric financial values retain their original numeric representation.\n let textStart = 0;\n while (\n textStart < s.length &&\n (s.charCodeAt(textStart) <= 32 || s.charCodeAt(textStart) === 127 || /\\s/u.test(s[textStart]))\n ) {\n textStart += 1;\n }\n const formulaText = typeof cell === 'string' && /^[=+\\-@=+-@]/u.test(s.slice(textStart));\n const value = formulaText ? `\\t${s}` : s;\n return formulaText || /[\",\\r\\n]/.test(value) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value;\n };\n return [headers, ...rows].map((row) => row.map(escape).join(',')).join('\\n');\n}\n"],"mappings":";AAAA,SAAgB,EAAM,GAAmB,GAAqC;CAC5E,IAAM,KAAU,MAA0B;EACxC,IAAM,IAAI,OAAO,KAAQ,EAAE,GAGvB,IAAY;EAChB,OACE,IAAY,EAAE,WACb,EAAE,WAAW,CAAS,KAAK,MAAM,EAAE,WAAW,CAAS,MAAM,OAAO,MAAM,KAAK,EAAE,EAAU,KAE5F,KAAa;EAEf,IAAM,IAAc,OAAO,KAAS,YAAY,gBAAgB,KAAK,EAAE,MAAM,CAAS,CAAC,GACjF,IAAQ,IAAc,KAAK,MAAM;EACvC,OAAO,KAAe,WAAW,KAAK,CAAK,IAAI,IAAI,EAAM,QAAQ,MAAM,MAAI,EAAE,KAAK;CACpF;CACA,OAAO,CAAC,GAAS,GAAG,CAAI,EAAE,KAAK,MAAQ,EAAI,IAAI,CAAM,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI;AAC7E"}
@@ -0,0 +1,10 @@
1
+ import e from "../../node_modules/clsx/dist/clsx.js";
2
+ import { twMerge as t } from "../../node_modules/tailwind-merge/dist/bundle-mjs.js";
3
+ //#region src/brainyrich/utils/cn.ts
4
+ function n(...n) {
5
+ return t(e(n));
6
+ }
7
+ //#endregion
8
+ export { n as cn };
9
+
10
+ //# sourceMappingURL=cn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cn.js","names":[],"sources":["../../../src/brainyrich/utils/cn.ts"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":";;;AAGA,SAAgB,EAAG,GAAG,GAAsB;CAC1C,OAAO,EAAQ,EAAK,CAAM,CAAC;AAC7B"}
@@ -0,0 +1,13 @@
1
+ import { BraGoal, BraGoalProjection, BraGoalStatus } from '../types/bra';
2
+ import { VizTone } from '../components/viz';
3
+ /** Sum of the fixed-amount funding links wired to a goal (real backend value). */
4
+ export declare function goalFixedFunded(goal: Pick<BraGoal, 'fundings'>): number;
5
+ /**
6
+ * Funded-progress percentage for a goal. ACHIEVED goals read 100%; otherwise the
7
+ * sum of fixed funding links over the target — every input is wired backend data,
8
+ * never fabricated.
9
+ */
10
+ export declare function fundedPercent(goal: Pick<BraGoal, 'fundings' | 'targetAmount' | 'status'>): number;
11
+ /** Ring/accent tone derived from the goal's real status + projection. */
12
+ export declare function goalTone(status: BraGoalStatus, projection: BraGoalProjection): VizTone;
13
+ //# sourceMappingURL=goalMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goalMetrics.d.ts","sourceRoot":"","sources":["../../../src/brainyrich/utils/goalMetrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,MAAM,CAIvE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,cAAc,GAAG,QAAQ,CAAC,GAAG,MAAM,CAIjG;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAYtF"}
@@ -0,0 +1,20 @@
1
+ //#region src/brainyrich/utils/goalMetrics.ts
2
+ function e(e) {
3
+ return (e.fundings ?? []).reduce((e, t) => e + (t.fixedAmount ?? 0), 0);
4
+ }
5
+ function t(t) {
6
+ return t.status === "ACHIEVED" ? 100 : t.targetAmount > 0 ? Math.max(0, Math.min(100, e(t) / t.targetAmount * 100)) : 0;
7
+ }
8
+ function n(e, t) {
9
+ if (e === "ACHIEVED") return "success";
10
+ switch (t) {
11
+ case "AHEAD":
12
+ case "ON_TRACK": return "brand";
13
+ case "BEHIND": return "warning";
14
+ default: return "error";
15
+ }
16
+ }
17
+ //#endregion
18
+ export { t as fundedPercent, n as goalTone };
19
+
20
+ //# sourceMappingURL=goalMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goalMetrics.js","names":[],"sources":["../../../src/brainyrich/utils/goalMetrics.ts"],"sourcesContent":["import type { BraGoal, BraGoalProjection, BraGoalStatus } from '../types/bra';\nimport type { VizTone } from '../components/viz';\n\n/** Sum of the fixed-amount funding links wired to a goal (real backend value). */\nexport function goalFixedFunded(goal: Pick<BraGoal, 'fundings'>): number {\n // List and detail queries both fetch `fundings`; goals returned by mutations\n // (e.g. a freshly created goal) do not, and have no funding links yet anyway.\n return (goal.fundings ?? []).reduce((s, f) => s + (f.fixedAmount ?? 0), 0);\n}\n\n/**\n * Funded-progress percentage for a goal. ACHIEVED goals read 100%; otherwise the\n * sum of fixed funding links over the target — every input is wired backend data,\n * never fabricated.\n */\nexport function fundedPercent(goal: Pick<BraGoal, 'fundings' | 'targetAmount' | 'status'>): number {\n if (goal.status === 'ACHIEVED') return 100;\n if (!(goal.targetAmount > 0)) return 0;\n return Math.max(0, Math.min(100, (goalFixedFunded(goal) / goal.targetAmount) * 100));\n}\n\n/** Ring/accent tone derived from the goal's real status + projection. */\nexport function goalTone(status: BraGoalStatus, projection: BraGoalProjection): VizTone {\n if (status === 'ACHIEVED') return 'success';\n switch (projection) {\n case 'AHEAD':\n case 'ON_TRACK':\n return 'brand';\n case 'BEHIND':\n return 'warning';\n case 'AT_RISK':\n default:\n return 'error';\n }\n}\n"],"mappings":";AAIA,SAAgB,EAAgB,GAAyC;CAGvE,QAAQ,EAAK,YAAY,CAAC,GAAG,QAAQ,GAAG,MAAM,KAAK,EAAE,eAAe,IAAI,CAAC;AAC3E;AAOA,SAAgB,EAAc,GAAqE;CAGjG,OAFI,EAAK,WAAW,aAAmB,MACjC,EAAK,eAAe,IACnB,KAAK,IAAI,GAAG,KAAK,IAAI,KAAM,EAAgB,CAAI,IAAI,EAAK,eAAgB,GAAG,CAAC,IAD9C;AAEvC;AAGA,SAAgB,EAAS,GAAuB,GAAwC;CACtF,IAAI,MAAW,YAAY,OAAO;CAClC,QAAQ,GAAR;EACE,KAAK;EACL,KAAK,YACH,OAAO;EACT,KAAK,UACH,OAAO;EAET,SACE,OAAO;CACX;AACF"}
@@ -0,0 +1,7 @@
1
+ import { BraAccount, BraGoal, BraInsight, BraPortfolio } from '../brainyrich/types/bra';
2
+ export declare const translate: (_key: string, fallback: string, params?: Record<string, string | number>) => string;
3
+ export declare function makeGoal(overrides?: Partial<BraGoal>): BraGoal;
4
+ export declare function makeAccount(overrides?: Partial<BraAccount>): BraAccount;
5
+ export declare function makeInsight(overrides?: Partial<BraInsight>): BraInsight;
6
+ export declare function makePortfolio(overrides?: Partial<BraPortfolio>): BraPortfolio;
7
+ //# sourceMappingURL=brainyrichFixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brainyrichFixtures.d.ts","sourceRoot":"","sources":["../../src/test/brainyrichFixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAI7F,eAAO,MAAM,SAAS,GACpB,MAAM,MAAM,EACZ,UAAU,MAAM,EAChB,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KACvC,MAGW,CAAC;AAEf,wBAAgB,QAAQ,CAAC,SAAS,GAAE,OAAO,CAAC,OAAO,CAAM,GAAG,OAAO,CAsBlE;AAED,wBAAgB,WAAW,CAAC,SAAS,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,UAAU,CAoB3E;AAED,wBAAgB,WAAW,CAAC,SAAS,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,UAAU,CAmB3E;AAED,wBAAgB,aAAa,CAAC,SAAS,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,YAAY,CAmBjF"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Replace `window.matchMedia` with a controllable fake whose
3
+ * `(max-width: …)` queries match when `mobile` is true. Returns a setter that
4
+ * flips the viewport and notifies every subscribed listener, mimicking a
5
+ * resize or rotation across the breakpoint.
6
+ */
7
+ export declare function mockViewport(mobile: boolean): (next: boolean) => void;
8
+ //# sourceMappingURL=viewport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewport.d.ts","sourceRoot":"","sources":["../../src/test/viewport.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAuBrE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-brainyrich",
3
- "version": "2026.1101.1",
3
+ "version": "2026.1101.3",
4
4
  "description": "Burdenoff BrainyRich Microfrontend",
5
5
  "type": "module",
6
6
  "files": [