@mx-cartographer/experiences 9.4.12-alpha.al0 → 9.4.12
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/CHANGELOG.md +3 -1
- package/dist/common/context/hooks.d.ts +1 -0
- package/dist/common/context/hooks.es.js +18 -17
- package/dist/common/context/hooks.es.js.map +1 -1
- package/dist/common/context/index.d.ts +1 -1
- package/dist/common/index.es.js +130 -129
- package/dist/common/utils/Theme.es.js +23 -23
- package/dist/common/utils/Theme.es.js.map +1 -1
- package/dist/core/stores/InsightsV2Store.d.ts +24 -7
- package/dist/core/stores/InsightsV2Store.es.js +18 -23
- package/dist/core/stores/InsightsV2Store.es.js.map +1 -1
- package/dist/insights-v2/actionBlocks/MakeTransferActionBlock/MakeTransferActionBlock.d.ts +4 -27
- package/dist/insights-v2/actionBlocks/MakeTransferActionBlock/MakeTransferActionBlock.es.js +253 -206
- package/dist/insights-v2/actionBlocks/MakeTransferActionBlock/MakeTransferActionBlock.es.js.map +1 -1
- package/dist/insights-v2/actionBlocks/MakeTransferActionBlock/MakeTransferActionBlockLayer.d.ts +5 -4
- package/dist/insights-v2/actionBlocks/MakeTransferActionBlock/MakeTransferActionBlockLayer.es.js +12 -20
- package/dist/insights-v2/actionBlocks/MakeTransferActionBlock/MakeTransferActionBlockLayer.es.js.map +1 -1
- package/dist/insights-v2/actionBlocks/MakeTransferActionBlock/index.d.ts +2 -0
- package/dist/insights-v2/actionBlocks/MakeTransferActionBlock/layout.d.ts +9 -43
- package/dist/insights-v2/actionBlocks/MakeTransferActionBlock/layout.es.js +12 -79
- package/dist/insights-v2/actionBlocks/MakeTransferActionBlock/layout.es.js.map +1 -1
- package/dist/insights-v2/actionBlocks/PlaceholderActionBlock.es.js +35 -13
- package/dist/insights-v2/actionBlocks/PlaceholderActionBlock.es.js.map +1 -1
- package/dist/insights-v2/blocks/ChartBlocks/BarchartBlock/BarchartBlock.es.js +17 -13
- package/dist/insights-v2/blocks/ChartBlocks/BarchartBlock/BarchartBlock.es.js.map +1 -1
- package/dist/insights-v2/blocks/ChartBlocks/BarchartBlock/utils.es.js.map +1 -1
- package/dist/insights-v2/blocks/ChartBlocks/DonutChartBlock/DonutChart.es.js +7 -7
- package/dist/insights-v2/blocks/ChartBlocks/DonutChartBlock/DonutChart.es.js.map +1 -1
- package/dist/insights-v2/blocks/ChartBlocks/DoubleBarChartBlock/DoubleBarChartBlock.es.js +17 -13
- package/dist/insights-v2/blocks/ChartBlocks/DoubleBarChartBlock/DoubleBarChartBlock.es.js.map +1 -1
- package/dist/insights-v2/blocks/ChartBlocks/index.d.ts +1 -0
- package/dist/insights-v2/blocks/ComponentBlocks/BudgetBlock/BudgetBlock.es.js +19 -25
- package/dist/insights-v2/blocks/ComponentBlocks/BudgetBlock/BudgetBlock.es.js.map +1 -1
- package/dist/insights-v2/blocks/createVariantBlock.d.ts +29 -0
- package/dist/insights-v2/blocks/createVariantBlock.es.js +13 -0
- package/dist/insights-v2/blocks/createVariantBlock.es.js.map +1 -0
- package/dist/insights-v2/components/chartblocks/BarchartV2.es.js +24 -25
- package/dist/insights-v2/components/chartblocks/BarchartV2.es.js.map +1 -1
- package/dist/insights-v2/components/chartblocks/DoubleBarChart.es.js +18 -19
- package/dist/insights-v2/components/chartblocks/DoubleBarChart.es.js.map +1 -1
- package/dist/insights-v2/index.es.js +52 -50
- package/dist/insights-v2/mappings/blocks.es.js +20 -20
- package/package.json +1 -1
package/dist/insights-v2/actionBlocks/MakeTransferActionBlock/MakeTransferActionBlock.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MakeTransferActionBlock.es.js","names":[],"sources":["../../../../src/insights-v2/actionBlocks/MakeTransferActionBlock/MakeTransferActionBlock.tsx"],"sourcesContent":["import React from 'react'\nimport { Card, Divider, List, ListItem, Stack } from '@mui/material'\nimport { Icon } from '@mxenabled/mx-icons'\n\nimport { Text } from '@mxenabled/mxui'\nimport { BalanceStepper } from './BalanceStepper'\nimport { formatCurrency } from '../../../common'\nimport { buildDynamicCopy } from '../../../core'\nimport SaveEnoughToLiveOnBottomSection from './SaveEnoughToLiveOnBottomSection'\nimport { getMakeTransferLayout, variants } from './layout'\n\n// Re-exported for existing importers (adapter, tests) that pull `variants` from\n// the component module. The source of truth is ./layout.\nexport { variants }\n\ninterface CopyContent {\n header_content?: string\n description?: string\n body_content?: string\n body_description?: string\n available_text?: string\n total_remaining_text?: string\n increment_aria_label?: string\n decrement_aria_label?: string\n expenses_text?: string\n available_balances_text?: string\n average_monthly_spend_text?: string\n your_available_balances_text?: string\n}\n\ninterface MakeTransferActionBlockProps {\n date?: string\n variant: (typeof variants)[keyof typeof variants]\n svgDateContent?: string\n availableBalances?: number\n copy: CopyContent\n averageMonthlySpend?: number\n /** SAVE_AN_EXTRA_100: total remaining from the payload; falls back to available − expenses. */\n totalRemaining?: number\n}\n\n// Content-only: the surrounding Drawer (open/close/title) is owned by\n// ActionBlockLayer, which renders this inside the shared action-drawer shell.\nexport const MakeTransferActionBlock = ({\n variant = variants.SAVE_ENOUGH_TO_LIVE_ON,\n svgDateContent,\n date,\n copy,\n availableBalances,\n averageMonthlySpend,\n totalRemaining,\n}: MakeTransferActionBlockProps) => {\n // All per-variant layout decisions live in ./layout.ts (Beat Blocks pattern).\n const layout = getMakeTransferLayout(variant)\n const { monthsTable, deltaAmount } = layout\n\n const [amountToCalculate, setAmountToCalculate] = React.useState(\n layout.initialAmount ?? averageMonthlySpend ?? 0,\n )\n\n // Variants without a fixed initialAmount (e.g. SAVE_ENOUGH_TO_LIVE_ON) seed the\n // stepper from averageMonthlySpend. useState only captures its initializer once,\n // so sync once the spend resolves after mount.\n React.useEffect(() => {\n if (layout.initialAmount == null && averageMonthlySpend != null) {\n setAmountToCalculate(averageMonthlySpend)\n }\n }, [averageMonthlySpend, layout.initialAmount])\n\n return (\n <>\n <Stack\n sx={{\n bgcolor: 'background.paper',\n p: 24,\n borderBottom: '1px solid',\n borderColor: 'divider',\n }}\n >\n {layout.showBalancesSection &&\n availableBalances != null &&\n averageMonthlySpend != null &&\n svgDateContent && (\n <SaveEnoughToLiveOnBottomSection\n content={svgDateContent || ''}\n leftLabel={copy.available_balances_text!}\n leftValue={formatCurrency(availableBalances, '0,0.00')}\n rightLabel={copy.average_monthly_spend_text!}\n rightValue={formatCurrency(averageMonthlySpend, '0,0.00')}\n sx={{ width: '100%', mb: 24 }}\n />\n )}\n <Stack\n sx={{\n gap: 8,\n }}\n >\n <Text variant=\"h3\">{copy.header_content}</Text>\n <Text sx={{ lineHeight: '24px' }} truncate={false} variant=\"body1\">\n {copy.description}\n </Text>\n </Stack>\n </Stack>\n {layout.showRemainingCard && availableBalances != null && averageMonthlySpend != null && (\n <Stack sx={{ pt: 24, px: 24 }}>\n <Card sx={{ px: 16, pt: 16, pb: 12 }}>\n <Stack\n sx={{\n border: 1,\n borderColor: 'divider',\n borderRadius: '4px',\n gap: 12,\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n p: 8,\n mb: 12,\n }}\n >\n <Stack sx={{ width: 155, textAlign: 'center' }}>\n <Text sx={{ fontWeight: 600 }} variant=\"body1\">\n {formatCurrency(availableBalances, '0,0.00')}\n </Text>\n <Text sx={{ color: 'text.secondary' }} variant=\"caption\">\n {copy.available_text}\n </Text>\n </Stack>\n <Icon name=\"remove\" size={20} />\n <Stack sx={{ width: 155, textAlign: 'center' }}>\n <Text sx={{ fontWeight: 600 }} variant=\"body1\">\n {formatCurrency(averageMonthlySpend, '0,0.00')}\n </Text>\n <Text sx={{ color: 'text.secondary' }} variant=\"caption\">\n {copy.expenses_text}\n </Text>\n </Stack>\n </Stack>\n <Stack\n sx={{\n textAlign: 'center',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n gap: 4,\n }}\n >\n <Text sx={{ color: 'text.secondary' }} variant=\"body2\">\n {copy.total_remaining_text}:\n </Text>\n <Text sx={{ fontWeight: 600 }} variant=\"body2\">\n {formatCurrency(totalRemaining, '0,0.00')}\n </Text>\n </Stack>\n </Card>\n </Stack>\n )}\n\n <Stack sx={{ p: 24, gap: 8 }}>\n <Text sx={{ fontWeight: 600 }} truncate={false} variant=\"body1\">\n {copy.body_content}\n </Text>\n <BalanceStepper\n amount={formatCurrency(amountToCalculate, '0,0.00')}\n copy={copy}\n onDecrement={() => setAmountToCalculate((prev) => Math.max(0, prev - deltaAmount))}\n onIncrement={() => setAmountToCalculate((prev) => prev + deltaAmount)}\n />\n </Stack>\n <Stack sx={{ gap: 8 }}>\n <Text sx={{ fontWeight: 600, mx: 24 }} truncate={false} variant=\"body1\">\n {copy.body_description}\n </Text>\n <List sx={{ bgcolor: 'background.paper', width: '100%' }}>\n {monthsTable.map(({ label, value }, index) => {\n const isLastIndex = layout.lastRowIndex\n return (\n <React.Fragment key={value}>\n <ListItem\n disableGutters={true}\n disablePadding={true}\n sx={{\n minHeight: 52,\n bgcolor: 'background.paper',\n }}\n >\n <Stack sx={{ width: '100%' }}>\n <Stack\n sx={{\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '100%',\n px: 24,\n py: 8,\n }}\n >\n <Text truncate={false} variant=\"body1\">\n {label}\n </Text>\n <Text sx={{ fontWeight: 600 }} truncate={false} variant=\"body1\">\n {formatCurrency(value * amountToCalculate, '0,0')}\n </Text>\n </Stack>\n </Stack>\n </ListItem>\n <Divider component=\"li\" sx={{ ml: index === isLastIndex ? 0 : 24 }} />\n </React.Fragment>\n )\n })}\n </List>\n {layout.showTotalBalances && availableBalances != null && (\n <Stack sx={{ pt: 6, pb: 14, px: 24, textAlign: 'right', gap: 4 }}>\n <Text truncate={false} variant=\"h3\">\n {formatCurrency(availableBalances, '0,0.00')}\n </Text>\n {date && (\n <Text\n sx={{ color: 'text.secondary', fontWeight: 400 }}\n truncate={false}\n variant=\"subtitle2\"\n >\n {buildDynamicCopy(copy.your_available_balances_text!, date) as string}\n </Text>\n )}\n </Stack>\n )}\n </Stack>\n </>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MakeTransferActionBlock.es.js","names":[],"sources":["../../../../src/insights-v2/actionBlocks/MakeTransferActionBlock/MakeTransferActionBlock.tsx"],"sourcesContent":["import React, { type ReactNode } from 'react'\nimport { Card, Divider, List, ListItem, Stack } from '@mui/material'\nimport { Icon } from '@mxenabled/mx-icons'\n\nimport { Text } from '@mxenabled/mxui'\n\nimport { formatCurrency } from '../../../common'\nimport { buildDynamicCopy, type MakeTransferCopy } from '../../../core'\n\nimport { BalanceStepper } from './BalanceStepper'\nimport SaveEnoughToLiveOnBottomSection from './SaveEnoughToLiveOnBottomSection'\nimport {\n toNumber,\n variants,\n type MakeTransferVariant,\n type MakeTransferVariantProps,\n} from './layout'\n\n// ============================================================================\n// Section building blocks (block-local)\n// ============================================================================\n\ninterface MonthRow {\n label: string\n value: number\n}\n\nconst SAVE_AN_EXTRA_MONTHS: readonly MonthRow[] = [\n { label: '3 months', value: 3 },\n { label: '6 months', value: 6 },\n { label: '9 months', value: 9 },\n]\n\nconst SAVE_ENOUGH_MONTHS: readonly MonthRow[] = [\n { label: '1 month', value: 1 },\n { label: '3 months', value: 3 },\n { label: '6 months', value: 6 },\n { label: '9 months', value: 9 },\n]\n\n/** Bordered title + description, with an optional `leading` slot. */\nconst Header = ({ copy, leading }: { copy: MakeTransferCopy; leading?: ReactNode }) => (\n <Stack\n sx={{ bgcolor: 'background.paper', p: 24, borderBottom: '1px solid', borderColor: 'divider' }}\n >\n {leading}\n <Stack sx={{ gap: 8 }}>\n <Text variant=\"h3\">{copy.header_content}</Text>\n <Text sx={{ lineHeight: '24px' }} truncate={false} variant=\"body1\">\n {copy.description}\n </Text>\n </Stack>\n </Stack>\n)\n\n/** Save-extra only: available − expenses = total remaining. */\nconst RemainingCard = ({\n availableBalances,\n expenses,\n totalRemaining,\n copy,\n}: {\n availableBalances: number\n expenses: number\n totalRemaining?: number\n copy: MakeTransferCopy\n}) => (\n <Stack sx={{ pt: 24, px: 24 }}>\n <Card sx={{ px: 16, pt: 16, pb: 12 }}>\n <Stack\n sx={{\n border: 1,\n borderColor: 'divider',\n borderRadius: '4px',\n gap: 12,\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n p: 8,\n mb: 12,\n }}\n >\n <Stack sx={{ width: 155, textAlign: 'center' }}>\n <Text sx={{ fontWeight: 600 }} variant=\"body1\">\n {formatCurrency(availableBalances, '0,0.00')}\n </Text>\n <Text sx={{ color: 'text.secondary' }} variant=\"caption\">\n {copy.available_text}\n </Text>\n </Stack>\n <Icon name=\"remove\" size={20} />\n <Stack sx={{ width: 155, textAlign: 'center' }}>\n <Text sx={{ fontWeight: 600 }} variant=\"body1\">\n {formatCurrency(expenses, '0,0.00')}\n </Text>\n <Text sx={{ color: 'text.secondary' }} variant=\"caption\">\n {copy.expenses_text}\n </Text>\n </Stack>\n </Stack>\n <Stack\n sx={{\n textAlign: 'center',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n gap: 4,\n }}\n >\n <Text sx={{ color: 'text.secondary' }} variant=\"body2\">\n {copy.total_remaining_text}:\n </Text>\n <Text sx={{ fontWeight: 600 }} variant=\"body2\">\n {formatCurrency(totalRemaining, '0,0.00')}\n </Text>\n </Stack>\n </Card>\n </Stack>\n)\n\n/** Save-enough only: total available balances as of a date. */\nconst TotalsFooter = ({\n availableBalances,\n date,\n copy,\n}: {\n availableBalances: number\n date?: string\n copy: MakeTransferCopy\n}) => (\n <Stack sx={{ pt: 6, pb: 14, px: 24, textAlign: 'right', gap: 4 }}>\n <Text truncate={false} variant=\"h3\">\n {formatCurrency(availableBalances, '0,0.00')}\n </Text>\n {date && (\n <Text sx={{ color: 'text.secondary', fontWeight: 400 }} truncate={false} variant=\"subtitle2\">\n {buildDynamicCopy(copy.your_available_balances_text, date) as string}\n </Text>\n )}\n </Stack>\n)\n\n/** Stepper + projected-savings table. Owns the amount state so both stay in sync. */\nconst SavingsProjection = ({\n bodyContent,\n bodyDescription,\n monthsTable,\n deltaAmount,\n initialAmount,\n seedAmount,\n copy,\n}: {\n bodyContent: string\n bodyDescription: string\n monthsTable: readonly MonthRow[]\n deltaAmount: number\n /** Fixed starting amount; when null, seeds from `seedAmount` once it resolves. */\n initialAmount: number | null\n seedAmount?: number\n copy: MakeTransferCopy\n}) => {\n const [amount, setAmount] = React.useState(initialAmount ?? seedAmount ?? 0)\n\n React.useEffect(() => {\n if (initialAmount == null && seedAmount != null) {\n setAmount(seedAmount)\n }\n }, [initialAmount, seedAmount])\n\n const lastRowIndex = monthsTable.length - 1\n\n return (\n <>\n <Stack sx={{ p: 24, gap: 8 }}>\n <Text sx={{ fontWeight: 600 }} truncate={false} variant=\"body1\">\n {bodyContent}\n </Text>\n <BalanceStepper\n amount={formatCurrency(amount, '0,0.00')}\n copy={copy}\n onDecrement={() => setAmount((prev) => Math.max(0, prev - deltaAmount))}\n onIncrement={() => setAmount((prev) => prev + deltaAmount)}\n />\n </Stack>\n <Stack sx={{ gap: 8 }}>\n <Text sx={{ fontWeight: 600, mx: 24 }} truncate={false} variant=\"body1\">\n {bodyDescription}\n </Text>\n <List sx={{ bgcolor: 'background.paper', width: '100%' }}>\n {monthsTable.map(({ label, value }, index) => (\n <React.Fragment key={value}>\n <ListItem\n disableGutters={true}\n disablePadding={true}\n sx={{ minHeight: 52, bgcolor: 'background.paper' }}\n >\n <Stack sx={{ width: '100%' }}>\n <Stack\n sx={{\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '100%',\n px: 24,\n py: 8,\n }}\n >\n <Text truncate={false} variant=\"body1\">\n {label}\n </Text>\n <Text sx={{ fontWeight: 600 }} truncate={false} variant=\"body1\">\n {formatCurrency(value * amount, '0,0')}\n </Text>\n </Stack>\n </Stack>\n </ListItem>\n <Divider component=\"li\" sx={{ ml: index === lastRowIndex ? 0 : 24 }} />\n </React.Fragment>\n ))}\n </List>\n </Stack>\n </>\n )\n}\n\n// ============================================================================\n// Block — one component handles both variants (they share the header + the\n// stepper/table skeleton; the top/middle/bottom sections differ). Branching is\n// on `variant` since the two are structurally close. If a third structurally\n// distinct variant appears, split into per-variant components + a registry.\n// ============================================================================\n\nexport const MakeTransferActionBlock = ({\n variant,\n slotData,\n copy,\n}: MakeTransferVariantProps & { variant: MakeTransferVariant }) => {\n const isSaveEnough = variant === variants.SAVE_ENOUGH_TO_LIVE_ON\n\n const availableBalances = slotData?.available_balance\n const averageMonthlySpend = toNumber(slotData?.avg_monthly_spend)\n const expenses = toNumber(slotData?.upcoming_expenses)\n const totalRemaining = toNumber(slotData?.total_remaining)\n const svgDateContent = slotData?.time_period\n const date = slotData?.date\n\n return (\n <>\n <Header\n copy={copy}\n leading={\n isSaveEnough &&\n availableBalances != null &&\n averageMonthlySpend != null &&\n svgDateContent ? (\n <SaveEnoughToLiveOnBottomSection\n content={svgDateContent}\n leftLabel={copy.available_balances_text}\n leftValue={formatCurrency(availableBalances, '0,0.00')}\n rightLabel={copy.average_monthly_spend_text}\n rightValue={formatCurrency(averageMonthlySpend, '0,0.00')}\n sx={{ width: '100%', mb: 24 }}\n />\n ) : null\n }\n />\n\n {!isSaveEnough && availableBalances != null && expenses != null && (\n <RemainingCard\n availableBalances={availableBalances}\n copy={copy}\n expenses={expenses}\n totalRemaining={totalRemaining}\n />\n )}\n\n <SavingsProjection\n bodyContent={isSaveEnough ? copy.body_spending_content : copy.body_saving_content}\n bodyDescription={\n isSaveEnough ? copy.body_spending_description : copy.body_saving_description\n }\n copy={copy}\n deltaAmount={isSaveEnough ? 50 : 5}\n initialAmount={isSaveEnough ? null : 100}\n monthsTable={isSaveEnough ? SAVE_ENOUGH_MONTHS : SAVE_AN_EXTRA_MONTHS}\n seedAmount={isSaveEnough ? averageMonthlySpend : undefined}\n />\n\n {isSaveEnough && availableBalances != null && (\n <TotalsFooter availableBalances={availableBalances} copy={copy} date={date} />\n )}\n </>\n )\n}\n"],"mappings":"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"}
|
package/dist/insights-v2/actionBlocks/MakeTransferActionBlock/MakeTransferActionBlockLayer.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Beat } from '../../../core';
|
|
2
2
|
/**
|
|
3
|
-
* Adapter that plugs
|
|
3
|
+
* Adapter that plugs MakeTransfer into the ActionBlock registry.
|
|
4
4
|
*
|
|
5
|
-
* The
|
|
6
|
-
* (open/close/title). This adapter derives the variant from the clicked CTA,
|
|
7
|
-
*
|
|
5
|
+
* The variants are content-only — ActionBlockLayer owns the surrounding Drawer
|
|
6
|
+
* (open/close/title). This adapter derives the variant from the clicked CTA, the
|
|
7
|
+
* copy from GlobalCopyStore, and passes the slot data through; each variant reads
|
|
8
|
+
* the fields it needs.
|
|
8
9
|
*/
|
|
9
10
|
export declare const MakeTransferActionBlockLayer: (({ beat, }: {
|
|
10
11
|
beat: Beat;
|
package/dist/insights-v2/actionBlocks/MakeTransferActionBlock/MakeTransferActionBlockLayer.es.js
CHANGED
|
@@ -1,26 +1,18 @@
|
|
|
1
|
-
import { useGlobalCopyStore as
|
|
2
|
-
import {
|
|
3
|
-
import { MakeTransferActionBlock as
|
|
4
|
-
import { observer as
|
|
5
|
-
import { jsx as
|
|
6
|
-
var
|
|
7
|
-
const { actionDrawer:
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
return /* @__PURE__ */ _(v, {
|
|
13
|
-
availableBalances: o?.available_balance,
|
|
14
|
-
averageMonthlySpend: s(o?.[t.averageMonthlySpend]),
|
|
15
|
-
copy: m,
|
|
16
|
-
date: o?.date,
|
|
17
|
-
svgDateContent: t.timePeriod ? o?.[t.timePeriod] : void 0,
|
|
18
|
-
totalRemaining: t.totalRemaining ? s(o?.[t.totalRemaining]) : void 0,
|
|
19
|
-
variant: r
|
|
1
|
+
import { useGlobalCopyStore as n, useInsightsV2Store as s } from "../../../common/context/hooks.es.js";
|
|
2
|
+
import { resolveMakeTransferVariant as i } from "./layout.es.js";
|
|
3
|
+
import { MakeTransferActionBlock as c } from "./MakeTransferActionBlock.es.js";
|
|
4
|
+
import { observer as f } from "mobx-react-lite";
|
|
5
|
+
import { jsx as m } from "react/jsx-runtime";
|
|
6
|
+
var g = f(function({ beat: a }) {
|
|
7
|
+
const { actionDrawer: o } = s(), { insights_feed: t } = n(), r = a.insights_payload, e = o.trigger === "secondaryCta" ? r?.secondary_cta : r?.primary_cta;
|
|
8
|
+
return /* @__PURE__ */ m(c, {
|
|
9
|
+
copy: t.make_transfer,
|
|
10
|
+
slotData: r?.instance_slot_data,
|
|
11
|
+
variant: i(e?.variant)
|
|
20
12
|
});
|
|
21
13
|
});
|
|
22
14
|
export {
|
|
23
|
-
|
|
15
|
+
g as MakeTransferActionBlockLayer
|
|
24
16
|
};
|
|
25
17
|
|
|
26
18
|
//# sourceMappingURL=MakeTransferActionBlockLayer.es.js.map
|
package/dist/insights-v2/actionBlocks/MakeTransferActionBlock/MakeTransferActionBlockLayer.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MakeTransferActionBlockLayer.es.js","names":[],"sources":["../../../../src/insights-v2/actionBlocks/MakeTransferActionBlock/MakeTransferActionBlockLayer.tsx"],"sourcesContent":["import { observer } from 'mobx-react-lite'\n\nimport { useGlobalCopyStore, useInsightsV2Store } from '../../../common'\n\nimport type { Beat } from '../../../core'\nimport type { SaveExtraBlockData } from '../../../core/types/InsightsInstanceSlotData'\n\nimport { MakeTransferActionBlock } from './MakeTransferActionBlock'\nimport {
|
|
1
|
+
{"version":3,"file":"MakeTransferActionBlockLayer.es.js","names":[],"sources":["../../../../src/insights-v2/actionBlocks/MakeTransferActionBlock/MakeTransferActionBlockLayer.tsx"],"sourcesContent":["import { observer } from 'mobx-react-lite'\n\nimport { useGlobalCopyStore, useInsightsV2Store } from '../../../common'\n\nimport type { Beat } from '../../../core'\nimport type { SaveExtraBlockData } from '../../../core/types/InsightsInstanceSlotData'\n\nimport { MakeTransferActionBlock } from './MakeTransferActionBlock'\nimport { resolveMakeTransferVariant } from './layout'\n\n/**\n * Adapter that plugs MakeTransfer into the ActionBlock registry.\n *\n * The variants are content-only — ActionBlockLayer owns the surrounding Drawer\n * (open/close/title). This adapter derives the variant from the clicked CTA, the\n * copy from GlobalCopyStore, and passes the slot data through; each variant reads\n * the fields it needs.\n */\nexport const MakeTransferActionBlockLayer = observer(function MakeTransferActionBlockLayer({\n beat,\n}: {\n beat: Beat\n}) {\n const { actionDrawer } = useInsightsV2Store()\n const { insights_feed: insightsFeedCopy } = useGlobalCopyStore()\n\n const payload = beat.insights_payload\n const cta =\n actionDrawer.trigger === 'secondaryCta' ? payload?.secondary_cta : payload?.primary_cta\n\n return (\n <MakeTransferActionBlock\n copy={insightsFeedCopy.make_transfer}\n slotData={payload?.instance_slot_data as SaveExtraBlockData | undefined}\n variant={resolveMakeTransferVariant(cta?.variant)}\n />\n )\n})\n"],"mappings":";;;;;AAkBA,IAAa,IAA+B,EAAS,SAAsC,EACzF,MAAA,EAAA,GAGC;AACD,QAAM,EAAE,cAAA,EAAA,IAAiB,EAAmB,GACtC,EAAE,eAAe,EAAA,IAAqB,EAAmB,GAEzD,IAAU,EAAK,kBACf,IACJ,EAAa,YAAY,iBAAiB,GAAS,gBAAgB,GAAS;AAE9E,SACE,gBAAA,EAAC,GAAD;AAAA,IACE,MAAM,EAAiB;AAAA,IACvB,UAAU,GAAS;AAAA,IACnB,SAAS,EAA2B,GAAK,OAAO;AAAA,EACjD,CAAA;AAEL,CAAC"}
|
|
@@ -1,57 +1,23 @@
|
|
|
1
1
|
import { GlobalCopy, MakeTransferCopy } from '../../../core';
|
|
2
2
|
import { SaveExtraBlockData } from '../../../core/types/InsightsInstanceSlotData';
|
|
3
3
|
/**
|
|
4
|
-
* MakeTransfer drilldown variants. The block uses the VALUE (e.g. "SaveAnExtra100")
|
|
4
|
+
* MakeTransfer drilldown variants. The block uses the VALUE (e.g. "SaveAnExtra100"),
|
|
5
|
+
* which is also the key each variant registers under (see ./index).
|
|
5
6
|
*/
|
|
6
7
|
export declare const variants: {
|
|
7
8
|
readonly SAVE_ENOUGH_TO_LIVE_ON: "SaveEnoughToLiveOn";
|
|
8
9
|
readonly SAVE_AN_EXTRA_100: "SaveAnExtra100";
|
|
9
10
|
};
|
|
10
11
|
export type MakeTransferVariant = (typeof variants)[keyof typeof variants];
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
* Per-variant layout for the MakeTransfer drilldown — mirrors the Beat Blocks
|
|
17
|
-
* `layout.ts` pattern: the component reads this config instead of branching on
|
|
18
|
-
* the variant inline.
|
|
19
|
-
*/
|
|
20
|
-
export interface MakeTransferLayoutConfig {
|
|
21
|
-
/** Rows in the projected-savings table. */
|
|
22
|
-
monthsTable: readonly MonthRow[];
|
|
23
|
-
/** Stepper increment/decrement step. */
|
|
24
|
-
deltaAmount: number;
|
|
25
|
-
/** Starting stepper amount; when null, defaults to `averageMonthlySpend`. */
|
|
26
|
-
initialAmount: number | null;
|
|
27
|
-
/** Index of the last table row (its divider has no left inset). */
|
|
28
|
-
lastRowIndex: number;
|
|
29
|
-
/** Available/expenses card with "total remaining" (save-extra only). */
|
|
30
|
-
showRemainingCard: boolean;
|
|
31
|
-
/** SVG timeline + balances header section (save-enough only). */
|
|
32
|
-
showBalancesSection: boolean;
|
|
33
|
-
/** Total available-balances footer (save-enough only). */
|
|
34
|
-
showTotalBalances: boolean;
|
|
35
|
-
/** `insights_feed.make_transfer` copy keys resolved for this variant. */
|
|
36
|
-
copyKeys: {
|
|
37
|
-
title: keyof MakeTransferCopy;
|
|
38
|
-
bodyContent: keyof MakeTransferCopy;
|
|
39
|
-
bodyDescription: keyof MakeTransferCopy;
|
|
40
|
-
};
|
|
41
|
-
/** `instance_slot_data` field names feeding this variant's figures. */
|
|
42
|
-
dataKeys: {
|
|
43
|
-
/** Field for the "average monthly spend" / "expenses" figure. */
|
|
44
|
-
averageMonthlySpend: keyof SaveExtraBlockData;
|
|
45
|
-
/** SAVE_ENOUGH_TO_LIVE_ON: duration overlaid on the timeline SVG. */
|
|
46
|
-
timePeriod?: keyof SaveExtraBlockData;
|
|
47
|
-
/** SAVE_AN_EXTRA_100: total-remaining figure. */
|
|
48
|
-
totalRemaining?: keyof SaveExtraBlockData;
|
|
49
|
-
};
|
|
12
|
+
/** Props shared by every MakeTransfer variant. Each variant reads the fields it
|
|
13
|
+
* needs directly off `slotData` — no per-variant key indirection. */
|
|
14
|
+
export interface MakeTransferVariantProps {
|
|
15
|
+
slotData?: SaveExtraBlockData;
|
|
16
|
+
copy: MakeTransferCopy;
|
|
50
17
|
}
|
|
51
18
|
/** Maps the payload variant key to the block's variant VALUE (defaults to save-extra). */
|
|
52
19
|
export declare const resolveMakeTransferVariant: (variant?: string | null) => MakeTransferVariant;
|
|
53
|
-
/** Layout config for a resolved block variant. */
|
|
54
|
-
export declare const getMakeTransferLayout: (variant: MakeTransferVariant) => MakeTransferLayoutConfig;
|
|
55
20
|
/** Variant-specific, localized drawer title from `insights_feed.make_transfer`. */
|
|
56
21
|
export declare const getMakeTransferDrawerTitle: (variant: string | null | undefined, copy: GlobalCopy) => string;
|
|
57
|
-
|
|
22
|
+
/** Coerce a payload figure (number or numeric string) to a number, else undefined. */
|
|
23
|
+
export declare const toNumber: (value?: string | number) => number | undefined;
|
|
@@ -1,85 +1,18 @@
|
|
|
1
|
-
var
|
|
1
|
+
var e = {
|
|
2
2
|
SAVE_ENOUGH_TO_LIVE_ON: "SaveEnoughToLiveOn",
|
|
3
3
|
SAVE_AN_EXTRA_100: "SaveAnExtra100"
|
|
4
|
-
},
|
|
5
|
-
save_enough_to_live_on:
|
|
6
|
-
save_an_extra_100:
|
|
7
|
-
}, t =
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
},
|
|
12
|
-
{
|
|
13
|
-
label: "3 months",
|
|
14
|
-
value: 3
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
label: "6 months",
|
|
18
|
-
value: 6
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
label: "9 months",
|
|
22
|
-
value: 9
|
|
23
|
-
}
|
|
24
|
-
], n = [
|
|
25
|
-
{
|
|
26
|
-
label: "3 months",
|
|
27
|
-
value: 3
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
label: "6 months",
|
|
31
|
-
value: 6
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
label: "9 months",
|
|
35
|
-
value: 9
|
|
36
|
-
}
|
|
37
|
-
], o = {
|
|
38
|
-
[a.SAVE_AN_EXTRA_100]: {
|
|
39
|
-
monthsTable: n,
|
|
40
|
-
deltaAmount: 5,
|
|
41
|
-
initialAmount: 100,
|
|
42
|
-
lastRowIndex: n.length - 1,
|
|
43
|
-
showRemainingCard: !0,
|
|
44
|
-
showBalancesSection: !1,
|
|
45
|
-
showTotalBalances: !1,
|
|
46
|
-
copyKeys: {
|
|
47
|
-
title: "save_extra_title",
|
|
48
|
-
bodyContent: "body_saving_content",
|
|
49
|
-
bodyDescription: "body_saving_description"
|
|
50
|
-
},
|
|
51
|
-
dataKeys: {
|
|
52
|
-
averageMonthlySpend: "upcoming_expenses",
|
|
53
|
-
totalRemaining: "total_remaining"
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
[a.SAVE_ENOUGH_TO_LIVE_ON]: {
|
|
57
|
-
monthsTable: t,
|
|
58
|
-
deltaAmount: 50,
|
|
59
|
-
initialAmount: null,
|
|
60
|
-
lastRowIndex: t.length - 1,
|
|
61
|
-
showRemainingCard: !1,
|
|
62
|
-
showBalancesSection: !0,
|
|
63
|
-
showTotalBalances: !0,
|
|
64
|
-
copyKeys: {
|
|
65
|
-
title: "save_enough_title",
|
|
66
|
-
bodyContent: "body_spending_content",
|
|
67
|
-
bodyDescription: "body_spending_description"
|
|
68
|
-
},
|
|
69
|
-
dataKeys: {
|
|
70
|
-
averageMonthlySpend: "avg_monthly_spend",
|
|
71
|
-
timePeriod: "time_period"
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}, i = (e) => s[e ?? ""] ?? a.SAVE_AN_EXTRA_100, r = (e) => o[e], v = (e, _) => {
|
|
75
|
-
const l = o[i(e)];
|
|
76
|
-
return _.insights_feed?.make_transfer[l.copyKeys.title] ?? "";
|
|
77
|
-
};
|
|
4
|
+
}, t = {
|
|
5
|
+
save_enough_to_live_on: e.SAVE_ENOUGH_TO_LIVE_ON,
|
|
6
|
+
save_an_extra_100: e.SAVE_AN_EXTRA_100
|
|
7
|
+
}, n = (_) => t[_ ?? ""] ?? e.SAVE_AN_EXTRA_100, E = (_, a) => {
|
|
8
|
+
const r = a.insights_feed?.make_transfer;
|
|
9
|
+
return r ? n(_) === e.SAVE_ENOUGH_TO_LIVE_ON ? r.save_enough_title : r.save_extra_title : "";
|
|
10
|
+
}, A = (_) => _ == null || _ === "" ? void 0 : Number(_);
|
|
78
11
|
export {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
12
|
+
E as getMakeTransferDrawerTitle,
|
|
13
|
+
n as resolveMakeTransferVariant,
|
|
14
|
+
A as toNumber,
|
|
15
|
+
e as variants
|
|
83
16
|
};
|
|
84
17
|
|
|
85
18
|
//# sourceMappingURL=layout.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.es.js","names":[],"sources":["../../../../src/insights-v2/actionBlocks/MakeTransferActionBlock/layout.ts"],"sourcesContent":["import type { GlobalCopy, MakeTransferCopy } from '../../../core'\nimport type { SaveExtraBlockData } from '../../../core/types/InsightsInstanceSlotData'\n\n/**\n * MakeTransfer drilldown variants. The block uses the VALUE (e.g. \"SaveAnExtra100\").\n */\nexport const variants = {\n SAVE_ENOUGH_TO_LIVE_ON: 'SaveEnoughToLiveOn',\n SAVE_AN_EXTRA_100: 'SaveAnExtra100',\n} as const\n\nexport type MakeTransferVariant = (typeof variants)[keyof typeof variants]\n\n// The beat payload sends the variant as a snake_case key; map it to the value.\nconst VARIANT_BY_KEY: Record<string, MakeTransferVariant> = {\n save_enough_to_live_on: variants.SAVE_ENOUGH_TO_LIVE_ON,\n save_an_extra_100: variants.SAVE_AN_EXTRA_100,\n}\n\
|
|
1
|
+
{"version":3,"file":"layout.es.js","names":[],"sources":["../../../../src/insights-v2/actionBlocks/MakeTransferActionBlock/layout.ts"],"sourcesContent":["import type { GlobalCopy, MakeTransferCopy } from '../../../core'\nimport type { SaveExtraBlockData } from '../../../core/types/InsightsInstanceSlotData'\n\n/**\n * MakeTransfer drilldown variants. The block uses the VALUE (e.g. \"SaveAnExtra100\"),\n * which is also the key each variant registers under (see ./index).\n */\nexport const variants = {\n SAVE_ENOUGH_TO_LIVE_ON: 'SaveEnoughToLiveOn',\n SAVE_AN_EXTRA_100: 'SaveAnExtra100',\n} as const\n\nexport type MakeTransferVariant = (typeof variants)[keyof typeof variants]\n\n// The beat payload sends the variant as a snake_case key; map it to the value.\nconst VARIANT_BY_KEY: Record<string, MakeTransferVariant> = {\n save_enough_to_live_on: variants.SAVE_ENOUGH_TO_LIVE_ON,\n save_an_extra_100: variants.SAVE_AN_EXTRA_100,\n}\n\n/** Props shared by every MakeTransfer variant. Each variant reads the fields it\n * needs directly off `slotData` — no per-variant key indirection. */\nexport interface MakeTransferVariantProps {\n slotData?: SaveExtraBlockData\n copy: MakeTransferCopy\n}\n\n/** Maps the payload variant key to the block's variant VALUE (defaults to save-extra). */\nexport const resolveMakeTransferVariant = (variant?: string | null): MakeTransferVariant =>\n VARIANT_BY_KEY[variant ?? ''] ?? variants.SAVE_AN_EXTRA_100\n\n/** Variant-specific, localized drawer title from `insights_feed.make_transfer`. */\nexport const getMakeTransferDrawerTitle = (\n variant: string | null | undefined,\n copy: GlobalCopy,\n): string => {\n const makeTransfer = copy.insights_feed?.make_transfer\n if (!makeTransfer) return ''\n return resolveMakeTransferVariant(variant) === variants.SAVE_ENOUGH_TO_LIVE_ON\n ? makeTransfer.save_enough_title\n : makeTransfer.save_extra_title\n}\n\n/** Coerce a payload figure (number or numeric string) to a number, else undefined. */\nexport const toNumber = (value?: string | number): number | undefined =>\n value === undefined || value === null || value === '' ? undefined : Number(value)\n"],"mappings":"AAOA,IAAa,IAAW;AAAA,EACtB,wBAAwB;AAAA,EACxB,mBAAmB;AACrB,GAKM,IAAsD;AAAA,EAC1D,wBAAwB,EAAS;AAAA,EACjC,mBAAmB,EAAS;AAC9B,GAUa,IAAA,CAA8B,MACzC,EAAe,KAAW,EAAA,KAAO,EAAS,mBAG/B,IAAA,CACX,GACA,MACW;AACX,QAAM,IAAe,EAAK,eAAe;AACzC,SAAK,IACE,EAA2B,CAAO,MAAM,EAAS,yBACpD,EAAa,oBACb,EAAa,mBAHS;AAI5B,GAGa,IAAA,CAAY,MACA,KAAU,QAAQ,MAAU,KAAK,SAAY,OAAO,CAAK"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { useInsightsV2Store as
|
|
2
|
-
import {
|
|
1
|
+
import { useActionContext as h, useInsightsV2Store as m } from "../../common/context/hooks.es.js";
|
|
2
|
+
import { createVariantBlock as p } from "../blocks/createVariantBlock.es.js";
|
|
3
|
+
import { observer as i } from "mobx-react-lite";
|
|
3
4
|
import l from "@mui/material/Stack";
|
|
4
|
-
import { H3 as
|
|
5
|
-
import { jsx as
|
|
6
|
-
var
|
|
7
|
-
const {
|
|
5
|
+
import { H3 as s, Text as a } from "@mxenabled/mxui";
|
|
6
|
+
import { jsx as n, jsxs as e } from "react/jsx-runtime";
|
|
7
|
+
var c = i(({ beat: t }) => {
|
|
8
|
+
const { chartBarIndex: r = 0, tabIndex: o = 0 } = h() ?? {};
|
|
8
9
|
return /* @__PURE__ */ e(l, {
|
|
9
10
|
sx: {
|
|
10
11
|
alignItems: "center",
|
|
@@ -13,20 +14,41 @@ var g = c(function({ beat: i }) {
|
|
|
13
14
|
textAlign: "center"
|
|
14
15
|
},
|
|
15
16
|
children: [
|
|
16
|
-
/* @__PURE__ */
|
|
17
|
-
/* @__PURE__ */
|
|
18
|
-
/* @__PURE__ */ e(
|
|
19
|
-
/* @__PURE__ */ e(
|
|
17
|
+
/* @__PURE__ */ n(s, { children: "Action Block Layer Drilldown" }),
|
|
18
|
+
/* @__PURE__ */ n(a, { children: "This is a placeholder action block. Replace it with your own implementation by registering your block in src/insights-v2/mappings/blocks.ts." }),
|
|
19
|
+
/* @__PURE__ */ e(a, { children: ["Beat: ", t.guid] }),
|
|
20
|
+
/* @__PURE__ */ e(a, { children: [
|
|
20
21
|
"Drilldown: chartBarIndex ",
|
|
21
|
-
|
|
22
|
+
r,
|
|
22
23
|
", tabIndex ",
|
|
23
|
-
o
|
|
24
|
+
o
|
|
24
25
|
] })
|
|
25
26
|
]
|
|
26
27
|
});
|
|
28
|
+
}), g = ({ beat: t }) => /* @__PURE__ */ e(l, {
|
|
29
|
+
sx: {
|
|
30
|
+
alignItems: "center",
|
|
31
|
+
gap: 8,
|
|
32
|
+
p: 24,
|
|
33
|
+
textAlign: "center"
|
|
34
|
+
},
|
|
35
|
+
children: [/* @__PURE__ */ n(s, { children: "Action Block Layer Drilldown (compact)" }), /* @__PURE__ */ e(a, { children: ["Beat: ", t.guid] })]
|
|
36
|
+
}), x = p({
|
|
37
|
+
variants: {
|
|
38
|
+
default: c,
|
|
39
|
+
compact: g
|
|
40
|
+
},
|
|
41
|
+
fallback: c,
|
|
42
|
+
name: "Placeholder"
|
|
43
|
+
}), A = i(function({ beat: r }) {
|
|
44
|
+
const { actionDrawer: o } = m(), d = o.trigger === "secondaryCta" ? r.insights_payload?.secondary_cta : r.insights_payload?.primary_cta;
|
|
45
|
+
return /* @__PURE__ */ n(x, {
|
|
46
|
+
beat: r,
|
|
47
|
+
variant: d?.variant
|
|
48
|
+
});
|
|
27
49
|
});
|
|
28
50
|
export {
|
|
29
|
-
|
|
51
|
+
A as PlaceholderActionBlock
|
|
30
52
|
};
|
|
31
53
|
|
|
32
54
|
//# sourceMappingURL=PlaceholderActionBlock.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlaceholderActionBlock.es.js","names":[],"sources":["../../../src/insights-v2/actionBlocks/PlaceholderActionBlock.tsx"],"sourcesContent":["import Stack from '@mui/material/Stack'\n\nimport { H3, Text } from '@mxenabled/mxui'\nimport { observer } from 'mobx-react-lite'\n\nimport { useInsightsV2Store } from '../../common'\nimport { type ActionBlockProps } from '../mappings/blocks'\n\
|
|
1
|
+
{"version":3,"file":"PlaceholderActionBlock.es.js","names":[],"sources":["../../../src/insights-v2/actionBlocks/PlaceholderActionBlock.tsx"],"sourcesContent":["import Stack from '@mui/material/Stack'\n\nimport { H3, Text } from '@mxenabled/mxui'\nimport { observer } from 'mobx-react-lite'\n\nimport { useActionContext, useInsightsV2Store } from '../../common'\nimport type { Beat, DrilldownPayload } from '../../core'\n\nimport { createVariantBlock } from '../blocks/createVariantBlock'\nimport { type ActionBlockProps } from '../mappings/blocks'\n\n// This block doubles as the reference example for the two building blocks a real\n// action block uses:\n// 1. useActionContext<T>() — read the drawer's opaque, block-specific context.\n// 2. createVariantBlock — dispatch to a per-variant component with a fallback.\n// Register a block with variants exactly like `PlaceholderVariants` below, then\n// wire it into src/insights-v2/mappings/blocks.ts.\n\ninterface PlaceholderVariantProps {\n beat: Beat\n}\n\n/** Default variant — also the fallback for unknown/absent variants.\n * Wrapped in `observer` because it reads the drawer's observable context via\n * useActionContext; without it a memoized ancestor would stop it re-rendering.\n * This is the copy-paste template for real blocks, so it must model the rule. */\nconst DefaultPlaceholder = observer(({ beat }: PlaceholderVariantProps) => {\n // Chart drilldowns put { chartBarIndex, tabIndex } on the drawer context; a\n // CTA open carries none, so default to 0.\n const { chartBarIndex = 0, tabIndex = 0 } = useActionContext<DrilldownPayload>() ?? {}\n\n return (\n <Stack sx={{ alignItems: 'center', gap: 8, p: 24, textAlign: 'center' }}>\n <H3>Action Block Layer Drilldown</H3>\n <Text>\n This is a placeholder action block. Replace it with your own implementation by registering\n your block in src/insights-v2/mappings/blocks.ts.\n </Text>\n <Text>Beat: {beat.guid}</Text>\n <Text>\n Drilldown: chartBarIndex {chartBarIndex}, tabIndex {tabIndex}\n </Text>\n </Stack>\n )\n})\n\n/** A second sample variant, to show registry dispatch with more than one entry. */\nconst CompactPlaceholder = ({ beat }: PlaceholderVariantProps) => (\n <Stack sx={{ alignItems: 'center', gap: 8, p: 24, textAlign: 'center' }}>\n <H3>Action Block Layer Drilldown (compact)</H3>\n <Text>Beat: {beat.guid}</Text>\n </Stack>\n)\n\n// Register one component per backend `variant`; unknown/absent variants fall\n// back to DefaultPlaceholder.\nconst PlaceholderVariants = createVariantBlock<PlaceholderVariantProps>({\n variants: {\n default: DefaultPlaceholder,\n compact: CompactPlaceholder,\n },\n fallback: DefaultPlaceholder,\n name: 'Placeholder',\n})\n\nexport const PlaceholderActionBlock = observer(function PlaceholderActionBlock({\n beat,\n}: ActionBlockProps) {\n const { actionDrawer } = useInsightsV2Store()\n const cta =\n actionDrawer.trigger === 'secondaryCta'\n ? beat.insights_payload?.secondary_cta\n : beat.insights_payload?.primary_cta\n\n return <PlaceholderVariants beat={beat} variant={cta?.variant} />\n})\n"],"mappings":";;;;;;AA0BA,IAAM,IAAqB,EAAA,CAAU,EAAE,MAAA,EAAA,MAAoC;AAGzE,QAAM,EAAE,eAAA,IAAgB,GAAG,UAAA,IAAW,EAAA,IAAM,EAAmC,KAAK,CAAC;AAErF,SACE,gBAAA,EAAC,GAAD;AAAA,IAAO,IAAI;AAAA,MAAE,YAAY;AAAA,MAAU,KAAK;AAAA,MAAG,GAAG;AAAA,MAAI,WAAW;AAAA,IAAS;AAAA,IAAtE,UAAA;AAAA,MACE,gBAAA,EAAC,GAAD,EAAA,UAAI,+BAAgC,CAAA;AAAA,MACpC,gBAAA,EAAC,GAAD,EAAA,UAAM,+IAGA,CAAA;AAAA,MACN,gBAAA,EAAC,GAAD,EAAA,UAAA,CAAM,UAAO,EAAK,IAAW,EAAA,CAAA;AAAA,MAC7B,gBAAA,EAAC,GAAD,EAAA,UAAA;AAAA,QAAM;AAAA,QACsB;AAAA,QAAc;AAAA,QAAY;AAAA,MAChD,EAAA,CAAA;AAAA,IACD;AAAA;AAEX,CAAC,GAGK,IAAA,CAAsB,EAAE,MAAA,EAAA,MAC5B,gBAAA,EAAC,GAAD;AAAA,EAAO,IAAI;AAAA,IAAE,YAAY;AAAA,IAAU,KAAK;AAAA,IAAG,GAAG;AAAA,IAAI,WAAW;AAAA,EAAS;AAAA,EAAtE,UAAA,CACE,gBAAA,EAAC,GAAD,EAAA,UAAI,yCAA0C,CAAA,GAC9C,gBAAA,EAAC,GAAD,EAAA,UAAA,CAAM,UAAO,EAAK,IAAW,EAAA,CAAA,CACxB;IAKH,IAAsB,EAA4C;AAAA,EACtE,UAAU;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,EACV,MAAM;AACR,CAAC,GAEY,IAAyB,EAAS,SAAgC,EAC7E,MAAA,EAAA,GACmB;AACnB,QAAM,EAAE,cAAA,EAAA,IAAiB,EAAmB,GACtC,IACJ,EAAa,YAAY,iBACrB,EAAK,kBAAkB,gBACvB,EAAK,kBAAkB;AAE7B,SAAO,gBAAA,EAAC,GAAD;AAAA,IAA2B,MAAA;AAAA,IAAM,SAAS,GAAK;AAAA,EAAU,CAAA;AAClE,CAAC"}
|
|
@@ -1,25 +1,29 @@
|
|
|
1
|
-
import { useInsightsV2Store as
|
|
2
|
-
import { formatCurrency as
|
|
3
|
-
import { BarChartV2 as
|
|
4
|
-
import { EmptyBarChart as
|
|
5
|
-
import { barChartVariant as
|
|
6
|
-
import
|
|
1
|
+
import { useInsightsV2Store as b } from "../../../../common/context/hooks.es.js";
|
|
2
|
+
import { formatCurrency as B } from "../../../../core/utils/NumberFormatting.es.js";
|
|
3
|
+
import { BarChartV2 as C } from "../../../components/chartblocks/BarchartV2.es.js";
|
|
4
|
+
import { EmptyBarChart as x } from "../../../components/chartblocks/EmptyBarChart.es.js";
|
|
5
|
+
import { barChartVariant as _, buildChartData as v, buildDataSeries as A } from "./utils.es.js";
|
|
6
|
+
import D from "react";
|
|
7
7
|
import { jsx as o } from "react/jsx-runtime";
|
|
8
|
-
import { useTheme as
|
|
8
|
+
import { useTheme as y } from "@mui/material/styles";
|
|
9
9
|
var E = ({ payload: n, beatGuid: m = "" }) => {
|
|
10
|
-
const s =
|
|
11
|
-
return t.length ? /* @__PURE__ */ o(
|
|
10
|
+
const s = y(), { openActionDrawer: c } = b(), { instance_slot: i, instance_slot_data: a } = n, { data_series: l, ariaLabel: h = "", average_amount: e = 0, legends: d = [] } = a, t = v(A(l), h), [p] = D.useState(t.length - 1), { color: u } = _(i, a, s), [f, g] = d.map((r) => r.label);
|
|
11
|
+
return t.length ? /* @__PURE__ */ o(C, {
|
|
12
12
|
amounts: {
|
|
13
13
|
average: e,
|
|
14
|
-
formattedAverage:
|
|
14
|
+
formattedAverage: B(e, "0,0")
|
|
15
15
|
},
|
|
16
16
|
color: u,
|
|
17
17
|
data: t,
|
|
18
18
|
monthlyAmountLabel: f,
|
|
19
|
-
onBarClick: (
|
|
19
|
+
onBarClick: (r) => c({
|
|
20
|
+
guid: m,
|
|
21
|
+
trigger: "chartBar",
|
|
22
|
+
context: { chartBarIndex: r }
|
|
23
|
+
}),
|
|
20
24
|
selectedTabIndex: p,
|
|
21
|
-
trendAmountLabel:
|
|
22
|
-
}) : /* @__PURE__ */ o(
|
|
25
|
+
trendAmountLabel: g
|
|
26
|
+
}) : /* @__PURE__ */ o(x, {});
|
|
23
27
|
};
|
|
24
28
|
export {
|
|
25
29
|
E as BarchartBlock
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BarchartBlock.es.js","names":[],"sources":["../../../../../src/insights-v2/blocks/ChartBlocks/BarchartBlock/BarchartBlock.tsx"],"sourcesContent":["import React from 'react'\nimport { useTheme } from '@mui/material/styles'\n\nimport { formatCurrency, useInsightsV2Store } from '../../../../common'\nimport type { DataSeries } from '../../../../core'\nimport type { BarChartBlockData } from '../../../../core/types/InsightsInstanceSlotData'\n\nimport { BarChartV2 } from '../../../components/chartblocks/BarchartV2'\nimport { EmptyBarChart } from '../../../components/chartblocks/EmptyBarChart'\n\nimport type { BlockProps } from '../../types'\n\nimport { barChartVariant, buildChartData, buildDataSeries } from './utils'\n\nexport const BarchartBlock = ({ payload, beatGuid = '' }: BlockProps<BarChartBlockData>) => {\n const theme = useTheme()\n const {
|
|
1
|
+
{"version":3,"file":"BarchartBlock.es.js","names":[],"sources":["../../../../../src/insights-v2/blocks/ChartBlocks/BarchartBlock/BarchartBlock.tsx"],"sourcesContent":["import React from 'react'\nimport { useTheme } from '@mui/material/styles'\n\nimport { formatCurrency, useInsightsV2Store } from '../../../../common'\nimport type { DataSeries, DrilldownPayload } from '../../../../core'\nimport type { BarChartBlockData } from '../../../../core/types/InsightsInstanceSlotData'\n\nimport { BarChartV2 } from '../../../components/chartblocks/BarchartV2'\nimport { EmptyBarChart } from '../../../components/chartblocks/EmptyBarChart'\n\nimport type { BlockProps } from '../../types'\n\nimport { barChartVariant, buildChartData, buildDataSeries } from './utils'\n\nexport const BarchartBlock = ({ payload, beatGuid = '' }: BlockProps<BarChartBlockData>) => {\n const theme = useTheme()\n const { openActionDrawer } = useInsightsV2Store()\n const { instance_slot, instance_slot_data } = payload\n const { data_series, ariaLabel = '', average_amount = 0, legends = [] } = instance_slot_data\n const chartData = buildChartData(buildDataSeries(data_series as DataSeries), ariaLabel)\n const [selectedTabIndex] = React.useState(chartData.length - 1)\n const { color } = barChartVariant(instance_slot, instance_slot_data, theme)\n\n const [monthlyAmountLabel, trendAmountLabel] = legends.map((legend) => legend.label)\n\n return chartData.length ? (\n <BarChartV2\n amounts={{\n average: average_amount,\n formattedAverage: formatCurrency(average_amount, '0,0'),\n }}\n color={color}\n data={chartData}\n monthlyAmountLabel={monthlyAmountLabel}\n onBarClick={(index) =>\n openActionDrawer({\n guid: beatGuid,\n trigger: 'chartBar',\n context: { chartBarIndex: index } satisfies DrilldownPayload,\n })\n }\n selectedTabIndex={selectedTabIndex}\n trendAmountLabel={trendAmountLabel}\n />\n ) : (\n <EmptyBarChart />\n )\n}\n"],"mappings":";;;;;;;;AAcA,IAAa,IAAA,CAAiB,EAAE,SAAA,GAAS,UAAA,IAAW,GAAA,MAAwC;AAC1F,QAAM,IAAQ,EAAS,GACjB,EAAE,kBAAA,EAAA,IAAqB,EAAmB,GAC1C,EAAE,eAAA,GAAe,oBAAA,EAAA,IAAuB,GACxC,EAAE,aAAA,GAAa,WAAA,IAAY,IAAI,gBAAA,IAAiB,GAAG,SAAA,IAAU,CAAC,EAAA,IAAM,GACpE,IAAY,EAAe,EAAgB,CAAyB,GAAG,CAAS,GAChF,CAAC,CAAA,IAAoB,EAAM,SAAS,EAAU,SAAS,CAAC,GACxD,EAAE,OAAA,EAAA,IAAU,EAAgB,GAAe,GAAoB,CAAK,GAEpE,CAAC,GAAoB,CAAA,IAAoB,EAAQ,IAAA,CAAK,MAAW,EAAO,KAAK;AAEnF,SAAO,EAAU,SACf,gBAAA,EAAC,GAAD;AAAA,IACE,SAAS;AAAA,MACP,SAAS;AAAA,MACT,kBAAkB,EAAe,GAAgB,KAAK;AAAA,IACxD;AAAA,IACO,OAAA;AAAA,IACP,MAAM;AAAA,IACc,oBAAA;AAAA,IACpB,YAAA,CAAa,MACX,EAAiB;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,EAAE,eAAe,EAAM;AAAA,IAClC,CAAC;AAAA,IAEe,kBAAA;AAAA,IACA,kBAAA;AAAA,EACnB,CAAA,IAED,gBAAA,EAAC,GAAD,CAAgB,CAAA;AAEpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.es.js","names":[],"sources":["../../../../../src/insights-v2/blocks/ChartBlocks/BarchartBlock/utils.ts"],"sourcesContent":["import { type Theme } from '@mui/material/styles'\n\nimport { parseISO } from 'date-fns/parseISO'\n\nimport { getCategoryColor } from '../../../../core/utils/CategoryUtil'\nimport { buildDynamicCopy } from '../../../../core/utils/Localization'\nimport { formatCurrency } from '../../../../core/utils/NumberFormatting'\nimport { DATE_FORMATS_INTL, formatDate } from '../../../../core/constants'\nimport type { DataSeries, InstanceSlot } from '../../../../core'\nimport type { InsightsInstanceSlotData } from '../../../../core/types/InsightsInstanceSlotData'\nimport { getLayoutConfig } from './layout'\n\nexport const BAR_CHART_VARIANTS = {\n CATEGORY_COLOR: 'CategoryColor',\n SAVINGS_ACCOUNT_BALANCES_SUMMARY: 'SavingsAccountBalancesSummary',\n MONTHLY_SPEND_COMPARISON: 'MonthlySpendComparison',\n}\n\nexport const buildDataSeries = (data: DataSeries | undefined) => {\n if (!data) {\n return []\n }\n\n if (data.data) {\n return data.data.map((d) => {\n const item: any = {}\n\n data.names?.map((name, index) => {\n item[name] = d[index]\n })\n return item\n })\n } else {\n return []\n }\n}\n\nexport const buildChartData = (dataSeries: any[], ariaLabel: string) => {\n // Bars render oldest→newest (Jan→Dec, left→right, per Figma). The single-bar backend sends\n // data_series newest-first, so normalize date-ascending here — the single source of truth for both\n // the card (BarchartBlock) and the drill-down. This keeps their bar/tab indices aligned, which the\n // card relies on when it forwards a clicked bar index straight to the drill-down (
|
|
1
|
+
{"version":3,"file":"utils.es.js","names":[],"sources":["../../../../../src/insights-v2/blocks/ChartBlocks/BarchartBlock/utils.ts"],"sourcesContent":["import { type Theme } from '@mui/material/styles'\n\nimport { parseISO } from 'date-fns/parseISO'\n\nimport { getCategoryColor } from '../../../../core/utils/CategoryUtil'\nimport { buildDynamicCopy } from '../../../../core/utils/Localization'\nimport { formatCurrency } from '../../../../core/utils/NumberFormatting'\nimport { DATE_FORMATS_INTL, formatDate } from '../../../../core/constants'\nimport type { DataSeries, InstanceSlot } from '../../../../core'\nimport type { InsightsInstanceSlotData } from '../../../../core/types/InsightsInstanceSlotData'\nimport { getLayoutConfig } from './layout'\n\nexport const BAR_CHART_VARIANTS = {\n CATEGORY_COLOR: 'CategoryColor',\n SAVINGS_ACCOUNT_BALANCES_SUMMARY: 'SavingsAccountBalancesSummary',\n MONTHLY_SPEND_COMPARISON: 'MonthlySpendComparison',\n}\n\nexport const buildDataSeries = (data: DataSeries | undefined) => {\n if (!data) {\n return []\n }\n\n if (data.data) {\n return data.data.map((d) => {\n const item: any = {}\n\n data.names?.map((name, index) => {\n item[name] = d[index]\n })\n return item\n })\n } else {\n return []\n }\n}\n\nexport const buildChartData = (dataSeries: any[], ariaLabel: string) => {\n // Bars render oldest→newest (Jan→Dec, left→right, per Figma). The single-bar backend sends\n // data_series newest-first, so normalize date-ascending here — the single source of truth for both\n // the card (BarchartBlock) and the drill-down. This keeps their bar/tab indices aligned, which the\n // card relies on when it forwards a clicked bar index straight to the drill-down (openActionDrawer).\n const data = [...dataSeries]\n .sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime())\n .map((total) => {\n const label = formatDate(parseISO(total.date), DATE_FORMATS_INTL.MONTH_SHORT)\n\n return {\n ariaLabel: buildDynamicCopy(\n ariaLabel,\n label,\n formatCurrency(total.amount, '0.00'),\n ) as string,\n label,\n value: total.amount,\n formattedAmount: formatCurrency(total.amount, '0,0'),\n }\n })\n\n return data\n}\n\nexport const barChartVariant = (\n instanceSlot: InstanceSlot,\n instanceSlotData: InsightsInstanceSlotData,\n theme: Theme,\n) => {\n const { variant } = instanceSlot\n const barChartLayout = getLayoutConfig(theme)\n if (variant === BAR_CHART_VARIANTS.CATEGORY_COLOR && instanceSlotData.category_guid) {\n const categoryColor = getCategoryColor(instanceSlotData.category_guid, theme)\n return {\n color: categoryColor,\n }\n }\n return {\n color:\n barChartLayout[variant as keyof typeof barChartLayout]?.color ?? theme.palette.primary.main,\n }\n}\n"],"mappings":";;;;;;AAYA,IAAa,IAAqB;AAAA,EAChC,gBAAgB;AAAA,EAChB,kCAAkC;AAAA,EAClC,0BAA0B;AAC5B,GAEa,IAAA,CAAmB,MACzB,IAID,EAAK,OACA,EAAK,KAAK,IAAA,CAAK,MAAM;AAC1B,QAAM,IAAY,CAAC;AAEnB,SAAA,EAAK,OAAO,IAAA,CAAK,GAAM,MAAU;AAC/B,IAAA,EAAK,CAAA,IAAQ,EAAE,CAAA;AAAA,EACjB,CAAC,GACM;AACT,CAAC,IAEM,CAAC,IAbD,CAAC,GAiBC,IAAA,CAAkB,GAAmB,MAKnC,CAAC,GAAG,CAAU,EACxB,KAAA,CAAM,GAAG,MAAM,IAAI,KAAK,EAAE,IAAI,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,EACtE,IAAA,CAAK,MAAU;AACd,QAAM,IAAQ,EAAW,EAAS,EAAM,IAAI,GAAG,EAAkB,WAAW;AAE5E,SAAO;AAAA,IACL,WAAW,EACT,GACA,GACA,EAAe,EAAM,QAAQ,MAAM,CACrC;AAAA,IACA,OAAA;AAAA,IACA,OAAO,EAAM;AAAA,IACb,iBAAiB,EAAe,EAAM,QAAQ,KAAK;AAAA,EACrD;AACF,CAEK,GAGI,IAAA,CACX,GACA,GACA,MACG;AACH,QAAM,EAAE,SAAA,EAAA,IAAY,GACd,IAAiB,EAAgB,CAAK;AAC5C,SAAI,MAAY,EAAmB,kBAAkB,EAAiB,gBAE7D,EACL,OAFoB,EAAiB,EAAiB,eAAe,CAE9D,EACT,IAEK,EACL,OACE,EAAe,CAAA,GAAyC,SAAS,EAAM,QAAQ,QAAQ,KAC3F;AACF"}
|
|
@@ -3,12 +3,12 @@ import { Text as l } from "@mxenabled/mxui";
|
|
|
3
3
|
import { jsx as e, jsxs as i } from "react/jsx-runtime";
|
|
4
4
|
import c from "@mui/material/Box";
|
|
5
5
|
import { PieChart as m } from "@mui/x-charts/PieChart";
|
|
6
|
-
var w = ({ data:
|
|
7
|
-
const d =
|
|
6
|
+
var w = ({ data: a, centerLabel: n, centerValue: h }) => {
|
|
7
|
+
const d = a.some((t) => t.label && t.labelValue), r = !d, u = a.map((t, s) => ({
|
|
8
8
|
id: s,
|
|
9
9
|
color: t.color,
|
|
10
10
|
value: t.value
|
|
11
|
-
})), x = r ? 30 : 53, p = r ? 35 : 63, f = 2, b = () => r ? "body1" :
|
|
11
|
+
})), x = r ? 30 : 53, p = r ? 35 : 63, f = 2, b = () => r ? "body1" : n ? "h3" : "h2";
|
|
12
12
|
return /* @__PURE__ */ i(o, {
|
|
13
13
|
sx: {
|
|
14
14
|
alignItems: "center",
|
|
@@ -42,10 +42,10 @@ var w = ({ data: n, centerLabel: a, centerValue: h }) => {
|
|
|
42
42
|
sx: { ...r && { fontWeight: 600 } },
|
|
43
43
|
variant: b(),
|
|
44
44
|
children: h
|
|
45
|
-
}),
|
|
45
|
+
}), n && /* @__PURE__ */ e(l, {
|
|
46
46
|
sx: { color: "text.secondary" },
|
|
47
47
|
variant: r ? "caption" : "body2",
|
|
48
|
-
children:
|
|
48
|
+
children: n
|
|
49
49
|
})]
|
|
50
50
|
})]
|
|
51
51
|
}), d && /* @__PURE__ */ e(o, {
|
|
@@ -53,7 +53,7 @@ var w = ({ data: n, centerLabel: a, centerValue: h }) => {
|
|
|
53
53
|
gap: 24,
|
|
54
54
|
pl: 24
|
|
55
55
|
},
|
|
56
|
-
children:
|
|
56
|
+
children: a.map((t, s) => t.label && t.labelValue && /* @__PURE__ */ i(o, { children: [/* @__PURE__ */ i(o, {
|
|
57
57
|
sx: {
|
|
58
58
|
gap: 8,
|
|
59
59
|
flexDirection: "row",
|
|
@@ -76,7 +76,7 @@ var w = ({ data: n, centerLabel: a, centerValue: h }) => {
|
|
|
76
76
|
},
|
|
77
77
|
variant: "subtitle2",
|
|
78
78
|
children: t.labelValue
|
|
79
|
-
})] }, s))
|
|
79
|
+
})] }, t.label ?? s))
|
|
80
80
|
})]
|
|
81
81
|
});
|
|
82
82
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DonutChart.es.js","names":[],"sources":["../../../../../src/insights-v2/blocks/ChartBlocks/DonutChartBlock/DonutChart.tsx"],"sourcesContent":["import Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\nimport { Text } from '@mxenabled/mxui'\nimport { PieChart } from '@mui/x-charts/PieChart'\ninterface DonutSegment {\n color: string\n label?: string\n labelValue?: React.ReactNode\n value: number\n}\n\ninterface DonutChartV2Props {\n data: DonutSegment[]\n centerLabel?: string\n centerValue: string\n}\n\nconst DonutChartV2 = ({ data, centerLabel, centerValue }: DonutChartV2Props) => {\n const hasLegend = data.some((segment) => segment.label && segment.labelValue)\n const isEmbedded = !hasLegend\n\n const chartData = data.map((item, index) => ({\n id: index,\n color: item.color,\n value: item.value,\n }))\n const innerRadius = isEmbedded ? 30 : 53\n const outerRadius = isEmbedded ? 35 : 63\n const cornerRadius = 2\n\n const getCenterValueVariant = () => {\n if (isEmbedded) return 'body1'\n if (centerLabel) return 'h3'\n return 'h2'\n }\n\n return (\n <Stack sx={{ alignItems: 'center', flexDirection: 'row', px: 16, py: 4 }}>\n <Box\n sx={{\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'center',\n position: 'relative',\n }}\n >\n <PieChart\n height={isEmbedded ? 72 : 125}\n series={[\n {\n cornerRadius,\n data: chartData,\n innerRadius,\n outerRadius,\n },\n ]}\n slots={{ tooltip: () => null }}\n width={isEmbedded ? 72 : 125}\n />\n\n <Box sx={{ position: 'absolute', textAlign: 'center' }}>\n <Text sx={{ ...(isEmbedded && { fontWeight: 600 }) }} variant={getCenterValueVariant()}>\n {centerValue}\n </Text>\n {centerLabel && (\n <Text sx={{ color: 'text.secondary' }} variant={isEmbedded ? 'caption' : 'body2'}>\n {centerLabel}\n </Text>\n )}\n </Box>\n </Box>\n\n {hasLegend && (\n <Stack sx={{ gap: 24, pl: 24 }}>\n {data.map(\n (segment, index) =>\n segment.label &&\n segment.labelValue && (\n <Stack key={index}>\n <Stack sx={{ gap: 8, flexDirection: 'row', alignItems: 'center' }}>\n <Box\n sx={{\n backgroundColor: segment.color,\n borderRadius: '2px',\n height: 12,\n width: 12,\n }}\n />\n <Text sx={{ fontWeight: 400 }} variant=\"subtitle2\">\n {segment.label}\n </Text>\n </Stack>\n <Text sx={{ fontWeight: 400, pl: 20 }} variant=\"subtitle2\">\n {segment.labelValue}\n </Text>\n </Stack>\n ),\n )}\n </Stack>\n )}\n </Stack>\n )\n}\n\nexport default DonutChartV2\n"],"mappings":";;;;;AAiBA,IAAM,IAAA,CAAgB,EAAE,MAAA,GAAM,aAAA,GAAa,aAAA,EAAA,MAAqC;AAC9E,QAAM,IAAY,EAAK,KAAA,CAAM,MAAY,EAAQ,SAAS,EAAQ,UAAU,GACtE,IAAa,CAAC,GAEd,IAAY,EAAK,IAAA,CAAK,GAAM,OAAW;AAAA,IAC3C,IAAI;AAAA,IACJ,OAAO,EAAK;AAAA,IACZ,OAAO,EAAK;AAAA,EACd,EAAE,GACI,IAAc,IAAa,KAAK,IAChC,IAAc,IAAa,KAAK,IAChC,IAAe,GAEf,IAAA,MACA,IAAmB,UACnB,IAAoB,OACjB;AAGT,SACE,gBAAA,EAAC,GAAD;AAAA,IAAO,IAAI;AAAA,MAAE,YAAY;AAAA,MAAU,eAAe;AAAA,MAAO,IAAI;AAAA,MAAI,IAAI;AAAA,IAAE;AAAA,IAAvE,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,MACE,IAAI;AAAA,QACF,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,UAAU;AAAA,MACZ;AAAA,MANF,UAAA,CAQE,gBAAA,EAAC,GAAD;AAAA,QACE,QAAQ,IAAa,KAAK;AAAA,QAC1B,QAAQ,CACN;AAAA,UACE,cAAA;AAAA,UACA,MAAM;AAAA,UACN,aAAA;AAAA,UACA,aAAA;AAAA,QACF,CACF;AAAA,QACA,OAAO,EAAE,SAAA,MAAe,KAAK;AAAA,QAC7B,OAAO,IAAa,KAAK;AAAA,MAC1B,CAAA,GAED,gBAAA,EAAC,GAAD;AAAA,QAAK,IAAI;AAAA,UAAE,UAAU;AAAA,UAAY,WAAW;AAAA,QAAS;AAAA,QAArD,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,UAAM,IAAI,EAAE,GAAI,KAAc,EAAE,YAAY,IAAI,EAAG;AAAA,UAAG,SAAS,EAAsB;AAAA,UAClF,UAAA;AAAA,QACG,CAAA,GACL,KACC,gBAAA,EAAC,GAAD;AAAA,UAAM,IAAI,EAAE,OAAO,iBAAiB;AAAA,UAAG,SAAS,IAAa,YAAY;AAAA,UACtE,UAAA;AAAA,QACG,CAAA,CAEL;AAAA,MACF,CAAA,CAAA;AAAA,IAEJ,CAAA,GAAA,KACC,gBAAA,EAAC,GAAD;AAAA,MAAO,IAAI;AAAA,QAAE,KAAK;AAAA,QAAI,IAAI;AAAA,MAAG;AAAA,MAC1B,UAAA,EAAK,IAAA,CACH,GAAS,MACR,EAAQ,SACR,EAAQ,cACN,gBAAA,EAAC,GAAD,EAAA,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,QAAO,IAAI;AAAA,UAAE,KAAK;AAAA,UAAG,eAAe;AAAA,UAAO,YAAY;AAAA,QAAS;AAAA,QAAhE,UAAA,CACE,gBAAA,EAAC,GAAD,EACE,IAAI;AAAA,UACF,iBAAiB,EAAQ;AAAA,UACzB,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,EACD,CAAA,GACD,gBAAA,EAAC,GAAD;AAAA,UAAM,IAAI,EAAE,YAAY,IAAI;AAAA,UAAG,SAAQ;AAAA,UACpC,UAAA,EAAQ;AAAA,QACL,CAAA,CACD;AAAA,MACP,CAAA,GAAA,gBAAA,EAAC,GAAD;AAAA,QAAM,IAAI;AAAA,UAAE,YAAY;AAAA,UAAK,IAAI;AAAA,QAAG;AAAA,QAAG,SAAQ;AAAA,QAC5C,UAAA,EAAQ;AAAA,MACL,CAAA,CACD,EAAA,GAjBK,
|
|
1
|
+
{"version":3,"file":"DonutChart.es.js","names":[],"sources":["../../../../../src/insights-v2/blocks/ChartBlocks/DonutChartBlock/DonutChart.tsx"],"sourcesContent":["import Box from '@mui/material/Box'\nimport Stack from '@mui/material/Stack'\nimport { Text } from '@mxenabled/mxui'\nimport { PieChart } from '@mui/x-charts/PieChart'\ninterface DonutSegment {\n color: string\n label?: string\n labelValue?: React.ReactNode\n value: number\n}\n\ninterface DonutChartV2Props {\n data: DonutSegment[]\n centerLabel?: string\n centerValue: string\n}\n\nconst DonutChartV2 = ({ data, centerLabel, centerValue }: DonutChartV2Props) => {\n const hasLegend = data.some((segment) => segment.label && segment.labelValue)\n const isEmbedded = !hasLegend\n\n const chartData = data.map((item, index) => ({\n id: index,\n color: item.color,\n value: item.value,\n }))\n const innerRadius = isEmbedded ? 30 : 53\n const outerRadius = isEmbedded ? 35 : 63\n const cornerRadius = 2\n\n const getCenterValueVariant = () => {\n if (isEmbedded) return 'body1'\n if (centerLabel) return 'h3'\n return 'h2'\n }\n\n return (\n <Stack sx={{ alignItems: 'center', flexDirection: 'row', px: 16, py: 4 }}>\n <Box\n sx={{\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'center',\n position: 'relative',\n }}\n >\n <PieChart\n height={isEmbedded ? 72 : 125}\n series={[\n {\n cornerRadius,\n data: chartData,\n innerRadius,\n outerRadius,\n },\n ]}\n slots={{ tooltip: () => null }}\n width={isEmbedded ? 72 : 125}\n />\n\n <Box sx={{ position: 'absolute', textAlign: 'center' }}>\n <Text sx={{ ...(isEmbedded && { fontWeight: 600 }) }} variant={getCenterValueVariant()}>\n {centerValue}\n </Text>\n {centerLabel && (\n <Text sx={{ color: 'text.secondary' }} variant={isEmbedded ? 'caption' : 'body2'}>\n {centerLabel}\n </Text>\n )}\n </Box>\n </Box>\n\n {hasLegend && (\n <Stack sx={{ gap: 24, pl: 24 }}>\n {data.map(\n (segment, index) =>\n segment.label &&\n segment.labelValue && (\n <Stack key={segment.label ?? index}>\n <Stack sx={{ gap: 8, flexDirection: 'row', alignItems: 'center' }}>\n <Box\n sx={{\n backgroundColor: segment.color,\n borderRadius: '2px',\n height: 12,\n width: 12,\n }}\n />\n <Text sx={{ fontWeight: 400 }} variant=\"subtitle2\">\n {segment.label}\n </Text>\n </Stack>\n <Text sx={{ fontWeight: 400, pl: 20 }} variant=\"subtitle2\">\n {segment.labelValue}\n </Text>\n </Stack>\n ),\n )}\n </Stack>\n )}\n </Stack>\n )\n}\n\nexport default DonutChartV2\n"],"mappings":";;;;;AAiBA,IAAM,IAAA,CAAgB,EAAE,MAAA,GAAM,aAAA,GAAa,aAAA,EAAA,MAAqC;AAC9E,QAAM,IAAY,EAAK,KAAA,CAAM,MAAY,EAAQ,SAAS,EAAQ,UAAU,GACtE,IAAa,CAAC,GAEd,IAAY,EAAK,IAAA,CAAK,GAAM,OAAW;AAAA,IAC3C,IAAI;AAAA,IACJ,OAAO,EAAK;AAAA,IACZ,OAAO,EAAK;AAAA,EACd,EAAE,GACI,IAAc,IAAa,KAAK,IAChC,IAAc,IAAa,KAAK,IAChC,IAAe,GAEf,IAAA,MACA,IAAmB,UACnB,IAAoB,OACjB;AAGT,SACE,gBAAA,EAAC,GAAD;AAAA,IAAO,IAAI;AAAA,MAAE,YAAY;AAAA,MAAU,eAAe;AAAA,MAAO,IAAI;AAAA,MAAI,IAAI;AAAA,IAAE;AAAA,IAAvE,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,MACE,IAAI;AAAA,QACF,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,UAAU;AAAA,MACZ;AAAA,MANF,UAAA,CAQE,gBAAA,EAAC,GAAD;AAAA,QACE,QAAQ,IAAa,KAAK;AAAA,QAC1B,QAAQ,CACN;AAAA,UACE,cAAA;AAAA,UACA,MAAM;AAAA,UACN,aAAA;AAAA,UACA,aAAA;AAAA,QACF,CACF;AAAA,QACA,OAAO,EAAE,SAAA,MAAe,KAAK;AAAA,QAC7B,OAAO,IAAa,KAAK;AAAA,MAC1B,CAAA,GAED,gBAAA,EAAC,GAAD;AAAA,QAAK,IAAI;AAAA,UAAE,UAAU;AAAA,UAAY,WAAW;AAAA,QAAS;AAAA,QAArD,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,UAAM,IAAI,EAAE,GAAI,KAAc,EAAE,YAAY,IAAI,EAAG;AAAA,UAAG,SAAS,EAAsB;AAAA,UAClF,UAAA;AAAA,QACG,CAAA,GACL,KACC,gBAAA,EAAC,GAAD;AAAA,UAAM,IAAI,EAAE,OAAO,iBAAiB;AAAA,UAAG,SAAS,IAAa,YAAY;AAAA,UACtE,UAAA;AAAA,QACG,CAAA,CAEL;AAAA,MACF,CAAA,CAAA;AAAA,IAEJ,CAAA,GAAA,KACC,gBAAA,EAAC,GAAD;AAAA,MAAO,IAAI;AAAA,QAAE,KAAK;AAAA,QAAI,IAAI;AAAA,MAAG;AAAA,MAC1B,UAAA,EAAK,IAAA,CACH,GAAS,MACR,EAAQ,SACR,EAAQ,cACN,gBAAA,EAAC,GAAD,EAAA,UAAA,CACE,gBAAA,EAAC,GAAD;AAAA,QAAO,IAAI;AAAA,UAAE,KAAK;AAAA,UAAG,eAAe;AAAA,UAAO,YAAY;AAAA,QAAS;AAAA,QAAhE,UAAA,CACE,gBAAA,EAAC,GAAD,EACE,IAAI;AAAA,UACF,iBAAiB,EAAQ;AAAA,UACzB,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,EACD,CAAA,GACD,gBAAA,EAAC,GAAD;AAAA,UAAM,IAAI,EAAE,YAAY,IAAI;AAAA,UAAG,SAAQ;AAAA,UACpC,UAAA,EAAQ;AAAA,QACL,CAAA,CACD;AAAA,MACP,CAAA,GAAA,gBAAA,EAAC,GAAD;AAAA,QAAM,IAAI;AAAA,UAAE,YAAY;AAAA,UAAK,IAAI;AAAA,QAAG;AAAA,QAAG,SAAQ;AAAA,QAC5C,UAAA,EAAQ;AAAA,MACL,CAAA,CACD,EAAA,GAjBK,EAAQ,SAAS,CAiBtB,CAEb;AAAA,IACK,CAAA,CAEJ;AAAA;AAEX"}
|