drizzle-cube 0.4.3 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/charts.js +13 -13
- package/dist/client/chunks/{RetentionCombinedChart-7bGP_ozM.js → RetentionCombinedChart-BK8N-MOQ.js} +2 -2
- package/dist/client/chunks/{RetentionCombinedChart-7bGP_ozM.js.map → RetentionCombinedChart-BK8N-MOQ.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-BlCXpnDL.js → analysis-builder-CNBmAGAO.js} +8 -9
- package/dist/client/chunks/{analysis-builder-BlCXpnDL.js.map → analysis-builder-CNBmAGAO.js.map} +1 -1
- package/dist/client/chunks/{analysis-builder-shared-BOYNJQY8.js → analysis-builder-shared-INGGwyTG.js} +6 -6
- package/dist/client/chunks/{analysis-builder-shared-BOYNJQY8.js.map → analysis-builder-shared-INGGwyTG.js.map} +1 -1
- package/dist/client/chunks/{chart-activity-grid-sUkuCJzm.js → chart-activity-grid-DvgTYQaE.js} +2 -2
- package/dist/client/chunks/{chart-activity-grid-sUkuCJzm.js.map → chart-activity-grid-DvgTYQaE.js.map} +1 -1
- package/dist/client/chunks/{chart-area-C4DIi9k_.js → chart-area-BKjd_STS.js} +3 -3
- package/dist/client/chunks/{chart-area-C4DIi9k_.js.map → chart-area-BKjd_STS.js.map} +1 -1
- package/dist/client/chunks/{chart-bar-7ZleGCsN.js → chart-bar-DBI41w05.js} +2 -2
- package/dist/client/chunks/{chart-bar-7ZleGCsN.js.map → chart-bar-DBI41w05.js.map} +1 -1
- package/dist/client/chunks/{chart-bubble-D-auWIjP.js → chart-bubble-BD-1kneU.js} +2 -2
- package/dist/client/chunks/{chart-bubble-D-auWIjP.js.map → chart-bubble-BD-1kneU.js.map} +1 -1
- package/dist/client/chunks/{chart-config-markdown-DZxdGNVQ.js → chart-config-markdown-6fsr-U6_.js} +38 -8
- package/dist/client/chunks/chart-config-markdown-6fsr-U6_.js.map +1 -0
- package/dist/client/chunks/{chart-data-table-DW6VNGeW.js → chart-data-table-B74HLpAx.js} +3 -3
- package/dist/client/chunks/{chart-data-table-DW6VNGeW.js.map → chart-data-table-B74HLpAx.js.map} +1 -1
- package/dist/client/chunks/{chart-funnel-eUJApzmA.js → chart-funnel-DQ9cW6j9.js} +2 -2
- package/dist/client/chunks/{chart-funnel-eUJApzmA.js.map → chart-funnel-DQ9cW6j9.js.map} +1 -1
- package/dist/client/chunks/{chart-heat-map-DR3O3GXx.js → chart-heat-map-CpIr4tbs.js} +2 -2
- package/dist/client/chunks/{chart-heat-map-DR3O3GXx.js.map → chart-heat-map-CpIr4tbs.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-delta-Bp9Yrgyc.js → chart-kpi-delta-DPcSazD3.js} +3 -3
- package/dist/client/chunks/{chart-kpi-delta-Bp9Yrgyc.js.map → chart-kpi-delta-DPcSazD3.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-number-B3yvgbr-.js → chart-kpi-number-D62PzKZ1.js} +2 -2
- package/dist/client/chunks/{chart-kpi-number-B3yvgbr-.js.map → chart-kpi-number-D62PzKZ1.js.map} +1 -1
- package/dist/client/chunks/{chart-kpi-text-D0TsUiaO.js → chart-kpi-text-B6Z5tFV1.js} +3 -3
- package/dist/client/chunks/{chart-kpi-text-D0TsUiaO.js.map → chart-kpi-text-B6Z5tFV1.js.map} +1 -1
- package/dist/client/chunks/{chart-line-C7VStgaJ.js → chart-line-Ds4BYA0K.js} +3 -3
- package/dist/client/chunks/{chart-line-C7VStgaJ.js.map → chart-line-Ds4BYA0K.js.map} +1 -1
- package/dist/client/chunks/chart-markdown-Rq6ORisB.js +276 -0
- package/dist/client/chunks/chart-markdown-Rq6ORisB.js.map +1 -0
- package/dist/client/chunks/{chart-pie-DPdYJSM3.js → chart-pie-BBrLh0iU.js} +2 -2
- package/dist/client/chunks/{chart-pie-DPdYJSM3.js.map → chart-pie-BBrLh0iU.js.map} +1 -1
- package/dist/client/chunks/{chart-radar-DF6VNSiC.js → chart-radar-vr5FgjHT.js} +2 -2
- package/dist/client/chunks/{chart-radar-DF6VNSiC.js.map → chart-radar-vr5FgjHT.js.map} +1 -1
- package/dist/client/chunks/{chart-radial-bar-7Ttfz-kO.js → chart-radial-bar-BV_3Nm5P.js} +2 -2
- package/dist/client/chunks/{chart-radial-bar-7Ttfz-kO.js.map → chart-radial-bar-BV_3Nm5P.js.map} +1 -1
- package/dist/client/chunks/{chart-sankey-D86RYk9B.js → chart-sankey-CHROzr4S.js} +2 -2
- package/dist/client/chunks/{chart-sankey-D86RYk9B.js.map → chart-sankey-CHROzr4S.js.map} +1 -1
- package/dist/client/chunks/{chart-scatter-BUnIiLr_.js → chart-scatter-DbRTU3FG.js} +2 -2
- package/dist/client/chunks/{chart-scatter-BUnIiLr_.js.map → chart-scatter-DbRTU3FG.js.map} +1 -1
- package/dist/client/chunks/{chart-sunburst-CsHlHfZQ.js → chart-sunburst-B-aPUzYL.js} +2 -2
- package/dist/client/chunks/{chart-sunburst-CsHlHfZQ.js.map → chart-sunburst-B-aPUzYL.js.map} +1 -1
- package/dist/client/chunks/{chart-tree-map-DFAbkeo1.js → chart-tree-map-qY148fiC.js} +2 -2
- package/dist/client/chunks/{chart-tree-map-DFAbkeo1.js.map → chart-tree-map-qY148fiC.js.map} +1 -1
- package/dist/client/chunks/{chartConfigRegistry-DNEbwgTc.js → chartConfigRegistry-Di34paQH.js} +2 -2
- package/dist/client/chunks/{chartConfigRegistry-DNEbwgTc.js.map → chartConfigRegistry-Di34paQH.js.map} +1 -1
- package/dist/client/chunks/{charts-core-DAF1iT_h.js → charts-core-T8UglYyq.js} +224 -224
- package/dist/client/chunks/charts-core-T8UglYyq.js.map +1 -0
- package/dist/client/chunks/{charts-loader-7pEaEz-f.js → charts-loader-YnhJHubD.js} +21 -21
- package/dist/client/chunks/{charts-loader-7pEaEz-f.js.map → charts-loader-YnhJHubD.js.map} +1 -1
- package/dist/client/chunks/components-D0i1yQsk.js +9835 -0
- package/dist/client/chunks/components-D0i1yQsk.js.map +1 -0
- package/dist/client/chunks/{core-DGLxd5v5.js → core-D_8mkGpQ.js} +2 -2
- package/dist/client/chunks/{core-DGLxd5v5.js.map → core-D_8mkGpQ.js.map} +1 -1
- package/dist/client/chunks/{providers-D2xswCYu.js → providers-CgxXm6Ll.js} +2 -2
- package/dist/client/chunks/{providers-D2xswCYu.js.map → providers-CgxXm6Ll.js.map} +1 -1
- package/dist/client/chunks/{syntaxHighlighting-DAT9C6Ss.js → syntaxHighlighting-BQfjio-i.js} +2 -2
- package/dist/client/chunks/{syntaxHighlighting-DAT9C6Ss.js.map → syntaxHighlighting-BQfjio-i.js.map} +1 -1
- package/dist/client/chunks/{useDirtyStateTracking-CTS_m9mg.js → useDirtyStateTracking-Cu1HSjmo.js} +9 -9
- package/dist/client/chunks/{useDirtyStateTracking-CTS_m9mg.js.map → useDirtyStateTracking-Cu1HSjmo.js.map} +1 -1
- package/dist/client/chunks/{vendor-DfDLOfBe.js → vendor-AVsJ2ni0.js} +4 -4
- package/dist/client/chunks/{vendor-DfDLOfBe.js.map → vendor-AVsJ2ni0.js.map} +1 -1
- package/dist/client/components/AnalysisBuilder/AnalysisDisplayConfigPanel.d.ts +3 -1
- package/dist/client/components/FloatingEditToolbar.d.ts +3 -1
- package/dist/client/components/TextPortletModal.d.ts +12 -0
- package/dist/client/components.js +15 -352
- package/dist/client/components.js.map +1 -1
- package/dist/client/hooks/useDashboardHook.d.ts +7 -2
- package/dist/client/hooks.js +23 -23
- package/dist/client/index.js +8 -8
- package/dist/client/providers.js +1 -1
- package/dist/client/stores/dashboardStore.d.ts +14 -0
- package/dist/client/styles.css +1 -1
- package/dist/client/types.d.ts +3 -0
- package/dist/client/utils.js +6 -6
- package/dist/client-bundle-stats.html +1 -1
- package/package.json +1 -1
- package/dist/client/chunks/DashboardEditModal-BGDhxKg1.js +0 -9169
- package/dist/client/chunks/DashboardEditModal-BGDhxKg1.js.map +0 -1
- package/dist/client/chunks/chart-config-markdown-DZxdGNVQ.js.map +0 -1
- package/dist/client/chunks/chart-markdown-Cget3iEq.js +0 -257
- package/dist/client/chunks/chart-markdown-Cget3iEq.js.map +0 -1
- package/dist/client/chunks/charts-core-DAF1iT_h.js.map +0 -1
package/dist/client/charts.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { L as w, g as L, c as T, b as O, i as S, p as N, a as v } from "./chunks/charts-loader-
|
|
1
|
+
import { L as w, g as L, c as T, b as O, i as S, p as N, a as v } from "./chunks/charts-loader-YnhJHubD.js";
|
|
2
2
|
import { useState as f, useEffect as c } from "react";
|
|
3
3
|
import { f as G } from "./chunks/index-CApFCBF9.js";
|
|
4
|
-
import { c as E, C as H, N as I, P } from "./chunks/charts-core-
|
|
5
|
-
import { B as _ } from "./chunks/chart-bar-
|
|
6
|
-
import { L as j } from "./chunks/chart-line-
|
|
7
|
-
import { default as U } from "./chunks/chart-area-
|
|
8
|
-
import { default as Y } from "./chunks/chart-pie-
|
|
9
|
-
import { default as $ } from "./chunks/chart-scatter-
|
|
10
|
-
import { default as J } from "./chunks/chart-radar-
|
|
11
|
-
import { default as Q } from "./chunks/chart-radial-bar-
|
|
12
|
-
import { default as ee } from "./chunks/chart-tree-map-
|
|
13
|
-
import { default as ae } from "./chunks/chart-funnel-
|
|
14
|
-
import { D as ie } from "./chunks/chart-data-table-
|
|
4
|
+
import { c as E, C as H, N as I, P } from "./chunks/charts-core-T8UglYyq.js";
|
|
5
|
+
import { B as _ } from "./chunks/chart-bar-DBI41w05.js";
|
|
6
|
+
import { L as j } from "./chunks/chart-line-Ds4BYA0K.js";
|
|
7
|
+
import { default as U } from "./chunks/chart-area-BKjd_STS.js";
|
|
8
|
+
import { default as Y } from "./chunks/chart-pie-BBrLh0iU.js";
|
|
9
|
+
import { default as $ } from "./chunks/chart-scatter-DbRTU3FG.js";
|
|
10
|
+
import { default as J } from "./chunks/chart-radar-vr5FgjHT.js";
|
|
11
|
+
import { default as Q } from "./chunks/chart-radial-bar-BV_3Nm5P.js";
|
|
12
|
+
import { default as ee } from "./chunks/chart-tree-map-qY148fiC.js";
|
|
13
|
+
import { default as ae } from "./chunks/chart-funnel-DQ9cW6j9.js";
|
|
14
|
+
import { D as ie } from "./chunks/chart-data-table-B74HLpAx.js";
|
|
15
15
|
const s = {
|
|
16
16
|
dropZones: [
|
|
17
17
|
{
|
|
@@ -55,7 +55,7 @@ const s = {
|
|
|
55
55
|
kpiNumber: () => import("./chunks/chart-config-kpi-number-nVAwDXzq.js"),
|
|
56
56
|
kpiDelta: () => import("./chunks/chart-config-kpi-delta-yTA5ug_l.js"),
|
|
57
57
|
kpiText: () => import("./chunks/chart-config-kpi-text-DZjqsx-b.js"),
|
|
58
|
-
markdown: () => import("./chunks/chart-config-markdown-
|
|
58
|
+
markdown: () => import("./chunks/chart-config-markdown-6fsr-U6_.js"),
|
|
59
59
|
funnel: () => import("./chunks/chart-config-funnel-BlSQYng0.js"),
|
|
60
60
|
sankey: () => import("./chunks/chart-config-sankey-CNAgsMQ4.js"),
|
|
61
61
|
sunburst: () => import("./chunks/chart-config-sunburst-W_SKwaj0.js"),
|
package/dist/client/chunks/{RetentionCombinedChart-7bGP_ozM.js → RetentionCombinedChart-BK8N-MOQ.js}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as e, jsxs as l } from "react/jsx-runtime";
|
|
2
2
|
import E, { useState as M, useMemo as T } from "react";
|
|
3
3
|
import { ComposedChart as O, CartesianGrid as W, XAxis as F, YAxis as B, Legend as I, Line as X } from "recharts";
|
|
4
|
-
import { a as Y, C as q, b as J, c as $ } from "./charts-core-
|
|
4
|
+
import { a as Y, C as q, b as J, c as $ } from "./charts-core-T8UglYyq.js";
|
|
5
5
|
import { i as K } from "./retention-CzCo8262.js";
|
|
6
6
|
function Q(d) {
|
|
7
7
|
return `rgba(34, 197, 94, ${0.1 + Math.max(0, Math.min(1, d)) * 0.7})`;
|
|
@@ -253,4 +253,4 @@ const ae = E.memo(function({
|
|
|
253
253
|
export {
|
|
254
254
|
ae as default
|
|
255
255
|
};
|
|
256
|
-
//# sourceMappingURL=RetentionCombinedChart-
|
|
256
|
+
//# sourceMappingURL=RetentionCombinedChart-BK8N-MOQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RetentionCombinedChart-7bGP_ozM.js","sources":["../../../src/client/components/charts/RetentionCombinedChart.tsx"],"sourcesContent":["/**\n * RetentionCombinedChart Component\n *\n * Combined visualization for retention analysis data.\n * Supports multiple display modes: heatmap, line chart, or combined view.\n *\n * Features:\n * - X-axis: Period numbers (P0, P1, P2...)\n * - Y-axis: Retention % (0-100%)\n * - Lines: One per breakdown value (or single if no breakdown)\n * - Display modes: 'heatmap' | 'line' | 'combined'\n * - Heatmap shows color-coded retention matrix\n * - Line chart shows retention curves over periods\n */\n\nimport React, { useMemo, useState } from 'react'\nimport {\n ComposedChart,\n Line,\n XAxis,\n YAxis,\n CartesianGrid,\n Legend,\n} from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS, CHART_MARGINS } from '../../utils/chartConstants'\nimport type { ChartProps } from '../../types'\nimport type { RetentionChartData, RetentionResultRow, RetentionGranularity } from '../../types/retention'\nimport { isRetentionData } from '../../types/retention'\n\n/**\n * Retention display mode\n * - 'heatmap': Show retention as color-coded bars\n * - 'line': Show retention as line curves\n * - 'combined': Show both heatmap background and line overlay\n */\nexport type RetentionDisplayMode = 'heatmap' | 'line' | 'combined'\n\n/**\n * Get color with opacity based on retention rate for heatmap cells\n * Uses a green gradient: higher retention = more saturated green\n */\nfunction getRetentionColor(rate: number): string {\n const clampedRate = Math.max(0, Math.min(1, rate))\n const alpha = 0.1 + clampedRate * 0.7\n return `rgba(34, 197, 94, ${alpha})`\n}\n\n/**\n * Format percentage for display\n */\nfunction formatPercentage(rate: number): string {\n return `${Math.round(rate * 100)}%`\n}\n\n/**\n * Format period label based on granularity\n * Period 0 shows \"< 1 Day\" / \"< 1 Week\" etc. to indicate the initial cohort\n * e.g., Period 0 with 'week' granularity → \"< 1 Week\", Period 1 → \"Week 1\"\n */\nfunction formatPeriodLabel(period: number, granularity?: RetentionGranularity): string {\n const prefix = granularity === 'day' ? 'Day'\n : granularity === 'week' ? 'Week'\n : granularity === 'month' ? 'Month'\n : 'P' // Fallback to P0, P1, etc.\n\n // Period 0 is special - shows \"< 1 Day\" / \"< 1 Week\" etc.\n if (period === 0) {\n return granularity ? `< 1 ${prefix}` : 'P0'\n }\n\n return granularity ? `${prefix} ${period}` : `P${period}`\n}\n\n/**\n * Get display label for the cohort total column\n * Shows \"Total\" regardless of binding key - it's the cohort size count\n */\nfunction getCohortLabel(_bindingKeyLabel?: string): string {\n return 'Total'\n}\n\n/**\n * Get default series name based on binding key\n * e.g., \"userId\" → \"userId Retention\", null → \"Retention\"\n */\nfunction getDefaultSeriesName(bindingKeyLabel?: string): string {\n if (!bindingKeyLabel) return 'Retention'\n return `${bindingKeyLabel} Retention`\n}\n\n/**\n * Transform retention data for chart display\n * Groups data by period with breakdown values as series\n */\nfunction transformRetentionData(\n rows: RetentionResultRow[],\n periods: number[],\n breakdownValues?: string[],\n granularity?: RetentionGranularity,\n bindingKeyLabel?: string\n): { chartData: any[]; seriesKeys: string[]; defaultSeriesName: string } {\n const defaultSeriesName = getDefaultSeriesName(bindingKeyLabel)\n\n // If no breakdown, single series\n if (!breakdownValues || breakdownValues.length === 0) {\n const chartData = periods.map((period) => {\n const row = rows.find((r) => r.period === period && !r.breakdownValue)\n return {\n period,\n periodLabel: formatPeriodLabel(period, granularity),\n [defaultSeriesName]: row ? row.retentionRate : null,\n cohortSize: row?.cohortSize ?? 0,\n retainedUsers: row?.retainedUsers ?? 0,\n }\n })\n return { chartData, seriesKeys: [defaultSeriesName], defaultSeriesName }\n }\n\n // With breakdown, create series per breakdown value\n const chartData = periods.map((period) => {\n const dataPoint: any = {\n period,\n periodLabel: formatPeriodLabel(period, granularity),\n }\n\n breakdownValues.forEach((bv) => {\n const row = rows.find((r) => r.period === period && r.breakdownValue === bv)\n dataPoint[bv] = row ? row.retentionRate : null\n dataPoint[`${bv}_cohortSize`] = row?.cohortSize ?? 0\n dataPoint[`${bv}_retainedUsers`] = row?.retainedUsers ?? 0\n })\n\n return dataPoint\n })\n\n return { chartData, seriesKeys: breakdownValues, defaultSeriesName }\n}\n\ninterface TooltipData {\n period: number\n breakdownValue?: string | null\n cohortSize: number\n retainedUsers: number\n retentionRate: number\n x: number\n y: number\n}\n\n/**\n * RetentionCombinedChart Component\n */\nconst RetentionCombinedChart = React.memo(function RetentionCombinedChart({\n data,\n height = '100%',\n displayConfig,\n colorPalette,\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n const [heatmapTooltip, setHeatmapTooltip] = useState<TooltipData | null>(null)\n\n // Parse retention data\n const retentionData = useMemo<RetentionChartData | null>(() => {\n if (!data) return null\n\n // Check if data is already in RetentionChartData format\n if (isRetentionData(data)) {\n return data\n }\n\n // If data is an array of RetentionResultRow, convert it\n if (Array.isArray(data) && data.length > 0) {\n const rows = data as RetentionResultRow[]\n const periods = [...new Set(rows.map((r) => r.period))].sort((a, b) => a - b)\n const breakdownValues = [\n ...new Set(rows.filter((r) => r.breakdownValue).map((r) => r.breakdownValue!)),\n ]\n\n return {\n rows,\n periods,\n breakdownValues: breakdownValues.length > 0 ? breakdownValues : undefined,\n }\n }\n\n return null\n }, [data])\n\n // Transform data for chart\n const { chartData, seriesKeys, defaultSeriesName } = useMemo(() => {\n if (!retentionData) {\n return { chartData: [], seriesKeys: [], defaultSeriesName: 'Retention' }\n }\n return transformRetentionData(\n retentionData.rows,\n retentionData.periods,\n retentionData.breakdownValues,\n retentionData.granularity,\n retentionData.bindingKeyLabel\n )\n }, [retentionData])\n\n // Get cohort label for heatmap column header\n const cohortLabel = getCohortLabel(retentionData?.bindingKeyLabel)\n\n // Display mode from config\n const displayMode: RetentionDisplayMode =\n (displayConfig as any)?.retentionDisplayMode || 'line'\n\n const showLegend = displayConfig?.showLegend ?? true\n const showGrid = displayConfig?.showGrid ?? true\n const showTooltip = displayConfig?.showTooltip ?? true\n\n // Handle empty/loading states\n if (!data || (Array.isArray(data) && data.length === 0)) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\"\n style={{ height }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No data available</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">\n Configure retention analysis to see results\n </div>\n </div>\n </div>\n )\n }\n\n if (!chartData || chartData.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\"\n style={{ height }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Unable to render retention data</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">Data format may be incorrect</div>\n </div>\n </div>\n )\n }\n\n // Render line chart component (reused in line and combined modes)\n const renderLineChart = (chartHeight: string | number) => {\n const chartMargins = {\n ...CHART_MARGINS,\n left: 50,\n right: 20,\n }\n\n return (\n <ChartContainer height={chartHeight}>\n <ComposedChart data={chartData} margin={chartMargins} accessibilityLayer={false}>\n {showGrid && <CartesianGrid strokeDasharray=\"3 3\" />}\n <XAxis\n dataKey=\"periodLabel\"\n tick={{ fontSize: 12 }}\n axisLine={{ stroke: 'var(--dc-border)' }}\n tickLine={{ stroke: 'var(--dc-border)' }}\n />\n <YAxis\n domain={[0, 1]}\n tickFormatter={(value) => formatPercentage(value)}\n tick={{ fontSize: 12 }}\n axisLine={{ stroke: 'var(--dc-border)' }}\n tickLine={{ stroke: 'var(--dc-border)' }}\n label={{\n value: 'Retention %',\n angle: -90,\n position: 'insideLeft',\n style: { textAnchor: 'middle', fontSize: '12px', fill: 'var(--dc-text-secondary)' },\n }}\n />\n {showTooltip && (\n <ChartTooltip\n formatter={(value: any, name: string) => {\n if (value === null || value === undefined) {\n return ['No data', name]\n }\n return [formatPercentage(value), name]\n }}\n labelFormatter={(label: string) => label}\n />\n )}\n {showLegend && (\n <Legend\n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"line\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.dataKey || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n\n {/* Render lines */}\n {seriesKeys.map((seriesKey, index) => (\n <Line\n key={seriesKey}\n type=\"monotone\"\n dataKey={seriesKey}\n stroke={\n (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }\n strokeWidth={2}\n dot={{ r: 4, strokeWidth: 2 }}\n activeDot={{ r: 6 }}\n strokeOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n connectNulls={false}\n />\n ))}\n </ComposedChart>\n </ChartContainer>\n )\n }\n\n // Render heatmap table component (reused in heatmap and combined modes)\n const renderHeatmapTable = () => (\n <table className=\"dc:w-full dc:border-collapse dc:text-sm\">\n <thead className=\"dc:sticky dc:top-0 bg-dc-bg dc:z-10\">\n <tr>\n <th className=\"dc:text-left dc:p-2 dc:font-medium text-dc-text dc:border-b border-dc-border dc:min-w-[100px] dc:whitespace-nowrap\">\n {retentionData?.breakdownValues?.length ? 'Segment' : 'Cohort'}\n </th>\n <th className=\"dc:text-right dc:p-2 dc:font-medium text-dc-text dc:border-b border-dc-border dc:min-w-[60px] dc:whitespace-nowrap\">\n {cohortLabel}\n </th>\n {retentionData?.periods.map((period) => (\n <th\n key={period}\n className=\"dc:text-center dc:p-2 dc:font-medium text-dc-text dc:border-b border-dc-border dc:min-w-[70px] dc:whitespace-nowrap\"\n >\n {formatPeriodLabel(period, retentionData?.granularity)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {seriesKeys.map((seriesKey, rowIndex) => {\n const period0Data = chartData.find((d) => d.period === 0)\n const isDefaultSeries = seriesKey === defaultSeriesName\n const cohortSize = isDefaultSeries\n ? period0Data?.cohortSize ?? 0\n : period0Data?.[`${seriesKey}_cohortSize`] ?? 0\n\n return (\n <tr\n key={seriesKey}\n className={rowIndex % 2 === 0 ? 'bg-dc-bg' : 'bg-dc-surface-secondary'}\n >\n <td className=\"dc:p-2 dc:font-medium text-dc-text dc:border-b border-dc-border dc:whitespace-nowrap\">\n {seriesKey}\n </td>\n <td className=\"dc:p-2 dc:text-right text-dc-text-secondary dc:border-b border-dc-border\">\n {cohortSize.toLocaleString()}\n </td>\n {retentionData?.periods.map((period) => {\n const dataPoint = chartData.find((d) => d.period === period)\n const rate = dataPoint?.[seriesKey] ?? 0\n const bgColor = rate > 0 ? getRetentionColor(rate) : 'transparent'\n const textColor = rate > 0.5 ? '#ffffff' : 'var(--dc-text)'\n\n return (\n <td\n key={period}\n className=\"dc:p-2 dc:text-center dc:border-b border-dc-border dc:cursor-default dc:transition-opacity dc:hover:opacity-80\"\n style={{ backgroundColor: bgColor, color: textColor }}\n onMouseEnter={(e) => {\n const rect = e.currentTarget.getBoundingClientRect()\n const retainedUsers = isDefaultSeries\n ? dataPoint?.retainedUsers ?? 0\n : dataPoint?.[`${seriesKey}_retainedUsers`] ?? 0\n setHeatmapTooltip({\n period,\n breakdownValue: isDefaultSeries ? null : seriesKey,\n cohortSize,\n retainedUsers,\n retentionRate: rate,\n x: rect.left + rect.width / 2,\n y: rect.top,\n })\n }}\n onMouseLeave={() => setHeatmapTooltip(null)}\n >\n {rate > 0 ? formatPercentage(rate) : '-'}\n </td>\n )\n })}\n </tr>\n )\n })}\n </tbody>\n </table>\n )\n\n // Render heatmap tooltip (shared between heatmap and combined modes)\n const renderHeatmapTooltip = () =>\n heatmapTooltip && (\n <div\n className=\"dc:fixed dc:z-50 dc:px-3 dc:py-2 bg-dc-surface dc:border border-dc-border dc:rounded dc:shadow-lg dc:text-sm dc:pointer-events-none\"\n style={{\n left: heatmapTooltip.x,\n top: heatmapTooltip.y - 10,\n transform: 'translate(-50%, -100%)',\n }}\n >\n <div className=\"dc:font-medium text-dc-text dc:mb-1\">\n {heatmapTooltip.breakdownValue\n ? `${heatmapTooltip.breakdownValue} - ${formatPeriodLabel(heatmapTooltip.period, retentionData?.granularity)}`\n : formatPeriodLabel(heatmapTooltip.period, retentionData?.granularity)}\n </div>\n <div className=\"text-dc-text-secondary dc:space-y-0.5\">\n <div>Cohort Size: {heatmapTooltip.cohortSize.toLocaleString()}</div>\n <div>Retained: {heatmapTooltip.retainedUsers.toLocaleString()}</div>\n <div className=\"dc:font-medium text-dc-text\">\n Rate: {formatPercentage(heatmapTooltip.retentionRate)}\n </div>\n </div>\n </div>\n )\n\n // Render heatmap mode (table-based only)\n if (displayMode === 'heatmap') {\n return (\n <div className=\"dc:relative dc:w-full dc:h-full dc:overflow-auto\" style={{ height }}>\n {renderHeatmapTable()}\n {renderHeatmapTooltip()}\n </div>\n )\n }\n\n // Combined mode: line chart on top, heatmap table below\n if (displayMode === 'combined') {\n return (\n <div className=\"dc:flex dc:flex-col dc:w-full dc:h-full\" style={{ height }}>\n {/* Line chart - takes remaining space after heatmap */}\n <div className=\"dc:flex-1 dc:min-h-[200px]\">\n {renderLineChart('100%')}\n </div>\n {/* Heatmap table - auto-height based on content, scrolls if needed */}\n <div className=\"dc:flex-shrink-0 dc:max-h-[40%] dc:overflow-auto dc:border-t border-dc-border\">\n {renderHeatmapTable()}\n </div>\n {/* Shared heatmap tooltip */}\n {renderHeatmapTooltip()}\n </div>\n )\n }\n\n // Line mode: just the line chart\n return renderLineChart(height)\n})\n\nexport default RetentionCombinedChart\n"],"names":["getRetentionColor","rate","formatPercentage","formatPeriodLabel","period","granularity","prefix","getCohortLabel","_bindingKeyLabel","getDefaultSeriesName","bindingKeyLabel","transformRetentionData","rows","periods","breakdownValues","defaultSeriesName","row","r","dataPoint","bv","RetentionCombinedChart","React","data","height","displayConfig","colorPalette","hoveredLegend","setHoveredLegend","useState","heatmapTooltip","setHeatmapTooltip","retentionData","useMemo","isRetentionData","a","b","chartData","seriesKeys","cohortLabel","displayMode","showLegend","showGrid","showTooltip","jsx","jsxs","renderLineChart","chartHeight","chartMargins","CHART_MARGINS","ChartContainer","ComposedChart","CartesianGrid","XAxis","YAxis","value","ChartTooltip","name","label","Legend","o","seriesKey","index","Line","CHART_COLORS","renderHeatmapTable","rowIndex","period0Data","d","isDefaultSeries","cohortSize","bgColor","textColor","e","rect","retainedUsers","renderHeatmapTooltip"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RetentionCombinedChart-BK8N-MOQ.js","sources":["../../../src/client/components/charts/RetentionCombinedChart.tsx"],"sourcesContent":["/**\n * RetentionCombinedChart Component\n *\n * Combined visualization for retention analysis data.\n * Supports multiple display modes: heatmap, line chart, or combined view.\n *\n * Features:\n * - X-axis: Period numbers (P0, P1, P2...)\n * - Y-axis: Retention % (0-100%)\n * - Lines: One per breakdown value (or single if no breakdown)\n * - Display modes: 'heatmap' | 'line' | 'combined'\n * - Heatmap shows color-coded retention matrix\n * - Line chart shows retention curves over periods\n */\n\nimport React, { useMemo, useState } from 'react'\nimport {\n ComposedChart,\n Line,\n XAxis,\n YAxis,\n CartesianGrid,\n Legend,\n} from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS, CHART_MARGINS } from '../../utils/chartConstants'\nimport type { ChartProps } from '../../types'\nimport type { RetentionChartData, RetentionResultRow, RetentionGranularity } from '../../types/retention'\nimport { isRetentionData } from '../../types/retention'\n\n/**\n * Retention display mode\n * - 'heatmap': Show retention as color-coded bars\n * - 'line': Show retention as line curves\n * - 'combined': Show both heatmap background and line overlay\n */\nexport type RetentionDisplayMode = 'heatmap' | 'line' | 'combined'\n\n/**\n * Get color with opacity based on retention rate for heatmap cells\n * Uses a green gradient: higher retention = more saturated green\n */\nfunction getRetentionColor(rate: number): string {\n const clampedRate = Math.max(0, Math.min(1, rate))\n const alpha = 0.1 + clampedRate * 0.7\n return `rgba(34, 197, 94, ${alpha})`\n}\n\n/**\n * Format percentage for display\n */\nfunction formatPercentage(rate: number): string {\n return `${Math.round(rate * 100)}%`\n}\n\n/**\n * Format period label based on granularity\n * Period 0 shows \"< 1 Day\" / \"< 1 Week\" etc. to indicate the initial cohort\n * e.g., Period 0 with 'week' granularity → \"< 1 Week\", Period 1 → \"Week 1\"\n */\nfunction formatPeriodLabel(period: number, granularity?: RetentionGranularity): string {\n const prefix = granularity === 'day' ? 'Day'\n : granularity === 'week' ? 'Week'\n : granularity === 'month' ? 'Month'\n : 'P' // Fallback to P0, P1, etc.\n\n // Period 0 is special - shows \"< 1 Day\" / \"< 1 Week\" etc.\n if (period === 0) {\n return granularity ? `< 1 ${prefix}` : 'P0'\n }\n\n return granularity ? `${prefix} ${period}` : `P${period}`\n}\n\n/**\n * Get display label for the cohort total column\n * Shows \"Total\" regardless of binding key - it's the cohort size count\n */\nfunction getCohortLabel(_bindingKeyLabel?: string): string {\n return 'Total'\n}\n\n/**\n * Get default series name based on binding key\n * e.g., \"userId\" → \"userId Retention\", null → \"Retention\"\n */\nfunction getDefaultSeriesName(bindingKeyLabel?: string): string {\n if (!bindingKeyLabel) return 'Retention'\n return `${bindingKeyLabel} Retention`\n}\n\n/**\n * Transform retention data for chart display\n * Groups data by period with breakdown values as series\n */\nfunction transformRetentionData(\n rows: RetentionResultRow[],\n periods: number[],\n breakdownValues?: string[],\n granularity?: RetentionGranularity,\n bindingKeyLabel?: string\n): { chartData: any[]; seriesKeys: string[]; defaultSeriesName: string } {\n const defaultSeriesName = getDefaultSeriesName(bindingKeyLabel)\n\n // If no breakdown, single series\n if (!breakdownValues || breakdownValues.length === 0) {\n const chartData = periods.map((period) => {\n const row = rows.find((r) => r.period === period && !r.breakdownValue)\n return {\n period,\n periodLabel: formatPeriodLabel(period, granularity),\n [defaultSeriesName]: row ? row.retentionRate : null,\n cohortSize: row?.cohortSize ?? 0,\n retainedUsers: row?.retainedUsers ?? 0,\n }\n })\n return { chartData, seriesKeys: [defaultSeriesName], defaultSeriesName }\n }\n\n // With breakdown, create series per breakdown value\n const chartData = periods.map((period) => {\n const dataPoint: any = {\n period,\n periodLabel: formatPeriodLabel(period, granularity),\n }\n\n breakdownValues.forEach((bv) => {\n const row = rows.find((r) => r.period === period && r.breakdownValue === bv)\n dataPoint[bv] = row ? row.retentionRate : null\n dataPoint[`${bv}_cohortSize`] = row?.cohortSize ?? 0\n dataPoint[`${bv}_retainedUsers`] = row?.retainedUsers ?? 0\n })\n\n return dataPoint\n })\n\n return { chartData, seriesKeys: breakdownValues, defaultSeriesName }\n}\n\ninterface TooltipData {\n period: number\n breakdownValue?: string | null\n cohortSize: number\n retainedUsers: number\n retentionRate: number\n x: number\n y: number\n}\n\n/**\n * RetentionCombinedChart Component\n */\nconst RetentionCombinedChart = React.memo(function RetentionCombinedChart({\n data,\n height = '100%',\n displayConfig,\n colorPalette,\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n const [heatmapTooltip, setHeatmapTooltip] = useState<TooltipData | null>(null)\n\n // Parse retention data\n const retentionData = useMemo<RetentionChartData | null>(() => {\n if (!data) return null\n\n // Check if data is already in RetentionChartData format\n if (isRetentionData(data)) {\n return data\n }\n\n // If data is an array of RetentionResultRow, convert it\n if (Array.isArray(data) && data.length > 0) {\n const rows = data as RetentionResultRow[]\n const periods = [...new Set(rows.map((r) => r.period))].sort((a, b) => a - b)\n const breakdownValues = [\n ...new Set(rows.filter((r) => r.breakdownValue).map((r) => r.breakdownValue!)),\n ]\n\n return {\n rows,\n periods,\n breakdownValues: breakdownValues.length > 0 ? breakdownValues : undefined,\n }\n }\n\n return null\n }, [data])\n\n // Transform data for chart\n const { chartData, seriesKeys, defaultSeriesName } = useMemo(() => {\n if (!retentionData) {\n return { chartData: [], seriesKeys: [], defaultSeriesName: 'Retention' }\n }\n return transformRetentionData(\n retentionData.rows,\n retentionData.periods,\n retentionData.breakdownValues,\n retentionData.granularity,\n retentionData.bindingKeyLabel\n )\n }, [retentionData])\n\n // Get cohort label for heatmap column header\n const cohortLabel = getCohortLabel(retentionData?.bindingKeyLabel)\n\n // Display mode from config\n const displayMode: RetentionDisplayMode =\n (displayConfig as any)?.retentionDisplayMode || 'line'\n\n const showLegend = displayConfig?.showLegend ?? true\n const showGrid = displayConfig?.showGrid ?? true\n const showTooltip = displayConfig?.showTooltip ?? true\n\n // Handle empty/loading states\n if (!data || (Array.isArray(data) && data.length === 0)) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\"\n style={{ height }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">No data available</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">\n Configure retention analysis to see results\n </div>\n </div>\n </div>\n )\n }\n\n if (!chartData || chartData.length === 0) {\n return (\n <div\n className=\"dc:flex dc:items-center dc:justify-center dc:w-full text-dc-text-muted\"\n style={{ height }}\n >\n <div className=\"dc:text-center\">\n <div className=\"dc:text-sm dc:font-semibold dc:mb-1\">Unable to render retention data</div>\n <div className=\"dc:text-xs text-dc-text-secondary\">Data format may be incorrect</div>\n </div>\n </div>\n )\n }\n\n // Render line chart component (reused in line and combined modes)\n const renderLineChart = (chartHeight: string | number) => {\n const chartMargins = {\n ...CHART_MARGINS,\n left: 50,\n right: 20,\n }\n\n return (\n <ChartContainer height={chartHeight}>\n <ComposedChart data={chartData} margin={chartMargins} accessibilityLayer={false}>\n {showGrid && <CartesianGrid strokeDasharray=\"3 3\" />}\n <XAxis\n dataKey=\"periodLabel\"\n tick={{ fontSize: 12 }}\n axisLine={{ stroke: 'var(--dc-border)' }}\n tickLine={{ stroke: 'var(--dc-border)' }}\n />\n <YAxis\n domain={[0, 1]}\n tickFormatter={(value) => formatPercentage(value)}\n tick={{ fontSize: 12 }}\n axisLine={{ stroke: 'var(--dc-border)' }}\n tickLine={{ stroke: 'var(--dc-border)' }}\n label={{\n value: 'Retention %',\n angle: -90,\n position: 'insideLeft',\n style: { textAnchor: 'middle', fontSize: '12px', fill: 'var(--dc-text-secondary)' },\n }}\n />\n {showTooltip && (\n <ChartTooltip\n formatter={(value: any, name: string) => {\n if (value === null || value === undefined) {\n return ['No data', name]\n }\n return [formatPercentage(value), name]\n }}\n labelFormatter={(label: string) => label}\n />\n )}\n {showLegend && (\n <Legend\n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"line\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.dataKey || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n\n {/* Render lines */}\n {seriesKeys.map((seriesKey, index) => (\n <Line\n key={seriesKey}\n type=\"monotone\"\n dataKey={seriesKey}\n stroke={\n (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }\n strokeWidth={2}\n dot={{ r: 4, strokeWidth: 2 }}\n activeDot={{ r: 6 }}\n strokeOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n connectNulls={false}\n />\n ))}\n </ComposedChart>\n </ChartContainer>\n )\n }\n\n // Render heatmap table component (reused in heatmap and combined modes)\n const renderHeatmapTable = () => (\n <table className=\"dc:w-full dc:border-collapse dc:text-sm\">\n <thead className=\"dc:sticky dc:top-0 bg-dc-bg dc:z-10\">\n <tr>\n <th className=\"dc:text-left dc:p-2 dc:font-medium text-dc-text dc:border-b border-dc-border dc:min-w-[100px] dc:whitespace-nowrap\">\n {retentionData?.breakdownValues?.length ? 'Segment' : 'Cohort'}\n </th>\n <th className=\"dc:text-right dc:p-2 dc:font-medium text-dc-text dc:border-b border-dc-border dc:min-w-[60px] dc:whitespace-nowrap\">\n {cohortLabel}\n </th>\n {retentionData?.periods.map((period) => (\n <th\n key={period}\n className=\"dc:text-center dc:p-2 dc:font-medium text-dc-text dc:border-b border-dc-border dc:min-w-[70px] dc:whitespace-nowrap\"\n >\n {formatPeriodLabel(period, retentionData?.granularity)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {seriesKeys.map((seriesKey, rowIndex) => {\n const period0Data = chartData.find((d) => d.period === 0)\n const isDefaultSeries = seriesKey === defaultSeriesName\n const cohortSize = isDefaultSeries\n ? period0Data?.cohortSize ?? 0\n : period0Data?.[`${seriesKey}_cohortSize`] ?? 0\n\n return (\n <tr\n key={seriesKey}\n className={rowIndex % 2 === 0 ? 'bg-dc-bg' : 'bg-dc-surface-secondary'}\n >\n <td className=\"dc:p-2 dc:font-medium text-dc-text dc:border-b border-dc-border dc:whitespace-nowrap\">\n {seriesKey}\n </td>\n <td className=\"dc:p-2 dc:text-right text-dc-text-secondary dc:border-b border-dc-border\">\n {cohortSize.toLocaleString()}\n </td>\n {retentionData?.periods.map((period) => {\n const dataPoint = chartData.find((d) => d.period === period)\n const rate = dataPoint?.[seriesKey] ?? 0\n const bgColor = rate > 0 ? getRetentionColor(rate) : 'transparent'\n const textColor = rate > 0.5 ? '#ffffff' : 'var(--dc-text)'\n\n return (\n <td\n key={period}\n className=\"dc:p-2 dc:text-center dc:border-b border-dc-border dc:cursor-default dc:transition-opacity dc:hover:opacity-80\"\n style={{ backgroundColor: bgColor, color: textColor }}\n onMouseEnter={(e) => {\n const rect = e.currentTarget.getBoundingClientRect()\n const retainedUsers = isDefaultSeries\n ? dataPoint?.retainedUsers ?? 0\n : dataPoint?.[`${seriesKey}_retainedUsers`] ?? 0\n setHeatmapTooltip({\n period,\n breakdownValue: isDefaultSeries ? null : seriesKey,\n cohortSize,\n retainedUsers,\n retentionRate: rate,\n x: rect.left + rect.width / 2,\n y: rect.top,\n })\n }}\n onMouseLeave={() => setHeatmapTooltip(null)}\n >\n {rate > 0 ? formatPercentage(rate) : '-'}\n </td>\n )\n })}\n </tr>\n )\n })}\n </tbody>\n </table>\n )\n\n // Render heatmap tooltip (shared between heatmap and combined modes)\n const renderHeatmapTooltip = () =>\n heatmapTooltip && (\n <div\n className=\"dc:fixed dc:z-50 dc:px-3 dc:py-2 bg-dc-surface dc:border border-dc-border dc:rounded dc:shadow-lg dc:text-sm dc:pointer-events-none\"\n style={{\n left: heatmapTooltip.x,\n top: heatmapTooltip.y - 10,\n transform: 'translate(-50%, -100%)',\n }}\n >\n <div className=\"dc:font-medium text-dc-text dc:mb-1\">\n {heatmapTooltip.breakdownValue\n ? `${heatmapTooltip.breakdownValue} - ${formatPeriodLabel(heatmapTooltip.period, retentionData?.granularity)}`\n : formatPeriodLabel(heatmapTooltip.period, retentionData?.granularity)}\n </div>\n <div className=\"text-dc-text-secondary dc:space-y-0.5\">\n <div>Cohort Size: {heatmapTooltip.cohortSize.toLocaleString()}</div>\n <div>Retained: {heatmapTooltip.retainedUsers.toLocaleString()}</div>\n <div className=\"dc:font-medium text-dc-text\">\n Rate: {formatPercentage(heatmapTooltip.retentionRate)}\n </div>\n </div>\n </div>\n )\n\n // Render heatmap mode (table-based only)\n if (displayMode === 'heatmap') {\n return (\n <div className=\"dc:relative dc:w-full dc:h-full dc:overflow-auto\" style={{ height }}>\n {renderHeatmapTable()}\n {renderHeatmapTooltip()}\n </div>\n )\n }\n\n // Combined mode: line chart on top, heatmap table below\n if (displayMode === 'combined') {\n return (\n <div className=\"dc:flex dc:flex-col dc:w-full dc:h-full\" style={{ height }}>\n {/* Line chart - takes remaining space after heatmap */}\n <div className=\"dc:flex-1 dc:min-h-[200px]\">\n {renderLineChart('100%')}\n </div>\n {/* Heatmap table - auto-height based on content, scrolls if needed */}\n <div className=\"dc:flex-shrink-0 dc:max-h-[40%] dc:overflow-auto dc:border-t border-dc-border\">\n {renderHeatmapTable()}\n </div>\n {/* Shared heatmap tooltip */}\n {renderHeatmapTooltip()}\n </div>\n )\n }\n\n // Line mode: just the line chart\n return renderLineChart(height)\n})\n\nexport default RetentionCombinedChart\n"],"names":["getRetentionColor","rate","formatPercentage","formatPeriodLabel","period","granularity","prefix","getCohortLabel","_bindingKeyLabel","getDefaultSeriesName","bindingKeyLabel","transformRetentionData","rows","periods","breakdownValues","defaultSeriesName","row","r","dataPoint","bv","RetentionCombinedChart","React","data","height","displayConfig","colorPalette","hoveredLegend","setHoveredLegend","useState","heatmapTooltip","setHeatmapTooltip","retentionData","useMemo","isRetentionData","a","b","chartData","seriesKeys","cohortLabel","displayMode","showLegend","showGrid","showTooltip","jsx","jsxs","renderLineChart","chartHeight","chartMargins","CHART_MARGINS","ChartContainer","ComposedChart","CartesianGrid","XAxis","YAxis","value","ChartTooltip","name","label","Legend","o","seriesKey","index","Line","CHART_COLORS","renderHeatmapTable","rowIndex","period0Data","d","isDefaultSeries","cohortSize","bgColor","textColor","e","rect","retainedUsers","renderHeatmapTooltip"],"mappings":"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"}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { jsxs as t, jsx as e, Fragment as ie } from "react/jsx-runtime";
|
|
2
2
|
import { useState as G, useCallback as F, memo as me, useEffect as z, useRef as Z, useMemo as Y, Component as fd, forwardRef as qc, useImperativeHandle as pd } from "react";
|
|
3
|
-
import { u as xd, g as bd } from "./providers-
|
|
4
|
-
import { F as gd, G as Ce, E as sc, C as Ct, D as yd, H as vd, q as Nd, I as wd, u as Cd, J as Sd } from "./analysis-builder-shared-
|
|
5
|
-
import { Z as Wt, _ as Dd, f as kd, a3 as Td, a4 as jc, a5 as Qc, a6 as Gc, a7 as Ad } from "./
|
|
6
|
-
import { i as $d, L as ac } from "./charts-loader-
|
|
3
|
+
import { u as xd, g as bd } from "./providers-CgxXm6Ll.js";
|
|
4
|
+
import { F as gd, G as Ce, E as sc, C as Ct, D as yd, H as vd, q as Nd, I as wd, u as Cd, J as Sd } from "./analysis-builder-shared-INGGwyTG.js";
|
|
5
|
+
import { Z as Wt, _ as Dd, f as kd, a3 as Td, a4 as jc, a5 as Qc, a6 as Gc, a7 as Ad, a8 as St } from "./components-D0i1yQsk.js";
|
|
6
|
+
import { i as $d, L as ac } from "./charts-loader-YnhJHubD.js";
|
|
7
7
|
import { useExplainQuery as ht, useExplainAI as Id } from "../hooks.js";
|
|
8
8
|
import { b as $, g as dc } from "./icons-DRreo6m8.js";
|
|
9
|
-
import { S as ue } from "./charts-core-
|
|
10
|
-
import { p as Rd, q as Fd, r as Ed, D as Ut, s as ft, n as ze, F as _c } from "./useDirtyStateTracking-
|
|
9
|
+
import { S as ue } from "./charts-core-T8UglYyq.js";
|
|
10
|
+
import { p as Rd, q as Fd, r as Ed, D as Ut, s as ft, n as ze, F as _c } from "./useDirtyStateTracking-Cu1HSjmo.js";
|
|
11
11
|
import { useChartConfig as Od } from "../charts.js";
|
|
12
|
-
import { AnalysisDisplayConfigPanel as St } from "../components.js";
|
|
13
12
|
import { b as ic, F as oc } from "./flow-utils-CjQZG5qq.js";
|
|
14
13
|
import { b as lc, g as Ld, c as uc, e as Bd, R as mc, a as hc, f as Pd } from "./retention-CzCo8262.js";
|
|
15
14
|
function pt(r) {
|
|
@@ -2965,7 +2964,7 @@ function xc({
|
|
|
2965
2964
|
const [x, g] = G(!1), [i, l] = G(null);
|
|
2966
2965
|
z(() => {
|
|
2967
2966
|
let C = !0;
|
|
2968
|
-
return import("./chartConfigRegistry-
|
|
2967
|
+
return import("./chartConfigRegistry-Di34paQH.js").then((R) => {
|
|
2969
2968
|
C && l(R.chartConfigRegistry);
|
|
2970
2969
|
}).catch(() => {
|
|
2971
2970
|
C && l(null);
|
|
@@ -6146,4 +6145,4 @@ lr.displayName = "AnalysisBuilder";
|
|
|
6146
6145
|
export {
|
|
6147
6146
|
lr as default
|
|
6148
6147
|
};
|
|
6149
|
-
//# sourceMappingURL=analysis-builder-
|
|
6148
|
+
//# sourceMappingURL=analysis-builder-CNBmAGAO.js.map
|