@mastra/playground-ui 41.0.0 → 41.1.0-alpha.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SankeyChart.cjs.js","sources":["../../src/ds/components/SankeyChart/sankey-chart-utils.ts","../../src/ds/components/SankeyChart/sankeyColor.ts","../../src/ds/components/SankeyChart/sankey-context.tsx","../../src/ds/components/SankeyChart/sankey-chart.tsx"],"sourcesContent":["export type SankeyChartRecord = Record<string, unknown>;\n\nexport type SankeyChartColumn = {\n id: string;\n label: string;\n};\n\nexport type SankeyChartNode = {\n id: string;\n name: string;\n column: SankeyChartColumn;\n value: string | number;\n};\n\nexport type SankeyChartLink = {\n id: string;\n source: number;\n target: number;\n value: number;\n sourceNode: SankeyChartNode;\n targetNode: SankeyChartNode;\n records: Array<SankeyChartRecord>;\n};\n\nexport type SankeyChartGraph = {\n nodes: Array<SankeyChartNode>;\n links: Array<SankeyChartLink>;\n};\n\nexport type SankeyChartCurveSelection = {\n source: {\n column: SankeyChartColumn;\n value: string | number;\n };\n target: {\n column: SankeyChartColumn;\n value: string | number;\n };\n records: Array<SankeyChartRecord>;\n};\n\nconst EMPTY_GRAPH: SankeyChartGraph = { nodes: [], links: [] };\n\nexport function getSankeyChartValue(value: unknown): string | number | undefined {\n if (typeof value === 'string') {\n const trimmedValue = value.trim();\n return trimmedValue.length > 0 ? trimmedValue : undefined;\n }\n\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n\n return undefined;\n}\n\nexport function reorderSankeyChartColumns(\n columns: Array<SankeyChartColumn>,\n startIndex: number,\n endIndex: number,\n): Array<SankeyChartColumn> {\n if (\n startIndex === endIndex ||\n startIndex < 0 ||\n endIndex < 0 ||\n startIndex >= columns.length ||\n endIndex >= columns.length\n ) {\n return columns;\n }\n\n const reorderedColumns = [...columns];\n const [movedColumn] = reorderedColumns.splice(startIndex, 1);\n if (!movedColumn) return columns;\n reorderedColumns.splice(endIndex, 0, movedColumn);\n return reorderedColumns;\n}\n\nexport function buildSankeyChartGraph(\n data: Array<SankeyChartRecord>,\n columns: Array<SankeyChartColumn>,\n): SankeyChartGraph {\n if (columns.length < 2 || data.length === 0) return EMPTY_GRAPH;\n\n const nodes: Array<SankeyChartNode> = [];\n const nodeIndexes = new Map<string, number>();\n const linksById = new Map<string, SankeyChartLink>();\n\n const getNode = (column: SankeyChartColumn, value: string | number): { node: SankeyChartNode; index: number } => {\n const id = createNodeId(column.id, value);\n const existingIndex = nodeIndexes.get(id);\n const existingNode = existingIndex === undefined ? undefined : nodes[existingIndex];\n if (existingIndex !== undefined && existingNode) return { node: existingNode, index: existingIndex };\n\n const node: SankeyChartNode = { id, name: String(value), column, value };\n const index = nodes.length;\n nodes.push(node);\n nodeIndexes.set(id, index);\n return { node, index };\n };\n\n for (let columnIndex = 0; columnIndex < columns.length - 1; columnIndex += 1) {\n const sourceColumn = columns[columnIndex];\n const targetColumn = columns[columnIndex + 1];\n if (!sourceColumn || !targetColumn) continue;\n\n for (const record of data) {\n const sourceValue = getSankeyChartValue(record[sourceColumn.id]);\n const targetValue = getSankeyChartValue(record[targetColumn.id]);\n if (sourceValue === undefined || targetValue === undefined) continue;\n\n const source = getNode(sourceColumn, sourceValue);\n const target = getNode(targetColumn, targetValue);\n const id = `${source.node.id}->${target.node.id}`;\n const existingLink = linksById.get(id);\n\n if (existingLink) {\n existingLink.value += 1;\n existingLink.records.push(record);\n } else {\n linksById.set(id, {\n id,\n source: source.index,\n target: target.index,\n value: 1,\n sourceNode: source.node,\n targetNode: target.node,\n records: [record],\n });\n }\n }\n }\n\n return { nodes, links: [...linksById.values()] };\n}\n\nexport function getSankeyChartCurveSelection(link: SankeyChartLink): SankeyChartCurveSelection {\n return {\n source: { column: link.sourceNode.column, value: link.sourceNode.value },\n target: { column: link.targetNode.column, value: link.targetNode.value },\n records: link.records,\n };\n}\n\nfunction createNodeId(columnId: string, value: string | number) {\n return JSON.stringify([columnId, typeof value, value]);\n}\n","const MIN_HUE_DISTANCE = 26;\n\nfunction normalizeHue(hue: number) {\n return ((hue % 360) + 360) % 360;\n}\n\nexport function hashHue(value: string) {\n let hash = 2166136261;\n\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n\n return normalizeHue(hash);\n}\n\nfunction supportsOklch() {\n return typeof CSS !== 'undefined' && CSS.supports?.('color', 'oklch(62% 0.14 180)') === true;\n}\n\nexport function nodeColor(hue: number) {\n const normalizedHue = normalizeHue(hue);\n return supportsOklch() ? `oklch(68% 0.13 ${normalizedHue})` : `hsl(${normalizedHue} 42% 62%)`;\n}\n\nexport function nodeColorVivid(hue: number) {\n const normalizedHue = normalizeHue(hue);\n return supportsOklch() ? `oklch(74% 0.18 ${normalizedHue})` : `hsl(${normalizedHue} 55% 68%)`;\n}\n\nexport function buildSankeyHueMap(names: string[]) {\n const entries = [...new Set(names)]\n .map(name => ({ name, hue: hashHue(name) }))\n .sort((left, right) => left.hue - right.hue || left.name.localeCompare(right.name));\n\n for (let pass = 0; pass < 3; pass += 1) {\n for (let iteration = 0; iteration < entries.length * 8; iteration += 1) {\n entries.sort((left, right) => left.hue - right.hue || left.name.localeCompare(right.name));\n let adjusted = false;\n\n for (let index = 0; index < entries.length; index += 1) {\n const current = entries[index];\n const next = entries[(index + 1) % entries.length];\n if (!current || !next) continue;\n\n const distance = normalizeHue(next.hue - current.hue);\n if (distance >= MIN_HUE_DISTANCE - Number.EPSILON) continue;\n\n const adjustment = (MIN_HUE_DISTANCE - distance) / 2;\n current.hue = normalizeHue(current.hue - adjustment);\n next.hue = normalizeHue(next.hue + adjustment);\n adjusted = true;\n }\n\n if (!adjusted) break;\n }\n }\n\n return Object.fromEntries(entries.map(({ name, hue }) => [name, normalizeHue(hue)]));\n}\n","import { createContext, useContext, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { buildSankeyChartGraph, reorderSankeyChartColumns } from './sankey-chart-utils';\nimport type { SankeyChartColumn, SankeyChartGraph, SankeyChartRecord } from './sankey-chart-utils';\nimport { buildSankeyHueMap } from './sankeyColor';\n\nexport type SankeyProps = {\n data: Array<SankeyChartRecord>;\n columns: Array<SankeyChartColumn>;\n children: ReactNode;\n columnOrder?: Array<string>;\n onColumnOrderChange?: (columnOrder: Array<string>) => void;\n visibleColumnIds?: Array<string>;\n onVisibleColumnIdsChange?: (columnIds: Array<string>) => void;\n};\n\nexport type SankeyControlColumn = SankeyChartColumn & {\n visible: boolean;\n};\n\nexport type SankeyControls = {\n columns: Array<SankeyControlColumn>;\n toggleColumn: (columnId: string) => void;\n reorderColumns: (sourceIndex: number, destinationIndex: number) => void;\n};\n\ntype SankeyRenderContext = {\n graph: SankeyChartGraph;\n enabledColumns: Array<SankeyChartColumn>;\n hueMap: Record<string, number>;\n};\n\nconst SankeyControlsContext = createContext<SankeyControls | undefined>(undefined);\nconst SankeyRenderContext = createContext<SankeyRenderContext | undefined>(undefined);\n\nexport function Sankey({\n data,\n columns,\n children,\n columnOrder,\n onColumnOrderChange,\n visibleColumnIds,\n onVisibleColumnIdsChange,\n}: SankeyProps) {\n const columnIds = columns.map(column => column.id);\n const [internalOrder, setInternalOrder] = useState(columnIds);\n const [internalVisibleIds, setInternalVisibleIds] = useState(columnIds);\n const orderedColumns = orderColumns(columns, columnOrder ?? internalOrder);\n const visibleIds = new Set(visibleColumnIds ?? internalVisibleIds);\n const enabledColumns = orderedColumns.filter(column => visibleIds.has(column.id));\n const graph = buildSankeyChartGraph(data, enabledColumns);\n const hueMap = buildSankeyHueMap(graph.nodes.map(node => String(node.value)));\n\n const setVisibleColumns = (nextIds: Array<string>) => {\n if (visibleColumnIds === undefined) setInternalVisibleIds(nextIds);\n onVisibleColumnIdsChange?.(nextIds);\n };\n\n const setColumnOrder = (nextOrder: Array<string>) => {\n if (columnOrder === undefined) setInternalOrder(nextOrder);\n onColumnOrderChange?.(nextOrder);\n };\n\n const toggleColumn = (columnId: string) => {\n const nextIds = visibleIds.has(columnId)\n ? orderedColumns.filter(column => visibleIds.has(column.id) && column.id !== columnId).map(column => column.id)\n : orderedColumns.filter(column => visibleIds.has(column.id) || column.id === columnId).map(column => column.id);\n setVisibleColumns(nextIds);\n };\n\n const reorderColumns = (sourceIndex: number, destinationIndex: number) => {\n const reorderedEnabled = reorderSankeyChartColumns(enabledColumns, sourceIndex, destinationIndex);\n const enabledIterator = reorderedEnabled[Symbol.iterator]();\n const nextColumns = orderedColumns.map(column =>\n visibleIds.has(column.id) ? (enabledIterator.next().value ?? column) : column,\n );\n setColumnOrder(nextColumns.map(column => column.id));\n };\n\n const controlColumns = orderedColumns.map(column => ({ ...column, visible: visibleIds.has(column.id) }));\n\n return (\n <SankeyControlsContext.Provider value={{ columns: controlColumns, toggleColumn, reorderColumns }}>\n <SankeyRenderContext.Provider value={{ graph, enabledColumns, hueMap }}>{children}</SankeyRenderContext.Provider>\n </SankeyControlsContext.Provider>\n );\n}\n\n// Context providers and their hooks intentionally share this module.\n// eslint-disable-next-line react-refresh/only-export-components\nexport function useSankey() {\n const context = useContext(SankeyControlsContext);\n if (!context) throw new Error('useSankey must be used within Sankey');\n return context;\n}\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport function useSankeyRenderContext() {\n const context = useContext(SankeyRenderContext);\n if (!context) throw new Error('SankeyChart must be used within Sankey');\n return context;\n}\n\nfunction orderColumns(columns: Array<SankeyChartColumn>, order: Array<string>) {\n const positions = new Map(order.map((id, index) => [id, index]));\n return [...columns].sort(\n (left, right) => (positions.get(left.id) ?? columns.length) - (positions.get(right.id) ?? columns.length),\n );\n}\n","import { useState } from 'react';\nimport type { CSSProperties, KeyboardEvent } from 'react';\nimport { ResponsiveContainer, Sankey as RechartsSankey } from 'recharts';\nimport { getSankeyChartCurveSelection } from './sankey-chart-utils';\nimport type { SankeyChartCurveSelection } from './sankey-chart-utils';\nimport { useSankeyRenderContext } from './sankey-context';\nimport { nodeColor, nodeColorVivid } from './sankeyColor';\nimport { Colors } from '@/ds/tokens';\nimport { cn } from '@/lib/utils';\n\nexport type SankeyChartProps = {\n height?: CSSProperties['height'];\n className?: string;\n onCurveClick?: (selection: SankeyChartCurveSelection) => void;\n};\n\nexport function SankeyChart({ height = 320, className, onCurveClick }: SankeyChartProps) {\n const { graph, enabledColumns, hueMap } = useSankeyRenderContext();\n const [hoveredSourceName, setHoveredSourceName] = useState<string>();\n const lastColumnId = enabledColumns.at(-1)?.id;\n\n return (\n <div className={cn('min-w-0', className)}>\n {graph.links.length === 0 ? (\n <div\n className=\"flex items-center justify-center rounded-md border border-border1 text-ui-sm text-neutral3\"\n style={{ height }}\n >\n Select at least two columns with data to display a flow\n </div>\n ) : (\n <div style={{ height }}>\n <ResponsiveContainer\n width=\"100%\"\n height=\"100%\"\n initialDimension={{ width: 800, height: typeof height === 'number' ? height : 320 }}\n >\n <RechartsSankey\n data={graph}\n nodeWidth={7}\n nodePadding={18}\n margin={{ top: 40, right: 120, bottom: 12, left: 120 }}\n node={(props: SankeyNodeRendererProps) => {\n const node = graph.nodes[props.index];\n const showColumnLabel = node\n ? graph.nodes.findIndex(candidate => candidate.column.id === node.column.id) === props.index\n : false;\n return (\n <SankeyNode\n {...props}\n hueMap={hueMap}\n columnLabel={node?.column.label}\n showColumnLabel={showColumnLabel}\n isLastColumn={node?.column.id === lastColumnId}\n onHoverChange={setHoveredSourceName}\n />\n );\n }}\n link={(props: SankeyLinkRendererProps) => {\n const link = graph.links[props.index];\n return (\n <SankeyLink\n {...props}\n hueMap={hueMap}\n highlighted={String(props.payload.source.name ?? '') === hoveredSourceName}\n onHoverChange={setHoveredSourceName}\n clickable={onCurveClick !== undefined}\n onSelect={() => {\n if (link) onCurveClick?.(getSankeyChartCurveSelection(link));\n }}\n />\n );\n }}\n />\n </ResponsiveContainer>\n </div>\n )}\n </div>\n );\n}\n\ntype SankeyNodeRendererProps = {\n x: number;\n y: number;\n width: number;\n height: number;\n index: number;\n payload: { name?: string | number; value?: string | number };\n};\n\ntype SankeyLinkRendererProps = {\n sourceX: number;\n targetX: number;\n sourceY: number;\n targetY: number;\n sourceControlX: number;\n targetControlX: number;\n linkWidth: number;\n index: number;\n payload: { source: { name?: string | number }; target: { name?: string | number } };\n};\n\ntype SankeyNodeProps = SankeyNodeRendererProps & {\n hueMap: Record<string, number>;\n columnLabel?: string;\n showColumnLabel: boolean;\n isLastColumn: boolean;\n onHoverChange: (sourceName: string | undefined) => void;\n};\n\nfunction SankeyNode({\n x,\n y,\n width,\n height,\n payload,\n hueMap,\n columnLabel,\n showColumnLabel,\n isLastColumn,\n onHoverChange,\n}: SankeyNodeProps) {\n const name = typeof payload.name === 'string' || typeof payload.name === 'number' ? String(payload.name) : '';\n const value = typeof payload.value === 'string' || typeof payload.value === 'number' ? String(payload.value) : '';\n const labelX = isLastColumn ? x - 8 : x + width + 8;\n const textAnchor = isLastColumn ? 'end' : 'start';\n const hue = hueMap[name] ?? 0;\n\n return (\n <g onMouseEnter={() => onHoverChange(name)} onMouseLeave={() => onHoverChange(undefined)}>\n {showColumnLabel && columnLabel ? (\n <text x={x + width / 2} y={18} textAnchor=\"middle\" fill={Colors.neutral5} fontSize={12} fontWeight={600}>\n {columnLabel}\n </text>\n ) : null}\n <rect x={x} y={y} width={width} height={height} rx={3} fill={nodeColor(hue)} />\n <text\n x={labelX}\n y={y + height / 2 - 4}\n textAnchor={textAnchor}\n fill={Colors.neutral5}\n fontSize={12.5}\n fontFamily=\"var(--font-mono)\"\n paintOrder=\"stroke\"\n stroke={Colors.surface1}\n strokeWidth={3}\n strokeLinejoin=\"round\"\n >\n {name}\n </text>\n <text x={labelX} y={y + height / 2 + 10} textAnchor={textAnchor} fill={Colors.neutral3} fontSize={10.5}>\n {value}\n </text>\n </g>\n );\n}\n\ntype SankeyLinkProps = SankeyLinkRendererProps & {\n hueMap: Record<string, number>;\n highlighted: boolean;\n clickable: boolean;\n onHoverChange: (sourceName: string | undefined) => void;\n onSelect: () => void;\n};\n\nfunction SankeyLink({\n sourceX,\n targetX,\n sourceY,\n targetY,\n sourceControlX,\n targetControlX,\n linkWidth,\n index,\n payload,\n hueMap,\n highlighted,\n clickable,\n onHoverChange,\n onSelect,\n}: SankeyLinkProps) {\n const halfWidth = Math.max(0, linkWidth) / 2;\n const path = [\n `M${sourceX},${sourceY - halfWidth}`,\n `C${sourceControlX},${sourceY - halfWidth} ${targetControlX},${targetY - halfWidth} ${targetX},${targetY - halfWidth}`,\n `L${targetX},${targetY + halfWidth}`,\n `C${targetControlX},${targetY + halfWidth} ${sourceControlX},${sourceY + halfWidth} ${sourceX},${sourceY + halfWidth}`,\n 'Z',\n ].join(' ');\n const sourceName = String(payload.source.name ?? '');\n const targetName = String(payload.target.name ?? '');\n const gradientId = `sankey-grad-${index}`;\n const vividGradientId = `${gradientId}-vivid`;\n const handleKeyDown = (event: KeyboardEvent<SVGPathElement>) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n onSelect();\n };\n\n return (\n <g>\n <defs>\n <linearGradient id={gradientId} gradientUnits=\"userSpaceOnUse\" x1={sourceX} x2={targetX}>\n <stop offset=\"0%\" stopColor={nodeColor(hueMap[sourceName] ?? 0)} />\n <stop offset=\"100%\" stopColor={nodeColor(hueMap[targetName] ?? 0)} />\n </linearGradient>\n <linearGradient id={vividGradientId} gradientUnits=\"userSpaceOnUse\" x1={sourceX} x2={targetX}>\n <stop offset=\"0%\" stopColor={nodeColorVivid(hueMap[sourceName] ?? 0)} />\n <stop offset=\"100%\" stopColor={nodeColorVivid(hueMap[targetName] ?? 0)} />\n </linearGradient>\n </defs>\n <path\n d={path}\n fill={`url(#${highlighted ? vividGradientId : gradientId})`}\n fillOpacity={highlighted ? 0.75 : 0.32}\n stroke=\"none\"\n role={clickable ? 'button' : undefined}\n tabIndex={clickable ? 0 : undefined}\n aria-label={clickable ? 'Select Sankey curve' : undefined}\n onClick={clickable ? onSelect : undefined}\n onKeyDown={clickable ? handleKeyDown : undefined}\n onMouseEnter={() => onHoverChange(sourceName)}\n onMouseLeave={() => onHoverChange(undefined)}\n style={{ cursor: clickable ? 'pointer' : undefined, transition: 'fill-opacity 0.18s ease' }}\n />\n </g>\n );\n}\n"],"names":["createContext","useState","jsx","useContext","cn","ResponsiveContainer","RechartsSankey","jsxs","Colors"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from '../src/ds/components/SankeyChart/index'
2
+ export {}
@@ -0,0 +1,352 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useState, useContext, createContext } from 'react';
3
+ import { ResponsiveContainer, Sankey as Sankey$1 } from 'recharts';
4
+ import { C as Colors } from '../spacings-C87dXiT-.js';
5
+ import { c as cn } from '../cn-BakJzhuv.js';
6
+
7
+ const EMPTY_GRAPH = { nodes: [], links: [] };
8
+ function getSankeyChartValue(value) {
9
+ if (typeof value === "string") {
10
+ const trimmedValue = value.trim();
11
+ return trimmedValue.length > 0 ? trimmedValue : void 0;
12
+ }
13
+ if (typeof value === "number" && Number.isFinite(value)) return value;
14
+ return void 0;
15
+ }
16
+ function reorderSankeyChartColumns(columns, startIndex, endIndex) {
17
+ if (startIndex === endIndex || startIndex < 0 || endIndex < 0 || startIndex >= columns.length || endIndex >= columns.length) {
18
+ return columns;
19
+ }
20
+ const reorderedColumns = [...columns];
21
+ const [movedColumn] = reorderedColumns.splice(startIndex, 1);
22
+ if (!movedColumn) return columns;
23
+ reorderedColumns.splice(endIndex, 0, movedColumn);
24
+ return reorderedColumns;
25
+ }
26
+ function buildSankeyChartGraph(data, columns) {
27
+ if (columns.length < 2 || data.length === 0) return EMPTY_GRAPH;
28
+ const nodes = [];
29
+ const nodeIndexes = /* @__PURE__ */ new Map();
30
+ const linksById = /* @__PURE__ */ new Map();
31
+ const getNode = (column, value) => {
32
+ const id = createNodeId(column.id, value);
33
+ const existingIndex = nodeIndexes.get(id);
34
+ const existingNode = existingIndex === void 0 ? void 0 : nodes[existingIndex];
35
+ if (existingIndex !== void 0 && existingNode) return { node: existingNode, index: existingIndex };
36
+ const node = { id, name: String(value), column, value };
37
+ const index = nodes.length;
38
+ nodes.push(node);
39
+ nodeIndexes.set(id, index);
40
+ return { node, index };
41
+ };
42
+ for (let columnIndex = 0; columnIndex < columns.length - 1; columnIndex += 1) {
43
+ const sourceColumn = columns[columnIndex];
44
+ const targetColumn = columns[columnIndex + 1];
45
+ if (!sourceColumn || !targetColumn) continue;
46
+ for (const record of data) {
47
+ const sourceValue = getSankeyChartValue(record[sourceColumn.id]);
48
+ const targetValue = getSankeyChartValue(record[targetColumn.id]);
49
+ if (sourceValue === void 0 || targetValue === void 0) continue;
50
+ const source = getNode(sourceColumn, sourceValue);
51
+ const target = getNode(targetColumn, targetValue);
52
+ const id = `${source.node.id}->${target.node.id}`;
53
+ const existingLink = linksById.get(id);
54
+ if (existingLink) {
55
+ existingLink.value += 1;
56
+ existingLink.records.push(record);
57
+ } else {
58
+ linksById.set(id, {
59
+ id,
60
+ source: source.index,
61
+ target: target.index,
62
+ value: 1,
63
+ sourceNode: source.node,
64
+ targetNode: target.node,
65
+ records: [record]
66
+ });
67
+ }
68
+ }
69
+ }
70
+ return { nodes, links: [...linksById.values()] };
71
+ }
72
+ function getSankeyChartCurveSelection(link) {
73
+ return {
74
+ source: { column: link.sourceNode.column, value: link.sourceNode.value },
75
+ target: { column: link.targetNode.column, value: link.targetNode.value },
76
+ records: link.records
77
+ };
78
+ }
79
+ function createNodeId(columnId, value) {
80
+ return JSON.stringify([columnId, typeof value, value]);
81
+ }
82
+
83
+ const MIN_HUE_DISTANCE = 26;
84
+ function normalizeHue(hue) {
85
+ return (hue % 360 + 360) % 360;
86
+ }
87
+ function hashHue(value) {
88
+ let hash = 2166136261;
89
+ for (let index = 0; index < value.length; index += 1) {
90
+ hash ^= value.charCodeAt(index);
91
+ hash = Math.imul(hash, 16777619);
92
+ }
93
+ return normalizeHue(hash);
94
+ }
95
+ function supportsOklch() {
96
+ return typeof CSS !== "undefined" && CSS.supports?.("color", "oklch(62% 0.14 180)") === true;
97
+ }
98
+ function nodeColor(hue) {
99
+ const normalizedHue = normalizeHue(hue);
100
+ return supportsOklch() ? `oklch(68% 0.13 ${normalizedHue})` : `hsl(${normalizedHue} 42% 62%)`;
101
+ }
102
+ function nodeColorVivid(hue) {
103
+ const normalizedHue = normalizeHue(hue);
104
+ return supportsOklch() ? `oklch(74% 0.18 ${normalizedHue})` : `hsl(${normalizedHue} 55% 68%)`;
105
+ }
106
+ function buildSankeyHueMap(names) {
107
+ const entries = [...new Set(names)].map((name) => ({ name, hue: hashHue(name) })).sort((left, right) => left.hue - right.hue || left.name.localeCompare(right.name));
108
+ for (let pass = 0; pass < 3; pass += 1) {
109
+ for (let iteration = 0; iteration < entries.length * 8; iteration += 1) {
110
+ entries.sort((left, right) => left.hue - right.hue || left.name.localeCompare(right.name));
111
+ let adjusted = false;
112
+ for (let index = 0; index < entries.length; index += 1) {
113
+ const current = entries[index];
114
+ const next = entries[(index + 1) % entries.length];
115
+ if (!current || !next) continue;
116
+ const distance = normalizeHue(next.hue - current.hue);
117
+ if (distance >= MIN_HUE_DISTANCE - Number.EPSILON) continue;
118
+ const adjustment = (MIN_HUE_DISTANCE - distance) / 2;
119
+ current.hue = normalizeHue(current.hue - adjustment);
120
+ next.hue = normalizeHue(next.hue + adjustment);
121
+ adjusted = true;
122
+ }
123
+ if (!adjusted) break;
124
+ }
125
+ }
126
+ return Object.fromEntries(entries.map(({ name, hue }) => [name, normalizeHue(hue)]));
127
+ }
128
+
129
+ const SankeyControlsContext = createContext(void 0);
130
+ const SankeyRenderContext = createContext(void 0);
131
+ function Sankey({
132
+ data,
133
+ columns,
134
+ children,
135
+ columnOrder,
136
+ onColumnOrderChange,
137
+ visibleColumnIds,
138
+ onVisibleColumnIdsChange
139
+ }) {
140
+ const columnIds = columns.map((column) => column.id);
141
+ const [internalOrder, setInternalOrder] = useState(columnIds);
142
+ const [internalVisibleIds, setInternalVisibleIds] = useState(columnIds);
143
+ const orderedColumns = orderColumns(columns, columnOrder ?? internalOrder);
144
+ const visibleIds = new Set(visibleColumnIds ?? internalVisibleIds);
145
+ const enabledColumns = orderedColumns.filter((column) => visibleIds.has(column.id));
146
+ const graph = buildSankeyChartGraph(data, enabledColumns);
147
+ const hueMap = buildSankeyHueMap(graph.nodes.map((node) => String(node.value)));
148
+ const setVisibleColumns = (nextIds) => {
149
+ if (visibleColumnIds === void 0) setInternalVisibleIds(nextIds);
150
+ onVisibleColumnIdsChange?.(nextIds);
151
+ };
152
+ const setColumnOrder = (nextOrder) => {
153
+ if (columnOrder === void 0) setInternalOrder(nextOrder);
154
+ onColumnOrderChange?.(nextOrder);
155
+ };
156
+ const toggleColumn = (columnId) => {
157
+ const nextIds = visibleIds.has(columnId) ? orderedColumns.filter((column) => visibleIds.has(column.id) && column.id !== columnId).map((column) => column.id) : orderedColumns.filter((column) => visibleIds.has(column.id) || column.id === columnId).map((column) => column.id);
158
+ setVisibleColumns(nextIds);
159
+ };
160
+ const reorderColumns = (sourceIndex, destinationIndex) => {
161
+ const reorderedEnabled = reorderSankeyChartColumns(enabledColumns, sourceIndex, destinationIndex);
162
+ const enabledIterator = reorderedEnabled[Symbol.iterator]();
163
+ const nextColumns = orderedColumns.map(
164
+ (column) => visibleIds.has(column.id) ? enabledIterator.next().value ?? column : column
165
+ );
166
+ setColumnOrder(nextColumns.map((column) => column.id));
167
+ };
168
+ const controlColumns = orderedColumns.map((column) => ({ ...column, visible: visibleIds.has(column.id) }));
169
+ return /* @__PURE__ */ jsx(SankeyControlsContext.Provider, { value: { columns: controlColumns, toggleColumn, reorderColumns }, children: /* @__PURE__ */ jsx(SankeyRenderContext.Provider, { value: { graph, enabledColumns, hueMap }, children }) });
170
+ }
171
+ function useSankey() {
172
+ const context = useContext(SankeyControlsContext);
173
+ if (!context) throw new Error("useSankey must be used within Sankey");
174
+ return context;
175
+ }
176
+ function useSankeyRenderContext() {
177
+ const context = useContext(SankeyRenderContext);
178
+ if (!context) throw new Error("SankeyChart must be used within Sankey");
179
+ return context;
180
+ }
181
+ function orderColumns(columns, order) {
182
+ const positions = new Map(order.map((id, index) => [id, index]));
183
+ return [...columns].sort(
184
+ (left, right) => (positions.get(left.id) ?? columns.length) - (positions.get(right.id) ?? columns.length)
185
+ );
186
+ }
187
+
188
+ function SankeyChart({ height = 320, className, onCurveClick }) {
189
+ const { graph, enabledColumns, hueMap } = useSankeyRenderContext();
190
+ const [hoveredSourceName, setHoveredSourceName] = useState();
191
+ const lastColumnId = enabledColumns.at(-1)?.id;
192
+ return /* @__PURE__ */ jsx("div", { className: cn("min-w-0", className), children: graph.links.length === 0 ? /* @__PURE__ */ jsx(
193
+ "div",
194
+ {
195
+ className: "flex items-center justify-center rounded-md border border-border1 text-ui-sm text-neutral3",
196
+ style: { height },
197
+ children: "Select at least two columns with data to display a flow"
198
+ }
199
+ ) : /* @__PURE__ */ jsx("div", { style: { height }, children: /* @__PURE__ */ jsx(
200
+ ResponsiveContainer,
201
+ {
202
+ width: "100%",
203
+ height: "100%",
204
+ initialDimension: { width: 800, height: typeof height === "number" ? height : 320 },
205
+ children: /* @__PURE__ */ jsx(
206
+ Sankey$1,
207
+ {
208
+ data: graph,
209
+ nodeWidth: 7,
210
+ nodePadding: 18,
211
+ margin: { top: 40, right: 120, bottom: 12, left: 120 },
212
+ node: (props) => {
213
+ const node = graph.nodes[props.index];
214
+ const showColumnLabel = node ? graph.nodes.findIndex((candidate) => candidate.column.id === node.column.id) === props.index : false;
215
+ return /* @__PURE__ */ jsx(
216
+ SankeyNode,
217
+ {
218
+ ...props,
219
+ hueMap,
220
+ columnLabel: node?.column.label,
221
+ showColumnLabel,
222
+ isLastColumn: node?.column.id === lastColumnId,
223
+ onHoverChange: setHoveredSourceName
224
+ }
225
+ );
226
+ },
227
+ link: (props) => {
228
+ const link = graph.links[props.index];
229
+ return /* @__PURE__ */ jsx(
230
+ SankeyLink,
231
+ {
232
+ ...props,
233
+ hueMap,
234
+ highlighted: String(props.payload.source.name ?? "") === hoveredSourceName,
235
+ onHoverChange: setHoveredSourceName,
236
+ clickable: onCurveClick !== void 0,
237
+ onSelect: () => {
238
+ if (link) onCurveClick?.(getSankeyChartCurveSelection(link));
239
+ }
240
+ }
241
+ );
242
+ }
243
+ }
244
+ )
245
+ }
246
+ ) }) });
247
+ }
248
+ function SankeyNode({
249
+ x,
250
+ y,
251
+ width,
252
+ height,
253
+ payload,
254
+ hueMap,
255
+ columnLabel,
256
+ showColumnLabel,
257
+ isLastColumn,
258
+ onHoverChange
259
+ }) {
260
+ const name = typeof payload.name === "string" || typeof payload.name === "number" ? String(payload.name) : "";
261
+ const value = typeof payload.value === "string" || typeof payload.value === "number" ? String(payload.value) : "";
262
+ const labelX = isLastColumn ? x - 8 : x + width + 8;
263
+ const textAnchor = isLastColumn ? "end" : "start";
264
+ const hue = hueMap[name] ?? 0;
265
+ return /* @__PURE__ */ jsxs("g", { onMouseEnter: () => onHoverChange(name), onMouseLeave: () => onHoverChange(void 0), children: [
266
+ showColumnLabel && columnLabel ? /* @__PURE__ */ jsx("text", { x: x + width / 2, y: 18, textAnchor: "middle", fill: Colors.neutral5, fontSize: 12, fontWeight: 600, children: columnLabel }) : null,
267
+ /* @__PURE__ */ jsx("rect", { x, y, width, height, rx: 3, fill: nodeColor(hue) }),
268
+ /* @__PURE__ */ jsx(
269
+ "text",
270
+ {
271
+ x: labelX,
272
+ y: y + height / 2 - 4,
273
+ textAnchor,
274
+ fill: Colors.neutral5,
275
+ fontSize: 12.5,
276
+ fontFamily: "var(--font-mono)",
277
+ paintOrder: "stroke",
278
+ stroke: Colors.surface1,
279
+ strokeWidth: 3,
280
+ strokeLinejoin: "round",
281
+ children: name
282
+ }
283
+ ),
284
+ /* @__PURE__ */ jsx("text", { x: labelX, y: y + height / 2 + 10, textAnchor, fill: Colors.neutral3, fontSize: 10.5, children: value })
285
+ ] });
286
+ }
287
+ function SankeyLink({
288
+ sourceX,
289
+ targetX,
290
+ sourceY,
291
+ targetY,
292
+ sourceControlX,
293
+ targetControlX,
294
+ linkWidth,
295
+ index,
296
+ payload,
297
+ hueMap,
298
+ highlighted,
299
+ clickable,
300
+ onHoverChange,
301
+ onSelect
302
+ }) {
303
+ const halfWidth = Math.max(0, linkWidth) / 2;
304
+ const path = [
305
+ `M${sourceX},${sourceY - halfWidth}`,
306
+ `C${sourceControlX},${sourceY - halfWidth} ${targetControlX},${targetY - halfWidth} ${targetX},${targetY - halfWidth}`,
307
+ `L${targetX},${targetY + halfWidth}`,
308
+ `C${targetControlX},${targetY + halfWidth} ${sourceControlX},${sourceY + halfWidth} ${sourceX},${sourceY + halfWidth}`,
309
+ "Z"
310
+ ].join(" ");
311
+ const sourceName = String(payload.source.name ?? "");
312
+ const targetName = String(payload.target.name ?? "");
313
+ const gradientId = `sankey-grad-${index}`;
314
+ const vividGradientId = `${gradientId}-vivid`;
315
+ const handleKeyDown = (event) => {
316
+ if (event.key !== "Enter" && event.key !== " ") return;
317
+ event.preventDefault();
318
+ onSelect();
319
+ };
320
+ return /* @__PURE__ */ jsxs("g", { children: [
321
+ /* @__PURE__ */ jsxs("defs", { children: [
322
+ /* @__PURE__ */ jsxs("linearGradient", { id: gradientId, gradientUnits: "userSpaceOnUse", x1: sourceX, x2: targetX, children: [
323
+ /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: nodeColor(hueMap[sourceName] ?? 0) }),
324
+ /* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: nodeColor(hueMap[targetName] ?? 0) })
325
+ ] }),
326
+ /* @__PURE__ */ jsxs("linearGradient", { id: vividGradientId, gradientUnits: "userSpaceOnUse", x1: sourceX, x2: targetX, children: [
327
+ /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: nodeColorVivid(hueMap[sourceName] ?? 0) }),
328
+ /* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: nodeColorVivid(hueMap[targetName] ?? 0) })
329
+ ] })
330
+ ] }),
331
+ /* @__PURE__ */ jsx(
332
+ "path",
333
+ {
334
+ d: path,
335
+ fill: `url(#${highlighted ? vividGradientId : gradientId})`,
336
+ fillOpacity: highlighted ? 0.75 : 0.32,
337
+ stroke: "none",
338
+ role: clickable ? "button" : void 0,
339
+ tabIndex: clickable ? 0 : void 0,
340
+ "aria-label": clickable ? "Select Sankey curve" : void 0,
341
+ onClick: clickable ? onSelect : void 0,
342
+ onKeyDown: clickable ? handleKeyDown : void 0,
343
+ onMouseEnter: () => onHoverChange(sourceName),
344
+ onMouseLeave: () => onHoverChange(void 0),
345
+ style: { cursor: clickable ? "pointer" : void 0, transition: "fill-opacity 0.18s ease" }
346
+ }
347
+ )
348
+ ] });
349
+ }
350
+
351
+ export { Sankey, SankeyChart, buildSankeyChartGraph, getSankeyChartCurveSelection, getSankeyChartValue, reorderSankeyChartColumns, useSankey };
352
+ //# sourceMappingURL=SankeyChart.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SankeyChart.es.js","sources":["../../src/ds/components/SankeyChart/sankey-chart-utils.ts","../../src/ds/components/SankeyChart/sankeyColor.ts","../../src/ds/components/SankeyChart/sankey-context.tsx","../../src/ds/components/SankeyChart/sankey-chart.tsx"],"sourcesContent":["export type SankeyChartRecord = Record<string, unknown>;\n\nexport type SankeyChartColumn = {\n id: string;\n label: string;\n};\n\nexport type SankeyChartNode = {\n id: string;\n name: string;\n column: SankeyChartColumn;\n value: string | number;\n};\n\nexport type SankeyChartLink = {\n id: string;\n source: number;\n target: number;\n value: number;\n sourceNode: SankeyChartNode;\n targetNode: SankeyChartNode;\n records: Array<SankeyChartRecord>;\n};\n\nexport type SankeyChartGraph = {\n nodes: Array<SankeyChartNode>;\n links: Array<SankeyChartLink>;\n};\n\nexport type SankeyChartCurveSelection = {\n source: {\n column: SankeyChartColumn;\n value: string | number;\n };\n target: {\n column: SankeyChartColumn;\n value: string | number;\n };\n records: Array<SankeyChartRecord>;\n};\n\nconst EMPTY_GRAPH: SankeyChartGraph = { nodes: [], links: [] };\n\nexport function getSankeyChartValue(value: unknown): string | number | undefined {\n if (typeof value === 'string') {\n const trimmedValue = value.trim();\n return trimmedValue.length > 0 ? trimmedValue : undefined;\n }\n\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n\n return undefined;\n}\n\nexport function reorderSankeyChartColumns(\n columns: Array<SankeyChartColumn>,\n startIndex: number,\n endIndex: number,\n): Array<SankeyChartColumn> {\n if (\n startIndex === endIndex ||\n startIndex < 0 ||\n endIndex < 0 ||\n startIndex >= columns.length ||\n endIndex >= columns.length\n ) {\n return columns;\n }\n\n const reorderedColumns = [...columns];\n const [movedColumn] = reorderedColumns.splice(startIndex, 1);\n if (!movedColumn) return columns;\n reorderedColumns.splice(endIndex, 0, movedColumn);\n return reorderedColumns;\n}\n\nexport function buildSankeyChartGraph(\n data: Array<SankeyChartRecord>,\n columns: Array<SankeyChartColumn>,\n): SankeyChartGraph {\n if (columns.length < 2 || data.length === 0) return EMPTY_GRAPH;\n\n const nodes: Array<SankeyChartNode> = [];\n const nodeIndexes = new Map<string, number>();\n const linksById = new Map<string, SankeyChartLink>();\n\n const getNode = (column: SankeyChartColumn, value: string | number): { node: SankeyChartNode; index: number } => {\n const id = createNodeId(column.id, value);\n const existingIndex = nodeIndexes.get(id);\n const existingNode = existingIndex === undefined ? undefined : nodes[existingIndex];\n if (existingIndex !== undefined && existingNode) return { node: existingNode, index: existingIndex };\n\n const node: SankeyChartNode = { id, name: String(value), column, value };\n const index = nodes.length;\n nodes.push(node);\n nodeIndexes.set(id, index);\n return { node, index };\n };\n\n for (let columnIndex = 0; columnIndex < columns.length - 1; columnIndex += 1) {\n const sourceColumn = columns[columnIndex];\n const targetColumn = columns[columnIndex + 1];\n if (!sourceColumn || !targetColumn) continue;\n\n for (const record of data) {\n const sourceValue = getSankeyChartValue(record[sourceColumn.id]);\n const targetValue = getSankeyChartValue(record[targetColumn.id]);\n if (sourceValue === undefined || targetValue === undefined) continue;\n\n const source = getNode(sourceColumn, sourceValue);\n const target = getNode(targetColumn, targetValue);\n const id = `${source.node.id}->${target.node.id}`;\n const existingLink = linksById.get(id);\n\n if (existingLink) {\n existingLink.value += 1;\n existingLink.records.push(record);\n } else {\n linksById.set(id, {\n id,\n source: source.index,\n target: target.index,\n value: 1,\n sourceNode: source.node,\n targetNode: target.node,\n records: [record],\n });\n }\n }\n }\n\n return { nodes, links: [...linksById.values()] };\n}\n\nexport function getSankeyChartCurveSelection(link: SankeyChartLink): SankeyChartCurveSelection {\n return {\n source: { column: link.sourceNode.column, value: link.sourceNode.value },\n target: { column: link.targetNode.column, value: link.targetNode.value },\n records: link.records,\n };\n}\n\nfunction createNodeId(columnId: string, value: string | number) {\n return JSON.stringify([columnId, typeof value, value]);\n}\n","const MIN_HUE_DISTANCE = 26;\n\nfunction normalizeHue(hue: number) {\n return ((hue % 360) + 360) % 360;\n}\n\nexport function hashHue(value: string) {\n let hash = 2166136261;\n\n for (let index = 0; index < value.length; index += 1) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n\n return normalizeHue(hash);\n}\n\nfunction supportsOklch() {\n return typeof CSS !== 'undefined' && CSS.supports?.('color', 'oklch(62% 0.14 180)') === true;\n}\n\nexport function nodeColor(hue: number) {\n const normalizedHue = normalizeHue(hue);\n return supportsOklch() ? `oklch(68% 0.13 ${normalizedHue})` : `hsl(${normalizedHue} 42% 62%)`;\n}\n\nexport function nodeColorVivid(hue: number) {\n const normalizedHue = normalizeHue(hue);\n return supportsOklch() ? `oklch(74% 0.18 ${normalizedHue})` : `hsl(${normalizedHue} 55% 68%)`;\n}\n\nexport function buildSankeyHueMap(names: string[]) {\n const entries = [...new Set(names)]\n .map(name => ({ name, hue: hashHue(name) }))\n .sort((left, right) => left.hue - right.hue || left.name.localeCompare(right.name));\n\n for (let pass = 0; pass < 3; pass += 1) {\n for (let iteration = 0; iteration < entries.length * 8; iteration += 1) {\n entries.sort((left, right) => left.hue - right.hue || left.name.localeCompare(right.name));\n let adjusted = false;\n\n for (let index = 0; index < entries.length; index += 1) {\n const current = entries[index];\n const next = entries[(index + 1) % entries.length];\n if (!current || !next) continue;\n\n const distance = normalizeHue(next.hue - current.hue);\n if (distance >= MIN_HUE_DISTANCE - Number.EPSILON) continue;\n\n const adjustment = (MIN_HUE_DISTANCE - distance) / 2;\n current.hue = normalizeHue(current.hue - adjustment);\n next.hue = normalizeHue(next.hue + adjustment);\n adjusted = true;\n }\n\n if (!adjusted) break;\n }\n }\n\n return Object.fromEntries(entries.map(({ name, hue }) => [name, normalizeHue(hue)]));\n}\n","import { createContext, useContext, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { buildSankeyChartGraph, reorderSankeyChartColumns } from './sankey-chart-utils';\nimport type { SankeyChartColumn, SankeyChartGraph, SankeyChartRecord } from './sankey-chart-utils';\nimport { buildSankeyHueMap } from './sankeyColor';\n\nexport type SankeyProps = {\n data: Array<SankeyChartRecord>;\n columns: Array<SankeyChartColumn>;\n children: ReactNode;\n columnOrder?: Array<string>;\n onColumnOrderChange?: (columnOrder: Array<string>) => void;\n visibleColumnIds?: Array<string>;\n onVisibleColumnIdsChange?: (columnIds: Array<string>) => void;\n};\n\nexport type SankeyControlColumn = SankeyChartColumn & {\n visible: boolean;\n};\n\nexport type SankeyControls = {\n columns: Array<SankeyControlColumn>;\n toggleColumn: (columnId: string) => void;\n reorderColumns: (sourceIndex: number, destinationIndex: number) => void;\n};\n\ntype SankeyRenderContext = {\n graph: SankeyChartGraph;\n enabledColumns: Array<SankeyChartColumn>;\n hueMap: Record<string, number>;\n};\n\nconst SankeyControlsContext = createContext<SankeyControls | undefined>(undefined);\nconst SankeyRenderContext = createContext<SankeyRenderContext | undefined>(undefined);\n\nexport function Sankey({\n data,\n columns,\n children,\n columnOrder,\n onColumnOrderChange,\n visibleColumnIds,\n onVisibleColumnIdsChange,\n}: SankeyProps) {\n const columnIds = columns.map(column => column.id);\n const [internalOrder, setInternalOrder] = useState(columnIds);\n const [internalVisibleIds, setInternalVisibleIds] = useState(columnIds);\n const orderedColumns = orderColumns(columns, columnOrder ?? internalOrder);\n const visibleIds = new Set(visibleColumnIds ?? internalVisibleIds);\n const enabledColumns = orderedColumns.filter(column => visibleIds.has(column.id));\n const graph = buildSankeyChartGraph(data, enabledColumns);\n const hueMap = buildSankeyHueMap(graph.nodes.map(node => String(node.value)));\n\n const setVisibleColumns = (nextIds: Array<string>) => {\n if (visibleColumnIds === undefined) setInternalVisibleIds(nextIds);\n onVisibleColumnIdsChange?.(nextIds);\n };\n\n const setColumnOrder = (nextOrder: Array<string>) => {\n if (columnOrder === undefined) setInternalOrder(nextOrder);\n onColumnOrderChange?.(nextOrder);\n };\n\n const toggleColumn = (columnId: string) => {\n const nextIds = visibleIds.has(columnId)\n ? orderedColumns.filter(column => visibleIds.has(column.id) && column.id !== columnId).map(column => column.id)\n : orderedColumns.filter(column => visibleIds.has(column.id) || column.id === columnId).map(column => column.id);\n setVisibleColumns(nextIds);\n };\n\n const reorderColumns = (sourceIndex: number, destinationIndex: number) => {\n const reorderedEnabled = reorderSankeyChartColumns(enabledColumns, sourceIndex, destinationIndex);\n const enabledIterator = reorderedEnabled[Symbol.iterator]();\n const nextColumns = orderedColumns.map(column =>\n visibleIds.has(column.id) ? (enabledIterator.next().value ?? column) : column,\n );\n setColumnOrder(nextColumns.map(column => column.id));\n };\n\n const controlColumns = orderedColumns.map(column => ({ ...column, visible: visibleIds.has(column.id) }));\n\n return (\n <SankeyControlsContext.Provider value={{ columns: controlColumns, toggleColumn, reorderColumns }}>\n <SankeyRenderContext.Provider value={{ graph, enabledColumns, hueMap }}>{children}</SankeyRenderContext.Provider>\n </SankeyControlsContext.Provider>\n );\n}\n\n// Context providers and their hooks intentionally share this module.\n// eslint-disable-next-line react-refresh/only-export-components\nexport function useSankey() {\n const context = useContext(SankeyControlsContext);\n if (!context) throw new Error('useSankey must be used within Sankey');\n return context;\n}\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport function useSankeyRenderContext() {\n const context = useContext(SankeyRenderContext);\n if (!context) throw new Error('SankeyChart must be used within Sankey');\n return context;\n}\n\nfunction orderColumns(columns: Array<SankeyChartColumn>, order: Array<string>) {\n const positions = new Map(order.map((id, index) => [id, index]));\n return [...columns].sort(\n (left, right) => (positions.get(left.id) ?? columns.length) - (positions.get(right.id) ?? columns.length),\n );\n}\n","import { useState } from 'react';\nimport type { CSSProperties, KeyboardEvent } from 'react';\nimport { ResponsiveContainer, Sankey as RechartsSankey } from 'recharts';\nimport { getSankeyChartCurveSelection } from './sankey-chart-utils';\nimport type { SankeyChartCurveSelection } from './sankey-chart-utils';\nimport { useSankeyRenderContext } from './sankey-context';\nimport { nodeColor, nodeColorVivid } from './sankeyColor';\nimport { Colors } from '@/ds/tokens';\nimport { cn } from '@/lib/utils';\n\nexport type SankeyChartProps = {\n height?: CSSProperties['height'];\n className?: string;\n onCurveClick?: (selection: SankeyChartCurveSelection) => void;\n};\n\nexport function SankeyChart({ height = 320, className, onCurveClick }: SankeyChartProps) {\n const { graph, enabledColumns, hueMap } = useSankeyRenderContext();\n const [hoveredSourceName, setHoveredSourceName] = useState<string>();\n const lastColumnId = enabledColumns.at(-1)?.id;\n\n return (\n <div className={cn('min-w-0', className)}>\n {graph.links.length === 0 ? (\n <div\n className=\"flex items-center justify-center rounded-md border border-border1 text-ui-sm text-neutral3\"\n style={{ height }}\n >\n Select at least two columns with data to display a flow\n </div>\n ) : (\n <div style={{ height }}>\n <ResponsiveContainer\n width=\"100%\"\n height=\"100%\"\n initialDimension={{ width: 800, height: typeof height === 'number' ? height : 320 }}\n >\n <RechartsSankey\n data={graph}\n nodeWidth={7}\n nodePadding={18}\n margin={{ top: 40, right: 120, bottom: 12, left: 120 }}\n node={(props: SankeyNodeRendererProps) => {\n const node = graph.nodes[props.index];\n const showColumnLabel = node\n ? graph.nodes.findIndex(candidate => candidate.column.id === node.column.id) === props.index\n : false;\n return (\n <SankeyNode\n {...props}\n hueMap={hueMap}\n columnLabel={node?.column.label}\n showColumnLabel={showColumnLabel}\n isLastColumn={node?.column.id === lastColumnId}\n onHoverChange={setHoveredSourceName}\n />\n );\n }}\n link={(props: SankeyLinkRendererProps) => {\n const link = graph.links[props.index];\n return (\n <SankeyLink\n {...props}\n hueMap={hueMap}\n highlighted={String(props.payload.source.name ?? '') === hoveredSourceName}\n onHoverChange={setHoveredSourceName}\n clickable={onCurveClick !== undefined}\n onSelect={() => {\n if (link) onCurveClick?.(getSankeyChartCurveSelection(link));\n }}\n />\n );\n }}\n />\n </ResponsiveContainer>\n </div>\n )}\n </div>\n );\n}\n\ntype SankeyNodeRendererProps = {\n x: number;\n y: number;\n width: number;\n height: number;\n index: number;\n payload: { name?: string | number; value?: string | number };\n};\n\ntype SankeyLinkRendererProps = {\n sourceX: number;\n targetX: number;\n sourceY: number;\n targetY: number;\n sourceControlX: number;\n targetControlX: number;\n linkWidth: number;\n index: number;\n payload: { source: { name?: string | number }; target: { name?: string | number } };\n};\n\ntype SankeyNodeProps = SankeyNodeRendererProps & {\n hueMap: Record<string, number>;\n columnLabel?: string;\n showColumnLabel: boolean;\n isLastColumn: boolean;\n onHoverChange: (sourceName: string | undefined) => void;\n};\n\nfunction SankeyNode({\n x,\n y,\n width,\n height,\n payload,\n hueMap,\n columnLabel,\n showColumnLabel,\n isLastColumn,\n onHoverChange,\n}: SankeyNodeProps) {\n const name = typeof payload.name === 'string' || typeof payload.name === 'number' ? String(payload.name) : '';\n const value = typeof payload.value === 'string' || typeof payload.value === 'number' ? String(payload.value) : '';\n const labelX = isLastColumn ? x - 8 : x + width + 8;\n const textAnchor = isLastColumn ? 'end' : 'start';\n const hue = hueMap[name] ?? 0;\n\n return (\n <g onMouseEnter={() => onHoverChange(name)} onMouseLeave={() => onHoverChange(undefined)}>\n {showColumnLabel && columnLabel ? (\n <text x={x + width / 2} y={18} textAnchor=\"middle\" fill={Colors.neutral5} fontSize={12} fontWeight={600}>\n {columnLabel}\n </text>\n ) : null}\n <rect x={x} y={y} width={width} height={height} rx={3} fill={nodeColor(hue)} />\n <text\n x={labelX}\n y={y + height / 2 - 4}\n textAnchor={textAnchor}\n fill={Colors.neutral5}\n fontSize={12.5}\n fontFamily=\"var(--font-mono)\"\n paintOrder=\"stroke\"\n stroke={Colors.surface1}\n strokeWidth={3}\n strokeLinejoin=\"round\"\n >\n {name}\n </text>\n <text x={labelX} y={y + height / 2 + 10} textAnchor={textAnchor} fill={Colors.neutral3} fontSize={10.5}>\n {value}\n </text>\n </g>\n );\n}\n\ntype SankeyLinkProps = SankeyLinkRendererProps & {\n hueMap: Record<string, number>;\n highlighted: boolean;\n clickable: boolean;\n onHoverChange: (sourceName: string | undefined) => void;\n onSelect: () => void;\n};\n\nfunction SankeyLink({\n sourceX,\n targetX,\n sourceY,\n targetY,\n sourceControlX,\n targetControlX,\n linkWidth,\n index,\n payload,\n hueMap,\n highlighted,\n clickable,\n onHoverChange,\n onSelect,\n}: SankeyLinkProps) {\n const halfWidth = Math.max(0, linkWidth) / 2;\n const path = [\n `M${sourceX},${sourceY - halfWidth}`,\n `C${sourceControlX},${sourceY - halfWidth} ${targetControlX},${targetY - halfWidth} ${targetX},${targetY - halfWidth}`,\n `L${targetX},${targetY + halfWidth}`,\n `C${targetControlX},${targetY + halfWidth} ${sourceControlX},${sourceY + halfWidth} ${sourceX},${sourceY + halfWidth}`,\n 'Z',\n ].join(' ');\n const sourceName = String(payload.source.name ?? '');\n const targetName = String(payload.target.name ?? '');\n const gradientId = `sankey-grad-${index}`;\n const vividGradientId = `${gradientId}-vivid`;\n const handleKeyDown = (event: KeyboardEvent<SVGPathElement>) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n onSelect();\n };\n\n return (\n <g>\n <defs>\n <linearGradient id={gradientId} gradientUnits=\"userSpaceOnUse\" x1={sourceX} x2={targetX}>\n <stop offset=\"0%\" stopColor={nodeColor(hueMap[sourceName] ?? 0)} />\n <stop offset=\"100%\" stopColor={nodeColor(hueMap[targetName] ?? 0)} />\n </linearGradient>\n <linearGradient id={vividGradientId} gradientUnits=\"userSpaceOnUse\" x1={sourceX} x2={targetX}>\n <stop offset=\"0%\" stopColor={nodeColorVivid(hueMap[sourceName] ?? 0)} />\n <stop offset=\"100%\" stopColor={nodeColorVivid(hueMap[targetName] ?? 0)} />\n </linearGradient>\n </defs>\n <path\n d={path}\n fill={`url(#${highlighted ? vividGradientId : gradientId})`}\n fillOpacity={highlighted ? 0.75 : 0.32}\n stroke=\"none\"\n role={clickable ? 'button' : undefined}\n tabIndex={clickable ? 0 : undefined}\n aria-label={clickable ? 'Select Sankey curve' : undefined}\n onClick={clickable ? onSelect : undefined}\n onKeyDown={clickable ? handleKeyDown : undefined}\n onMouseEnter={() => onHoverChange(sourceName)}\n onMouseLeave={() => onHoverChange(undefined)}\n style={{ cursor: clickable ? 'pointer' : undefined, transition: 'fill-opacity 0.18s ease' }}\n />\n </g>\n );\n}\n"],"names":["RechartsSankey"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { ComponentPropsWithoutRef } from 'react';
2
+ export type ComposerProps = ComponentPropsWithoutRef<'form'>;
3
+ export declare const Composer: import('react').ForwardRefExoticComponent<Omit<import('react').DetailedHTMLProps<import('react').FormHTMLAttributes<HTMLFormElement>, HTMLFormElement>, "ref"> & import('react').RefAttributes<HTMLFormElement>>;
4
+ export interface ComposerBoxProps extends ComponentPropsWithoutRef<'div'> {
5
+ sendingPulseKey?: number;
6
+ }
7
+ export declare const ComposerBox: import('react').ForwardRefExoticComponent<ComposerBoxProps & import('react').RefAttributes<HTMLDivElement>>;
8
+ export declare const ComposerAttachments: import('react').ForwardRefExoticComponent<Omit<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
9
+ export declare const ComposerInput: import('react').ForwardRefExoticComponent<Omit<import('react').DetailedHTMLProps<import('react').TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, "ref"> & import('react').RefAttributes<HTMLTextAreaElement>>;
10
+ export declare const ComposerActions: import('react').ForwardRefExoticComponent<Omit<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,8 @@
1
+ import { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { Composer } from './composer';
3
+ declare const meta: Meta<typeof Composer>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof Composer>;
6
+ export declare const Empty: Story;
7
+ export declare const WithAttachmentsAndActions: Story;
8
+ export declare const DisabledAndRunning: Story;
@@ -0,0 +1,2 @@
1
+ export { Composer, ComposerActions, ComposerAttachments, ComposerBox, ComposerInput } from './composer';
2
+ export type { ComposerBoxProps, ComposerProps } from './composer';
@@ -0,0 +1,6 @@
1
+ export { Sankey, useSankey } from './sankey-context';
2
+ export type { SankeyControlColumn, SankeyControls, SankeyProps } from './sankey-context';
3
+ export { SankeyChart } from './sankey-chart';
4
+ export type { SankeyChartProps } from './sankey-chart';
5
+ export { buildSankeyChartGraph, getSankeyChartCurveSelection, getSankeyChartValue, reorderSankeyChartColumns, } from './sankey-chart-utils';
6
+ export type { SankeyChartColumn, SankeyChartCurveSelection, SankeyChartGraph, SankeyChartLink, SankeyChartNode, SankeyChartRecord, } from './sankey-chart-utils';
@@ -0,0 +1,39 @@
1
+ export type SankeyChartRecord = Record<string, unknown>;
2
+ export type SankeyChartColumn = {
3
+ id: string;
4
+ label: string;
5
+ };
6
+ export type SankeyChartNode = {
7
+ id: string;
8
+ name: string;
9
+ column: SankeyChartColumn;
10
+ value: string | number;
11
+ };
12
+ export type SankeyChartLink = {
13
+ id: string;
14
+ source: number;
15
+ target: number;
16
+ value: number;
17
+ sourceNode: SankeyChartNode;
18
+ targetNode: SankeyChartNode;
19
+ records: Array<SankeyChartRecord>;
20
+ };
21
+ export type SankeyChartGraph = {
22
+ nodes: Array<SankeyChartNode>;
23
+ links: Array<SankeyChartLink>;
24
+ };
25
+ export type SankeyChartCurveSelection = {
26
+ source: {
27
+ column: SankeyChartColumn;
28
+ value: string | number;
29
+ };
30
+ target: {
31
+ column: SankeyChartColumn;
32
+ value: string | number;
33
+ };
34
+ records: Array<SankeyChartRecord>;
35
+ };
36
+ export declare function getSankeyChartValue(value: unknown): string | number | undefined;
37
+ export declare function reorderSankeyChartColumns(columns: Array<SankeyChartColumn>, startIndex: number, endIndex: number): Array<SankeyChartColumn>;
38
+ export declare function buildSankeyChartGraph(data: Array<SankeyChartRecord>, columns: Array<SankeyChartColumn>): SankeyChartGraph;
39
+ export declare function getSankeyChartCurveSelection(link: SankeyChartLink): SankeyChartCurveSelection;
@@ -0,0 +1,8 @@
1
+ import { CSSProperties } from 'react';
2
+ import { SankeyChartCurveSelection } from './sankey-chart-utils';
3
+ export type SankeyChartProps = {
4
+ height?: CSSProperties['height'];
5
+ className?: string;
6
+ onCurveClick?: (selection: SankeyChartCurveSelection) => void;
7
+ };
8
+ export declare function SankeyChart({ height, className, onCurveClick }: SankeyChartProps): import("react").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { SankeyChart } from './sankey-chart';
3
+ declare const meta: Meta<typeof SankeyChart>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof SankeyChart>;
6
+ export declare const Default: Story;
7
+ export declare const Interactive: Story;
8
+ export declare const ClickableCurves: Story;
9
+ export declare const Empty: Story;
@@ -0,0 +1,29 @@
1
+ import { ReactNode } from 'react';
2
+ import { SankeyChartColumn, SankeyChartGraph, SankeyChartRecord } from './sankey-chart-utils';
3
+ export type SankeyProps = {
4
+ data: Array<SankeyChartRecord>;
5
+ columns: Array<SankeyChartColumn>;
6
+ children: ReactNode;
7
+ columnOrder?: Array<string>;
8
+ onColumnOrderChange?: (columnOrder: Array<string>) => void;
9
+ visibleColumnIds?: Array<string>;
10
+ onVisibleColumnIdsChange?: (columnIds: Array<string>) => void;
11
+ };
12
+ export type SankeyControlColumn = SankeyChartColumn & {
13
+ visible: boolean;
14
+ };
15
+ export type SankeyControls = {
16
+ columns: Array<SankeyControlColumn>;
17
+ toggleColumn: (columnId: string) => void;
18
+ reorderColumns: (sourceIndex: number, destinationIndex: number) => void;
19
+ };
20
+ type SankeyRenderContext = {
21
+ graph: SankeyChartGraph;
22
+ enabledColumns: Array<SankeyChartColumn>;
23
+ hueMap: Record<string, number>;
24
+ };
25
+ declare const SankeyRenderContext: import('react').Context<SankeyRenderContext | undefined>;
26
+ export declare function Sankey({ data, columns, children, columnOrder, onColumnOrderChange, visibleColumnIds, onVisibleColumnIdsChange, }: SankeyProps): import("react").JSX.Element;
27
+ export declare function useSankey(): SankeyControls;
28
+ export declare function useSankeyRenderContext(): SankeyRenderContext;
29
+ export {};