@mastra/playground-ui 44.0.0-alpha.1 → 44.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/components/DataList.cjs.js +1 -1
  3. package/dist/components/DataList.es.js +1 -1
  4. package/dist/components/LogsDataList.cjs.js +1 -1
  5. package/dist/components/LogsDataList.es.js +1 -1
  6. package/dist/components/SankeyChart.cjs.js +67 -12
  7. package/dist/components/SankeyChart.cjs.js.map +1 -1
  8. package/dist/components/SankeyChart.es.js +67 -12
  9. package/dist/components/SankeyChart.es.js.map +1 -1
  10. package/dist/domains/logs/components/logs-list-view.cjs.js +1 -1
  11. package/dist/domains/logs/components/logs-list-view.es.js +1 -1
  12. package/dist/domains/logs/log-filters.cjs.js +4 -6
  13. package/dist/domains/logs/log-filters.cjs.js.map +1 -1
  14. package/dist/domains/logs/log-filters.es.js +4 -6
  15. package/dist/domains/logs/log-filters.es.js.map +1 -1
  16. package/dist/domains/metrics/metrics-filters.cjs.js +4 -6
  17. package/dist/domains/metrics/metrics-filters.cjs.js.map +1 -1
  18. package/dist/domains/metrics/metrics-filters.es.js +4 -6
  19. package/dist/domains/metrics/metrics-filters.es.js.map +1 -1
  20. package/dist/domains/traces/components/traces-list-view.cjs.js +1 -1
  21. package/dist/domains/traces/components/traces-list-view.es.js +1 -1
  22. package/dist/domains/traces/hooks/use-entity-names.cjs.js +3 -1
  23. package/dist/domains/traces/hooks/use-entity-names.cjs.js.map +1 -1
  24. package/dist/domains/traces/hooks/use-entity-names.es.js +3 -1
  25. package/dist/domains/traces/hooks/use-entity-names.es.js.map +1 -1
  26. package/dist/domains/traces/trace-filters.cjs.js +4 -6
  27. package/dist/domains/traces/trace-filters.cjs.js.map +1 -1
  28. package/dist/domains/traces/trace-filters.es.js +4 -6
  29. package/dist/domains/traces/trace-filters.es.js.map +1 -1
  30. package/dist/{logs-data-list-BkmYnYuf.js → logs-data-list-BhDEUkXZ.js} +4 -5
  31. package/dist/logs-data-list-BhDEUkXZ.js.map +1 -0
  32. package/dist/{logs-data-list-B6XQnRed.cjs → logs-data-list-C_FyPCxE.cjs} +4 -5
  33. package/dist/logs-data-list-C_FyPCxE.cjs.map +1 -0
  34. package/dist/src/domains/logs/log-filters.d.ts +11 -9
  35. package/dist/src/domains/metrics/metrics-filters.d.ts +4 -4
  36. package/dist/src/domains/traces/trace-filters.d.ts +11 -9
  37. package/dist/src/ds/components/SankeyChart/sankey-chart-utils.d.ts +16 -0
  38. package/dist/src/ds/components/SankeyChart/use-sankey-chart-measurements.d.ts +1 -0
  39. package/dist/{traces-data-list-Bmx7jLZc.js → traces-data-list-CB4kjGeS.js} +3 -4
  40. package/dist/traces-data-list-CB4kjGeS.js.map +1 -0
  41. package/dist/{traces-data-list-Dx9tpivx.cjs → traces-data-list-CwGS6fk9.cjs} +3 -4
  42. package/dist/traces-data-list-CwGS6fk9.cjs.map +1 -0
  43. package/package.json +6 -6
  44. package/dist/logs-data-list-B6XQnRed.cjs.map +0 -1
  45. package/dist/logs-data-list-BkmYnYuf.js.map +0 -1
  46. package/dist/traces-data-list-Bmx7jLZc.js.map +0 -1
  47. package/dist/traces-data-list-Dx9tpivx.cjs.map +0 -1
@@ -96,6 +96,35 @@ function buildSankeyChartGraph(data, columns, getRecordWeight = () => 1, getReco
96
96
  }
97
97
  return { nodes, links: [...linksById.values()] };
98
98
  }
99
+ const SANKEY_NODE_WIDTH = 7;
100
+ const LABEL_CHARACTER_WIDTH_RATIO = 0.62;
101
+ const LABEL_GUTTER = 16;
102
+ const LABEL_ELLIPSIS = "…";
103
+ function getSankeyLabelWidths({
104
+ chartWidth,
105
+ columnCount,
106
+ marginLeft,
107
+ marginRight
108
+ }) {
109
+ if (chartWidth <= 0 || columnCount < 2) {
110
+ return { centered: Number.POSITIVE_INFINITY, edge: Number.POSITIVE_INFINITY };
111
+ }
112
+ const columnPitch = (chartWidth - marginLeft - marginRight - SANKEY_NODE_WIDTH) / (columnCount - 1);
113
+ const centered = Math.max(0, columnPitch - LABEL_GUTTER);
114
+ const edge = Math.max(0, columnPitch + SANKEY_NODE_WIDTH / 2 - LABEL_GUTTER - centered / 2);
115
+ return { centered, edge };
116
+ }
117
+ function truncateSankeyLabel(label, {
118
+ fontSize,
119
+ maxWidth,
120
+ maxCharacters = Number.POSITIVE_INFINITY
121
+ }) {
122
+ const widthLimit = Number.isFinite(maxWidth) ? Math.floor(maxWidth / (fontSize * LABEL_CHARACTER_WIDTH_RATIO)) : Number.POSITIVE_INFINITY;
123
+ const limit = Math.min(widthLimit, maxCharacters);
124
+ if (label.length <= limit) return label;
125
+ if (limit <= 1) return LABEL_ELLIPSIS;
126
+ return `${label.slice(0, limit - 1).trimEnd()}${LABEL_ELLIPSIS}`;
127
+ }
99
128
  function buildFixedSankeyGeometry(graph, {
100
129
  top,
101
130
  bottom,
@@ -308,14 +337,23 @@ function useSankeyChartMeasurements({
308
337
  top: Number(margin?.top ?? 64),
309
338
  bottom: measuredHeight - Number(margin?.bottom ?? 12),
310
339
  left: Number(margin?.left ?? 160),
311
- right: measuredWidth - Number(margin?.right ?? 160) - 7,
340
+ right: measuredWidth - Number(margin?.right ?? 160) - SANKEY_NODE_WIDTH,
312
341
  nodePadding: 8
313
342
  }) : void 0,
314
343
  [graph, margin?.bottom, margin?.left, margin?.right, margin?.top, measuredHeight, measuredWidth, usesFixedGeometry]
315
344
  );
316
- return { chartContainerRef, fixedGeometry };
345
+ const labelWidths = getSankeyLabelWidths({
346
+ chartWidth: measuredWidth,
347
+ columnCount: new Set(graph.nodes.map((node) => node.column.id)).size,
348
+ marginLeft: Number(margin?.left ?? 160),
349
+ marginRight: Number(margin?.right ?? 160)
350
+ });
351
+ return { chartContainerRef, fixedGeometry, labelWidths };
317
352
  }
318
353
 
354
+ const NODE_LABEL_FONT_SIZE = 11;
355
+ const COLUMN_LABEL_FONT_SIZE = 12;
356
+ const NODE_LABEL_MAX_CHARACTERS = 23;
319
357
  function SankeyChart({
320
358
  height = 320,
321
359
  className,
@@ -325,7 +363,7 @@ function SankeyChart({
325
363
  isNodeClickable
326
364
  }) {
327
365
  const { graph, enabledColumns, hueMap, usesFixedGeometry } = useSankeyRenderContext();
328
- const { chartContainerRef, fixedGeometry } = useSankeyChartMeasurements({
366
+ const { chartContainerRef, fixedGeometry, labelWidths } = useSankeyChartMeasurements({
329
367
  graph,
330
368
  height,
331
369
  margin,
@@ -358,7 +396,7 @@ function SankeyChart({
358
396
  Sankey$1,
359
397
  {
360
398
  data: graph,
361
- nodeWidth: 7,
399
+ nodeWidth: SANKEY_NODE_WIDTH,
362
400
  nodePadding: 56,
363
401
  margin,
364
402
  node: (props) => {
@@ -385,6 +423,7 @@ function SankeyChart({
385
423
  showColumnLabel,
386
424
  isFirstColumn: node?.column.id === firstColumnId,
387
425
  isLastColumn: node?.column.id === lastColumnId,
426
+ labelWidths,
388
427
  onFocusChange: setFocusedSourceName,
389
428
  onHoverChange: setHoveredSourceName,
390
429
  clickable,
@@ -437,6 +476,7 @@ function SankeyNode({
437
476
  showColumnLabel,
438
477
  isFirstColumn,
439
478
  isLastColumn,
479
+ labelWidths,
440
480
  clickable,
441
481
  onFocusChange,
442
482
  onHoverChange,
@@ -448,7 +488,13 @@ function SankeyNode({
448
488
  const visibleDisplayLabel = descriptionIndex >= 0 ? displayLabel.slice(0, descriptionIndex) : displayLabel;
449
489
  const description = descriptionIndex >= 0 ? displayLabel.slice(descriptionIndex + 1) : void 0;
450
490
  const accessibleLabel = displayLabel.replaceAll("\n", ". ");
451
- const visibleLabel = truncateNodeLabel(visibleDisplayLabel);
491
+ const nodeLabelWidth = isFirstColumn || isLastColumn ? labelWidths.edge : labelWidths.centered;
492
+ const visibleLabel = truncateSankeyLabel(visibleDisplayLabel, {
493
+ fontSize: NODE_LABEL_FONT_SIZE,
494
+ maxWidth: nodeLabelWidth,
495
+ maxCharacters: NODE_LABEL_MAX_CHARACTERS
496
+ });
497
+ const visibleColumnLabel = columnLabel ? truncateSankeyLabel(columnLabel, { fontSize: COLUMN_LABEL_FONT_SIZE, maxWidth: labelWidths.centered }) : void 0;
452
498
  const tooltipId = useId();
453
499
  const [isHovered, setIsHovered] = useState(false);
454
500
  const [isFocused, setIsFocused] = useState(false);
@@ -509,7 +555,21 @@ function SankeyNode({
509
555
  tabIndex: 0,
510
556
  children: [
511
557
  /* @__PURE__ */ jsx("title", { children: displayLabel }),
512
- showColumnLabel && columnLabel ? /* @__PURE__ */ jsx("text", { x: columnLabelX, y: 18, textAnchor: "middle", fill: nodeColor(hue), fontSize: 12, fontWeight: 600, children: columnLabel }) : null,
558
+ showColumnLabel && visibleColumnLabel ? /* @__PURE__ */ jsxs(
559
+ "text",
560
+ {
561
+ x: columnLabelX,
562
+ y: 18,
563
+ textAnchor: "middle",
564
+ fill: nodeColor(hue),
565
+ fontSize: COLUMN_LABEL_FONT_SIZE,
566
+ fontWeight: 600,
567
+ children: [
568
+ visibleColumnLabel === columnLabel ? null : /* @__PURE__ */ jsx("title", { children: columnLabel }),
569
+ visibleColumnLabel
570
+ ]
571
+ }
572
+ ) : null,
513
573
  /* @__PURE__ */ jsx("rect", { x, y: visibleY, width, height: visibleHeight, rx: 3, fill: nodeColor(hue) }),
514
574
  /* @__PURE__ */ jsx(
515
575
  "text",
@@ -518,7 +578,7 @@ function SankeyNode({
518
578
  y: y - 24,
519
579
  textAnchor,
520
580
  fill: Colors.neutral5,
521
- fontSize: 11,
581
+ fontSize: NODE_LABEL_FONT_SIZE,
522
582
  fontFamily: "var(--font-mono)",
523
583
  children: visibleLabel
524
584
  }
@@ -561,11 +621,6 @@ function scaleSankeyDimension(size, displayValue, layoutValue) {
561
621
  if (displayValue === void 0 || layoutValue === void 0 || layoutValue <= 0) return size;
562
622
  return size * Math.min(Math.max(displayValue / layoutValue, 0), 1);
563
623
  }
564
- function truncateNodeLabel(label) {
565
- const maximumLength = 23;
566
- if (label.length <= maximumLength) return label;
567
- return `${label.slice(0, maximumLength - 1).trimEnd()}…`;
568
- }
569
624
  function SankeyLink({
570
625
  sourceX,
571
626
  targetX,
@@ -1 +1 @@
1
- {"version":3,"file":"SankeyChart.es.js","sources":["../../src/ds/components/SankeyChart/sankey-chart-utils.ts","../../src/ds/components/SankeyChart/sankey-context.tsx","../../src/ds/components/SankeyChart/use-sankey-chart-measurements.ts","../../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 label: string;\n column: SankeyChartColumn;\n value: string | number;\n displayValue?: number;\n};\n\nexport type SankeyChartLink = {\n id: string;\n source: number;\n target: number;\n value: number;\n displayValue: 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 FixedSankeyNodeGeometry = {\n x: number;\n centerY: number;\n y: number;\n height: number;\n};\n\nexport type FixedSankeyLinkGeometry = {\n sourceY: number;\n targetY: number;\n sourceWidth: number;\n targetWidth: number;\n};\n\nexport type FixedSankeyGeometry = {\n nodes: Map<string, FixedSankeyNodeGeometry>;\n links: Map<string, FixedSankeyLinkGeometry>;\n};\n\nexport type SankeyChartNodeSelection = {\n column: SankeyChartColumn;\n value: string | number;\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 getRecordWeight: (record: SankeyChartRecord) => number = () => 1,\n getRecordNodeId?: (record: SankeyChartRecord, column: SankeyChartColumn) => string,\n getRecordNodeLabel?: (record: SankeyChartRecord, column: SankeyChartColumn) => string,\n getRecordNodeValue?: (record: SankeyChartRecord, column: SankeyChartColumn) => number,\n getRecordLayoutWeight?: (record: SankeyChartRecord) => number,\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 = (\n column: SankeyChartColumn,\n value: string | number,\n label: string,\n displayValue: number | undefined,\n ): { 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), label, column, value, displayValue };\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 displayWeight = getRecordWeight(record);\n const layoutWeight = getRecordLayoutWeight?.(record) ?? displayWeight;\n if (!Number.isFinite(displayWeight) || displayWeight < 0 || !Number.isFinite(layoutWeight) || layoutWeight < 0) {\n continue;\n }\n\n const sourceRecordValue = getSankeyChartValue(record[sourceColumn.id]);\n const targetRecordValue = getSankeyChartValue(record[targetColumn.id]);\n if (sourceRecordValue === undefined || targetRecordValue === undefined) continue;\n\n const sourceValue = getRecordNodeId\n ? getSankeyChartValue(getRecordNodeId(record, sourceColumn))\n : sourceRecordValue;\n const targetValue = getRecordNodeId\n ? getSankeyChartValue(getRecordNodeId(record, targetColumn))\n : targetRecordValue;\n if (sourceValue === undefined || targetValue === undefined) continue;\n\n const sourceLabel = getRecordNodeLabel?.(record, sourceColumn) ?? String(sourceRecordValue);\n const targetLabel = getRecordNodeLabel?.(record, targetColumn) ?? String(targetRecordValue);\n const sourceDisplayValue = getRecordNodeValue?.(record, sourceColumn);\n const targetDisplayValue = getRecordNodeValue?.(record, targetColumn);\n const source = getNode(\n sourceColumn,\n sourceValue,\n sourceLabel,\n sourceDisplayValue !== undefined && Number.isFinite(sourceDisplayValue) && sourceDisplayValue >= 0\n ? sourceDisplayValue\n : undefined,\n );\n const target = getNode(\n targetColumn,\n targetValue,\n targetLabel,\n targetDisplayValue !== undefined && Number.isFinite(targetDisplayValue) && targetDisplayValue >= 0\n ? targetDisplayValue\n : undefined,\n );\n const id = `${source.node.id}->${target.node.id}`;\n const existingLink = linksById.get(id);\n\n if (existingLink) {\n existingLink.value += layoutWeight;\n existingLink.displayValue += displayWeight;\n existingLink.records.push(record);\n } else {\n linksById.set(id, {\n id,\n source: source.index,\n target: target.index,\n value: layoutWeight,\n displayValue: displayWeight,\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 buildFixedSankeyGeometry(\n graph: SankeyChartGraph,\n {\n top,\n bottom,\n left,\n right,\n nodePadding,\n }: { top: number; bottom: number; left: number; right: number; nodePadding: number },\n): FixedSankeyGeometry {\n const nodes = new Map<string, FixedSankeyNodeGeometry>();\n const nodesByColumn = new Map<string, SankeyChartNode[]>();\n const currentNodeWeights = getSankeyChartCurrentNodeWeights(graph);\n\n for (const node of graph.nodes) {\n const columnNodes = nodesByColumn.get(node.column.id) ?? [];\n columnNodes.push(node);\n nodesByColumn.set(node.column.id, columnNodes);\n }\n\n const columns = [...nodesByColumn.values()];\n const slotHeights = columns.map(columnNodes =>\n Math.max(0, (bottom - top - nodePadding * Math.max(0, columnNodes.length - 1)) / columnNodes.length),\n );\n const maximumNodeHeight = Math.min(...slotHeights) * 0.6;\n\n columns.forEach((columnNodes, columnIndex) => {\n const slotHeight = slotHeights[columnIndex] ?? 0;\n const columnTotal = columnNodes.reduce(\n (total, node) => total + (node.displayValue ?? currentNodeWeights.get(node.id) ?? 0),\n 0,\n );\n const x = columns.length > 1 ? left + ((right - left) * columnIndex) / (columns.length - 1) : left;\n\n columnNodes.forEach((node, index) => {\n const value = node.displayValue ?? currentNodeWeights.get(node.id) ?? 0;\n const centerY = top + index * (slotHeight + nodePadding) + slotHeight / 2;\n const height = columnTotal > 0 ? maximumNodeHeight * (value / columnTotal) : 0;\n nodes.set(node.id, { x, centerY, y: centerY - height / 2, height });\n });\n });\n\n const links = new Map<string, FixedSankeyLinkGeometry>();\n const outgoingTotals = new Map<string, number>();\n const incomingTotals = new Map<string, number>();\n for (const link of graph.links) {\n outgoingTotals.set(link.sourceNode.id, (outgoingTotals.get(link.sourceNode.id) ?? 0) + link.displayValue);\n incomingTotals.set(link.targetNode.id, (incomingTotals.get(link.targetNode.id) ?? 0) + link.displayValue);\n }\n const sourceOffsets = new Map([...nodes].map(([id, geometry]) => [id, geometry.y]));\n const targetOffsets = new Map([...nodes].map(([id, geometry]) => [id, geometry.y]));\n\n for (const link of graph.links) {\n const sourceGeometry = nodes.get(link.sourceNode.id);\n const targetGeometry = nodes.get(link.targetNode.id);\n if (!sourceGeometry || !targetGeometry) continue;\n const sourceTotal = outgoingTotals.get(link.sourceNode.id) ?? 0;\n const targetTotal = incomingTotals.get(link.targetNode.id) ?? 0;\n const sourceWidth = sourceTotal > 0 ? sourceGeometry.height * (link.displayValue / sourceTotal) : 0;\n const targetWidth = targetTotal > 0 ? targetGeometry.height * (link.displayValue / targetTotal) : 0;\n const sourceOffset = sourceOffsets.get(link.sourceNode.id) ?? sourceGeometry.y;\n const targetOffset = targetOffsets.get(link.targetNode.id) ?? targetGeometry.y;\n links.set(link.id, {\n sourceY: sourceOffset + sourceWidth / 2,\n targetY: targetOffset + targetWidth / 2,\n sourceWidth,\n targetWidth,\n });\n sourceOffsets.set(link.sourceNode.id, sourceOffset + sourceWidth);\n targetOffsets.set(link.targetNode.id, targetOffset + targetWidth);\n }\n\n return { nodes, links };\n}\n\nexport function getSankeyChartNodeWeights(graph: SankeyChartGraph): Map<string, number> {\n const incomingWeights = new Map<string, number>();\n const outgoingWeights = new Map<string, number>();\n\n for (const link of graph.links) {\n outgoingWeights.set(link.sourceNode.id, (outgoingWeights.get(link.sourceNode.id) ?? 0) + link.value);\n incomingWeights.set(link.targetNode.id, (incomingWeights.get(link.targetNode.id) ?? 0) + link.value);\n }\n\n return new Map(\n graph.nodes.map(node => [node.id, Math.max(incomingWeights.get(node.id) ?? 0, outgoingWeights.get(node.id) ?? 0)]),\n );\n}\n\nfunction getSankeyChartCurrentNodeWeights(graph: SankeyChartGraph): Map<string, number> {\n const incomingWeights = new Map<string, number>();\n const outgoingWeights = new Map<string, number>();\n\n for (const link of graph.links) {\n outgoingWeights.set(link.sourceNode.id, (outgoingWeights.get(link.sourceNode.id) ?? 0) + link.displayValue);\n incomingWeights.set(link.targetNode.id, (incomingWeights.get(link.targetNode.id) ?? 0) + link.displayValue);\n }\n\n return new Map(\n graph.nodes.map(node => [node.id, Math.max(incomingWeights.get(node.id) ?? 0, outgoingWeights.get(node.id) ?? 0)]),\n );\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\nexport function getSankeyChartNodeSelection(node: SankeyChartNode): SankeyChartNodeSelection {\n return { column: node.column, value: node.value };\n}\n\nfunction createNodeId(columnId: string, value: string | number) {\n return JSON.stringify([columnId, typeof value, value]);\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 getRecordWeight?: (record: SankeyChartRecord) => number;\n getRecordLayoutWeight?: (record: SankeyChartRecord) => number;\n getRecordNodeId?: (record: SankeyChartRecord, column: SankeyChartColumn) => string;\n getRecordNodeLabel?: (record: SankeyChartRecord, column: SankeyChartColumn) => string;\n getRecordNodeValue?: (record: SankeyChartRecord, column: SankeyChartColumn) => number;\n getColumnHue?: (column: SankeyChartColumn) => number;\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 usesFixedGeometry: boolean;\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 getRecordWeight,\n getRecordLayoutWeight,\n getRecordNodeId,\n getRecordNodeLabel,\n getRecordNodeValue,\n getColumnHue,\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(\n data,\n enabledColumns,\n getRecordWeight,\n getRecordNodeId,\n getRecordNodeLabel,\n getRecordNodeValue,\n getRecordLayoutWeight,\n );\n const defaultHueMap = buildSankeyHueMap(graph.nodes.map(node => String(node.value)));\n const hueMap = Object.fromEntries(\n graph.nodes.map(node => [\n String(node.value),\n getColumnHue?.(node.column) ?? defaultHueMap[String(node.value)] ?? 0,\n ]),\n );\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\n value={{ graph, enabledColumns, hueMap, usesFixedGeometry: getRecordLayoutWeight !== undefined }}\n >\n {children}\n </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 { useEffect, useMemo, useRef, useState } from 'react';\nimport type { ComponentProps, CSSProperties } from 'react';\nimport type { Sankey as RechartsSankey } from 'recharts';\n\nimport { buildFixedSankeyGeometry } from './sankey-chart-utils';\nimport type { SankeyChartGraph } from './sankey-chart-utils';\n\ntype SankeyChartMeasurementsOptions = {\n graph: SankeyChartGraph;\n height: CSSProperties['height'];\n margin: ComponentProps<typeof RechartsSankey>['margin'];\n usesFixedGeometry: boolean;\n};\n\nexport function useSankeyChartMeasurements({\n graph,\n height,\n margin,\n usesFixedGeometry,\n}: SankeyChartMeasurementsOptions) {\n const chartContainerRef = useRef<HTMLDivElement>(null);\n const [measuredHeight, setMeasuredHeight] = useState(typeof height === 'number' ? height : 320);\n const [measuredWidth, setMeasuredWidth] = useState(800);\n\n useEffect(() => {\n const element = chartContainerRef.current;\n if (!element) return;\n\n const updateDimensions = () => {\n if (element.offsetHeight > 0) setMeasuredHeight(element.offsetHeight);\n if (element.offsetWidth > 0) setMeasuredWidth(element.offsetWidth);\n };\n\n updateDimensions();\n if (typeof ResizeObserver === 'undefined') return;\n\n const observer = new ResizeObserver(updateDimensions);\n observer.observe(element);\n return () => observer.disconnect();\n }, [height]);\n\n const fixedGeometry = useMemo(\n () =>\n usesFixedGeometry\n ? buildFixedSankeyGeometry(graph, {\n top: Number(margin?.top ?? 64),\n bottom: measuredHeight - Number(margin?.bottom ?? 12),\n left: Number(margin?.left ?? 160),\n right: measuredWidth - Number(margin?.right ?? 160) - 7,\n nodePadding: 8,\n })\n : undefined,\n [graph, margin?.bottom, margin?.left, margin?.right, margin?.top, measuredHeight, measuredWidth, usesFixedGeometry],\n );\n\n return { chartContainerRef, fixedGeometry };\n}\n","import { useId, useState } from 'react';\nimport type { ComponentProps, CSSProperties, KeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport { ResponsiveContainer, Sankey as RechartsSankey } from 'recharts';\nimport {\n getSankeyChartCurveSelection,\n getSankeyChartNodeSelection,\n getSankeyChartNodeWeights,\n} from './sankey-chart-utils';\nimport type { SankeyChartCurveSelection, SankeyChartNodeSelection } from './sankey-chart-utils';\nimport { useSankeyRenderContext } from './sankey-context';\nimport { nodeColor, nodeColorVivid } from './sankeyColor';\nimport { useSankeyChartMeasurements } from './use-sankey-chart-measurements';\nimport { Colors } from '@/ds/tokens';\nimport { cn } from '@/lib/utils';\n\nexport type SankeyChartProps = {\n height?: CSSProperties['height'];\n className?: string;\n margin?: ComponentProps<typeof RechartsSankey>['margin'];\n onCurveClick?: (selection: SankeyChartCurveSelection) => void;\n onNodeClick?: (selection: SankeyChartNodeSelection) => void;\n isNodeClickable?: (selection: SankeyChartNodeSelection) => boolean;\n};\n\nexport function SankeyChart({\n height = 320,\n className,\n margin = { top: 64, right: 160, bottom: 12, left: 160 },\n onCurveClick,\n onNodeClick,\n isNodeClickable,\n}: SankeyChartProps) {\n const { graph, enabledColumns, hueMap, usesFixedGeometry } = useSankeyRenderContext();\n const { chartContainerRef, fixedGeometry } = useSankeyChartMeasurements({\n graph,\n height,\n margin,\n usesFixedGeometry,\n });\n const [hoveredSourceName, setHoveredSourceName] = useState<string>();\n const [focusedSourceName, setFocusedSourceName] = useState<string>();\n const activeSourceName = hoveredSourceName ?? focusedSourceName;\n const firstColumnId = enabledColumns[0]?.id;\n const lastColumnId = enabledColumns.at(-1)?.id;\n const nodeWeights = getSankeyChartNodeWeights(graph);\n const total = graph.nodes.reduce(\n (sum, node) =>\n node.column.id === firstColumnId ? sum + (node.displayValue ?? nodeWeights.get(node.id) ?? 0) : sum,\n 0,\n );\n\n return (\n <div className={cn('min-w-0', className)}>\n {graph.links.length === 0 ? (\n <div\n className=\"border-border1 text-ui-sm text-neutral3 flex items-center justify-center rounded-md border\"\n style={{ height }}\n >\n Select at least two columns with data to display a flow\n </div>\n ) : (\n <div ref={chartContainerRef} 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={56}\n margin={margin}\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 const nodeGeometry = node ? fixedGeometry?.nodes.get(node.id) : undefined;\n const selection = node ? getSankeyChartNodeSelection(node) : undefined;\n const clickable = Boolean(\n onNodeClick && selection && (isNodeClickable === undefined || isNodeClickable(selection)),\n );\n return (\n <SankeyNode\n {...props}\n x={nodeGeometry?.x ?? props.x}\n y={nodeGeometry?.y ?? props.y}\n height={nodeGeometry?.height ?? props.height}\n hueMap={hueMap}\n columnLabel={node?.column.label}\n label={node?.label}\n nodeValue={node?.displayValue}\n layoutValue={nodeGeometry ? undefined : node ? nodeWeights.get(node.id) : undefined}\n total={total}\n showColumnLabel={showColumnLabel}\n isFirstColumn={node?.column.id === firstColumnId}\n isLastColumn={node?.column.id === lastColumnId}\n onFocusChange={setFocusedSourceName}\n onHoverChange={setHoveredSourceName}\n clickable={clickable}\n onSelect={() => {\n if (selection && clickable) onNodeClick?.(selection);\n }}\n />\n );\n }}\n link={(props: SankeyLinkRendererProps) => {\n const link = graph.links[props.index];\n const linkGeometry = link ? fixedGeometry?.links.get(link.id) : undefined;\n return (\n <SankeyLink\n {...props}\n sourceY={linkGeometry?.sourceY ?? props.sourceY}\n targetY={linkGeometry?.targetY ?? props.targetY}\n sourceWidth={linkGeometry?.sourceWidth}\n targetWidth={linkGeometry?.targetWidth}\n hueMap={hueMap}\n highlighted={String(props.payload.source.name ?? '') === activeSourceName}\n displayValue={link?.displayValue}\n layoutValue={link?.value}\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 label?: string;\n nodeValue?: number;\n layoutValue?: number;\n total: number;\n showColumnLabel: boolean;\n isFirstColumn: boolean;\n isLastColumn: boolean;\n clickable: boolean;\n onFocusChange: (sourceName: string | undefined) => void;\n onHoverChange: (sourceName: string | undefined) => void;\n onSelect: () => void;\n};\n\nfunction SankeyNode({\n x,\n y,\n width,\n height,\n payload,\n hueMap,\n columnLabel,\n label,\n nodeValue,\n layoutValue,\n total,\n showColumnLabel,\n isFirstColumn,\n isLastColumn,\n clickable,\n onFocusChange,\n onHoverChange,\n onSelect,\n}: SankeyNodeProps) {\n const name = typeof payload.name === 'string' || typeof payload.name === 'number' ? String(payload.name) : '';\n const displayLabel = label ?? name;\n const descriptionIndex = displayLabel.indexOf('\\n');\n const visibleDisplayLabel = descriptionIndex >= 0 ? displayLabel.slice(0, descriptionIndex) : displayLabel;\n const description = descriptionIndex >= 0 ? displayLabel.slice(descriptionIndex + 1) : undefined;\n const accessibleLabel = displayLabel.replaceAll('\\n', '. ');\n const visibleLabel = truncateNodeLabel(visibleDisplayLabel);\n const tooltipId = useId();\n const [isHovered, setIsHovered] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const [tooltipPosition, setTooltipPosition] = useState<{\n left: number;\n top: number;\n placement: 'above' | 'below';\n }>();\n const numericValue = nodeValue ?? (typeof payload.value === 'number' ? payload.value : Number(payload.value));\n const value = Number.isFinite(numericValue) ? String(numericValue) : '';\n const percentage = total > 0 && Number.isFinite(numericValue) ? Math.round((numericValue / total) * 100) : 0;\n const visibleHeight = scaleSankeyDimension(height, numericValue, layoutValue);\n const visibleY = y + (height - visibleHeight) / 2;\n const textAnchor = isFirstColumn ? 'start' : isLastColumn ? 'end' : 'middle';\n const labelX = isFirstColumn ? x : isLastColumn ? x + width : x + width / 2;\n const columnLabelX = x + width / 2;\n const hue = hueMap[name] ?? 0;\n const isTooltipVisible = Boolean(description && tooltipPosition && (isHovered || isFocused));\n const showTooltipAt = (target: SVGGElement) => {\n const rect = target.getBoundingClientRect();\n const placement = rect.top < 120 ? 'below' : 'above';\n setTooltipPosition({\n left: Math.min(Math.max(rect.left, 16), Math.max(window.innerWidth - 336, 16)),\n top: placement === 'above' ? rect.top - 8 : rect.bottom + 8,\n placement,\n });\n };\n const handleKeyDown = (event: KeyboardEvent<SVGGElement>) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n onSelect();\n };\n\n return (\n <>\n <g\n aria-describedby={description ? tooltipId : undefined}\n aria-label={`${accessibleLabel}: ${value} ${numericValue === 1 ? 'trace' : 'traces'} (${percentage}%)`}\n className=\"focus-visible:[&>rect]:stroke-neutral6 outline-hidden focus-visible:[&>rect]:stroke-2\"\n onClick={clickable ? onSelect : undefined}\n onKeyDown={clickable ? handleKeyDown : undefined}\n role={clickable ? 'button' : undefined}\n onFocus={event => {\n onFocusChange(name);\n setIsFocused(true);\n showTooltipAt(event.currentTarget);\n }}\n onBlur={() => {\n onFocusChange(undefined);\n setIsFocused(false);\n }}\n onMouseEnter={event => {\n onHoverChange(name);\n setIsHovered(true);\n showTooltipAt(event.currentTarget);\n }}\n onMouseLeave={() => {\n onHoverChange(undefined);\n setIsHovered(false);\n }}\n style={{ cursor: clickable ? 'pointer' : undefined }}\n tabIndex={0}\n >\n <title>{displayLabel}</title>\n {showColumnLabel && columnLabel ? (\n <text x={columnLabelX} y={18} textAnchor=\"middle\" fill={nodeColor(hue)} fontSize={12} fontWeight={600}>\n {columnLabel}\n </text>\n ) : null}\n <rect x={x} y={visibleY} width={width} height={visibleHeight} rx={3} fill={nodeColor(hue)} />\n <text\n x={labelX}\n y={y - 24}\n textAnchor={textAnchor}\n fill={Colors.neutral5}\n fontSize={11}\n fontFamily=\"var(--font-mono)\"\n >\n {visibleLabel}\n </text>\n <text x={labelX} y={y - 8} textAnchor={textAnchor} fill={Colors.neutral3} fontSize={9.5}>\n {value} ({percentage}%)\n </text>\n </g>\n {description && isTooltipVisible && tooltipPosition\n ? createPortal(\n <div\n aria-label={`${visibleDisplayLabel}: ${description}`}\n className=\"border-border1 bg-surface5 text-neutral6 shadow-elevated pointer-events-none fixed z-50 rounded-md border p-2 text-xs leading-4\"\n id={tooltipId}\n role=\"tooltip\"\n style={{\n left: tooltipPosition.left,\n maxWidth: 'min(20rem, calc(100vw - 2rem))',\n top: tooltipPosition.top,\n transform: tooltipPosition.placement === 'above' ? 'translateY(-100%)' : undefined,\n width: 'max-content',\n }}\n >\n <div className=\"font-medium\">{visibleDisplayLabel}</div>\n <div className=\"text-neutral4 whitespace-pre-wrap\">{description}</div>\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n\nfunction scaleSankeyDimension(size: number, displayValue: number | undefined, layoutValue: number | undefined) {\n if (displayValue === undefined || layoutValue === undefined || layoutValue <= 0) return size;\n return size * Math.min(Math.max(displayValue / layoutValue, 0), 1);\n}\n\nfunction truncateNodeLabel(label: string) {\n const maximumLength = 23;\n if (label.length <= maximumLength) return label;\n return `${label.slice(0, maximumLength - 1).trimEnd()}…`;\n}\n\ntype SankeyLinkProps = SankeyLinkRendererProps & {\n hueMap: Record<string, number>;\n highlighted: boolean;\n displayValue?: number;\n layoutValue?: number;\n sourceWidth?: number;\n targetWidth?: number;\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 displayValue,\n layoutValue,\n sourceWidth,\n targetWidth,\n clickable,\n onHoverChange,\n onSelect,\n}: SankeyLinkProps) {\n const visibleWidth = scaleSankeyDimension(linkWidth, displayValue, layoutValue);\n const sourceHalfWidth = Math.max(0, sourceWidth ?? visibleWidth) / 2;\n const targetHalfWidth = Math.max(0, targetWidth ?? visibleWidth) / 2;\n const path = [\n `M${sourceX},${sourceY - sourceHalfWidth}`,\n `C${sourceControlX},${sourceY - sourceHalfWidth} ${targetControlX},${targetY - targetHalfWidth} ${targetX},${targetY - targetHalfWidth}`,\n `L${targetX},${targetY + targetHalfWidth}`,\n `C${targetControlX},${targetY + targetHalfWidth} ${sourceControlX},${sourceY + sourceHalfWidth} ${sourceX},${sourceY + sourceHalfWidth}`,\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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"}
1
+ {"version":3,"file":"SankeyChart.es.js","sources":["../../src/ds/components/SankeyChart/sankey-chart-utils.ts","../../src/ds/components/SankeyChart/sankey-context.tsx","../../src/ds/components/SankeyChart/use-sankey-chart-measurements.ts","../../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 label: string;\n column: SankeyChartColumn;\n value: string | number;\n displayValue?: number;\n};\n\nexport type SankeyChartLink = {\n id: string;\n source: number;\n target: number;\n value: number;\n displayValue: 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 FixedSankeyNodeGeometry = {\n x: number;\n centerY: number;\n y: number;\n height: number;\n};\n\nexport type FixedSankeyLinkGeometry = {\n sourceY: number;\n targetY: number;\n sourceWidth: number;\n targetWidth: number;\n};\n\nexport type FixedSankeyGeometry = {\n nodes: Map<string, FixedSankeyNodeGeometry>;\n links: Map<string, FixedSankeyLinkGeometry>;\n};\n\nexport type SankeyChartNodeSelection = {\n column: SankeyChartColumn;\n value: string | number;\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 getRecordWeight: (record: SankeyChartRecord) => number = () => 1,\n getRecordNodeId?: (record: SankeyChartRecord, column: SankeyChartColumn) => string,\n getRecordNodeLabel?: (record: SankeyChartRecord, column: SankeyChartColumn) => string,\n getRecordNodeValue?: (record: SankeyChartRecord, column: SankeyChartColumn) => number,\n getRecordLayoutWeight?: (record: SankeyChartRecord) => number,\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 = (\n column: SankeyChartColumn,\n value: string | number,\n label: string,\n displayValue: number | undefined,\n ): { 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), label, column, value, displayValue };\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 displayWeight = getRecordWeight(record);\n const layoutWeight = getRecordLayoutWeight?.(record) ?? displayWeight;\n if (!Number.isFinite(displayWeight) || displayWeight < 0 || !Number.isFinite(layoutWeight) || layoutWeight < 0) {\n continue;\n }\n\n const sourceRecordValue = getSankeyChartValue(record[sourceColumn.id]);\n const targetRecordValue = getSankeyChartValue(record[targetColumn.id]);\n if (sourceRecordValue === undefined || targetRecordValue === undefined) continue;\n\n const sourceValue = getRecordNodeId\n ? getSankeyChartValue(getRecordNodeId(record, sourceColumn))\n : sourceRecordValue;\n const targetValue = getRecordNodeId\n ? getSankeyChartValue(getRecordNodeId(record, targetColumn))\n : targetRecordValue;\n if (sourceValue === undefined || targetValue === undefined) continue;\n\n const sourceLabel = getRecordNodeLabel?.(record, sourceColumn) ?? String(sourceRecordValue);\n const targetLabel = getRecordNodeLabel?.(record, targetColumn) ?? String(targetRecordValue);\n const sourceDisplayValue = getRecordNodeValue?.(record, sourceColumn);\n const targetDisplayValue = getRecordNodeValue?.(record, targetColumn);\n const source = getNode(\n sourceColumn,\n sourceValue,\n sourceLabel,\n sourceDisplayValue !== undefined && Number.isFinite(sourceDisplayValue) && sourceDisplayValue >= 0\n ? sourceDisplayValue\n : undefined,\n );\n const target = getNode(\n targetColumn,\n targetValue,\n targetLabel,\n targetDisplayValue !== undefined && Number.isFinite(targetDisplayValue) && targetDisplayValue >= 0\n ? targetDisplayValue\n : undefined,\n );\n const id = `${source.node.id}->${target.node.id}`;\n const existingLink = linksById.get(id);\n\n if (existingLink) {\n existingLink.value += layoutWeight;\n existingLink.displayValue += displayWeight;\n existingLink.records.push(record);\n } else {\n linksById.set(id, {\n id,\n source: source.index,\n target: target.index,\n value: layoutWeight,\n displayValue: displayWeight,\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 const SANKEY_NODE_WIDTH = 7;\n\n// mono faces we ship advance at ~0.6em — 0.62 biases toward truncating early\nconst LABEL_CHARACTER_WIDTH_RATIO = 0.62;\nconst LABEL_GUTTER = 16;\nconst LABEL_ELLIPSIS = '…';\n\nexport type SankeyLabelWidths = {\n centered: number;\n edge: number;\n};\n\nexport function getSankeyLabelWidths({\n chartWidth,\n columnCount,\n marginLeft,\n marginRight,\n}: {\n chartWidth: number;\n columnCount: number;\n marginLeft: number;\n marginRight: number;\n}): SankeyLabelWidths {\n if (chartWidth <= 0 || columnCount < 2) {\n return { centered: Number.POSITIVE_INFINITY, edge: Number.POSITIVE_INFINITY };\n }\n\n const columnPitch = (chartWidth - marginLeft - marginRight - SANKEY_NODE_WIDTH) / (columnCount - 1);\n const centered = Math.max(0, columnPitch - LABEL_GUTTER);\n // edge columns anchor at start/end, so their label spreads toward one neighbour instead of two\n const edge = Math.max(0, columnPitch + SANKEY_NODE_WIDTH / 2 - LABEL_GUTTER - centered / 2);\n\n return { centered, edge };\n}\n\nexport function truncateSankeyLabel(\n label: string,\n {\n fontSize,\n maxWidth,\n maxCharacters = Number.POSITIVE_INFINITY,\n }: { fontSize: number; maxWidth: number; maxCharacters?: number },\n): string {\n const widthLimit = Number.isFinite(maxWidth)\n ? Math.floor(maxWidth / (fontSize * LABEL_CHARACTER_WIDTH_RATIO))\n : Number.POSITIVE_INFINITY;\n const limit = Math.min(widthLimit, maxCharacters);\n\n if (label.length <= limit) return label;\n if (limit <= 1) return LABEL_ELLIPSIS;\n\n return `${label.slice(0, limit - 1).trimEnd()}${LABEL_ELLIPSIS}`;\n}\n\nexport function buildFixedSankeyGeometry(\n graph: SankeyChartGraph,\n {\n top,\n bottom,\n left,\n right,\n nodePadding,\n }: { top: number; bottom: number; left: number; right: number; nodePadding: number },\n): FixedSankeyGeometry {\n const nodes = new Map<string, FixedSankeyNodeGeometry>();\n const nodesByColumn = new Map<string, SankeyChartNode[]>();\n const currentNodeWeights = getSankeyChartCurrentNodeWeights(graph);\n\n for (const node of graph.nodes) {\n const columnNodes = nodesByColumn.get(node.column.id) ?? [];\n columnNodes.push(node);\n nodesByColumn.set(node.column.id, columnNodes);\n }\n\n const columns = [...nodesByColumn.values()];\n const slotHeights = columns.map(columnNodes =>\n Math.max(0, (bottom - top - nodePadding * Math.max(0, columnNodes.length - 1)) / columnNodes.length),\n );\n const maximumNodeHeight = Math.min(...slotHeights) * 0.6;\n\n columns.forEach((columnNodes, columnIndex) => {\n const slotHeight = slotHeights[columnIndex] ?? 0;\n const columnTotal = columnNodes.reduce(\n (total, node) => total + (node.displayValue ?? currentNodeWeights.get(node.id) ?? 0),\n 0,\n );\n const x = columns.length > 1 ? left + ((right - left) * columnIndex) / (columns.length - 1) : left;\n\n columnNodes.forEach((node, index) => {\n const value = node.displayValue ?? currentNodeWeights.get(node.id) ?? 0;\n const centerY = top + index * (slotHeight + nodePadding) + slotHeight / 2;\n const height = columnTotal > 0 ? maximumNodeHeight * (value / columnTotal) : 0;\n nodes.set(node.id, { x, centerY, y: centerY - height / 2, height });\n });\n });\n\n const links = new Map<string, FixedSankeyLinkGeometry>();\n const outgoingTotals = new Map<string, number>();\n const incomingTotals = new Map<string, number>();\n for (const link of graph.links) {\n outgoingTotals.set(link.sourceNode.id, (outgoingTotals.get(link.sourceNode.id) ?? 0) + link.displayValue);\n incomingTotals.set(link.targetNode.id, (incomingTotals.get(link.targetNode.id) ?? 0) + link.displayValue);\n }\n const sourceOffsets = new Map([...nodes].map(([id, geometry]) => [id, geometry.y]));\n const targetOffsets = new Map([...nodes].map(([id, geometry]) => [id, geometry.y]));\n\n for (const link of graph.links) {\n const sourceGeometry = nodes.get(link.sourceNode.id);\n const targetGeometry = nodes.get(link.targetNode.id);\n if (!sourceGeometry || !targetGeometry) continue;\n const sourceTotal = outgoingTotals.get(link.sourceNode.id) ?? 0;\n const targetTotal = incomingTotals.get(link.targetNode.id) ?? 0;\n const sourceWidth = sourceTotal > 0 ? sourceGeometry.height * (link.displayValue / sourceTotal) : 0;\n const targetWidth = targetTotal > 0 ? targetGeometry.height * (link.displayValue / targetTotal) : 0;\n const sourceOffset = sourceOffsets.get(link.sourceNode.id) ?? sourceGeometry.y;\n const targetOffset = targetOffsets.get(link.targetNode.id) ?? targetGeometry.y;\n links.set(link.id, {\n sourceY: sourceOffset + sourceWidth / 2,\n targetY: targetOffset + targetWidth / 2,\n sourceWidth,\n targetWidth,\n });\n sourceOffsets.set(link.sourceNode.id, sourceOffset + sourceWidth);\n targetOffsets.set(link.targetNode.id, targetOffset + targetWidth);\n }\n\n return { nodes, links };\n}\n\nexport function getSankeyChartNodeWeights(graph: SankeyChartGraph): Map<string, number> {\n const incomingWeights = new Map<string, number>();\n const outgoingWeights = new Map<string, number>();\n\n for (const link of graph.links) {\n outgoingWeights.set(link.sourceNode.id, (outgoingWeights.get(link.sourceNode.id) ?? 0) + link.value);\n incomingWeights.set(link.targetNode.id, (incomingWeights.get(link.targetNode.id) ?? 0) + link.value);\n }\n\n return new Map(\n graph.nodes.map(node => [node.id, Math.max(incomingWeights.get(node.id) ?? 0, outgoingWeights.get(node.id) ?? 0)]),\n );\n}\n\nfunction getSankeyChartCurrentNodeWeights(graph: SankeyChartGraph): Map<string, number> {\n const incomingWeights = new Map<string, number>();\n const outgoingWeights = new Map<string, number>();\n\n for (const link of graph.links) {\n outgoingWeights.set(link.sourceNode.id, (outgoingWeights.get(link.sourceNode.id) ?? 0) + link.displayValue);\n incomingWeights.set(link.targetNode.id, (incomingWeights.get(link.targetNode.id) ?? 0) + link.displayValue);\n }\n\n return new Map(\n graph.nodes.map(node => [node.id, Math.max(incomingWeights.get(node.id) ?? 0, outgoingWeights.get(node.id) ?? 0)]),\n );\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\nexport function getSankeyChartNodeSelection(node: SankeyChartNode): SankeyChartNodeSelection {\n return { column: node.column, value: node.value };\n}\n\nfunction createNodeId(columnId: string, value: string | number) {\n return JSON.stringify([columnId, typeof value, value]);\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 getRecordWeight?: (record: SankeyChartRecord) => number;\n getRecordLayoutWeight?: (record: SankeyChartRecord) => number;\n getRecordNodeId?: (record: SankeyChartRecord, column: SankeyChartColumn) => string;\n getRecordNodeLabel?: (record: SankeyChartRecord, column: SankeyChartColumn) => string;\n getRecordNodeValue?: (record: SankeyChartRecord, column: SankeyChartColumn) => number;\n getColumnHue?: (column: SankeyChartColumn) => number;\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 usesFixedGeometry: boolean;\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 getRecordWeight,\n getRecordLayoutWeight,\n getRecordNodeId,\n getRecordNodeLabel,\n getRecordNodeValue,\n getColumnHue,\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(\n data,\n enabledColumns,\n getRecordWeight,\n getRecordNodeId,\n getRecordNodeLabel,\n getRecordNodeValue,\n getRecordLayoutWeight,\n );\n const defaultHueMap = buildSankeyHueMap(graph.nodes.map(node => String(node.value)));\n const hueMap = Object.fromEntries(\n graph.nodes.map(node => [\n String(node.value),\n getColumnHue?.(node.column) ?? defaultHueMap[String(node.value)] ?? 0,\n ]),\n );\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\n value={{ graph, enabledColumns, hueMap, usesFixedGeometry: getRecordLayoutWeight !== undefined }}\n >\n {children}\n </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 { useEffect, useMemo, useRef, useState } from 'react';\nimport type { ComponentProps, CSSProperties } from 'react';\nimport type { Sankey as RechartsSankey } from 'recharts';\n\nimport { buildFixedSankeyGeometry, getSankeyLabelWidths, SANKEY_NODE_WIDTH } from './sankey-chart-utils';\nimport type { SankeyChartGraph } from './sankey-chart-utils';\n\ntype SankeyChartMeasurementsOptions = {\n graph: SankeyChartGraph;\n height: CSSProperties['height'];\n margin: ComponentProps<typeof RechartsSankey>['margin'];\n usesFixedGeometry: boolean;\n};\n\nexport function useSankeyChartMeasurements({\n graph,\n height,\n margin,\n usesFixedGeometry,\n}: SankeyChartMeasurementsOptions) {\n const chartContainerRef = useRef<HTMLDivElement>(null);\n const [measuredHeight, setMeasuredHeight] = useState(typeof height === 'number' ? height : 320);\n const [measuredWidth, setMeasuredWidth] = useState(800);\n\n useEffect(() => {\n const element = chartContainerRef.current;\n if (!element) return;\n\n const updateDimensions = () => {\n if (element.offsetHeight > 0) setMeasuredHeight(element.offsetHeight);\n if (element.offsetWidth > 0) setMeasuredWidth(element.offsetWidth);\n };\n\n updateDimensions();\n if (typeof ResizeObserver === 'undefined') return;\n\n const observer = new ResizeObserver(updateDimensions);\n observer.observe(element);\n return () => observer.disconnect();\n }, [height]);\n\n const fixedGeometry = useMemo(\n () =>\n usesFixedGeometry\n ? buildFixedSankeyGeometry(graph, {\n top: Number(margin?.top ?? 64),\n bottom: measuredHeight - Number(margin?.bottom ?? 12),\n left: Number(margin?.left ?? 160),\n right: measuredWidth - Number(margin?.right ?? 160) - SANKEY_NODE_WIDTH,\n nodePadding: 8,\n })\n : undefined,\n [graph, margin?.bottom, margin?.left, margin?.right, margin?.top, measuredHeight, measuredWidth, usesFixedGeometry],\n );\n\n // recharts spaces columns by link depth, so the graph — not the enabled column list — sets the pitch\n const labelWidths = getSankeyLabelWidths({\n chartWidth: measuredWidth,\n columnCount: new Set(graph.nodes.map(node => node.column.id)).size,\n marginLeft: Number(margin?.left ?? 160),\n marginRight: Number(margin?.right ?? 160),\n });\n\n return { chartContainerRef, fixedGeometry, labelWidths };\n}\n","import { useId, useState } from 'react';\nimport type { ComponentProps, CSSProperties, KeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport { ResponsiveContainer, Sankey as RechartsSankey } from 'recharts';\nimport {\n getSankeyChartCurveSelection,\n getSankeyChartNodeSelection,\n getSankeyChartNodeWeights,\n SANKEY_NODE_WIDTH,\n truncateSankeyLabel,\n} from './sankey-chart-utils';\nimport type { SankeyChartCurveSelection, SankeyChartNodeSelection, SankeyLabelWidths } from './sankey-chart-utils';\nimport { useSankeyRenderContext } from './sankey-context';\nimport { nodeColor, nodeColorVivid } from './sankeyColor';\nimport { useSankeyChartMeasurements } from './use-sankey-chart-measurements';\nimport { Colors } from '@/ds/tokens';\nimport { cn } from '@/lib/utils';\n\nconst NODE_LABEL_FONT_SIZE = 11;\nconst COLUMN_LABEL_FONT_SIZE = 12;\n// pre-measurement cap, kept so wide charts read unchanged\nconst NODE_LABEL_MAX_CHARACTERS = 23;\n\nexport type SankeyChartProps = {\n height?: CSSProperties['height'];\n className?: string;\n margin?: ComponentProps<typeof RechartsSankey>['margin'];\n onCurveClick?: (selection: SankeyChartCurveSelection) => void;\n onNodeClick?: (selection: SankeyChartNodeSelection) => void;\n isNodeClickable?: (selection: SankeyChartNodeSelection) => boolean;\n};\n\nexport function SankeyChart({\n height = 320,\n className,\n margin = { top: 64, right: 160, bottom: 12, left: 160 },\n onCurveClick,\n onNodeClick,\n isNodeClickable,\n}: SankeyChartProps) {\n const { graph, enabledColumns, hueMap, usesFixedGeometry } = useSankeyRenderContext();\n const { chartContainerRef, fixedGeometry, labelWidths } = useSankeyChartMeasurements({\n graph,\n height,\n margin,\n usesFixedGeometry,\n });\n const [hoveredSourceName, setHoveredSourceName] = useState<string>();\n const [focusedSourceName, setFocusedSourceName] = useState<string>();\n const activeSourceName = hoveredSourceName ?? focusedSourceName;\n const firstColumnId = enabledColumns[0]?.id;\n const lastColumnId = enabledColumns.at(-1)?.id;\n const nodeWeights = getSankeyChartNodeWeights(graph);\n const total = graph.nodes.reduce(\n (sum, node) =>\n node.column.id === firstColumnId ? sum + (node.displayValue ?? nodeWeights.get(node.id) ?? 0) : sum,\n 0,\n );\n\n return (\n <div className={cn('min-w-0', className)}>\n {graph.links.length === 0 ? (\n <div\n className=\"border-border1 text-ui-sm text-neutral3 flex items-center justify-center rounded-md border\"\n style={{ height }}\n >\n Select at least two columns with data to display a flow\n </div>\n ) : (\n <div ref={chartContainerRef} 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={SANKEY_NODE_WIDTH}\n nodePadding={56}\n margin={margin}\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 const nodeGeometry = node ? fixedGeometry?.nodes.get(node.id) : undefined;\n const selection = node ? getSankeyChartNodeSelection(node) : undefined;\n const clickable = Boolean(\n onNodeClick && selection && (isNodeClickable === undefined || isNodeClickable(selection)),\n );\n return (\n <SankeyNode\n {...props}\n x={nodeGeometry?.x ?? props.x}\n y={nodeGeometry?.y ?? props.y}\n height={nodeGeometry?.height ?? props.height}\n hueMap={hueMap}\n columnLabel={node?.column.label}\n label={node?.label}\n nodeValue={node?.displayValue}\n layoutValue={nodeGeometry ? undefined : node ? nodeWeights.get(node.id) : undefined}\n total={total}\n showColumnLabel={showColumnLabel}\n isFirstColumn={node?.column.id === firstColumnId}\n isLastColumn={node?.column.id === lastColumnId}\n labelWidths={labelWidths}\n onFocusChange={setFocusedSourceName}\n onHoverChange={setHoveredSourceName}\n clickable={clickable}\n onSelect={() => {\n if (selection && clickable) onNodeClick?.(selection);\n }}\n />\n );\n }}\n link={(props: SankeyLinkRendererProps) => {\n const link = graph.links[props.index];\n const linkGeometry = link ? fixedGeometry?.links.get(link.id) : undefined;\n return (\n <SankeyLink\n {...props}\n sourceY={linkGeometry?.sourceY ?? props.sourceY}\n targetY={linkGeometry?.targetY ?? props.targetY}\n sourceWidth={linkGeometry?.sourceWidth}\n targetWidth={linkGeometry?.targetWidth}\n hueMap={hueMap}\n highlighted={String(props.payload.source.name ?? '') === activeSourceName}\n displayValue={link?.displayValue}\n layoutValue={link?.value}\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 label?: string;\n nodeValue?: number;\n layoutValue?: number;\n total: number;\n showColumnLabel: boolean;\n isFirstColumn: boolean;\n isLastColumn: boolean;\n labelWidths: SankeyLabelWidths;\n clickable: boolean;\n onFocusChange: (sourceName: string | undefined) => void;\n onHoverChange: (sourceName: string | undefined) => void;\n onSelect: () => void;\n};\n\nfunction SankeyNode({\n x,\n y,\n width,\n height,\n payload,\n hueMap,\n columnLabel,\n label,\n nodeValue,\n layoutValue,\n total,\n showColumnLabel,\n isFirstColumn,\n isLastColumn,\n labelWidths,\n clickable,\n onFocusChange,\n onHoverChange,\n onSelect,\n}: SankeyNodeProps) {\n const name = typeof payload.name === 'string' || typeof payload.name === 'number' ? String(payload.name) : '';\n const displayLabel = label ?? name;\n const descriptionIndex = displayLabel.indexOf('\\n');\n const visibleDisplayLabel = descriptionIndex >= 0 ? displayLabel.slice(0, descriptionIndex) : displayLabel;\n const description = descriptionIndex >= 0 ? displayLabel.slice(descriptionIndex + 1) : undefined;\n const accessibleLabel = displayLabel.replaceAll('\\n', '. ');\n const nodeLabelWidth = isFirstColumn || isLastColumn ? labelWidths.edge : labelWidths.centered;\n const visibleLabel = truncateSankeyLabel(visibleDisplayLabel, {\n fontSize: NODE_LABEL_FONT_SIZE,\n maxWidth: nodeLabelWidth,\n maxCharacters: NODE_LABEL_MAX_CHARACTERS,\n });\n const visibleColumnLabel = columnLabel\n ? truncateSankeyLabel(columnLabel, { fontSize: COLUMN_LABEL_FONT_SIZE, maxWidth: labelWidths.centered })\n : undefined;\n const tooltipId = useId();\n const [isHovered, setIsHovered] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const [tooltipPosition, setTooltipPosition] = useState<{\n left: number;\n top: number;\n placement: 'above' | 'below';\n }>();\n const numericValue = nodeValue ?? (typeof payload.value === 'number' ? payload.value : Number(payload.value));\n const value = Number.isFinite(numericValue) ? String(numericValue) : '';\n const percentage = total > 0 && Number.isFinite(numericValue) ? Math.round((numericValue / total) * 100) : 0;\n const visibleHeight = scaleSankeyDimension(height, numericValue, layoutValue);\n const visibleY = y + (height - visibleHeight) / 2;\n const textAnchor = isFirstColumn ? 'start' : isLastColumn ? 'end' : 'middle';\n const labelX = isFirstColumn ? x : isLastColumn ? x + width : x + width / 2;\n const columnLabelX = x + width / 2;\n const hue = hueMap[name] ?? 0;\n const isTooltipVisible = Boolean(description && tooltipPosition && (isHovered || isFocused));\n const showTooltipAt = (target: SVGGElement) => {\n const rect = target.getBoundingClientRect();\n const placement = rect.top < 120 ? 'below' : 'above';\n setTooltipPosition({\n left: Math.min(Math.max(rect.left, 16), Math.max(window.innerWidth - 336, 16)),\n top: placement === 'above' ? rect.top - 8 : rect.bottom + 8,\n placement,\n });\n };\n const handleKeyDown = (event: KeyboardEvent<SVGGElement>) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n onSelect();\n };\n\n return (\n <>\n <g\n aria-describedby={description ? tooltipId : undefined}\n aria-label={`${accessibleLabel}: ${value} ${numericValue === 1 ? 'trace' : 'traces'} (${percentage}%)`}\n className=\"focus-visible:[&>rect]:stroke-neutral6 outline-hidden focus-visible:[&>rect]:stroke-2\"\n onClick={clickable ? onSelect : undefined}\n onKeyDown={clickable ? handleKeyDown : undefined}\n role={clickable ? 'button' : undefined}\n onFocus={event => {\n onFocusChange(name);\n setIsFocused(true);\n showTooltipAt(event.currentTarget);\n }}\n onBlur={() => {\n onFocusChange(undefined);\n setIsFocused(false);\n }}\n onMouseEnter={event => {\n onHoverChange(name);\n setIsHovered(true);\n showTooltipAt(event.currentTarget);\n }}\n onMouseLeave={() => {\n onHoverChange(undefined);\n setIsHovered(false);\n }}\n style={{ cursor: clickable ? 'pointer' : undefined }}\n tabIndex={0}\n >\n <title>{displayLabel}</title>\n {showColumnLabel && visibleColumnLabel ? (\n <text\n x={columnLabelX}\n y={18}\n textAnchor=\"middle\"\n fill={nodeColor(hue)}\n fontSize={COLUMN_LABEL_FONT_SIZE}\n fontWeight={600}\n >\n {visibleColumnLabel === columnLabel ? null : <title>{columnLabel}</title>}\n {visibleColumnLabel}\n </text>\n ) : null}\n <rect x={x} y={visibleY} width={width} height={visibleHeight} rx={3} fill={nodeColor(hue)} />\n <text\n x={labelX}\n y={y - 24}\n textAnchor={textAnchor}\n fill={Colors.neutral5}\n fontSize={NODE_LABEL_FONT_SIZE}\n fontFamily=\"var(--font-mono)\"\n >\n {visibleLabel}\n </text>\n <text x={labelX} y={y - 8} textAnchor={textAnchor} fill={Colors.neutral3} fontSize={9.5}>\n {value} ({percentage}%)\n </text>\n </g>\n {description && isTooltipVisible && tooltipPosition\n ? createPortal(\n <div\n aria-label={`${visibleDisplayLabel}: ${description}`}\n className=\"border-border1 bg-surface5 text-neutral6 shadow-elevated pointer-events-none fixed z-50 rounded-md border p-2 text-xs leading-4\"\n id={tooltipId}\n role=\"tooltip\"\n style={{\n left: tooltipPosition.left,\n maxWidth: 'min(20rem, calc(100vw - 2rem))',\n top: tooltipPosition.top,\n transform: tooltipPosition.placement === 'above' ? 'translateY(-100%)' : undefined,\n width: 'max-content',\n }}\n >\n <div className=\"font-medium\">{visibleDisplayLabel}</div>\n <div className=\"text-neutral4 whitespace-pre-wrap\">{description}</div>\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n\nfunction scaleSankeyDimension(size: number, displayValue: number | undefined, layoutValue: number | undefined) {\n if (displayValue === undefined || layoutValue === undefined || layoutValue <= 0) return size;\n return size * Math.min(Math.max(displayValue / layoutValue, 0), 1);\n}\n\ntype SankeyLinkProps = SankeyLinkRendererProps & {\n hueMap: Record<string, number>;\n highlighted: boolean;\n displayValue?: number;\n layoutValue?: number;\n sourceWidth?: number;\n targetWidth?: number;\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 displayValue,\n layoutValue,\n sourceWidth,\n targetWidth,\n clickable,\n onHoverChange,\n onSelect,\n}: SankeyLinkProps) {\n const visibleWidth = scaleSankeyDimension(linkWidth, displayValue, layoutValue);\n const sourceHalfWidth = Math.max(0, sourceWidth ?? visibleWidth) / 2;\n const targetHalfWidth = Math.max(0, targetWidth ?? visibleWidth) / 2;\n const path = [\n `M${sourceX},${sourceY - sourceHalfWidth}`,\n `C${sourceControlX},${sourceY - sourceHalfWidth} ${targetControlX},${targetY - targetHalfWidth} ${targetX},${targetY - targetHalfWidth}`,\n `L${targetX},${targetY + targetHalfWidth}`,\n `C${targetControlX},${targetY + targetHalfWidth} ${sourceControlX},${sourceY + sourceHalfWidth} ${sourceX},${sourceY + sourceHalfWidth}`,\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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"}
@@ -5,7 +5,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
5
5
  const jsxRuntime = require('react/jsx-runtime');
6
6
  const reactVirtual = require('@tanstack/react-virtual');
7
7
  const React = require('react');
8
- const logsDataList = require('../../../logs-data-list-B6XQnRed.cjs');
8
+ const logsDataList = require('../../../logs-data-list-C_FyPCxE.cjs');
9
9
  const dataListSkeleton = require('../../../data-list-skeleton-CmCTE-HQ.cjs');
10
10
 
11
11
  const COLUMNS = "6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)";
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { useVirtualizer } from '@tanstack/react-virtual';
3
3
  import { useRef, useEffect } from 'react';
4
- import { L as LogsDataList } from '../../../logs-data-list-BkmYnYuf.js';
4
+ import { L as LogsDataList } from '../../../logs-data-list-BhDEUkXZ.js';
5
5
  import { D as DataListSkeleton } from '../../../data-list-skeleton-CQvX7jIh.js';
6
6
 
7
7
  const COLUMNS = "6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)";
@@ -2,13 +2,11 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
- const observability = require('@mastra/core/observability');
6
-
7
5
  const LOGS_ROOT_ENTITY_TYPES = {
8
- AGENT: observability.EntityType.AGENT,
9
- WORKFLOW: observability.EntityType.WORKFLOW_RUN,
10
- SCORER: observability.EntityType.SCORER,
11
- INGEST: observability.EntityType.RAG_INGESTION
6
+ AGENT: "agent",
7
+ WORKFLOW: "workflow_run",
8
+ SCORER: "scorer",
9
+ INGEST: "rag_ingestion"
12
10
  };
13
11
  const LOGS_ROOT_ENTITY_TYPE_OPTIONS = [
14
12
  { label: "Agent", entityType: LOGS_ROOT_ENTITY_TYPES.AGENT },