@splunk/visualizations 28.7.0 → 28.9.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.
- package/Area.config.js +2 -4
- package/Area.config.js.map +2 -2
- package/Area.js +245 -147
- package/Area.js.map +4 -4
- package/Bar.config.js +2 -4
- package/Bar.config.js.map +2 -2
- package/Bar.js +246 -148
- package/Bar.js.map +4 -4
- package/Bubble/Bubble.d.ts +3 -1
- package/Bubble/Bubble.d.ts.map +1 -1
- package/Bubble.js +216 -108
- package/Bubble.js.map +4 -4
- package/CHANGELOG.external.md +56 -0
- package/ChoroplethSvg/ChoroplethSvg.d.ts +3 -1
- package/ChoroplethSvg/ChoroplethSvg.d.ts.map +1 -1
- package/ChoroplethSvg/PureChoroplethSvg/PureChoroplethSvg.d.ts.map +1 -1
- package/ChoroplethSvg/PureChoroplethSvg/SvgMutator.d.ts.map +1 -1
- package/ChoroplethSvg.js +638 -209
- package/ChoroplethSvg.js.map +4 -4
- package/Column.config.js +2 -4
- package/Column.config.js.map +2 -2
- package/Column.js +246 -148
- package/Column.js.map +4 -4
- package/Ellipse/Ellipse.d.ts +3 -1
- package/Ellipse/Ellipse.d.ts.map +1 -1
- package/Ellipse.js +216 -105
- package/Ellipse.js.map +4 -4
- package/Events/Events.d.ts +5 -3
- package/Events/Events.d.ts.map +1 -1
- package/Events/PureEvents/FieldSummaryTooltip.d.ts.map +1 -1
- package/Events/PureEvents/PureEvents.d.ts +0 -1
- package/Events/PureEvents/PureEvents.d.ts.map +1 -1
- package/Events.js +270 -157
- package/Events.js.map +4 -4
- package/FillerGauge.js +251 -143
- package/FillerGauge.js.map +4 -4
- package/Image/Image.d.ts +3 -1
- package/Image/Image.d.ts.map +1 -1
- package/Image.js +217 -106
- package/Image.js.map +4 -4
- package/Line.config.js +2 -4
- package/Line.config.js.map +2 -2
- package/Line.js +246 -148
- package/Line.js.map +4 -4
- package/LinkGraph/LinkGraph.d.ts +3 -1
- package/LinkGraph/LinkGraph.d.ts.map +1 -1
- package/LinkGraph/PureLinkGraph/PureLinkGraphUtils.d.ts.map +1 -1
- package/LinkGraph/PureLinkGraph/components/Node.d.ts.map +1 -1
- package/LinkGraph.config.js +1 -1
- package/LinkGraph.config.js.map +2 -2
- package/LinkGraph.js +802 -682
- package/LinkGraph.js.map +4 -4
- package/Map/Map.d.ts +10 -9
- package/Map/Map.d.ts.map +1 -1
- package/Map/PureMap/BubbleLayer.d.ts.map +1 -1
- package/Map/PureMap/ClusterLayer.d.ts.map +1 -1
- package/Map/PureMap/MapUtils.d.ts.map +1 -1
- package/Map/PureMap/MarkerWrapper.d.ts.map +1 -1
- package/Map/PureMap/PureMap.d.ts +8 -65
- package/Map/PureMap/PureMap.d.ts.map +1 -1
- package/Map.config.js +1 -1
- package/Map.config.js.map +2 -2
- package/Map.js +363 -313
- package/Map.js.map +4 -4
- package/Markdown/Markdown.d.ts +9 -1
- package/Markdown/Markdown.d.ts.map +1 -1
- package/Markdown/config.d.ts.map +1 -1
- package/Markdown.config.js +6 -1
- package/Markdown.config.js.map +2 -2
- package/Markdown.js +226 -95
- package/Markdown.js.map +3 -3
- package/MarkerGauge.js +247 -137
- package/MarkerGauge.js.map +4 -4
- package/NetworkGraph/PureNetworkGraph/PureNetworkGraph.d.ts.map +1 -1
- package/NetworkGraph/PureNetworkGraph/components/NetworkGraphSvg.d.ts +1 -0
- package/NetworkGraph/PureNetworkGraph/components/NetworkGraphSvg.d.ts.map +1 -1
- package/NetworkGraph/PureNetworkGraph/components/Node.d.ts +1 -0
- package/NetworkGraph/PureNetworkGraph/components/Node.d.ts.map +1 -1
- package/NetworkGraph/PureNetworkGraph/utils/networkGraphUtils.d.ts +3 -5
- package/NetworkGraph/PureNetworkGraph/utils/networkGraphUtils.d.ts.map +1 -1
- package/NetworkGraph.config.js +4 -2
- package/NetworkGraph.config.js.map +2 -2
- package/NetworkGraph.js +327 -188
- package/NetworkGraph.js.map +4 -4
- package/ParallelCoordinates/ParallelCoordinates.d.ts +3 -1
- package/ParallelCoordinates/ParallelCoordinates.d.ts.map +1 -1
- package/ParallelCoordinates.js +239 -128
- package/ParallelCoordinates.js.map +4 -4
- package/Pie/config.d.ts.map +1 -1
- package/Pie/pieUtils.d.ts.map +1 -1
- package/Pie.config.js +4 -2
- package/Pie.config.js.map +2 -2
- package/Pie.js +228 -125
- package/Pie.js.map +3 -3
- package/ProcessTree/ProcessTree.d.ts +3 -1
- package/ProcessTree/ProcessTree.d.ts.map +1 -1
- package/ProcessTree/PureProcessTree/PureProcessTree.d.ts +1 -0
- package/ProcessTree/PureProcessTree/PureProcessTree.d.ts.map +1 -1
- package/ProcessTree/PureProcessTree/components/ProcessTreeLeftPanel.d.ts +1 -0
- package/ProcessTree/PureProcessTree/components/ProcessTreeLeftPanel.d.ts.map +1 -1
- package/ProcessTree/PureProcessTree/hooks/useProcessTreeGraphData.d.ts +2 -1
- package/ProcessTree/PureProcessTree/hooks/useProcessTreeGraphData.d.ts.map +1 -1
- package/ProcessTree/PureProcessTree/utils/iconLoader.d.ts +2 -0
- package/ProcessTree/PureProcessTree/utils/iconLoader.d.ts.map +1 -1
- package/ProcessTree/PureProcessTree/utils/processTreeUtils.d.ts +5 -1
- package/ProcessTree/PureProcessTree/utils/processTreeUtils.d.ts.map +1 -1
- package/ProcessTree.js +435 -192
- package/ProcessTree.js.map +4 -4
- package/Punchcard/Punchcard.d.ts +3 -1
- package/Punchcard/Punchcard.d.ts.map +1 -1
- package/Punchcard.js +238 -129
- package/Punchcard.js.map +4 -4
- package/Rectangle/Rectangle.d.ts +3 -1
- package/Rectangle/Rectangle.d.ts.map +1 -1
- package/Rectangle.js +218 -116
- package/Rectangle.js.map +4 -4
- package/RichText/PureRichText/Editor/EditorPanel.d.ts +1 -4
- package/RichText/PureRichText/Editor/EditorPanel.d.ts.map +1 -1
- package/RichText/PureRichText/Editor/hooks/useConfigPanelFocus.d.ts +14 -0
- package/RichText/PureRichText/Editor/hooks/useConfigPanelFocus.d.ts.map +1 -0
- package/RichText/PureRichText/Editor/hooks/useEditorPanelSync.d.ts +15 -0
- package/RichText/PureRichText/Editor/hooks/useEditorPanelSync.d.ts.map +1 -0
- package/RichText/PureRichText/Editor/hooks/useLinkHandlers.d.ts.map +1 -1
- package/RichText/PureRichText/Editor/hooks/usePortalTarget.d.ts +9 -0
- package/RichText/PureRichText/Editor/hooks/usePortalTarget.d.ts.map +1 -0
- package/RichText/PureRichText/InnerEditor.d.ts +20 -4
- package/RichText/PureRichText/InnerEditor.d.ts.map +1 -1
- package/RichText/PureRichText/PureRichText.d.ts +21 -9
- package/RichText/PureRichText/PureRichText.d.ts.map +1 -1
- package/RichText/PureRichText/PureRichTextContext.d.ts +3 -6
- package/RichText/PureRichText/PureRichTextContext.d.ts.map +1 -1
- package/RichText/PureRichText/RichTextStyles.d.ts +5 -4
- package/RichText/PureRichText/RichTextStyles.d.ts.map +1 -1
- package/RichText/PureRichText/activeInstance.d.ts +6 -7
- package/RichText/PureRichText/activeInstance.d.ts.map +1 -1
- package/RichText/PureRichText/config.d.ts.map +1 -1
- package/RichText/PureRichText/hooks/useContentSave.d.ts +6 -0
- package/RichText/PureRichText/hooks/useContentSave.d.ts.map +1 -1
- package/RichText/PureRichText/hooks/useContentSync.d.ts +13 -1
- package/RichText/PureRichText/hooks/useContentSync.d.ts.map +1 -1
- package/RichText/PureRichText/hooks/useDashboardKeyboardNav.d.ts +2 -7
- package/RichText/PureRichText/hooks/useDashboardKeyboardNav.d.ts.map +1 -1
- package/RichText/PureRichText/hooks/useEditorSetup.d.ts +8 -4
- package/RichText/PureRichText/hooks/useEditorSetup.d.ts.map +1 -1
- package/RichText/PureRichText/hooks/useFakeHighlight.d.ts +1 -16
- package/RichText/PureRichText/hooks/useFakeHighlight.d.ts.map +1 -1
- package/RichText/PureRichText/hooks/useFocusHandlers.d.ts +2 -4
- package/RichText/PureRichText/hooks/useFocusHandlers.d.ts.map +1 -1
- package/RichText/PureRichText/hooks/useKeyboardShortcuts.d.ts.map +1 -1
- package/RichText/PureRichText/hooks/useMouseHandlers.d.ts +3 -7
- package/RichText/PureRichText/hooks/useMouseHandlers.d.ts.map +1 -1
- package/RichText/PureRichText/hooks/useStepFontSize.d.ts +2 -2
- package/RichText/PureRichText/hooks/useStepLineSpacing.d.ts +2 -3
- package/RichText/PureRichText/hooks/useStepLineSpacing.d.ts.map +1 -1
- package/RichText/PureRichText/hooks/useTokenMap.d.ts +31 -40
- package/RichText/PureRichText/hooks/useTokenMap.d.ts.map +1 -1
- package/RichText/PureRichText/renderers/ElementRenderer.d.ts +2 -5
- package/RichText/PureRichText/renderers/ElementRenderer.d.ts.map +1 -1
- package/RichText/PureRichText/renderers/LeafRenderer.d.ts +0 -4
- package/RichText/PureRichText/renderers/LeafRenderer.d.ts.map +1 -1
- package/RichText/PureRichText/types.d.ts +21 -0
- package/RichText/PureRichText/types.d.ts.map +1 -1
- package/RichText/PureRichText/utils/slateUtils.d.ts +26 -2
- package/RichText/PureRichText/utils/slateUtils.d.ts.map +1 -1
- package/RichText/RichText.d.ts +5 -1
- package/RichText/RichText.d.ts.map +1 -1
- package/RichText/config.d.ts.map +1 -1
- package/RichText.config.js +19 -1
- package/RichText.config.js.map +2 -2
- package/RichText.js +2311 -835
- package/RichText.js.map +4 -4
- package/Sankey/PureSankey/PureSankey.d.ts +2 -0
- package/Sankey/PureSankey/PureSankey.d.ts.map +1 -1
- package/Sankey/PureSankey/SankeyLink.d.ts +3 -1
- package/Sankey/PureSankey/SankeyLink.d.ts.map +1 -1
- package/Sankey/PureSankey/SankeyNode.d.ts +5 -2
- package/Sankey/PureSankey/SankeyNode.d.ts.map +1 -1
- package/Sankey/PureSankey/SankeyUtils.d.ts.map +1 -1
- package/Sankey/Sankey.d.ts +3 -1
- package/Sankey/Sankey.d.ts.map +1 -1
- package/Sankey.js +508 -219
- package/Sankey.js.map +4 -4
- package/Scatter.config.js +3 -5
- package/Scatter.config.js.map +2 -2
- package/Scatter.js +244 -146
- package/Scatter.js.map +4 -4
- package/SingleValue/SingleValue.d.ts.map +1 -1
- package/SingleValue.js +273 -173
- package/SingleValue.js.map +4 -4
- package/SingleValueBasic.js +4 -4
- package/SingleValueBasic.js.map +2 -2
- package/SingleValueIcon/SingleValueIcon.d.ts.map +1 -1
- package/SingleValueIcon.js +264 -164
- package/SingleValueIcon.js.map +4 -4
- package/SingleValueRadial.js +267 -167
- package/SingleValueRadial.js.map +4 -4
- package/SparkLine/SparkLine.d.ts.map +1 -1
- package/SparkLine.js.map +2 -2
- package/Table/PureTable.d.ts +2 -0
- package/Table/PureTable.d.ts.map +1 -1
- package/Table/Table.d.ts +2 -5
- package/Table/Table.d.ts.map +1 -1
- package/Table/config.d.ts.map +1 -1
- package/Table/hooks.d.ts.map +1 -1
- package/Table.config.js +8 -1
- package/Table.config.js.map +2 -2
- package/Table.js +374 -270
- package/Table.js.map +4 -4
- package/Timeline/PureTimeline/PureTimeline.d.ts +6 -5
- package/Timeline/PureTimeline/PureTimeline.d.ts.map +1 -1
- package/Timeline/PureTimeline/src/CursorPlugin.d.ts +1 -0
- package/Timeline/PureTimeline/src/CursorPlugin.d.ts.map +1 -1
- package/Timeline/PureTimeline/src/TimelineLegend.d.ts +10 -7
- package/Timeline/PureTimeline/src/TimelineLegend.d.ts.map +1 -1
- package/Timeline/PureTimeline/src/TimelineTooltip.d.ts +5 -1
- package/Timeline/PureTimeline/src/TimelineTooltip.d.ts.map +1 -1
- package/Timeline/PureTimeline/src/TimelineUplot.d.ts +19 -2
- package/Timeline/PureTimeline/src/TimelineUplot.d.ts.map +1 -1
- package/Timeline/PureTimeline/src/TimelineYAxis.d.ts.map +1 -1
- package/Timeline/PureTimeline/src/XAxisPlugin.d.ts +1 -0
- package/Timeline/PureTimeline/src/XAxisPlugin.d.ts.map +1 -1
- package/Timeline/PureTimeline/src/utils/timelineUtils.d.ts +8 -0
- package/Timeline/PureTimeline/src/utils/timelineUtils.d.ts.map +1 -1
- package/Timeline/Timeline.d.ts +3 -1
- package/Timeline/Timeline.d.ts.map +1 -1
- package/Timeline.config.js +2 -2
- package/Timeline.config.js.map +2 -2
- package/Timeline.js +713 -351
- package/Timeline.js.map +4 -4
- package/Treemap/PureTreemap/components/PureTreemap.d.ts +42 -0
- package/Treemap/PureTreemap/components/PureTreemap.d.ts.map +1 -0
- package/Treemap/PureTreemap/components/TreemapBreadcrumb.d.ts +10 -0
- package/Treemap/PureTreemap/components/TreemapBreadcrumb.d.ts.map +1 -0
- package/Treemap/PureTreemap/components/TreemapChildCell.d.ts +28 -0
- package/Treemap/PureTreemap/components/TreemapChildCell.d.ts.map +1 -0
- package/Treemap/PureTreemap/components/TreemapHeader.d.ts +19 -0
- package/Treemap/PureTreemap/components/TreemapHeader.d.ts.map +1 -0
- package/Treemap/PureTreemap/components/TreemapHoverTarget.d.ts +17 -0
- package/Treemap/PureTreemap/components/TreemapHoverTarget.d.ts.map +1 -0
- package/Treemap/PureTreemap/components/TreemapLegend.d.ts +20 -0
- package/Treemap/PureTreemap/components/TreemapLegend.d.ts.map +1 -0
- package/Treemap/PureTreemap/components/TreemapNode.d.ts +5 -0
- package/Treemap/PureTreemap/components/TreemapNode.d.ts.map +1 -0
- package/Treemap/PureTreemap/components/TreemapParentNode.d.ts +10 -0
- package/Treemap/PureTreemap/components/TreemapParentNode.d.ts.map +1 -0
- package/Treemap/PureTreemap/components/TreemapStandaloneNode.d.ts +6 -0
- package/Treemap/PureTreemap/components/TreemapStandaloneNode.d.ts.map +1 -0
- package/Treemap/PureTreemap/components/TreemapTooltip.d.ts +17 -0
- package/Treemap/PureTreemap/components/TreemapTooltip.d.ts.map +1 -0
- package/Treemap/PureTreemap/mockdata/data.d.ts +90 -0
- package/Treemap/PureTreemap/mockdata/data.d.ts.map +1 -0
- package/Treemap/PureTreemap/utils/treemapColorUtils.d.ts +67 -0
- package/Treemap/PureTreemap/utils/treemapColorUtils.d.ts.map +1 -0
- package/Treemap/PureTreemap/utils/treemapDataColorUtils.d.ts +5 -0
- package/Treemap/PureTreemap/utils/treemapDataColorUtils.d.ts.map +1 -0
- package/Treemap/PureTreemap/utils/treemapDataUtils.d.ts +14 -0
- package/Treemap/PureTreemap/utils/treemapDataUtils.d.ts.map +1 -0
- package/Treemap/PureTreemap/utils/treemapLayout.d.ts +49 -0
- package/Treemap/PureTreemap/utils/treemapLayout.d.ts.map +1 -0
- package/Treemap/PureTreemap/utils/treemapNodeUtils.d.ts +81 -0
- package/Treemap/PureTreemap/utils/treemapNodeUtils.d.ts.map +1 -0
- package/Treemap/PureTreemap/utils/treemapTypes.d.ts +37 -0
- package/Treemap/PureTreemap/utils/treemapTypes.d.ts.map +1 -0
- package/Treemap/PureTreemap/utils/treemapUtils.d.ts +76 -0
- package/Treemap/PureTreemap/utils/treemapUtils.d.ts.map +1 -0
- package/Treemap/Treemap.d.ts +14 -0
- package/Treemap/Treemap.d.ts.map +1 -0
- package/Treemap/config.d.ts +4 -0
- package/Treemap/config.d.ts.map +1 -0
- package/Treemap/index.d.ts +3 -0
- package/Treemap/index.d.ts.map +1 -0
- package/Treemap.config.js +465 -0
- package/Treemap.config.js.map +7 -0
- package/Treemap.js +6349 -0
- package/Treemap.js.map +7 -0
- package/common/Charting.js +8 -10
- package/common/Charting.js.map +2 -2
- package/common/ChartingApi.d.ts.map +1 -1
- package/common/ChartingApi.js +5 -2
- package/common/ChartingApi.js.map +2 -2
- package/common/DocExampleWithVizSandbox.js +3 -3
- package/common/DocExampleWithVizSandbox.js.map +2 -2
- package/common/GaugeMajorTicks.js.map +2 -2
- package/common/GaugeValueMarker.js +1 -0
- package/common/GaugeValueMarker.js.map +2 -2
- package/common/OptionsDoc.js +1 -1
- package/common/OptionsDoc.js.map +2 -2
- package/common/OverviewDoc.js +3 -3
- package/common/OverviewDoc.js.map +2 -2
- package/common/ThemesDoc.js.map +2 -2
- package/common/TimeSeriesChartWrapper.js +10 -9
- package/common/TimeSeriesChartWrapper.js.map +2 -2
- package/common/chartingUtils.d.ts.map +1 -1
- package/common/chartingUtils.js +12 -11
- package/common/chartingUtils.js.map +2 -2
- package/common/components/IconPlaceholder.d.ts.map +1 -1
- package/common/docUtils.d.ts.map +1 -1
- package/common/docUtils.js +16 -14
- package/common/docUtils.js.map +2 -2
- package/common/editorConfig/AxesChartDataDisplay.d.ts.map +1 -1
- package/common/gaugeUtils.d.ts.map +1 -1
- package/common/gaugeUtils.js +11 -5
- package/common/gaugeUtils.js.map +2 -2
- package/common/hocs/FixedSizeContainer.d.ts.map +1 -1
- package/common/hooks/useDynamicHeight.d.ts +67 -0
- package/common/hooks/useDynamicHeight.d.ts.map +1 -0
- package/common/hooks/useSorting.d.ts.map +1 -1
- package/common/interfaces/VizCategory.d.ts +2 -1
- package/common/interfaces/VizCategory.d.ts.map +1 -1
- package/common/interfaces/VizEvent.d.ts +7 -0
- package/common/interfaces/VizEvent.d.ts.map +1 -1
- package/common/utils/dataUtils.d.ts.map +1 -1
- package/common/utils/dataUtils.js +6 -10
- package/common/utils/dataUtils.js.map +2 -2
- package/common/utils/featureFlagUtils.js +2 -2
- package/common/utils/featureFlagUtils.js.map +2 -2
- package/common/utils/focusUtils.js +1 -1
- package/common/utils/focusUtils.js.map +2 -2
- package/common/utils/mapUtils.d.ts.map +1 -1
- package/common/utils/mapUtils.js +14 -18
- package/common/utils/mapUtils.js.map +2 -2
- package/common/utils/singleValueUtils.js +22 -25
- package/common/utils/singleValueUtils.js.map +2 -2
- package/common/utils/textUtils.d.ts.map +1 -1
- package/common/utils/textUtils.js +37 -23
- package/common/utils/textUtils.js.map +2 -2
- package/common/utils/trellisUtils.d.ts.map +1 -1
- package/common/utils/trellisUtils.js +18 -17
- package/common/utils/trellisUtils.js.map +2 -2
- package/common/utils/urlUtils.js.map +2 -2
- package/common/utils/visualizationTheme.d.ts +15 -0
- package/common/utils/visualizationTheme.d.ts.map +1 -0
- package/common/utils/visualizationTheme.js +72 -0
- package/common/utils/visualizationTheme.js.map +7 -0
- package/common/withDashboardViz.d.ts +3 -1
- package/common/withDashboardViz.d.ts.map +1 -1
- package/common/withDashboardViz.js +216 -105
- package/common/withDashboardViz.js.map +4 -4
- package/docs-llm/INDEX.md +1 -0
- package/docs-llm/area/options.md +84 -84
- package/docs-llm/bar/options.md +77 -77
- package/docs-llm/bubble/options.md +51 -51
- package/docs-llm/choropleth-svg/options.md +5 -5
- package/docs-llm/column/options.md +82 -82
- package/docs-llm/ellipse/options.md +6 -6
- package/docs-llm/events/options.md +6 -6
- package/docs-llm/filler-gauge/options.md +16 -16
- package/docs-llm/image/options.md +3 -3
- package/docs-llm/line/options.md +82 -82
- package/docs-llm/link-graph/options.md +16 -16
- package/docs-llm/map/options.md +12 -12
- package/docs-llm/markdown/options.md +7 -7
- package/docs-llm/marker-gauge/options.md +16 -16
- package/docs-llm/network-graph/options.md +39 -39
- package/docs-llm/parallel-coordinates/options.md +4 -4
- package/docs-llm/pie/examples-json.md +195 -0
- package/docs-llm/pie/examples-react.md +123 -0
- package/docs-llm/pie/options.md +23 -23
- package/docs-llm/process-tree/options.md +23 -22
- package/docs-llm/punchcard/options.md +23 -23
- package/docs-llm/pure-rich-text/options.md +6 -5
- package/docs-llm/rectangle/options.md +9 -9
- package/docs-llm/rich-text/options.md +6 -5
- package/docs-llm/sankey/options.md +9 -9
- package/docs-llm/scatter/options.md +57 -57
- package/docs-llm/single-value/options.md +39 -39
- package/docs-llm/single-value-icon/options.md +33 -33
- package/docs-llm/single-value-radial/options.md +31 -31
- package/docs-llm/table/options.md +14 -13
- package/docs-llm/timeline/options.md +17 -17
- package/docs-llm/treemap/examples-json.md +5 -0
- package/docs-llm/treemap/examples-react.md +5 -0
- package/docs-llm/treemap/options.md +26 -0
- package/docs-llm/treemap/overview.md +27 -0
- package/package.json +31 -30
package/Treemap.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["src/Treemap/index.ts", "esm-externals:@splunk/visualizations-shared/dataSourceUtils", "esm-externals:react", "esm-externals:lodash", "esm-externals:@splunk/themes/getSettingsFromThemedProps", "esm-externals:@splunk/visualization-encoding/Options", "esm-externals:@splunk/visualizations-shared/SanitizeProps", "esm-externals:@splunk/visualization-context/TimezoneContext", "esm-externals:@splunk/moment", "esm-externals:@splunk/visualization-context/FeatureFlagContext", "esm-externals:styled-components", "esm-externals:@splunk/visualizations-shared/hocUtils", "esm-externals:@splunk/visualizations-shared/JSONSchemaUtils", "esm-externals:@splunk/async-dynamic-options-evaluator", "esm-externals:@splunk/ui-utils/id", "esm-externals:prop-types", "src/common/interfaces/VizActionHandler.ts", "src/common/SplunkVisualization.tsx", "src/common/interfaces/DataSource.ts", "src/common/hooks/useSorting.ts", "src/common/hooks/usePagination.ts", "src/common/hooks/useDeepMemo.ts", "esm-externals:@splunk/ui-utils/i18n", "esm-externals:@splunk/visualizations-shared/Message", "esm-externals:@splunk/visualizations-shared/SizeAwareWrapper", "src/common/components/MissingPropsMessage.tsx", "src/common/utils/hocUtils.ts", "src/common/hocs/withEditModeCover.tsx", "esm-externals:@splunk/visualizations-shared/colorUtils", "esm-externals:@splunk/themes/variables", "esm-externals:@splunk/themes", "esm-externals:@splunk/visualizations-shared/style", "src/common/hocs/FixedSizeContainer.tsx", "src/common/components/IconPlaceholder.tsx", "src/common/hocs/withPlaceholder.tsx", "esm-externals:@splunk/visualizations-shared/numberUtils", "src/common/utils/dataUtils.ts", "src/common/hooks/usePrevious.ts", "src/common/hooks/useGetXAndYFields.tsx", "src/common/hooks/useDownsampleDataSources.tsx", "esm-externals:@splunk/visualization-context/FeatureFlags", "src/common/utils/featureFlagUtils.ts", "esm-externals:@splunk/visualizations-shared/trellisUtils", "src/common/utils/trellisUtils.ts", "esm-externals:@splunk/visualization-canvas", "src/common/components/VizStyleWrapper.jsx", "esm-externals:@splunk/react-icons/Triangle", "esm-externals:@splunk/visualizations-shared/propUtils", "esm-externals:@splunk/visualizations-shared/simpleXMLOptions", "src/common/chartingUtils.ts", "esm-externals:@splunk/visualization-schemas", "src/common/hooks/useTrellisEnabled.ts", "src/common/components/TrellisTitle.tsx", "src/common/TimeSeriesChartWrapper.tsx", "src/common/withDashboardViz.tsx", "esm-externals:@splunk/visualization-color-palettes", "src/Treemap/PureTreemap/utils/treemapDataUtils.ts", "esm-externals:d3-hierarchy", "src/Treemap/PureTreemap/utils/treemapLayout.ts", "esm-externals:chroma-js", "src/Treemap/PureTreemap/utils/treemapColorUtils.ts", "src/Treemap/PureTreemap/utils/treemapUtils.ts", "src/common/utils/textUtils.ts", "src/Treemap/PureTreemap/utils/treemapNodeUtils.ts", "src/Treemap/PureTreemap/components/TreemapHoverTarget.tsx", "src/Treemap/PureTreemap/components/TreemapChildCell.tsx", "src/Treemap/PureTreemap/components/TreemapParentNode.tsx", "src/Treemap/PureTreemap/components/TreemapStandaloneNode.tsx", "src/Treemap/PureTreemap/components/TreemapNode.tsx", "src/Treemap/PureTreemap/components/TreemapBreadcrumb.tsx", "esm-externals:@splunk/react-ui/Popover", "src/Treemap/PureTreemap/components/TreemapTooltip.tsx", "src/Treemap/PureTreemap/components/TreemapLegend.tsx", "src/Treemap/PureTreemap/components/PureTreemap.tsx", "src/Treemap/PureTreemap/utils/treemapDataColorUtils.ts", "esm-externals:@splunk/visualization-color-palettes/editors/PresetPalettes", "esm-externals:@splunk/react-icons/Treemap", "esm-externals:@splunk/visualization-icons/placeholders", "esm-externals:@splunk/visualizations-shared/configUtils", "src/common/utils/configUtils.ts", "src/common/editorConfig/BackgroundColor.ts", "esm-externals:@splunk/themes/pick", "src/common/ThemedDefaults.tsx", "src/Treemap/config.ts", "src/Treemap/Treemap.tsx"],
|
|
4
|
+
"sourcesContent": ["export * from './Treemap';\nexport { default } from './Treemap';\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/dataSourceUtils\";\nexport * from \"@splunk/visualizations-shared/dataSourceUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"react\";\nexport * from \"react\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"lodash\";\nexport * from \"lodash\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/themes/getSettingsFromThemedProps\";\nexport * from \"@splunk/themes/getSettingsFromThemedProps\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-encoding/Options\";\nexport * from \"@splunk/visualization-encoding/Options\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/SanitizeProps\";\nexport * from \"@splunk/visualizations-shared/SanitizeProps\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-context/TimezoneContext\";\nexport * from \"@splunk/visualization-context/TimezoneContext\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/moment\";\nexport * from \"@splunk/moment\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-context/FeatureFlagContext\";\nexport * from \"@splunk/visualization-context/FeatureFlagContext\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"styled-components\";\nexport * from \"styled-components\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/hocUtils\";\nexport * from \"@splunk/visualizations-shared/hocUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/JSONSchemaUtils\";\nexport * from \"@splunk/visualizations-shared/JSONSchemaUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/async-dynamic-options-evaluator\";\nexport * from \"@splunk/async-dynamic-options-evaluator\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/ui-utils/id\";\nexport * from \"@splunk/ui-utils/id\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"prop-types\";\nexport * from \"prop-types\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "/* eslint-disable class-methods-use-this */\nexport interface VizActionHandler {\n /**\n * put focus on the visualization\n */\n focus(): void;\n\n /**\n * compute snapshot of this visualization\n */\n snapshot(): Record<string, unknown>; // (This is for pdf export)\n}\n\nexport class DefaultVizActionHandler {\n focus(): void {\n // noop\n }\n\n snapshot(): Record<string, unknown> {\n return null; // noop\n }\n}\n", "/* eslint-disable react/no-unused-prop-types,react/prefer-stateless-function */\nimport * as T from 'prop-types';\nimport { noop } from 'lodash';\nimport { DashboardVizProps } from './interfaces/DashboardVizProps';\nimport { DefaultVizActionHandler } from './interfaces/VizActionHandler';\n\n// this is identical to the initial height and width we use in BaseVisualization in dashboard-visualizations\nexport const INITIAL_WIDTH = 250;\nexport const INITIAL_HEIGHT = 250;\n\n/**\n * A Splunk visualization\n */\nclass SplunkVisualization {\n static readonly propTypes: Record<keyof DashboardVizProps, T.Validator<any>> = {\n /**\n * display mode\n */\n mode: T.oneOf(['view', 'edit', 'export']).isRequired,\n /**\n * width in pixel or string, defaults to 100%\n */\n width: T.oneOfType([T.string, T.number]).isRequired,\n /**\n * height in pixel or string\n */\n height: T.oneOfType([T.string, T.number]).isRequired,\n /**\n * visualization context used for dynamic option evaluation\n */\n context: T.object,\n /**\n * visualization formatting options\n */\n options: T.object,\n /**\n * A callback to update formatting options\n */\n onOptionsChange: T.func,\n /**\n * datasource state which include data and request params, object key indicate the datasource type.\n */\n dataSources: T.objectOf(\n T.shape({\n /**\n * current request params\n */\n requestParams: T.object,\n /**\n * current dataset\n */\n data: T.shape({\n fields: T.array,\n columns: T.array,\n }),\n /**\n * error\n */\n error: T.shape({\n level: T.string,\n message: T.string,\n }),\n /**\n * meta data that came with the dataset\n */\n meta: T.object,\n })\n ),\n /**\n * A callback to trigger event\n */\n onEventTrigger: T.func,\n /**\n * Inform viz if there are handlers listening to events\n */\n hasEventHandlers: T.bool,\n /**\n * A callback to communicate computed props to a consumer\n */\n onComputedProps: T.func,\n /**\n * A callback to obtain visualization api\n */\n vizActionHandlerRef: T.func,\n\n loading: T.bool,\n theme: T.object,\n /**\n * A callback to request new data with updated request params\n */\n onRequestParamsChange: T.func,\n };\n\n /**\n *\n */\n public static readonly defaults: DashboardVizProps = {\n // BaseVisualization in dashboard-visualizations uses 100% for width but 250 for height\n width: '100%',\n height: INITIAL_HEIGHT,\n dataSources: {},\n onEventTrigger: (): Record<string, unknown> => ({}),\n mode: 'view',\n hasEventHandlers: false,\n options: {},\n context: {},\n onOptionsChange: (): Record<string, unknown> => ({}),\n vizActionHandlerRef: (): DefaultVizActionHandler => new DefaultVizActionHandler(),\n onComputedProps: (): Record<string, unknown> => ({}),\n loading: false,\n onRequestParamsChange: noop,\n };\n}\n\nexport default SplunkVisualization;\n", "import { FieldEntry } from '@splunk/visualizations-shared/dataSourceUtils';\nimport { validSegmentationModes } from '@splunk/visualization-schemas';\n\nexport interface JsonColumnData {\n fields: FieldEntry[] | string[];\n columns: (string | number | null)[][];\n}\n\nexport type HighlightedSourceMap = Record<string, Record<string, boolean>>;\nexport type TagsMap = Record<string, Record<string, string[]>>;\n\nexport interface Meta {\n totalCount: number;\n sid: string;\n app: string;\n highlighted?: HighlightedSourceMap;\n tags?: TagsMap;\n}\n\nexport const validSortDirs = ['asc', 'desc', 'none'] as const;\nexport type SortDirType = (typeof validSortDirs)[number];\nexport type SegmentationType = (typeof validSegmentationModes)[number];\nexport const validOutputModes = ['json_cols', 'json'] as const;\nexport type OutputModeType = (typeof validOutputModes)[number];\n\nexport interface RequestParams {\n count?: number;\n offset?: number;\n sort?: {\n [sortKey: string]: SortDirType;\n };\n segmentation?: SegmentationType;\n // eslint-disable-next-line camelcase\n output_mode?: OutputModeType;\n}\n\nexport interface DataSource {\n requestParams: Partial<RequestParams>;\n onRequestParamsChange?: (p: Record<string, unknown>) => void;\n data: JsonColumnData;\n error?: { level: string; message: string };\n meta: Partial<Meta>;\n}\n\nexport interface DataSourceMeta {\n requestParams: Partial<RequestParams>;\n meta: Partial<Meta>;\n onRequestParamsChange: (payload: RequestParams) => void;\n}\n", "import * as T from 'prop-types';\nimport { has } from 'lodash';\nimport { DataSourceMeta, SortDirType, validSortDirs } from '../interfaces/DataSource';\n\nexport interface SortParams {\n currentSortKey?: string;\n currentSortDir?: SortDirType;\n onSort?: (e: MouseEvent, { sortKey, sortDir }: { sortKey: string; sortDir: SortDirType }) => void;\n}\n\nexport const SortParamsPropTypes = T.shape({\n currentSortKey: T.string,\n currentSortDir: T.oneOf(validSortDirs),\n onSort: T.func,\n});\n\nexport const useSortingParams = ({ requestParams, onRequestParamsChange }: DataSourceMeta): SortParams => {\n let currentSortKey: string | undefined;\n let currentSortDir: SortDirType | undefined;\n\n const nextSortDirMap: Record<SortDirType, SortDirType> = {\n asc: 'desc',\n desc: 'asc',\n none: 'asc',\n };\n\n let onSort: SortParams['onSort'];\n if (typeof onRequestParamsChange === 'function') {\n if (requestParams && has(requestParams, 'sort')) {\n currentSortKey = Object.keys(requestParams.sort).shift();\n currentSortDir = requestParams.sort[currentSortKey];\n }\n\n // undid memoization since there is a dependency on requestParams, which is a deeply nested object\n onSort = (e, { sortKey, sortDir }): void => {\n if (typeof sortKey === 'string') {\n const nextSortDir = has(nextSortDirMap, sortDir) ? nextSortDirMap[sortDir] : 'none';\n onRequestParamsChange({\n ...requestParams,\n offset: 0,\n sort: { [sortKey]: nextSortDir },\n });\n } else {\n onRequestParamsChange(requestParams);\n }\n };\n }\n\n return {\n currentSortKey,\n currentSortDir,\n onSort,\n };\n};\n", "import * as T from 'prop-types';\nimport { cloneDeep, noop } from 'lodash';\nimport * as React from 'react';\nimport { DataSourceMeta, RequestParams } from '../interfaces/DataSource';\n\nexport interface OnChangeParams {\n page?: number;\n count?: number;\n}\nexport interface PaginatorParams {\n isPaging?: boolean;\n current?: number;\n totalPages?: number;\n onChange?: (event: React.MouseEvent<HTMLButtonElement>, data: OnChangeParams) => void;\n}\n\nexport const PaginatorParamsPropTypes = T.shape({\n isPaging: T.bool,\n current: T.number,\n totalPages: T.number,\n onChange: T.func,\n});\n\nexport const usePaginationParams = ({\n requestParams,\n meta,\n onRequestParamsChange,\n}: DataSourceMeta): PaginatorParams => {\n const totalCount = meta?.totalCount || 0;\n const offset = requestParams?.offset || 0;\n const count = requestParams?.count;\n const totalPages = typeof count === 'number' && count > 0 ? Math.ceil(totalCount / count) : 0;\n const current = typeof count === 'number' && count > 0 ? Math.floor(offset / count) + 1 : 0;\n const isPaging = totalPages > 1 && typeof onRequestParamsChange === 'function';\n\n const onChangeHandler = (e, { page, count: countArg }: OnChangeParams): void => {\n const newParams: RequestParams = cloneDeep(requestParams);\n\n if (typeof countArg === 'number') {\n newParams.count = countArg;\n newParams.offset = 0;\n }\n\n const pageCount = typeof newParams.count === 'number' ? newParams.count : 10;\n if (typeof page === 'number' && page > 0) {\n newParams.count = pageCount;\n newParams.offset = (page - 1) * pageCount;\n }\n\n onRequestParamsChange(newParams);\n };\n\n return {\n isPaging,\n current,\n totalPages,\n onChange: typeof onRequestParamsChange === 'function' ? onChangeHandler : noop,\n };\n};\n", "import { useRef } from 'react';\nimport { isEqual } from 'lodash';\n\n/**\n * This hook evaluates and stores the result of a passed function and only\n * re-evaluates the function when passed dependencies change.\n *\n * It is different from the internal React useMemo in the following aspects:\n * - it only stores the last evaluated result\n * - it uses a deep equality check to determine if dependencies have changed\n *\n * Inspired by apollo-client's useDeepMemo\n *\n * @param fn the function to be executed and\n * @param dependencies an array of dependencies\n */\nexport const useDeepMemo = <FnReturnType, DepType>(\n fn: () => FnReturnType,\n dependencies: DepType\n): FnReturnType => {\n const ref = useRef<{ dependencies: DepType; value: FnReturnType }>();\n if (!ref.current || !isEqual(dependencies, ref.current.dependencies)) {\n ref.current = {\n dependencies,\n value: fn(),\n };\n }\n return ref.current.value;\n};\n", "\nimport * as defaultImport from \"@splunk/ui-utils/i18n\";\nexport * from \"@splunk/ui-utils/i18n\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/Message\";\nexport * from \"@splunk/visualizations-shared/Message\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/SizeAwareWrapper\";\nexport * from \"@splunk/visualizations-shared/SizeAwareWrapper\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import * as React from 'react';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport Message from '@splunk/visualizations-shared/Message';\nimport SizeAwareWrapper from '@splunk/visualizations-shared/SizeAwareWrapper';\nimport SplunkVisualization from '../SplunkVisualization';\n\n/**\n * @method isMissing\n * @param {any} v\n * @returns {boolean} true if the input value === null or undefined\n */\nexport const isMissing = (v): boolean => {\n return v === null || v === undefined;\n};\n\n/**\n * @method misskingKeys\n * @param {string[]} keys\n * @param {object} target\n * @returns {string[]} the keys of missing required props\n */\nexport const missingKeys = (keys: string[], target: Record<string, unknown>): string[] =>\n keys.filter(k => isMissing(target[k]));\n\nexport interface MissingPropsProps {\n width?: string | number;\n height?: string | number;\n missingProps: string[];\n backgroundColor?: string;\n}\n\n/**\n * @method MissingPropsMessage\n * @param {MissingPropsProps} props\n * @returns {React.ReactElement}\n */\nexport const MissingPropsMessage = (props: MissingPropsProps): React.ReactElement => {\n const {\n width = SplunkVisualization.defaults.width,\n height = SplunkVisualization.defaults.height,\n missingProps,\n backgroundColor,\n } = props;\n const cachedHandleResize = React.useCallback((w, h) => {\n setContainerWidth(w);\n setContainerHeight(h);\n }, []);\n const [containerWidth, setContainerWidth] = React.useState<number>(Number(width));\n const [containerHeight, setContainerHeight] = React.useState<number>(Number(height));\n return (\n <div style={{ width: containerWidth, height: containerHeight, background: backgroundColor }}>\n <SizeAwareWrapper width={width} height={height} onResize={cachedHandleResize} />\n <Message\n data-test=\"message\"\n width={width}\n height={height}\n message={_(`Missing property: ${missingProps.join(', ')}`)}\n level=\"error\"\n />\n </div>\n );\n};\n\nexport default MissingPropsMessage;\n", "import { DashboardVizProps } from '../interfaces/DashboardVizProps';\n\nexport type DashboardVizType = React.ComponentType<DashboardVizProps>;\n\n/**\n * @method extendStaticWrapperProps\n * @param {Object} props\n * @param {DashboardVizType} props.Wrapper\n * @param {DashboardVizType} props.Visualization\n */\nexport const extendStaticWrapperProps = ({\n Wrapper,\n Visualization,\n}: {\n [key: string]: DashboardVizType;\n}): void => {\n const extendProperties = ['propTypes', 'config'];\n extendProperties.forEach((prop: string): void => {\n if (Visualization[prop]) {\n // eslint-disable-next-line no-param-reassign\n Wrapper[prop] = Visualization[prop];\n }\n });\n};\n", "import * as React from 'react';\nimport styled from 'styled-components';\nimport { DashboardVizProps } from '../interfaces/DashboardVizProps';\nimport { ExtendedDashViz } from '../interfaces/ExtendedDashViz';\nimport { extendStaticWrapperProps } from '../utils/hocUtils';\n\n// Global provided via webpack\n// eslint-disable-next-line no-underscore-dangle\ndeclare const __VISION_VERSION__: string;\n\nconst Cover = styled.div`\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n`;\n\nconst Blocker = styled.div.attrs({\n 'data-splunk-visualization-version': __VISION_VERSION__,\n})`\n position: relative;\n width: 100%;\n height: 100%;\n`;\n\n/**\n * HOC that renders a cover layer in edit mode\n * @method withEditModeCover\n * @param {ExtendedDashViz} Visualization\n * @returns {ExtendedDashViz} Wrapper\n */\nconst withEditModeCover = (\n Visualization: ExtendedDashViz,\n disableEditModeCover?: boolean\n): ExtendedDashViz => {\n const Wrapper = (props: DashboardVizProps): React.ReactElement<DashboardVizProps> => {\n const { mode } = props;\n const showEditCover = mode === 'edit' && !disableEditModeCover;\n\n return (\n <Blocker>\n <Visualization {...props} />\n {showEditCover && <Cover data-test=\"edit-mode-cover\" />}\n </Blocker>\n );\n };\n extendStaticWrapperProps({ Wrapper, Visualization });\n return Wrapper as ExtendedDashViz;\n};\n\nexport default withEditModeCover;\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/colorUtils\";\nexport * from \"@splunk/visualizations-shared/colorUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/themes/variables\";\nexport * from \"@splunk/themes/variables\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/themes\";\nexport * from \"@splunk/themes\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/style\";\nexport * from \"@splunk/visualizations-shared/style\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import * as React from 'react';\nimport styled from 'styled-components';\nimport { toPx } from '@splunk/visualizations-shared/style';\nimport { isColor } from '@splunk/visualizations-shared/colorUtils';\nimport SizeAwareWrapper from '@splunk/visualizations-shared/SizeAwareWrapper';\n\n// Global provided via webpack\n// eslint-disable-next-line no-underscore-dangle\ndeclare const __VISION_VERSION__: string;\n\ninterface ItemProps {\n backgroundColor?: string;\n width?: string | number;\n}\n\nconst Item = styled.div.attrs<ItemProps>(({ width }) => ({\n style: {\n width: toPx(width),\n },\n}))<ItemProps>`\n position: relative;\n background-color: ${(props): string =>\n (isColor(props.backgroundColor) && props.backgroundColor) || props.theme.defaultBackgroundColor}};\n`;\n\ninterface FixSizeItemProps {\n backgroundColor?: string;\n height?: string | number;\n width?: string | number;\n}\n\n// Use `.attrs()` for highly dynamic styles. Ref: https://github.com/styled-components/styled-components/issues/134#issuecomment-312415291\nconst FixSizeItem = styled.div.attrs<FixSizeItemProps>(\n ({\n width,\n height,\n }): {\n style: { width?: string; height?: string };\n } => {\n // Ensure height is never negative (browsers ignore negative height)\n const validHeight = typeof height === 'number' ? Math.max(height, 1) : height;\n return {\n style: {\n ...(width && { width: toPx(width) }),\n ...(validHeight && { height: toPx(validHeight) }),\n },\n };\n }\n)<FixSizeItemProps>`\n position: relative;\n flex-direction: column;\n flex: 1;\n display: flex;\n overflow: hidden !important;\n background-color: ${(props): string =>\n (isColor(props.backgroundColor) && props.backgroundColor) || props.theme.defaultBackgroundColor}};\n`;\n\nconst ItemContent = styled.div`\n position: relative;\n min-height: 100px;\n width: 100%;\n`;\n\nconst FixSizeItemContent = styled.div`\n min-height: 0px;\n flex: 1;\n position: relative;\n box-sizing: border-box;\n overflow: hidden !important;\n`;\n\ninterface HeightAndWidthProps {\n width?: string | number;\n height?: string | number;\n backgroundColor?: string;\n}\n\nconst withFixedSizeContainer = <P extends HeightAndWidthProps>(\n Viz: React.ComponentType<P>\n): React.ComponentType<P> => {\n const FixedSizeContainer = (props: P): React.ReactElement => {\n const { width, height, backgroundColor } = props;\n\n const cachedHandleResize = React.useCallback((w, h) => {\n setContainerWidth(w);\n setContainerHeight(h);\n }, []);\n const [containerWidth, setContainerWidth] = React.useState<number>(Number(props.width));\n const [containerHeight, setContainerHeight] = React.useState<number>(Number(props.height));\n if (!height) {\n return (\n <Item data-test=\"item\" width={width} backgroundColor={backgroundColor}>\n <ItemContent>\n <Viz {...props} />\n </ItemContent>\n </Item>\n );\n }\n return (\n <FixSizeItem\n data-test=\"fix-size-item\"\n data-splunk-visualization-version={__VISION_VERSION__}\n width={width}\n height={height}\n backgroundColor={backgroundColor}\n >\n <FixSizeItemContent>\n <SizeAwareWrapper width={width} height={height} onResize={cachedHandleResize} />\n <Viz {...props} width={containerWidth} height={containerHeight} />\n </FixSizeItemContent>\n </FixSizeItem>\n );\n };\n FixedSizeContainer.displayName = 'withFixedSizeContainer';\n return FixedSizeContainer;\n};\n\nexport default withFixedSizeContainer;\n", "import * as React from 'react';\nimport styled from 'styled-components';\nimport { get } from 'lodash';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport { pick } from '@splunk/themes';\nimport Message from '@splunk/visualizations-shared/Message';\nimport { DataSource } from '../interfaces/DataSource';\nimport withFixedSizeContainer from '../hocs/FixedSizeContainer';\nimport SplunkVisualization from '../SplunkVisualization';\n\n/**\n * @method shouldShowIconPlaceholder\n * @param {object} dataSources\n * @param {boolean} loading\n * @returns {boolean}\n */\nexport const shouldShowIconPlaceholder = (\n dataSources: { [name: string]: DataSource },\n loading = false\n): boolean => {\n const data = get(dataSources, 'primary.data.columns[0]', undefined);\n const noData = data === undefined;\n const fields = get(dataSources, 'primary.data.fields[0]', undefined);\n const noFields = fields === undefined;\n return loading || noData || noFields;\n};\n\nexport interface IconPlaceholderProps {\n icon?: React.ComponentType<any>;\n width?: string | number;\n height?: string | number;\n iconColor?: string;\n backgroundColor: string;\n}\n\nconst PlaceholderContainer = styled.div`\n /* The inline token color wins when supported. Older browsers discard an\n unsupported oklch value and retain this inherited fallback instead. */\n color: ${pick({\n dark: '#fafafa',\n light: '#2c2c2c',\n })};\n`;\n\n/**\n * @method IconPlaceholder\n * @param {IconPlaceholderProps} props\n * @returns {React.ReactElement}\n */\nconst IconPlaceholder = (props: IconPlaceholderProps): React.ReactElement => {\n const {\n width = SplunkVisualization.defaults.width,\n height = SplunkVisualization.defaults.height,\n icon,\n iconColor,\n backgroundColor,\n } = props;\n\n let content = (\n <Message width={width} height={height} level=\"warning\" message={_('No DataSource Connected')} />\n );\n if (icon) {\n content = React.createElement(icon, {\n style: {\n left: '50%',\n top: '50%',\n opacity: 0.15,\n position: 'absolute',\n transform: 'translate(-50%, -50%)',\n },\n width: '50%',\n height: '50%',\n 'data-test': 'icon-placeholder',\n });\n }\n\n return (\n <PlaceholderContainer\n data-test=\"icon-placeholder-container\"\n style={{ width, height, background: backgroundColor, color: iconColor }}\n >\n {content}\n </PlaceholderContainer>\n );\n};\n\nexport default withFixedSizeContainer(IconPlaceholder);\n", "import * as React from 'react';\nimport { isColor } from '@splunk/visualizations-shared/colorUtils';\nimport variables from '@splunk/themes/variables';\nimport IconPlaceholder, { shouldShowIconPlaceholder } from '../components/IconPlaceholder';\nimport { VizBehavior } from '../interfaces/VizBehavior';\nimport { DashboardVizProps } from '../interfaces/DashboardVizProps';\nimport { DataSource } from '../interfaces/DataSource';\nimport { ExtendedDashViz } from '../interfaces/ExtendedDashViz';\nimport { extendStaticWrapperProps } from '../utils/hocUtils';\nimport SplunkVisualization from '../SplunkVisualization';\n\ntype useIconPlaceholderType = (\n dataSources: { [name: string]: DataSource },\n loading: boolean,\n options: Record<string, unknown>\n) => boolean;\n\nconst withPlaceholder = (\n Visualization: ExtendedDashViz,\n useIconPlaceholder: useIconPlaceholderType = shouldShowIconPlaceholder\n): ExtendedDashViz => {\n const { config } = Visualization;\n const { themes } = config;\n\n const Wrapper = (props: DashboardVizProps): React.ReactElement<DashboardVizProps> => {\n const {\n dataSources,\n loading,\n options,\n height = SplunkVisualization.defaults.height,\n width = SplunkVisualization.defaults.width,\n } = props;\n\n const showPlaceholder = useIconPlaceholder(dataSources, loading, options);\n const icon = config.placeholderIcon ?? config.icon;\n const iconColor = variables.contentColorActive(props);\n const bgColorFromTheme = isColor(options?.backgroundColor)\n ? options?.backgroundColor\n : themes?.defaultBackgroundColor?.(props);\n\n if (config.supports.includes(VizBehavior.PLACEHOLDER) && showPlaceholder) {\n return (\n <IconPlaceholder\n data-test=\"icon-placeholder\"\n icon={icon}\n width={width}\n height={height}\n backgroundColor={bgColorFromTheme}\n iconColor={iconColor}\n />\n );\n }\n\n return <Visualization {...props} />;\n };\n extendStaticWrapperProps({ Wrapper, Visualization });\n return Wrapper as ExtendedDashViz;\n};\n\nexport default withPlaceholder;\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/numberUtils\";\nexport * from \"@splunk/visualizations-shared/numberUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import type { FieldEntry } from '@splunk/visualizations-shared/dataSourceUtils';\nimport { startsWithNumber } from '@splunk/visualizations-shared/numberUtils';\nimport type { DashboardVizProps, DataSource, VizConfig } from '../interfaces';\nimport { VizBehavior } from '../interfaces';\nimport { ChartEvent } from '../interfaces/ChartEvent';\n\nexport const convertToArrOfObjects = (columns: (string | any[])[], fields: any[]): any[] => {\n if (!columns?.[0]?.length) return [];\n\n const data = [];\n\n for (let i = 0; i < columns[0].length; i += 1) {\n const newObj = {};\n fields.forEach((field, index) => {\n const fieldName = getFieldName(field);\n if (columns[index][i] === '') {\n newObj[fieldName] = null;\n } else {\n newObj[fieldName] = columns[index][i];\n }\n });\n data.push(newObj);\n }\n\n return data;\n};\n\nconst getFieldName = (field: FieldEntry | string): string => (typeof field === 'string' ? field : field.name);\n\n// LTTB algorithm which can be used to downsample time series data while striving to maintain\n// the spikes and overall shape of the chart\n// Copied from https://github.com/sveinn-steinarsson/flot-downsample/blob/0815010016fc94b1bbc6a010afb8aad13ada6d0d/jquery.flot.downsample.js\n// Modifications include:\n// 1) Convert to modern JavaScript(use const, let, and use array.push to push to last element of array)\n// 2) Convert to camel case\n// 3) Convert to TS and also return the indices of the points that are in the downsampled result.\n// 4) Add a new parameter preferredDownsampleIndices that correspond to the indices of points\n// that should be used in case of a tie of the max area in a bucket\nconst largestTriangleThreeBuckets = (\n data: [Date | number, number][],\n threshold: number,\n preferredDownsampleIndices: Set<number>\n): {\n downsampledData: [Date | number, number][];\n downsampledIndices: number[];\n} => {\n const dataLength = data.length;\n const downsampledIndices = [];\n if (threshold >= dataLength || threshold === 0) {\n const allIndices = data.map((values, index) => index);\n return { downsampledData: data, downsampledIndices: allIndices }; // Nothing to do\n }\n\n const sampled: [Date | number, number][] = [];\n let sampledIndex = 0;\n\n // Bucket size. Leave room for start and end data points\n const every = (dataLength - 2) / (threshold - 2);\n\n let a = 0; // Initially a is the first point in the triangle\n let maxAreaPoint: [Date | number, number];\n let maxArea: number | undefined;\n let area: number | undefined;\n let nextA: number | undefined;\n\n sampled.push(data[a]); // Always add the first point\n downsampledIndices.push(0);\n\n // eslint-disable-next-line no-plusplus\n for (let i = 0; i < threshold - 2; i++) {\n // Calculate point average for next bucket (containing c)\n let avgX = 0;\n let avgY = 0;\n let avgRangeStart = Math.floor((i + 1) * every) + 1;\n let avgRangeEnd = Math.floor((i + 2) * every) + 1;\n avgRangeEnd = Math.min(avgRangeEnd, dataLength);\n\n const avgRangeLength = avgRangeEnd - avgRangeStart;\n\n // eslint-disable-next-line no-plusplus\n for (; avgRangeStart < avgRangeEnd; avgRangeStart++) {\n avgX += Number(data[avgRangeStart][0]); // * 1 enforces Number (value may be Date)\n avgY += data[avgRangeStart][1] * 1;\n }\n avgX /= avgRangeLength;\n avgY /= avgRangeLength;\n\n // Get the range for this bucket\n let rangeOffs = Math.floor((i + 0) * every) + 1;\n const rangeTo = Math.floor((i + 1) * every) + 1;\n\n // Point a\n const pointAX = Number(data[a][0]); // Enforce Number (value may be Date)\n const pointAY = data[a][1] * 1;\n\n // eslint-disable-next-line no-multi-assign\n maxArea = area = -1;\n let maxAreaIndex = rangeOffs;\n\n // eslint-disable-next-line no-plusplus\n for (; rangeOffs < rangeTo; rangeOffs++) {\n // Calculate triangle area over three buckets\n area =\n Math.abs(\n (pointAX - avgX) * (data[rangeOffs][1] - pointAY) -\n (pointAX - Number(data[rangeOffs][0])) * (avgY - pointAY)\n ) * 0.5;\n // Modification: try to downsample the least amount of points possible when there are multiple series\n // If all points in a bucket have the same area, prioritize the one with an x index\n // that also existed from another series so we don't add another point unnecessarily.\n // By default LTTB picks the leftmost point in the bucket\n if (area > maxArea || (area === maxArea && preferredDownsampleIndices.has(rangeOffs))) {\n maxArea = area;\n maxAreaPoint = data[rangeOffs];\n nextA = rangeOffs; // Next a is this b\n // Modification: save the index of the point with the most area\n maxAreaIndex = rangeOffs;\n }\n }\n\n // eslint-disable-next-line no-plusplus\n sampled[sampledIndex++] = maxAreaPoint; // Pick this point from the bucket\n downsampledIndices.push(maxAreaIndex);\n a = nextA; // This a is the next a (chosen b)\n }\n\n // eslint-disable-next-line no-plusplus\n sampled[sampledIndex++] = data[dataLength - 1]; // Always add last\n downsampledIndices.push(dataLength - 1);\n\n return { downsampledData: sampled, downsampledIndices };\n};\n\nexport type DownsampleOptions = { threshold: number } & Pick<DashboardVizProps, 'dataSources' | 'options'>;\n\ntype CoerceYColumnResult = {\n canDownsampleColumn: boolean;\n canLooselyCoerceSomeValues: boolean;\n coercedColumn: number[];\n};\n\n/**\n * Strictly coerces the entire column to numbers if it only consists of numeric strings or numbers. Also determines\n * if at least one of the values in the column can be loosely coerced to a number.\n * If the column cannot be strictly downsampled (if it contains nulls or non-numeric strings), returns an empty array and\n * returns that it cannot downsample the column.\n */\nconst strictlyCoerceYColumn = (\n column: (string | number)[] | number[],\n options: DownsampleOptions['options']\n): CoerceYColumnResult => {\n const isNullCoercionEnabled = options.nullValueDisplay === 'zero';\n // Splunk charting allows for numbers in formats such as negative hex that\n // Number() does not support and also allows loose coercion of hex numbers (but not other formats)\n // We want to identify columns which contain at least one value that can be loosely coerced\n const canLooselyCoerceSomeValues = column.some(\n value => startsWithNumber(`${value}`) || (isNullCoercionEnabled && value === null)\n );\n\n // If not all values in column can be strictly coerced to a number, we do not downsample\n const coercedColumn: number[] = [];\n const canDownsampleColumn = !column.some(value => {\n const coercedValue = Number(value);\n const coerceValueToZero = isNullCoercionEnabled && value === null;\n\n // if it can't be parsed or isn't safe, fail\n if (\n Number.isNaN(coercedValue) ||\n coercedValue <= Number.MIN_SAFE_INTEGER ||\n coercedValue >= Number.MAX_SAFE_INTEGER ||\n (typeof value !== 'string' && typeof value !== 'number' && !coerceValueToZero)\n ) {\n return true;\n }\n // save value and continue to next\n coercedColumn.push(coercedValue);\n return false;\n });\n\n return {\n canDownsampleColumn,\n canLooselyCoerceSomeValues,\n coercedColumn: canDownsampleColumn ? coercedColumn : [],\n };\n};\n\n/**\n * Tries to coerce the x-column to numbers or dates, if it is eligible for downsampling.\n * Only strictly increasing x-columns are eligible for downsampling.\n * If the column is not eligible for downsampling, returns an empty array.\n */\nconst strictlyCoerceXColumn = (column: (string | number)[], fieldType: string): Date[] | number[] => {\n if (fieldType === 'number') {\n const coercedXColumn = column.map(Number);\n if (isColumnStrictlyIncreasing(coercedXColumn, fieldType)) {\n return coercedXColumn;\n }\n } else if (fieldType === 'time') {\n const coercedXColumn = column.map(xValue => new Date(xValue));\n if (isColumnStrictlyIncreasing(coercedXColumn, fieldType)) {\n return coercedXColumn;\n }\n }\n return [];\n};\n\nexport const isDownsamplingEnabledForViz = ({ vizConfig }: { vizConfig: VizConfig }) => {\n return vizConfig.supports?.includes(VizBehavior.DOWNSAMPLING);\n};\n\nexport const calculateThresholdOnRangeSelect = ({\n firstIndex,\n lastIndex,\n dataSources,\n width,\n}: Pick<DashboardVizProps, 'dataSources'> & {\n firstIndex: number;\n lastIndex: number;\n width: number | string;\n}): number => {\n const window = lastIndex - firstIndex + 1;\n // eslint-disable-next-line no-unsafe-optional-chaining\n const ratio = Math.round(Number(dataSources?.primary?.data?.columns[0]?.length / window) * 10) / 10;\n return Math.round(ratio * Number(width));\n};\n\n/**\n * Calculates the downsampling threshold based on the range selection. If search zoom is enabled or there is no selection,\n * then returns the width of the visualization.\n *\n * Otherwise calculates the threshold based on the ratio of the window selected compared to the size of the non-downsampled\n * data sources. Returns null if the chart event's dataset does not match the passed in primary data source or if the chart is zoomed\n * in for a categorical chart.\n */\nexport const calculateDownsamplingThreshold = ({\n enableSearchZoom,\n dataSources,\n selectChartEvent,\n width,\n xField,\n}: {\n enableSearchZoom: boolean;\n dataSources: Record<string, DataSource> | null;\n selectChartEvent: ChartEvent<'chartRangeSelect'> | null;\n width: number;\n xField: string;\n}): number | null => {\n if (enableSearchZoom || !selectChartEvent) {\n return Number(width);\n }\n\n const primaryDataSource = dataSources?.primary;\n if (!primaryDataSource) {\n return null;\n }\n\n const { startXIndex, endXIndex, currentTarget } = selectChartEvent;\n\n try {\n const xFieldIndex = primaryDataSource?.data?.fields.findIndex(field => {\n const name = typeof field === 'string' ? field : field.name;\n return name === xField;\n });\n // .indexOf is not usable here: dataSet.fields is a union type (FieldEntry[] & string[]), so indexOf(xField) fails to type-check\n const downsampledXFieldIndex = currentTarget.dataSet?.fields.findIndex(field => field === xField); // NOSONAR typescript:S7753 - see note above\n\n if (xFieldIndex === -1 || downsampledXFieldIndex === -1) {\n return null;\n }\n\n const fullSeries = primaryDataSource?.data?.columns[xFieldIndex];\n const downsampledSeries = currentTarget.dataSet.seriesList[downsampledXFieldIndex];\n\n const firstIndex = fullSeries.indexOf(downsampledSeries[startXIndex]);\n const lastIndex = fullSeries.indexOf(downsampledSeries[endXIndex]);\n\n if (firstIndex >= 0 && lastIndex >= 0 && firstIndex <= lastIndex) {\n return calculateThresholdOnRangeSelect({\n firstIndex,\n lastIndex,\n dataSources,\n width,\n });\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Error occurred while setting downsample threshold on range select event', e);\n }\n\n return null;\n};\n\nconst isColumnStrictlyIncreasing = (column: (number | Date)[], fieldType: 'number' | 'time') => {\n return column.every((value, index) => {\n if (fieldType === 'number') {\n if (Number.isNaN(value)) {\n return false;\n }\n }\n\n if (fieldType === 'time') {\n if (Number.isNaN((value as Date).getTime())) {\n return false;\n }\n }\n if (index === 0) {\n return true;\n }\n return value > column[index - 1];\n });\n};\n\n/**\n * Verifies that all of the columns that are displayed in a chart can be downsampled. Valid columns that can be\n * displayed are those that contain at least one number. We can only downsample columns that only consist of numbers.\n *\n * If all columns can be downsampled, returns the x column coerced to time/number and y columns coerced to numbers.\n * If not all columns can be downsampled, then returns empty arrays for both x and y\n */\nconst tryToCoerceAllDisplayedFields = (\n ds: DataSource,\n xField: string,\n yFields: Set<string>,\n fieldTypes: string[],\n options: DownsampleOptions['options']\n): { xColumn: Date[] | number[]; yColumns: number[][] } => {\n let xColumn: Date[] | number[] = [];\n const yColumns: number[][] = [];\n\n const canDownsample = !ds.data.fields.some((field, index) => {\n const fieldName = getFieldName(field);\n const fieldType = fieldTypes[index] ?? 'unknown';\n const column = ds.data.columns[index];\n let hasDisplayedColumnThatCantBeDownsampled = false;\n\n if (fieldName === xField) {\n xColumn = strictlyCoerceXColumn(column, fieldType);\n } else if (yFields.has(fieldName)) {\n const { coercedColumn, canLooselyCoerceSomeValues, canDownsampleColumn } = strictlyCoerceYColumn(\n ds.data.columns[index],\n options\n );\n // do not perform downsampling if a column can possibly be displayed but cannot\n // be downsampled using LTTB\n hasDisplayedColumnThatCantBeDownsampled = canLooselyCoerceSomeValues && !canDownsampleColumn;\n if (hasDisplayedColumnThatCantBeDownsampled) {\n return true;\n }\n if (canDownsampleColumn) {\n yColumns.push(coercedColumn);\n }\n }\n return false;\n });\n\n if (canDownsample) {\n return { xColumn, yColumns };\n }\n return { xColumn: [], yColumns: [] };\n};\n\nconst pickIndicesFromDataSource = (ds: DataSource, indices: Set<number>): DataSource => {\n const sortedIndices = Array.from(indices).sort((a: number, b: number) => a - b);\n const slicedColumns = [];\n ds.data.columns.forEach(column => {\n const slicedColumn = [];\n sortedIndices.forEach(index => {\n slicedColumn.push(column[index]);\n });\n slicedColumns.push(slicedColumn);\n });\n\n // update data columns with downsampled columns\n return {\n ...ds,\n data: {\n ...ds.data,\n columns: slicedColumns,\n },\n };\n};\n\nexport const downsampleDataSources = ({ dataSources, threshold, options }: DownsampleOptions) => {\n const primaryDS = dataSources?.primary;\n // only downsample time series when number of data points are over threshold\n const numPoints = primaryDS?.data?.columns[0]?.length ?? 0;\n if (Number.isNaN(threshold) || numPoints <= threshold || threshold < 2) {\n return dataSources;\n }\n\n const { xField, yFields, fieldTypes } = options;\n if (!xField || !yFields?.length || !fieldTypes?.length) {\n return dataSources;\n }\n\n const nonInternalYFields = new Set<string>(yFields.filter(yField => !yField.startsWith('_')));\n const maxPointsInDownsample = Math.min(nonInternalYFields.size * threshold, numPoints);\n\n // Do not try to downsample if there are too many downsampled pts\n // At the worst case, each series has non-overlapping downsampled pts\n // which will mean that all points will be included in the downsampled result\n // This will just lead to additional overhead due to coercing each\n // x and y field to number\n if (maxPointsInDownsample >= numPoints) {\n return dataSources;\n }\n\n const { xColumn, yColumns } = tryToCoerceAllDisplayedFields(\n primaryDS,\n xField,\n nonInternalYFields,\n fieldTypes,\n options\n );\n\n if (!yColumns.length || !xColumn.length) {\n return dataSources;\n }\n\n const downsampledDataSources = { ...dataSources };\n const downsampledIndices = new Set<number>();\n\n yColumns.forEach((yColumn, columnIndex) => {\n // perform LTTB downsampling for current series, LTTB takes an [x, y] pair\n const xyPair: [Date | number, number][] = yColumn.map((yValue, index) => {\n return [xColumn[index], yValue];\n });\n\n try {\n const { downsampledIndices: downsampledIndicesForSeries } = largestTriangleThreeBuckets(\n xyPair,\n threshold,\n downsampledIndices\n );\n downsampledIndicesForSeries.forEach(downsampleIndex => downsampledIndices.add(downsampleIndex));\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(`Error occurred while downsampling column ${columnIndex}`, e);\n }\n });\n // update data columns with downsampled columns\n downsampledDataSources.primary = pickIndicesFromDataSource(primaryDS, downsampledIndices);\n\n return downsampledDataSources;\n};\n", "import { useEffect, useRef } from 'react';\n\nexport default function usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T>();\n useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}\n", "import { useMemo } from 'react';\nimport { Options as Opts } from '@splunk/visualization-encoding/Options';\nimport type { DashboardVizProps } from '../interfaces';\n\n/**\n * Hook that evaluates the DSL for subset of a viz's options needed to determine\n * its x and y fields as well as the types of all its fields.\n */\nconst useGetXAndYFields = ({\n shouldEvaluateDSL,\n options,\n context,\n dataSources,\n}: Pick<DashboardVizProps, 'dataSources' | 'options' | 'context'> & {\n shouldEvaluateDSL: boolean;\n}) => {\n const { dataSourcesWithOnlyOnePoint, dataFrameWithOnlyOnePoint } = useMemo(() => {\n if (!shouldEvaluateDSL) {\n return {\n dataSourcesWithOnlyOnePoint: null,\n dataFrameWithOnlyOnePoint: null,\n };\n }\n\n if (!dataSources?.primary?.data?.columns?.length) {\n return {\n dataSourcesWithOnlyOnePoint: null,\n dataFrameWithOnlyOnePoint: null,\n };\n }\n const { primary: primaryDS } = dataSources;\n\n const columnsWithOnlyOnePoint = primaryDS.data.columns.map(column => {\n return [column[0]];\n });\n\n const filteredDataSources = {\n primary: {\n ...primaryDS,\n data: {\n ...primaryDS.data,\n columns: columnsWithOnlyOnePoint,\n },\n },\n };\n\n return {\n dataSourcesWithOnlyOnePoint: filteredDataSources,\n dataFrameWithOnlyOnePoint: Opts.dataFrameFromDataSource(filteredDataSources),\n };\n }, [dataSources, shouldEvaluateDSL]);\n\n const xAndYFieldsWithTypes = useMemo(() => {\n try {\n if (!dataSourcesWithOnlyOnePoint || !dataFrameWithOnlyOnePoint) {\n return options;\n }\n\n if (!options?.x || (!options?.y && !options?.y2)) {\n return options;\n }\n\n const optionsToEvaluate = {\n x: options.x,\n xField: '> x | getField()',\n y: options.y,\n yFields: options.y ? '> y | getField()' : undefined,\n y2: options.y2,\n y2Fields: options.y2 ? '> y2 | getField()' : undefined,\n fieldTypes: '> primary | getType()',\n };\n\n const {\n xField = '',\n yFields = [],\n y2Fields = [],\n fieldTypes,\n } = Opts.evaluate(\n { options: optionsToEvaluate, context },\n dataSourcesWithOnlyOnePoint,\n () => {},\n dataFrameWithOnlyOnePoint\n );\n return {\n xField,\n yFields: [...yFields, ...y2Fields],\n fieldTypes,\n };\n } catch (e) /* NOSONAR typescript:S2486 - Evaluation failure falls back to empty field data */ {\n return {\n xField: undefined,\n yFields: [],\n fieldTypes: [],\n };\n }\n }, [options, context, dataSourcesWithOnlyOnePoint, dataFrameWithOnlyOnePoint]);\n\n return xAndYFieldsWithTypes;\n};\n\nexport default useGetXAndYFields;\n", "import { useRef, useMemo, useEffect, useState } from 'react';\nimport { debounce, isEqual, pick } from 'lodash';\nimport type { DashboardVizProps } from '../interfaces';\nimport type { DownsampleOptions } from '../utils/dataUtils';\nimport { downsampleDataSources } from '../utils/dataUtils';\nimport usePrevious from './usePrevious';\nimport useGetXAndYFields from './useGetXAndYFields';\n\n// Options properties which impact/require re-downsample on change.\nconst downsampleVizOptionProperties = ['nullValueDisplay'];\n\nconst useDownsampleDataSources = ({\n dataSources,\n options,\n context,\n threshold,\n isDownsamplingEnabled,\n}: Pick<DashboardVizProps, 'dataSources' | 'options' | 'context'> & {\n threshold: number;\n isDownsamplingEnabled?: boolean;\n}) => {\n const isFirstUseEffectCall = useRef(true);\n\n const xAndYFieldsWithTypes = useGetXAndYFields({\n shouldEvaluateDSL: isDownsamplingEnabled,\n options,\n context,\n dataSources,\n });\n\n // Extract viz options that impact downsampling.\n const downsampleVizOptions = useMemo(() => pick(options, downsampleVizOptionProperties), [options]);\n const downsampleDSOptions = useMemo(\n () => ({\n ...downsampleVizOptions,\n ...xAndYFieldsWithTypes,\n }),\n [xAndYFieldsWithTypes, downsampleVizOptions]\n );\n\n const previousDownsampleDSOptions = usePrevious(downsampleDSOptions);\n const previousDataSources = usePrevious(dataSources);\n const previousThreshold = usePrevious(threshold);\n\n const [downsampledDataSources, setDownsampledDataSources] = useState(() => {\n return isDownsamplingEnabled\n ? downsampleDataSources({\n dataSources,\n threshold,\n options: downsampleDSOptions,\n })\n : dataSources;\n });\n\n const debouncedDownsampleDataSources = useMemo(() => {\n return debounce(\n (downsampleOptions: DownsampleOptions) => {\n const downsampledResult = downsampleDataSources(downsampleOptions);\n setDownsampledDataSources(downsampledResult);\n },\n 100,\n { trailing: true }\n );\n }, []);\n\n useEffect(() => {\n // don't downsample again on the use effect call that happened due to the initial render\n // this is since we already downsampled as part of the useState call\n if (isFirstUseEffectCall.current) {\n isFirstUseEffectCall.current = false;\n return;\n }\n\n if (!isDownsamplingEnabled) {\n setDownsampledDataSources(dataSources);\n return;\n }\n\n if (\n isEqual(previousDownsampleDSOptions, downsampleDSOptions) &&\n previousDataSources === dataSources &&\n previousThreshold === threshold\n ) {\n return;\n }\n\n // Debounce the downsampling so we don't have to downsample and execute DSL multiple times\n // while the viz is being resized\n debouncedDownsampleDataSources({\n dataSources,\n options: downsampleDSOptions, // Dont want to re-downsample everytime the options change\n threshold,\n });\n\n // need to detect if this runs as part of the initial render\n }, [\n dataSources,\n downsampleDSOptions,\n debouncedDownsampleDataSources,\n xAndYFieldsWithTypes,\n threshold,\n isDownsamplingEnabled,\n previousDataSources,\n previousThreshold,\n previousDownsampleDSOptions,\n ]);\n\n return downsampledDataSources;\n};\n\nexport default useDownsampleDataSources;\n", "\nimport * as defaultImport from \"@splunk/visualization-context/FeatureFlags\";\nexport * from \"@splunk/visualization-context/FeatureFlags\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import * as React from 'react';\nimport FeatureFlags from '@splunk/visualization-context/FeatureFlags';\n\nexport const getFeatureFlag = (\n context: React.Context<any> | null | undefined | Record<keyof typeof FeatureFlags, boolean>,\n flagName: string\n): boolean => {\n // look for feature flag in context first\n if (context && Object.keys(context).includes(flagName)) {\n return context[flagName];\n }\n\n // fall back to defaults\n if (Object.keys(FeatureFlags).includes(flagName)) {\n return FeatureFlags[flagName];\n }\n\n // fall back to false\n return false;\n};\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/trellisUtils\";\nexport * from \"@splunk/visualizations-shared/trellisUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import { cloneDeep, omit } from 'lodash';\nimport { FieldEntry } from '@splunk/visualizations-shared/dataSourceUtils';\nimport {\n DataSplitMode,\n CHART,\n TIMECHART,\n STATS,\n UNKNOWN,\n extractDataSourceAggregationKeysChart,\n extractDataSourceAggregationKeysStats,\n extractSplitByFieldsChartFields,\n extractSplitByFieldsForStats,\n extractSplitByFieldsForUnknown,\n} from '@splunk/visualizations-shared/trellisUtils';\nimport { DataSource } from '../interfaces/DataSource';\n\nexport type SplitDataSource = { [key: string]: { [name: string]: DataSource } };\nexport interface DataSplitResult {\n splitDataSources: SplitDataSource;\n errorCode: 'UNKNOWN_DATA_SPLIT_MODE' | 'INVALID_SPLIT_BY_FIELD' | 'UNKNOWN';\n}\nexport const AGGREGATIONS = 'aggregations';\n\n/**\n * There can be certain SPL cmds that can produce dataSource without a specific field meta info (like group_by_rank, split_by_field etc),\n * to categorize it,\n * Example1:- `index = \"_internal\" | chart count`\n * Example2:- `index=_internal | chart avg(count), max(count)`\n * Example3:- `index = \"_internal\" | stats count`\n * Example4:- `index=_internal | stats avg(count), max(count)`\n */\nexport const dataSourcesSplitByAggregationsUnknown = (dataSource: {\n [name: string]: DataSource;\n}): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let errorCode = null;\n\n if (fields?.length) {\n splitDataSources = {};\n for (let i = 0; i < fields.length; i += 1) {\n const fieldName = fields[i].name;\n if (!fieldName?.startsWith('_')) {\n splitDataSources[fieldName] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[fieldName].primary.data.fields = [fields[i]];\n splitDataSources[fieldName].primary.data.columns = [columns[i]];\n }\n }\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\nconst toFieldEntries = (fields: FieldEntry[] | string[] = []): FieldEntry[] => {\n return fields.map(field => {\n if (typeof field === 'string') {\n return { name: field };\n }\n return field;\n });\n};\n\nexport const dataSourcesSplitByAggregationsTimechartAndChart = (dataSource: {\n [name: string]: DataSource;\n}): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let splitByFields = [];\n let errorCode = null;\n\n if (fields.length > 0) {\n splitByFields = extractDataSourceAggregationKeysChart(fields);\n }\n\n if (splitByFields && splitByFields.length > 0) {\n splitDataSources = {};\n splitByFields.forEach(splitByField => {\n splitDataSources[splitByField] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[splitByField].primary.data.fields = [fields[0]];\n splitDataSources[splitByField].primary.data.columns = [columns[0]];\n fields.forEach((field: FieldEntry, idx) => {\n const fieldName = field?.name;\n if (\n fieldName !== '_time' &&\n !fieldName?.startsWith('_') &&\n field.data_source === splitByField\n ) {\n splitDataSources[splitByField].primary.data.fields.push(field);\n splitDataSources[splitByField].primary.data.columns.push(columns[idx]);\n }\n });\n });\n } else if (!splitByFields?.length && fields.length > 1) {\n // handle where data_source doesnot exist in fields\n // example1 :- index=_internal | timechart count\n // example2 :- index=_internal | timechart max(count) avg(count)\n splitDataSources = {};\n for (let i = 1; i < fields.length; i += 1) {\n const fieldName = fields[i].name;\n if (!fieldName?.startsWith('_')) {\n splitDataSources[fieldName] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[fieldName].primary.data.fields = [fields[0], fields[i]];\n splitDataSources[fieldName].primary.data.columns = [columns[0], columns[i]];\n }\n }\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\nexport const dataSourcesSplitByAggregationsStats = (dataSource: {\n [name: string]: DataSource;\n}): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let splitByFields = [];\n let errorCode = null;\n if (fields.length > 0) {\n splitByFields = extractDataSourceAggregationKeysStats(fields);\n }\n\n if (splitByFields && splitByFields.length > 0) {\n splitDataSources = {};\n splitByFields.forEach(splitByField => {\n splitDataSources[splitByField] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[splitByField].primary.data.fields = [fields[0]];\n splitDataSources[splitByField].primary.data.columns = [columns[0]];\n const idx = fields.findIndex(field => field.name === splitByField);\n if (idx > 0) {\n splitDataSources[splitByField].primary.data.fields.push(fields[idx]);\n splitDataSources[splitByField].primary.data.columns.push(columns[idx]);\n }\n });\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\nexport const dataSourcesSplitByModeTimechart = (\n dataSource: { [name: string]: DataSource },\n splitBy: string\n): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let splitByFields = [];\n let errorCode = null;\n if (fields.length > 0) {\n splitByFields = extractSplitByFieldsChartFields(fields);\n }\n if (splitByFields?.includes(splitBy)) {\n splitDataSources = {};\n const dataSourceKeys = extractDataSourceAggregationKeysChart(fields);\n const valueKeys = [];\n for (let i = 1; i < fields.length; i += 1) {\n // not including internal fields\n if (!fields[i].name?.startsWith('_')) {\n valueKeys.push(fields[i].splitby_value ? fields[i].splitby_value : fields[i].name);\n }\n }\n valueKeys.forEach(val => {\n splitDataSources[val] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[val].primary.data.fields = [{ name: fields[0].name }];\n splitDataSources[val].primary.data.columns = [[...columns[0]]];\n dataSourceKeys.forEach(dsKey => {\n fields.forEach((field, idx) => {\n if (field.data_source === dsKey && (field.splitby_value === val || field.name === val)) {\n // only push valid fields for the current split by valueKey, instead of all fields.\n splitDataSources[val].primary.data.fields.push({\n name: dsKey,\n });\n splitDataSources[val].primary.data.columns.push([...columns[idx]]);\n }\n });\n });\n });\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\nconst splitRowWise = (\n dataSource: { [name: string]: DataSource },\n columns,\n fields,\n otherSplitBy: string[],\n dataSourceKeys: string[],\n nonDataSourceAggregations: string[]\n) => {\n const splitDataSources = {};\n const valueKeys = cloneDeep(columns[0]);\n valueKeys.forEach((val, idx) => {\n splitDataSources[val] = cloneDeep(omit(dataSource, ['primary.data.fields', 'primary.data.columns']));\n splitDataSources[val].primary.data.fields = [];\n if (otherSplitBy.length) {\n splitDataSources[val].primary.data.fields = [{ name: otherSplitBy[0] }];\n }\n if (dataSourceKeys.length) {\n const columnValues = [[]];\n splitDataSources[val].primary.data.fields = [\n ...splitDataSources[val].primary.data.fields,\n ...dataSourceKeys.map(k => ({ name: k })),\n ];\n dataSourceKeys.forEach(() => {\n columnValues.push([]);\n });\n for (let i = 1; i <= Math.ceil((fields.length - 1) / dataSourceKeys.length); i += 1) {\n columnValues[0].push(fields[i].splitby_value ? fields[i].splitby_value : fields[i].name);\n dataSourceKeys.forEach((dskey, dsIndx) => {\n const mul = (fields.length - 1) / dataSourceKeys.length;\n columnValues[dsIndx + 1].push(columns[i + dsIndx * mul][idx]);\n });\n }\n splitDataSources[val].primary.data.columns = columnValues;\n } else if (nonDataSourceAggregations.length) {\n const columnValues = [];\n fields.forEach((aggregationField, fieldIdx) => {\n if (fieldIdx > 0) {\n splitDataSources[val].primary.data.fields.push(aggregationField);\n columnValues.push([columns[fieldIdx][idx]]);\n }\n });\n splitDataSources[val].primary.data.columns = columnValues;\n }\n });\n return splitDataSources;\n};\n\nconst splitColumnWise = (\n dataSource: { [name: string]: DataSource },\n columns,\n fields,\n otherSplitBy: string[],\n dataSourceKeys: string[]\n) => {\n const splitDataSources = {};\n const valueKeys = [];\n for (let i = 1; i < fields.length; i += 1) {\n valueKeys.push(fields[i].splitby_value ? fields[i].splitby_value : fields[i].name);\n }\n valueKeys.forEach(val => {\n splitDataSources[val] = cloneDeep(omit(dataSource, ['primary.data.fields', 'primary.data.columns']));\n splitDataSources[val].primary.data.fields = [\n { name: otherSplitBy[0] },\n ...dataSourceKeys.map(k => ({ name: k })),\n ];\n splitDataSources[val].primary.data.columns = [[...columns[0]]];\n dataSourceKeys.forEach(dsKey => {\n fields.forEach((field, idx) => {\n if (field.data_source === dsKey && (field.splitby_value === val || field.name === val)) {\n splitDataSources[val].primary.data.columns.push([...columns[idx]]);\n }\n });\n });\n });\n return splitDataSources;\n};\n\nexport const dataSourcesSplitByModeChart = (\n dataSource: { [name: string]: DataSource },\n splitBy: string\n): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let splitByFields = [];\n let errorCode = null;\n if (fields.length > 0) {\n splitByFields = extractSplitByFieldsChartFields(fields);\n }\n if (splitByFields?.includes(splitBy)) {\n const splitByFieldIdx = splitByFields.indexOf(splitBy);\n const otherSplitBy = splitByFields.filter(f => f !== splitBy);\n const dataSourceKeys = extractDataSourceAggregationKeysChart(fields);\n const nonDataSourceAggregations = [];\n if (\n !dataSourceKeys.length &&\n fields[0].groupby_rank === '0' &&\n fields.length &&\n !fields[1].groupby_rank\n ) {\n for (let i = 1; i < fields.length; i += 1) {\n nonDataSourceAggregations.push(fields[i].name);\n }\n }\n if (splitByFieldIdx === 0) {\n splitDataSources = splitRowWise(\n dataSource,\n columns,\n fields,\n otherSplitBy,\n dataSourceKeys,\n nonDataSourceAggregations\n );\n } else {\n splitDataSources = splitColumnWise(dataSource, columns, fields, otherSplitBy, dataSourceKeys);\n }\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\n/**\n * This method does datasplitting for 'stats' and generic cmds('makeresults','table' etc - categoried as 'unknown' splitMode).\n * The main difference is for 'stats' cmd possible splitBy fields have 'group_by_rank' in field meta info, whereas for 'unknown' cmd it can be any fieldnames\n */\nexport const dataSourcesSplitByModeStatsorUnknown = (\n dataSource: { [name: string]: DataSource },\n splitBy: string,\n splitMode?: DataSplitMode\n): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let splitByFields = [];\n let errorCode = null;\n if (fields.length > 0) {\n splitByFields =\n splitMode === UNKNOWN\n ? extractSplitByFieldsForUnknown(fields)\n : extractSplitByFieldsForStats(fields);\n }\n const splitByIndex = fields.findIndex(field => field.name === splitBy);\n if (splitByFields?.includes(splitBy)) {\n const splitByColumn = dataSource?.primary?.data?.columns[splitByIndex];\n splitDataSources = {};\n splitByColumn.forEach((val, idx) => {\n if (splitDataSources[val]) {\n splitDataSources[val].push(idx);\n } else {\n splitDataSources[val] = [idx];\n }\n });\n const cloneFields = cloneDeep(fields);\n cloneFields.splice(splitByIndex, 1);\n const valueKeys = Object.keys(splitDataSources);\n valueKeys.forEach(val => {\n const valIndices = cloneDeep(splitDataSources[val]);\n splitDataSources[val] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[val].primary.data.fields = cloneFields;\n splitDataSources[val].primary.data.columns = [];\n columns.forEach((col, idx) => {\n if (idx !== splitByIndex) {\n const newCol = valIndices.map(valIdx => col[valIdx]);\n splitDataSources[val].primary.data.columns.push(newCol);\n }\n });\n });\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\nexport const getTrellisDataSourcesBySplitMode = (\n splitMode: DataSplitMode,\n dataSources: { [name: string]: DataSource },\n trellisSplitBy: string\n): DataSplitResult => {\n let result: DataSplitResult = null;\n try {\n if (splitMode === TIMECHART) {\n result =\n trellisSplitBy === AGGREGATIONS\n ? dataSourcesSplitByAggregationsTimechartAndChart(dataSources)\n : dataSourcesSplitByModeTimechart(dataSources, trellisSplitBy);\n } else if (splitMode === STATS) {\n result =\n trellisSplitBy === AGGREGATIONS\n ? dataSourcesSplitByAggregationsStats(dataSources)\n : dataSourcesSplitByModeStatsorUnknown(dataSources, trellisSplitBy, STATS);\n } else if (splitMode === CHART) {\n result =\n trellisSplitBy === AGGREGATIONS\n ? dataSourcesSplitByAggregationsTimechartAndChart(dataSources)\n : dataSourcesSplitByModeChart(dataSources, trellisSplitBy);\n } else if (splitMode === UNKNOWN) {\n result =\n trellisSplitBy === AGGREGATIONS\n ? dataSourcesSplitByAggregationsUnknown(dataSources)\n : dataSourcesSplitByModeStatsorUnknown(dataSources, trellisSplitBy, UNKNOWN);\n }\n } catch (ex) {\n // eslint-disable-next-line no-console\n console.error('getTrellisDataSourcesBySplitMode ', ex);\n result = { splitDataSources: null, errorCode: 'UNKNOWN' };\n }\n return result;\n};\n\n/**\n * sets legendDisplay to off when a visualization is in trellis mode and not set by the user\n * @param {Boolean} isTrellisOn\n * @param {DashboardVizOpts} options\n * @param {DashboardVizOpts} defaultOptions\n * @returns { {'legendDisplay', 'off'} or {} }\n */\nexport const turnOffLegendDisplayWhenTrellisIsOn = (\n isTrellisOn: boolean,\n options: Record<string, any>\n): Record<string, string> => {\n if (isTrellisOn && !options.legendDisplay) {\n return {\n legendDisplay: 'off',\n };\n }\n return {};\n};\n\ninterface MinMax {\n min: number;\n max: number;\n}\n\n// Returns the range extended to include every numeric point in the column.\n// Non-numeric strings become NaN and are ignored by the comparisons.\nconst extendMinMaxWithColumn = (column: Array<any>, range: MinMax): MinMax =>\n column.reduce((acc, point) => {\n const pointNumber = Number(point);\n if (Number.isNaN(pointNumber)) {\n return acc;\n }\n return {\n min: Math.min(pointNumber, acc.min),\n max: Math.max(pointNumber, acc.max),\n };\n }, range);\n\nconst calculateSharedMinMax = (splitData: SplitDataSource): Array<number> => {\n let range: MinMax = { min: Infinity, max: -Infinity };\n\n Object.keys(splitData).forEach(splitByKey => {\n const datasources = splitData[splitByKey];\n Object.keys(datasources).forEach(datasourceName => {\n const dataColumns = datasources[datasourceName].data.columns;\n dataColumns.forEach(column => {\n range = extendMinMaxWithColumn(column, range);\n });\n });\n });\n\n return [range.min, range.max];\n};\n\n/**\n * determines min and max to use in trellis mode\n * @param {splitData} SplitDataSource\n * @returns {Array<number | string>} [min, max]\n */\nexport const determineMinMax = (\n splitData: SplitDataSource,\n trellisSharedScale: boolean,\n yAxisMin: number | string,\n yAxisMax: number | string,\n stackMode?: string\n) => {\n if (!trellisSharedScale || stackMode === 'stacked100' || (yAxisMin !== 'auto' && yAxisMax !== 'auto'))\n return [yAxisMin, yAxisMax];\n\n const [sharedMin, sharedMax] = calculateSharedMinMax(splitData);\n\n const shouldUseSharedMax = sharedMax !== -Infinity && yAxisMax === 'auto';\n const shouldUseSharedMin = sharedMin !== Infinity && yAxisMin === 'auto';\n\n return [shouldUseSharedMin ? sharedMin : yAxisMin, shouldUseSharedMax ? sharedMax : yAxisMax];\n};\n", "\nimport * as defaultImport from \"@splunk/visualization-canvas\";\nexport * from \"@splunk/visualization-canvas\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import styled from 'styled-components';\n\nconst VizStyleWrapper = styled.div.attrs(({ dataTestKey }) => ({\n 'data-test': dataTestKey,\n 'data-testid': dataTestKey,\n}))`\n display: flex;\n justify-content: center;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background-color: ${props => props.backgroundColor};\n`;\n\nVizStyleWrapper.displayName = 'VizStyleWrapper';\n\nexport default VizStyleWrapper;\n", "\nimport * as defaultImport from \"@splunk/react-icons/Triangle\";\nexport * from \"@splunk/react-icons/Triangle\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/propUtils\";\nexport * from \"@splunk/visualizations-shared/propUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/simpleXMLOptions\";\nexport * from \"@splunk/visualizations-shared/simpleXMLOptions\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import { has, isArray, isUndefined } from 'lodash';\nimport React from 'react';\nimport styled from 'styled-components';\nimport variables from '@splunk/themes/variables';\nimport Triangle from '@splunk/react-icons/Triangle';\nimport { adjustOptionsToSchema } from '@splunk/visualizations-shared/propUtils';\nimport { getSimpleXMLOptionsForProps } from '@splunk/visualizations-shared/simpleXMLOptions';\nimport {\n BottomLegendFactory,\n Legend,\n SideLegendFactory,\n LeftLegendFactory,\n TopLegendFactory,\n ScaleConfig,\n shortenNumber,\n SeriesConfig,\n EventAnnotation,\n EventAnnotationRendererProps,\n} from '@splunk/visualization-canvas';\nimport type { LegendTruncation } from '@splunk/visualization-canvas';\nimport type { JsonColumnData } from './interfaces/DataSource';\n\ninterface ChartOptions {\n [key: string]: any;\n}\n\ninterface TransformAxisChartOptionsParams {\n originalOptions: Record<string, any>;\n optionsSchema: Record<string, any>;\n chart: string;\n convertToSCProps: (options: Record<string, any>) => Record<string, any>;\n preservedProps: string[];\n}\n\nexport const SHARED_AXIS_CHART_CANVAS_SPECIFIC_PROPS = [\n 'yAxisMin',\n 'yAxisMax',\n 'y2AxisMin',\n 'y2AxisMax',\n 'showXMajorGridLines',\n 'showYMajorGridLines',\n 'showY2MajorGridLines',\n 'showYMinorGridLines',\n 'showY2MinorGridLines',\n 'xAxisMajorTickVisibility',\n 'xAxisMajorTickSize',\n 'yAxisMajorTickVisibility',\n 'y2AxisMajorTickVisibility',\n 'yAxisMajorTickSize',\n 'y2AxisMajorTickSize',\n 'yAxisMinorTickVisibility',\n 'y2AxisMinorTickVisibility',\n 'yAxisMinorTickSize',\n 'y2AxisMinorTickSize',\n 'legendMode',\n 'legendTruncation',\n];\n\nexport const transformAxisChartOptions = ({\n originalOptions,\n optionsSchema,\n chart,\n convertToSCProps,\n preservedProps,\n}: TransformAxisChartOptionsParams): Record<string, any> => {\n const returnOptions = adjustOptionsToSchema(originalOptions, optionsSchema);\n const convertedOptions = convertToSCProps(returnOptions);\n const transformed = {\n ...getSimpleXMLOptionsForProps(convertedOptions),\n chart,\n };\n\n const preserved = preservedProps.reduce(\n (acc, prop) => {\n if (returnOptions[prop] !== undefined) {\n acc[prop] = returnOptions[prop];\n }\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Preserve legendLabels as stringified JSON (converted in convertTo*SCProperties)\n if (convertedOptions.legendLabels !== undefined) {\n preserved.legendLabels = convertedOptions.legendLabels;\n }\n\n return { ...transformed, ...preserved };\n};\n\nexport const DEFAULT_LINE_WIDTH = 2;\n/**\n * Get formatted annotations - highcharts expects annotations in a specific format\n * @method getAnnotations\n * @param {Object} options\n * @param {Array} options.annotationX\n * @param {Array} options.annotationColor\n * @param {Array} options.annotationLabel\n * @returns {Array}\n */\nexport const getAnnotations = ({ annotationX, annotationColor, annotationLabel }) =>\n annotationX?.length\n ? annotationX.map((timestamp, i) => ({\n color: annotationColor?.[i],\n label: annotationLabel?.[i],\n time: timestamp,\n }))\n : [];\n\n/**\n * Get formatted annotations for canvas - viz-canvas timeseries expects annotations in a specific format\n * @method getAnnotationsForCanvas\n * @param {Object} options\n * @param {Array} options.annotationX\n * @param {Array} options.annotationColor\n * @param {Array} options.annotationLabel\n * @returns {Array}\n */\nexport const getAnnotationsForCanvas = ({\n annotationX,\n annotationColor,\n annotationLabel,\n}): EventAnnotation[] =>\n annotationX?.length\n ? annotationX.map((timestamp, i) => ({\n key: annotationLabel?.[i],\n time: timestamp,\n color: annotationColor?.[i],\n }))\n : [];\n\n/**\n * Styled Triangle component for event annotations with default severityColorNotice\n */\nconst StyledTriangle = styled(Triangle)<{ eventColor?: string }>`\n color: ${props => props.eventColor || variables.severityColorNotice(props)};\n`;\n\n/**\n * Custom event annotation renderer using Triangle icon from @splunk/react-icons\n * @method triangleEventAnnotationRenderer\n * @param {EventAnnotationRendererProps} props\n * @returns {ReactElement}\n */\nexport const triangleEventAnnotationRenderer: React.FC<EventAnnotationRendererProps> = ({\n event,\n dimensions,\n}) => {\n const eventWithColor = event as EventAnnotation & { color?: string };\n return React.createElement(StyledTriangle, {\n width: `${dimensions.width}px`,\n height: `${dimensions.height}px`,\n viewBox: '0 0 24 24',\n variant: 'filled',\n eventColor: eventWithColor.color,\n });\n};\n\n/**\n * Truncate the result set to given limit\n * @method truncateData\n * @param {Object} dataSet - dataSources.primary.data\n * @param {Number|String} truncationLimit - options['chart.resultTruncationLimit']\n * @returns {Object}\n */\nexport const truncateData = (dataSet, truncationLimit): Record<string, any[]> => {\n if (!dataSet) {\n return null;\n }\n\n const limit = Number.parseInt(truncationLimit, 10);\n if (!limit || limit <= 0) {\n return dataSet;\n }\n\n const truncatedData: Record<string, Array<string[] | number[]>> = {\n ...dataSet,\n };\n truncatedData.columns = truncatedData.columns.map(columnData =>\n columnData && Array.isArray(columnData) ? columnData.slice(0, limit) : columnData\n );\n return truncatedData;\n};\n\n/**\n * Helper method to update the option values into the values that SC accepts\n * @method mapToValues\n * @param {Object} options\n * @returns {Object}\n */\nexport const mapToValues = (optionValuesSCMapping: Record<string, any>) => options => {\n const convertedOptions: Record<string, any> = { ...options };\n Object.keys(optionValuesSCMapping).forEach(key => {\n if (has(options, key)) {\n const updatedValue = optionValuesSCMapping[key][options[key]];\n if (!isUndefined(updatedValue)) {\n convertedOptions[key] = updatedValue;\n }\n }\n });\n return convertedOptions;\n};\n\ninterface Y2AxisOptions extends ChartOptions {\n y2Fields?: string | string[];\n}\n\n/**\n * Helper method to process options related to y2Fields\n * @method convertY2AxisOptions\n * @param {Object} originalOptions\n * @returns {Object}\n */\nexport const convertY2AxisOptions = ({\n y2Fields,\n ...originalOptions\n}: Y2AxisOptions): Record<string, any> => {\n const convertedOptions: Record<string, any> = {\n ...originalOptions,\n };\n if (y2Fields) {\n convertedOptions['axisY2.enabled'] = true;\n convertedOptions['axisY2.fields'] = isArray(y2Fields) ? y2Fields.filter(Boolean).join(',') : y2Fields;\n }\n return convertedOptions;\n};\n\n/**\n * Helper method to format value for overlayFields\n * @method convertOverlayFields\n * @param {Object} originalOptions\n * @returns {Object}\n */\nexport const convertOverlayFields = (originalOptions: ChartOptions): ChartOptions => {\n const convertedOptions: ChartOptions = {\n ...originalOptions,\n };\n const { overlayFields } = originalOptions;\n if (overlayFields) {\n convertedOptions.overlayFields = Array.isArray(overlayFields)\n ? overlayFields\n .filter(Boolean)\n .map(field => field.trim())\n .join(',')\n : overlayFields;\n }\n return convertedOptions;\n};\n\n/**\n * checks whether data is multi series data\n * @param {array} data array\n * @return {Boolean}\n */\nexport const isMultiSeriesData = (data: string[] | string[][]): boolean =>\n Array.isArray(data) && Array.isArray(data[0]);\n/**\n * checks whether data is multi series data and returns value as array\n * @param {array} data array\n * @param {*} value to return as array\n * @return {array}\n */\nexport const toArrayForSeries = (data, value): any[] => {\n if (isMultiSeriesData(data)) {\n return Array.isArray(value) ? value : [value];\n }\n return [value];\n};\ninterface ConstructFieldsAndColumnsParams {\n x: string[];\n y: string[] | string[][];\n xField: string;\n yFields: string | string[];\n y2?: string[] | string[][];\n y2Fields?: string | string[];\n}\nexport const constructFieldsAndColumns = ({\n x = [],\n y = [],\n xField,\n yFields,\n y2,\n y2Fields,\n}: ConstructFieldsAndColumnsParams): JsonColumnData => {\n const columns = [x.map(String), ...toArrayForSeries(y, y).map(series => series.map(String))];\n const yFieldsArray = toArrayForSeries(y, yFields);\n const fields = [{ name: xField }, ...yFieldsArray.map(field => ({ name: field }))];\n // splunk-charting requires y2 to be part of columns\n // when y & y2 options are configured with different (mutually exclusive) series\n // y2 columns need to be added to columns\n if (y2Fields) {\n const y2FieldsArray = toArrayForSeries(y2, y2Fields);\n const y2AsArray = toArrayForSeries(y2, y2).map(series => series?.map(String));\n y2FieldsArray.forEach((y2Field, index) => {\n if (!yFieldsArray.includes(y2Field) && y2AsArray[index]) {\n fields.push({\n name: y2Field,\n });\n columns.push(y2AsArray[index]);\n }\n });\n }\n return {\n columns,\n fields,\n };\n};\n\nexport function constructAdditionalTooltipFieldsMap({ fields, columns, additionalTooltipFields }) {\n const map = {};\n\n additionalTooltipFields?.forEach(fieldName => {\n const index = fields.findIndex(f => f.name === fieldName);\n if (index !== -1) {\n map[fieldName] = columns[index];\n }\n });\n\n return map;\n}\n\n/**\n * Extracts additional tooltip values from columns and fields into an array of objects.\n * Each object in the array represents the values at a specific data point index.\n * This follows the same pattern used by Timeline visualization.\n *\n * @param columns - Array of column data\n * @param fields - Array of field definitions with name property\n * @param additionalTooltipFields - Array of field names to extract\n * @returns Array of objects, where each object maps field names to values at that index\n */\n// Type alias for a single tooltip field value record\ntype TooltipFieldRecord = Record<string, string | number | null>;\n\nexport function extractAdditionalTooltipValues(\n columns: (string | number | null)[][],\n fields: { name: string }[],\n additionalTooltipFields: string[]\n): TooltipFieldRecord[] {\n if (!additionalTooltipFields?.length || !columns?.length || !fields?.length) {\n return [];\n }\n\n // Create a mapping of field names to their column indices\n const fieldIndexMap = fields.reduce<Record<string, number>>((acc, field, index) => {\n acc[field.name] = index;\n return acc;\n }, {});\n\n const numRows = columns[0]?.length || 0;\n const additionalTooltipValuesArray: TooltipFieldRecord[] = [];\n\n for (let i = 0; i < numRows; i += 1) {\n const tooltipObject: TooltipFieldRecord = {};\n\n additionalTooltipFields.forEach(fieldName => {\n if (fieldName in fieldIndexMap) {\n const columnIndex = fieldIndexMap[fieldName];\n tooltipObject[fieldName] = columns[columnIndex]?.[i] ?? null;\n } else {\n tooltipObject[fieldName] = null;\n }\n });\n\n additionalTooltipValuesArray.push(tooltipObject);\n }\n\n return additionalTooltipValuesArray;\n}\n\nexport type AdditionalTooltipResult = TooltipFieldRecord[];\n\ntype AdditionalTooltipValuesCache = {\n columns: unknown;\n fields: unknown;\n additionalTooltipFields: string[] | undefined;\n result: AdditionalTooltipResult | undefined;\n};\n\nexport const areStringArraysEqual = (a: string[] | undefined, b: string[] | undefined): boolean => {\n if (a === b) return true;\n if (!a || !b) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i += 1) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n};\n\nexport const createAdditionalTooltipValuesMemoizer = () => {\n let cache: AdditionalTooltipValuesCache = {\n columns: null,\n fields: null,\n additionalTooltipFields: undefined,\n result: undefined,\n };\n\n return (\n columns: (string | number | null)[][],\n fields: { name: string }[],\n additionalTooltipFields: string[] | undefined\n ): AdditionalTooltipResult | undefined => {\n if (\n cache.columns === columns &&\n cache.fields === fields &&\n areStringArraysEqual(cache.additionalTooltipFields, additionalTooltipFields)\n ) {\n return cache.result;\n }\n\n let result: AdditionalTooltipResult | undefined;\n if (additionalTooltipFields?.length && columns && fields) {\n result = extractAdditionalTooltipValues(columns, fields, additionalTooltipFields);\n }\n\n cache = {\n columns,\n fields,\n additionalTooltipFields,\n result,\n };\n\n return result;\n };\n};\n\n// Note: we are making the assumption that attaching a range.select listener means the user wants to enable search zoom\n// This is because we don't know if the time range tokens being updated by the drilldown is used by the current viz.\n// In the future we are considering using a shared context to pass this information from UDF to Viz.\ninterface OptionsProps {\n events?: string[];\n selectedItemId?: string;\n [key: string]: unknown;\n}\ninterface EventHandler {\n type: string;\n options: OptionsProps;\n}\n\nexport const shouldEnableSearchZoom = (eventHandlers: EventHandler[] = [], xField = '') => {\n const rangeSelectEventHandler = eventHandlers.find(eventHandler =>\n eventHandler.options.events?.includes('range.select')\n );\n // Check if xField is _time. This is how splunk-charting distinguishes a time chart from categorical.\n // Note: search zoom will be buggy if the x axis uses timestamp values but is not _time\n const xAxisIsTime = xField === '_time';\n\n return !!rangeSelectEventHandler && xAxisIsTime;\n};\n\nconst canvasSupportedTimeSeriesCharts = new Set(['splunk.line', 'splunk.area']);\nexport const isTimeSeriesCanvasRenderSupported = (vizConfigKey: string): boolean => {\n return canvasSupportedTimeSeriesCharts.has(vizConfigKey);\n};\n\ntype ChartData = {\n fields: (string | { name: string })[];\n columns: (string | number)[][];\n};\n\n// Filter all internal fields and columns except for _time fild\nexport const filterChartDataFromInternalFields = (chartData: ChartData): ChartData => {\n const { fields, columns } = chartData;\n\n // Determine the indexes to keep\n const keepIndexes = fields.reduce<number[]>((acc, field, index) => {\n const fieldName = typeof field === 'object' ? field?.name : field;\n if (!fieldName?.startsWith('_') || fieldName === '_time') {\n acc.push(index);\n }\n return acc;\n }, []);\n\n // Filter fields and columns\n const filteredFields = keepIndexes.map(index => fields[index]);\n const filteredColumns = keepIndexes.map(index => columns[index]);\n\n return { fields: filteredFields, columns: filteredColumns };\n};\n\nexport const isTimeField = (field): boolean => {\n return (\n (typeof field === 'object' && field?.name === '_time') ||\n (typeof field === 'string' && field === '_time')\n );\n};\n\nexport const convert2DArrayToNumbers = arr => {\n return arr.map(subArray => subArray.map(element => Number.parseFloat(element)));\n};\n\nexport const convertTimeStringToUnix = arr => {\n return arr.map(timeStr => Number.parseInt((new Date(timeStr).getTime() / 1000).toFixed(0), 10));\n};\n\n/**\n * Parses an axis value that may be 'auto', null, undefined, empty string, or a numeric value.\n * Returns undefined for non-numeric values, allowing the renderer to auto-calculate the range.\n * @param {any} val - The value to parse (string, number, null, undefined)\n * @returns {number | undefined} - Parsed number or undefined\n */\nexport const parseAxisValue = (val: any): number | undefined => {\n if (val === undefined || val === null || val === 'auto' || val === '') {\n return undefined;\n }\n const num = typeof val === 'number' ? val : Number.parseFloat(val);\n return Number.isNaN(num) ? undefined : num;\n};\n\n/**\n * Parses X-axis line visibility option from string to boolean or undefined.\n * @param {string | undefined} visibility - The visibility option ('hide', 'show', or other)\n * @returns {boolean | undefined} - false for 'hide', true for 'show', undefined otherwise\n */\nexport const parseXAxisLineVisibility = (visibility?: string): boolean | undefined => {\n if (visibility === 'hide') return false;\n if (visibility === 'show') return true;\n return undefined;\n};\n\n// Legend placement logic for canvas render, used in TimeseriesChartWrapper\nexport const getLegend = (props: {\n legendDisplay: string;\n isSeriesCompare: boolean;\n legendTruncation?: LegendTruncation;\n}): Legend | false => {\n const legendPlacement = props?.legendDisplay;\n const { isSeriesCompare, legendTruncation } = props;\n const commonLegendProps = {\n center: true,\n fontSize: 12,\n largerTiles: true,\n hideSeriesValue: !isSeriesCompare, // Show values if in seriesCompare mode\n legendTruncation,\n };\n\n // \"right\" | \"left\" | \"top\" | \"bottom\" | \"off\"\n switch (legendPlacement) {\n case 'off':\n return false;\n case 'left':\n return LeftLegendFactory({\n ...commonLegendProps,\n });\n case 'bottom':\n return BottomLegendFactory({\n wrap: true,\n ...commonLegendProps,\n });\n case 'top':\n return TopLegendFactory({\n wrap: true,\n ...commonLegendProps,\n });\n // Note: By default, use right legend\n default:\n return SideLegendFactory({\n ...commonLegendProps,\n });\n }\n};\n\nexport const getComputedAxisTitles = (\n inputAxisTitle: string,\n fields: string[],\n axisTitleVisibility: 'show' | 'collapsed'\n): string => {\n if (axisTitleVisibility === 'collapsed') {\n return '';\n }\n let fieldTitle = fields.length > 1 ? '' : fields[0]; // If more than one series (multi-series) default empty title\n if (!fieldTitle) {\n fieldTitle = '';\n }\n return inputAxisTitle?.length ? inputAxisTitle.trim() : fieldTitle;\n};\n\n/**\n * Truncates Y-axis title based on available container height and font metrics\n * @param axisTitle - The title text to potentially truncate\n * @param containerSpacing - Available height/ width in pixels depending on axis orientation\n * @param fontSize - Font size in pixels (default: 12)\n * @returns Truncated title with ellipsis if needed\n */\nexport const ellipsisAxisTitle = (axisTitle: string, containerSpacing: number, fontSize = 12): string => {\n if (!axisTitle) {\n return '';\n }\n if (Number.isNaN(containerSpacing) || containerSpacing <= 0) {\n return axisTitle;\n }\n // Calculate available height for text (leave 40% margin)\n const availableHeight = containerSpacing * 0.6;\n\n // Use a generic character width ratio that works across most fonts\n // 0.55 is a reasonable average for most fonts\n const avgCharWidth = fontSize * 0.55;\n\n // Calculate maximum characters that fit in available height\n const maxChars = Math.floor(availableHeight / avgCharWidth);\n\n // If title fits, return as-is\n if (axisTitle.length <= maxChars) {\n return axisTitle;\n }\n\n // Need to truncate - use middle ellipsis for better context\n if (maxChars <= 3) {\n return '...'; // Not enough space for meaningful text\n }\n\n // Reserve 3 characters for ellipsis\n const availableChars = maxChars - 3;\n const halfChars = Math.floor(availableChars / 2);\n\n // Create truncated title with middle ellipsis\n const start = axisTitle.slice(0, halfChars);\n const end = axisTitle.slice(-halfChars);\n\n return `${start}...${end}`;\n};\n\nexport type FieldObject = {\n name: string;\n};\n\nexport const getFieldName = (field: string | FieldObject): string => {\n const fieldName = typeof field === 'object' ? field?.name : field;\n return fieldName;\n};\n\nexport const getFieldNames = (fields: (string | FieldObject)[]): string[] => {\n return fields.map(field => getFieldName(field));\n};\n\n/**\n * Type alias for axis label visibility options\n */\nexport type AxisLabelVisibility = 'hide' | 'show' | 'auto';\n\n/**\n * Returns X scale config for viz-canvas charts\n * @param label\n * @param xAxisLabelVisibility\n * @returns\n */\nexport const getXScaleConfig = (\n label: string,\n xAxisLabelVisibility?: AxisLabelVisibility,\n xAxisLabelRotation?: -90 | -45 | 0 | 45 | 90\n): ScaleConfig => {\n const xConfig: ScaleConfig = { x: {} };\n xConfig.x.label = label;\n // Set hideLabels to true when xAxisLabelVisibility is \"hide\"\n if (xAxisLabelVisibility === 'hide') {\n xConfig.x.hideLabels = true;\n }\n // Set labelRotation if provided\n if (xAxisLabelRotation !== undefined) {\n xConfig.x.labelRotation = xAxisLabelRotation;\n }\n return xConfig;\n};\n\n/**\n * Returns Y scale config for viz-canvas charts\n * @param label\n * @param yAxisAbbreviation\n * @param yAxisScale\n * @param yAxisLabelVisibility\n * @param yAxisMin\n * @param yAxisMax\n * @returns\n */\nexport const getYScaleConfig = (\n label: string,\n yAxisAbbreviation: string,\n yAxisScale?: 'linear' | 'log',\n yAxisLabelVisibility?: AxisLabelVisibility,\n yAxisMin?: number,\n yAxisMax?: number\n): ScaleConfig => {\n const scaleType = yAxisScale ?? 'linear';\n const yConfig: ScaleConfig = { y: {} };\n yConfig.y.label = label;\n yConfig.y.type = scaleType;\n if (yAxisAbbreviation !== 'none') {\n yConfig.y.tickFmt = (v): string => shortenNumber(v, 1);\n }\n // Only set fixed width when abbreviation is ON\n // When abbreviation is OFF, width remains undefined to allow dynamic sizing in uplot-utils\n // based on actual data label lengths\n if (yAxisAbbreviation !== 'none') {\n yConfig.y.width = label && label.length > 0 ? 30 : 10;\n }\n if (yAxisLabelVisibility === 'hide') {\n yConfig.y.hideLabels = true;\n }\n if (yAxisMin !== undefined || yAxisMax !== undefined) {\n yConfig.y.range = (u, dataMin, dataMax) => {\n const min = yAxisMin ?? dataMin;\n const max = yAxisMax ?? dataMax;\n return [min, max];\n };\n }\n return yConfig;\n};\n/**\n * Returns Y2 scale config for viz-canvas charts\n * @param label\n * @param axisAbbreviation\n * @param axisScale\n * @param roundAxisLabelsToInteger\n * @param y2AxisLabelVisibility\n * @param y2AxisMin\n * @param y2AxisMax\n * @returns\n */\nexport const getY2ScaleConfig = (\n label: string,\n axisAbbreviation: string,\n axisScale?: 'linear' | 'log',\n roundAxisLabelsToInteger?: boolean,\n y2AxisLabelVisibility?: AxisLabelVisibility,\n y2AxisMin?: number,\n y2AxisMax?: number\n): ScaleConfig => {\n const y2Config: ScaleConfig = { y2: {} };\n const scaleType = axisScale ?? 'linear';\n y2Config.y2.label = label;\n y2Config.y2.side = 'right';\n // Note: showGrid is intentionally not set here so that the top-level\n // showY2MajorGridLines prop can control it (defaults to false)\n y2Config.y2.type = scaleType;\n if (axisAbbreviation !== 'none') {\n y2Config.y2.tickFmt = (v): string => shortenNumber(v, 1, roundAxisLabelsToInteger);\n // Set width for abbreviated Y2 axis\n // Y2 needs more width (50px) than Y-axis (30px) because of rotated title positioning\n // Width will be used to detect abbreviation setting in padding calculations\n y2Config.y2.width = label && label.length > 0 ? 50 : 10;\n } else if (roundAxisLabelsToInteger) {\n y2Config.y2.tickFmt = (v): string =>\n roundAxisLabelsToInteger ? Math.round(v).toString() : v.toString();\n }\n if (y2AxisLabelVisibility === 'hide') {\n y2Config.y2.hideLabels = true;\n }\n if (y2AxisMin !== undefined || y2AxisMax !== undefined) {\n y2Config.y2.range = (u, dataMin, dataMax) => {\n const min = y2AxisMin ?? dataMin;\n const max = y2AxisMax ?? dataMax;\n return [min, max];\n };\n }\n return y2Config;\n};\n\n/**\n * Add series overrides for viz-canvas charts (for eg:- line width)\n */\nconst getSeriesType = (\n isOverlay: boolean,\n isAreaChart: boolean,\n isStacked: boolean\n): SeriesConfig[string]['type'] | undefined => {\n if (isOverlay) return 'line';\n if (!isAreaChart) return undefined;\n return isStacked ? 'stacked-area' : 'area';\n};\n\nconst getY2Scale = (\n field: string,\n y2fields: string[] | undefined,\n overlayFields: string[] | undefined\n): 'y' | 'y2' => {\n const assignToY2 =\n (y2fields?.length > 0 && y2fields.includes(field)) ||\n (!y2fields?.length && overlayFields?.includes(field));\n return assignToY2 ? 'y2' : 'y';\n};\n\nexport const getSeriesOverrides = (opts: {\n yfields: string[];\n y2fields?: string[];\n lineWidth?: number;\n overlayFields?: string[];\n y2Enabled?: boolean;\n nullValueMode?: 'gaps' | 'connect' | 'zero';\n markerDisplay?: 'off' | 'filled' | 'outlined';\n lineDashStyle?: string;\n lineDashStylesByField?: Record<string, string>;\n stepPosition?: 'off' | 'before' | 'after';\n stepPositionsByField?: Record<string, 'off' | 'before' | 'after'>;\n type?: 'line' | 'area';\n stackMode?: 'auto' | 'stacked' | 'stacked100';\n showLines?: boolean;\n}): SeriesConfig => {\n const {\n yfields,\n y2fields,\n lineWidth,\n overlayFields,\n y2Enabled,\n nullValueMode,\n markerDisplay,\n lineDashStyle,\n lineDashStylesByField,\n stepPosition,\n stepPositionsByField,\n type,\n stackMode,\n showLines,\n } = opts;\n const seriesConfig: SeriesConfig = {};\n\n let spanGaps: boolean | undefined;\n if (nullValueMode === 'gaps') {\n spanGaps = false;\n } else if (nullValueMode == null) {\n spanGaps = undefined;\n } else {\n spanGaps = true;\n }\n const replaceNullsWithZero = nullValueMode === 'zero' ? true : undefined;\n\n const isAreaChart = type === 'area';\n const isStacked = isAreaChart && (stackMode === 'stacked' || stackMode === 'stacked100');\n\n // Non-overlay area fields first, then overlay fields - so overlays render on top\n const areaFields = isAreaChart ? yfields.filter(f => !overlayFields?.includes(f)) : yfields;\n const overlayFieldsInOrder = overlayFields?.filter(f => yfields.includes(f)) ?? [];\n const orderedFields = isAreaChart ? [...areaFields, ...overlayFieldsInOrder] : yfields;\n\n orderedFields.forEach(field => {\n const isOverlay = overlayFields?.includes(field) ?? false;\n const isPercent = isAreaChart && stackMode === 'stacked100' && !isOverlay;\n const shouldHideAreaOutline = isAreaChart && showLines === false && !isOverlay;\n\n seriesConfig[field] = {\n overrides: {\n width: shouldHideAreaOutline ? 0 : (lineWidth ?? DEFAULT_LINE_WIDTH),\n ...(isPercent ? ({ stacking: { mode: 'percent', group: 'A' } } as object) : {}),\n } as SeriesConfig[string]['overrides'],\n };\n\n const seriesType = getSeriesType(isOverlay, isAreaChart, isStacked);\n if (seriesType !== undefined) seriesConfig[field].type = seriesType;\n\n if (spanGaps !== undefined) seriesConfig[field].overrides.spanGaps = spanGaps;\n\n if (y2Enabled) seriesConfig[field].overrides.scale = getY2Scale(field, y2fields, overlayFields);\n\n if (markerDisplay !== undefined) seriesConfig[field].markerDisplay = markerDisplay;\n\n if (!isAreaChart || isOverlay) {\n const fieldDashStyle = lineDashStylesByField?.[field] || lineDashStyle;\n if (fieldDashStyle) seriesConfig[field].lineDashStyle = fieldDashStyle as any;\n }\n\n const hasFieldStepPosition = Object.hasOwn(stepPositionsByField || {}, field);\n const fieldStepPosition = hasFieldStepPosition ? stepPositionsByField?.[field] : stepPosition;\n if (fieldStepPosition && fieldStepPosition !== 'off') {\n (seriesConfig[field] as SeriesConfig[string] & { stepPosition?: string }).stepPosition =\n fieldStepPosition;\n }\n\n if (replaceNullsWithZero !== undefined) {\n (\n seriesConfig[field] as SeriesConfig[string] & { replaceNullsWithZero?: boolean }\n ).replaceNullsWithZero = replaceNullsWithZero;\n }\n });\n\n return seriesConfig;\n};\n\n/**\n * Finds the start and end indices in time series data for a given range.\n * @param xData - Array of time values (can be ISO strings or epoch timestamps)\n * @param startValue - Start value of the range (epoch timestamp)\n * @param endValue - End value of the range (epoch timestamp)\n * @returns Object with startXIndex (first index where time >= startValue) and endXIndex (last index where time <= endValue)\n */\nexport const findRangeIndices = (\n xData: (string | number)[],\n startValue: number,\n endValue: number\n): { startXIndex: number; endXIndex: number } => {\n let startXIndex = -1;\n let endXIndex = -1;\n\n // Convert xData to epoch timestamps if they are ISO strings\n const xDataEpoch = xData.map(val => {\n if (typeof val === 'string') {\n return new Date(val).getTime() / 1000; // Convert to epoch seconds\n }\n return val;\n });\n\n // Find the closest time value >= startValue\n for (let i = 0; i < xDataEpoch.length; i += 1) {\n if (xDataEpoch[i] >= startValue) {\n startXIndex = i;\n break;\n }\n }\n\n // If no value >= startValue found, use the last index (all values are less)\n if (startXIndex === -1 && xDataEpoch.length > 0) {\n startXIndex = xDataEpoch.length - 1;\n }\n\n // Find the closest time value <= endValue\n for (let i = xDataEpoch.length - 1; i >= 0; i -= 1) {\n if (xDataEpoch[i] <= endValue) {\n endXIndex = i;\n break;\n }\n }\n\n // If no value <= endValue found, use the first index (all values are greater)\n if (endXIndex === -1 && xDataEpoch.length > 0) {\n endXIndex = 0;\n }\n\n return { startXIndex, endXIndex };\n};\n", "\nimport * as defaultImport from \"@splunk/visualization-schemas\";\nexport * from \"@splunk/visualization-schemas\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import { useContext } from 'react';\nimport FeatureFlagContext from '@splunk/visualization-context/FeatureFlagContext';\nimport { LAYOUT_TYPE } from '@splunk/visualization-schemas';\n\nexport const useTrellisFeatureFlagOn = (): boolean => {\n const context = useContext(FeatureFlagContext) as Record<string, unknown>;\n return Boolean(context?.visualizations_enableTrellis);\n};\n\nexport const useTrellisEnabled = (layoutType = LAYOUT_TYPE.Off): boolean => {\n const trellisFeatureEnabled = useTrellisFeatureFlagOn();\n return trellisFeatureEnabled && layoutType === LAYOUT_TYPE.Trellis;\n};\n", "import * as React from 'react';\nimport styled from 'styled-components';\n\nexport const TRELLIS_TITLE_HEIGHT = 28;\n\nconst TrellisTitleText = styled.div`\n margin-left: 10px;\n margin-right: 10px;\n padding-top: 8px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n`;\n\nconst TrellisTitleDiv = styled.div<{\n fontColor: string;\n backgroundColor: string;\n}>`\n height: ${TRELLIS_TITLE_HEIGHT}px;\n font-size: 14px;\n font-weight: 700;\n color: ${props => props.fontColor};\n background-color: ${props => props.backgroundColor};\n box-shadow: 0 1px ${props => props.backgroundColor}; // this is added to avoid a 1px gap between title and viz divs that showed up intermittently because of pixel rounding error in chrome.\n`;\n\ninterface TrellisTitleProps {\n fontColor: string;\n backgroundColor: string;\n trellisKey: unknown;\n}\n\nconst formatTrellisKey = (value: TrellisTitleProps['trellisKey']): string => {\n if (value === null || value === undefined) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value.toString();\n }\n if (typeof value === 'symbol') {\n return value.toString();\n }\n try {\n return JSON.stringify(value);\n } catch {\n // JSON.stringify throws for BigInt and circular references\n return typeof value === 'bigint' ? value.toString() : '';\n }\n};\n\nexport const TrellisTitle = (props: TrellisTitleProps) => {\n const titleText = formatTrellisKey(props.trellisKey);\n return (\n <TrellisTitleDiv\n fontColor={props.fontColor}\n backgroundColor={props.backgroundColor}\n data-test=\"trellis-title\"\n title={titleText}\n >\n <TrellisTitleText>{titleText}</TrellisTitleText>\n </TrellisTitleDiv>\n );\n};\n", "import * as React from 'react';\nimport { useMemo, useRef } from 'react';\nimport { pick } from 'lodash';\nimport styled from 'styled-components';\nimport SizeAwareWrapper from '@splunk/visualizations-shared/SizeAwareWrapper';\nimport { TimeSeriesChart, RangeSelectionProvider } from '@splunk/visualization-canvas';\nimport { toDimension } from '@splunk/visualizations-shared/style';\nimport type { GenericDataSet } from '@splunk/visualization-canvas/types/types';\nimport VizStyleWrapper from './components/VizStyleWrapper';\nimport { ChartingProps } from './Charting';\nimport {\n convert2DArrayToNumbers,\n filterChartDataFromInternalFields,\n getComputedAxisTitles,\n getFieldName,\n getFieldNames,\n getLegend,\n getSeriesOverrides,\n getXScaleConfig,\n getYScaleConfig,\n getY2ScaleConfig,\n ellipsisAxisTitle,\n getAnnotationsForCanvas,\n triangleEventAnnotationRenderer,\n parseAxisValue,\n parseXAxisLineVisibility,\n findRangeIndices,\n shouldEnableSearchZoom,\n} from './chartingUtils';\nimport { useTrellisEnabled } from './hooks/useTrellisEnabled';\nimport { TrellisTitle, TRELLIS_TITLE_HEIGHT } from './components/TrellisTitle';\n\nconst TimeSeriesChartContainer = styled.div<{\n width: number | string;\n height: number | string;\n}>`\n overflow: hidden;\n ${props => toDimension(pick(props, ['width', 'height']))};\n\n canvas {\n position: absolute !important; // This is needed for canvas element export pdf/png to work correctly\n }\n`;\n\n/**\n * Adds trellis information to event payload\n * @param payload - The event payload object to modify\n * @param trellisKey - The current trellis key value (e.g., \"200\", \"404\")\n * @param trellisSplitBy - The field name being split by (e.g., \"status\")\n */\nexport const appendTrellisToPayload = (\n payload: Record<string, unknown>,\n trellisKey?: string,\n trellisSplitBy?: string\n): Record<string, unknown> => {\n const result = { ...payload };\n if (trellisSplitBy) {\n result['trellis.name'] = trellisSplitBy;\n }\n if (trellisKey) {\n result['trellis.value'] = trellisKey;\n }\n return result;\n};\n\n/**\n * Checks if the mouseover payload has changed compared to the previous payload\n * @param currentPayload - The current event payload\n * @param previousPayload - The previous event payload\n * @returns true if the payload has changed, false otherwise\n */\nexport const hasMouseoverPayloadChanged = (\n currentPayload: Record<string, unknown>,\n previousPayload: Record<string, unknown> | null\n): boolean => {\n if (!previousPayload) {\n return true;\n }\n\n // Check if data point index changed - this is the primary indicator of hovering a different point\n if (currentPayload.index !== previousPayload.index) {\n return true;\n }\n\n // Check if seriesIndex changed\n if (currentPayload.seriesIndex !== previousPayload.seriesIndex) {\n return true;\n }\n\n // Check if trellis fields changed (for trellis mode)\n if (currentPayload['trellis.name'] !== previousPayload['trellis.name']) {\n return true;\n }\n if (currentPayload['trellis.value'] !== previousPayload['trellis.value']) {\n return true;\n }\n\n return false;\n};\n\nexport const handleClick = (chartEvent, onClick, trellisKey?: string, trellisSplitBy?: string) => {\n const payload = {\n ...pick(chartEvent, 'value', 'seriesKey'),\n name: chartEvent.seriesKey,\n };\n delete payload.seriesKey;\n\n // Add row context fields in the format: row.${fieldName}.value\n if (chartEvent.rowContext) {\n Object.assign(\n payload,\n Object.keys(chartEvent.rowContext).reduce((acc, fieldName) => {\n acc[`row.${fieldName}.value`] = chartEvent.rowContext[fieldName];\n return acc;\n }, {})\n );\n }\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n if (onClick) {\n onClick({\n type: 'point.click',\n originalEvent: chartEvent,\n payload: updatedPayload,\n });\n }\n};\n\nexport const handleLegendClick = (chartEvent, onClick, trellisKey?: string, trellisSplitBy?: string) => {\n const payload = {\n name: chartEvent,\n };\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n if (onClick) {\n onClick({\n type: 'legend.click',\n originalEvent: chartEvent,\n payload: updatedPayload,\n });\n }\n};\n\nexport const handleRangeSelection = (\n rangeEvent,\n onSelect,\n chartData,\n trellisKey?: string,\n trellisSplitBy?: string\n) => {\n // Handle undefined range (clearing selection)\n if (!rangeEvent) {\n return;\n }\n\n // Find the indices in the data array that correspond to the start and end timestamps\n const xData = chartData?.columns?.[0] || [];\n const { startXIndex, endXIndex } = findRangeIndices(xData, rangeEvent.start, rangeEvent.end);\n\n const payload = {\n startXIndex,\n startXValue: rangeEvent.start,\n endXIndex,\n endXValue: rangeEvent.end,\n };\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n if (onSelect) {\n onSelect({\n type: 'range.selectBeforeZoom',\n originalEvent: rangeEvent,\n payload: updatedPayload,\n });\n }\n};\n\nexport const handleRangeZoom = (\n rangeEvent,\n onSelect,\n chartData,\n trellisKey?: string,\n trellisSplitBy?: string\n) => {\n // Find the indices in the data array that correspond to the start and end timestamps\n const xData = chartData?.columns?.[0] || [];\n const { startXIndex, endXIndex } = findRangeIndices(xData, rangeEvent.start, rangeEvent.end);\n\n const payload = {\n startXIndex,\n startXValue: rangeEvent.start,\n endXIndex,\n endXValue: rangeEvent.end,\n };\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n if (onSelect) {\n onSelect({\n type: 'range.select',\n originalEvent: rangeEvent,\n payload: updatedPayload,\n });\n }\n};\n\nexport const handleCrosshairChange = (\n chartEvent,\n onPointMouseOver,\n onPointMouseOut,\n trellisKey?: string,\n trellisSplitBy?: string,\n lastPayload = null,\n lastOriginalEvent = null\n) => {\n // Handle mouseout when chartEvent is undefined\n if (!chartEvent) {\n if (onPointMouseOut && lastPayload) {\n onPointMouseOut({\n type: 'point.mouseout',\n originalEvent: lastOriginalEvent,\n payload: lastPayload,\n });\n }\n return { payload: null, originalEvent: null };\n }\n\n // Handle mouseover\n const payload = {\n ...pick(chartEvent, 'value', 'seriesKey', 'time', 'index', 'seriesIndex'),\n name: chartEvent.seriesKey,\n };\n delete payload.seriesKey;\n\n // Add row context fields in the format: row.${fieldName}.value\n if (chartEvent.rowContext) {\n Object.assign(\n payload,\n Object.keys(chartEvent.rowContext).reduce((acc, fieldName) => {\n acc[`row.${fieldName}.value`] = chartEvent.rowContext[fieldName];\n return acc;\n }, {})\n );\n }\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n if (onPointMouseOver) {\n onPointMouseOver({\n type: 'point.mouseover',\n originalEvent: chartEvent,\n payload: updatedPayload,\n });\n }\n\n // Return payload and originalEvent for caller to store\n return { payload: updatedPayload, originalEvent: chartEvent };\n};\n\n/**\n * Helper function to parse array options that may be stringified JSON or already arrays\n */\nexport const parseArrayOption = (\n value: string[] | string | undefined | null\n): string[] | undefined | null => {\n if (Array.isArray(value)) {\n return value;\n }\n if (value) {\n return JSON.parse(value);\n }\n return undefined;\n};\n\nconst getAreaOpacityForCanvas = (areaOpacity: number | undefined | null): number | undefined | null =>\n // Preserve legacy visualizations behavior where area opacity is squared to match charting output.\n areaOpacity !== undefined && areaOpacity !== null ? areaOpacity ** 2 : areaOpacity;\n\nconst parseTickIntervalOption = (\n simpleXMLValue?: string | number,\n canvasValue?: number\n): number | undefined => {\n if (simpleXMLValue) return Number(simpleXMLValue);\n if (canvasValue) return Number(canvasValue);\n return undefined;\n};\n\nconst getYAxisTitles = ({\n y2Enabled,\n yFields,\n y2Fields,\n overlayFields,\n yAxisTitleText,\n yAxisTitleVisibility,\n y2AxisTitleText,\n y2AxisTitleVisibility,\n containerHeight,\n}: {\n y2Enabled: boolean;\n yFields: string[];\n y2Fields: string[];\n overlayFields: string[];\n yAxisTitleText?: string;\n yAxisTitleVisibility?: 'show' | 'collapsed';\n y2AxisTitleText?: string;\n y2AxisTitleVisibility?: 'show' | 'collapsed';\n containerHeight: number;\n}) => {\n const yFieldsForTitle = y2Enabled ? yFields.filter(field => !y2Fields.includes(field)) : yFields;\n const fieldsForY2Axis = y2Fields.length > 0 ? y2Fields : overlayFields;\n\n const yAxisTitle = ellipsisAxisTitle(\n getComputedAxisTitles(yAxisTitleText, yFieldsForTitle, yAxisTitleVisibility),\n containerHeight\n );\n const y2AxisTitle = ellipsisAxisTitle(\n getComputedAxisTitles(y2AxisTitleText, fieldsForY2Axis, y2AxisTitleVisibility),\n containerHeight\n );\n\n return { yAxisTitle, y2AxisTitle };\n};\n\nconst TimeSeriesChartWrapper = (props: ChartingProps) => {\n const {\n width,\n height,\n chartData,\n options,\n userLocale,\n annotationX,\n annotationLabel,\n annotationColor,\n legendDisplay,\n markerDisplay,\n onClick,\n onPointMouseOver,\n onPointMouseOut,\n onSelect,\n splitByLayout,\n trellisKey,\n trellisSplitBy,\n backgroundColor,\n defaultFontColor,\n additionalTooltipValues,\n // Extract axis line visibility options from props\n xAxisLineVisibility,\n yAxisLineVisibility,\n y2AxisLineVisibility,\n // Extract showYAxisWithZero directly from props for accelerated render mode\n showYAxisWithZero: showYAxisWithZeroFromProps,\n showY2AxisWithZero: showY2AxisWithZeroFromProps,\n ...otherOptions\n } = props as ChartingProps & {\n showYAxisWithZero?: boolean;\n showY2AxisWithZero?: boolean;\n xAxisLineVisibility?: string;\n yAxisLineVisibility?: string;\n y2AxisLineVisibility?: string;\n };\n const { eventHandlers, xField: xFieldFromProps } = otherOptions;\n const trellisEnabled = useTrellisEnabled(splitByLayout);\n const {\n backgroundColor: bgColorFromOptions,\n seriesColors: seriesColorsStr,\n fieldColors,\n legendLabels: legendLabelsStr,\n legendMode,\n legendTruncation,\n 'axisTitleX.text': xAxisTitleText,\n 'axisTitleY.text': yAxisTitleText,\n 'axisTitleY2.text': y2AxisTitleText,\n 'axisTitleX.visibility': xAxisTitleVisibility,\n 'axisTitleY.visibility': yAxisTitleVisibility,\n 'axisTitleY2.visibility': y2AxisTitleVisibility,\n 'axisLabelsX.majorLabelVisibility': xAxisLabelVisibility,\n 'axisLabelsX.majorLabelStyle.rotation': xAxisLabelRotation,\n 'axisLabelsX.maxLabelParts': xAxisMaxLabelParts,\n 'axisLabelsY.majorLabelVisibility': yAxisLabelVisibility,\n 'axisLabelsY.majorUnit': yAxisMajorUnitFromSimpleXML,\n 'axisLabelsY2.majorLabelVisibility': y2AxisLabelVisibility,\n 'axisLabelsY2.majorUnit': y2AxisMajorUnitFromSimpleXML,\n 'axisY.abbreviation': yAxisAbbreviation,\n 'axisY.scale': yAxisScale,\n 'axisY2.abbreviation': y2AxisAbbreviation,\n 'axisY2.fields': y2FieldsStr,\n 'axisY2.scale': y2AxisScale,\n 'axisY2.enabled': y2Enabled,\n 'axisLabelsY2.integerUnits': y2IntegerUnits,\n 'chart.overlayFields': overlayFieldsStr,\n 'chart.nullValueMode': nullValueMode,\n 'chart.showDataLabels': showDataLabels,\n 'chart.showLines': showLines,\n 'chart.stackMode': stackMode,\n lineWidth,\n lineDashStyle,\n fieldDashStyles: lineDashStylesByFieldStr,\n stepPosition,\n fieldStepPositions: stepPositionsByFieldStr,\n yAxisMin: yAxisMinRaw,\n yAxisMax: yAxisMaxRaw,\n y2AxisMin: y2AxisMinRaw,\n y2AxisMax: y2AxisMaxRaw,\n showXMajorGridLines,\n showYMajorGridLines,\n showY2MajorGridLines,\n showYMinorGridLines,\n showY2MinorGridLines,\n showLineSmoothing,\n xAxisMajorTickVisibility,\n xAxisMajorTickSize,\n yAxisMajorTickVisibility,\n y2AxisMajorTickVisibility,\n yAxisMajorTickSize,\n y2AxisMajorTickSize,\n yAxisMajorTickInterval,\n y2AxisMajorTickInterval,\n yAxisMinorTickVisibility,\n y2AxisMinorTickVisibility,\n yAxisMinorTickSize,\n y2AxisMinorTickSize,\n showYAxisWithZero: showYAxisWithZeroFromOptions,\n showY2AxisWithZero: showY2AxisWithZeroFromOptions,\n // area only props\n areaFillOpacity: areaOpacity,\n chart: chartType,\n } = options;\n\n // Map showDataLabels back to dataValuesDisplay format for canvas mode\n const dataValuesDisplay = showDataLabels === 'none' ? 'off' : showDataLabels;\n\n // Get showYAxisWithZero from top-level props first (accelerated render mode),\n // then fall back to options object (non-accelerated render mode)\n const showYAxisWithZero = showYAxisWithZeroFromProps ?? showYAxisWithZeroFromOptions;\n const showY2AxisWithZero = showY2AxisWithZeroFromProps ?? showY2AxisWithZeroFromOptions;\n\n // Convert visibility to boolean for canvas renderer\n // X-axis ticks default to true (shown) when 'auto' or 'show', false when 'hide'\n const showXMajorTicks = xAxisMajorTickVisibility !== 'hide';\n const showYMajorTicks = yAxisMajorTickVisibility === 'show';\n const showY2MajorTicks = y2AxisMajorTickVisibility === 'show';\n const showYMinorTicks = yAxisMinorTickVisibility === 'show';\n const showY2MinorTicks = y2AxisMinorTickVisibility === 'show';\n // X-axis line defaults to true (shown) for backwards compatibility\n const showXAxisLine = parseXAxisLineVisibility(xAxisLineVisibility);\n const showYAxisLine = yAxisLineVisibility === 'show';\n const showY2AxisLine = y2AxisLineVisibility === 'show';\n\n // Parse axis values - convert strings to numbers\n const yAxisMin = parseAxisValue(yAxisMinRaw);\n const yAxisMax = parseAxisValue(yAxisMaxRaw);\n const y2AxisMin = parseAxisValue(y2AxisMinRaw);\n const y2AxisMax = parseAxisValue(y2AxisMaxRaw);\n\n // Parse tick interval and size values - convert strings to numbers\n // Priority: SimpleXML props (from transformed options) > canvas-specific props\n const yAxisMajorTickIntervalNum = parseTickIntervalOption(\n yAxisMajorUnitFromSimpleXML,\n yAxisMajorTickInterval\n );\n const y2AxisMajorTickIntervalNum = parseTickIntervalOption(\n y2AxisMajorUnitFromSimpleXML,\n y2AxisMajorTickInterval\n );\n const xAxisMajorTickSizeNum = xAxisMajorTickSize == null ? undefined : Number(xAxisMajorTickSize);\n const yAxisMajorTickSizeNum = yAxisMajorTickSize == null ? undefined : Number(yAxisMajorTickSize);\n const y2AxisMajorTickSizeNum = y2AxisMajorTickSize == null ? undefined : Number(y2AxisMajorTickSize);\n const yAxisMinorTickSizeNum = yAxisMinorTickSize == null ? undefined : Number(yAxisMinorTickSize);\n const y2AxisMinorTickSizeNum = y2AxisMinorTickSize == null ? undefined : Number(y2AxisMinorTickSize);\n // Preserve legacy visualizations behavior where area opacity is squared to match charting output.\n const areaOpacityForCanvas = getAreaOpacityForCanvas(areaOpacity);\n const seriesColors = seriesColorsStr ? JSON.parse(seriesColorsStr) : undefined;\n const seriesColorsByField = fieldColors ? JSON.parse(fieldColors) : undefined;\n const lineDashStylesByField = lineDashStylesByFieldStr ? JSON.parse(lineDashStylesByFieldStr) : undefined;\n const stepPositionsByField = stepPositionsByFieldStr ? JSON.parse(stepPositionsByFieldStr) : undefined;\n const legendLabels = parseArrayOption(legendLabelsStr);\n const bgColor = backgroundColor || bgColorFromOptions;\n const [containerWidth, setContainerWidth] = React.useState(Number(props.width));\n const [containerHeight, setContainerHeight] = React.useState(Number(props.height));\n const cachedHandleResize = React.useCallback((w, h) => {\n setContainerWidth(w);\n setContainerHeight(h);\n }, []);\n const filteredChartData = filterChartDataFromInternalFields({\n fields: chartData.fields,\n columns: chartData.seriesList,\n });\n\n const xField = getFieldName(filteredChartData.fields[0]);\n const yFields = getFieldNames(\n filteredChartData.fields.length > 1 ? filteredChartData.fields.slice(1) : []\n );\n const y2Fields = useMemo(\n () => (y2FieldsStr ? y2FieldsStr.split(',').map(f => f.trim()) : []),\n [y2FieldsStr]\n );\n const overlayFields = useMemo(\n () => (overlayFieldsStr ? overlayFieldsStr.split(',').map(f => f.trim()) : []),\n [overlayFieldsStr]\n );\n\n let xAxisTitle = getComputedAxisTitles(xAxisTitleText, [xField], xAxisTitleVisibility);\n xAxisTitle = ellipsisAxisTitle(xAxisTitle, containerWidth);\n const { yAxisTitle, y2AxisTitle } = getYAxisTitles({\n y2Enabled,\n yFields,\n y2Fields,\n overlayFields,\n yAxisTitleText,\n yAxisTitleVisibility,\n y2AxisTitleText,\n y2AxisTitleVisibility,\n containerHeight,\n });\n\n const xScaleConfig = useMemo(\n () => getXScaleConfig(xAxisTitle, xAxisLabelVisibility, xAxisLabelRotation),\n [xAxisTitle, xAxisLabelVisibility, xAxisLabelRotation]\n );\n const isStacked100 = stackMode === 'stacked100';\n const yScaleConfig = useMemo(\n () => {\n const config = getYScaleConfig(\n yAxisTitle,\n yAxisAbbreviation,\n yAxisScale,\n yAxisLabelVisibility,\n yAxisMin,\n yAxisMax\n );\n // For stacked100, override tick formatter to show percentage labels (0-100%)\n // uPlot stores stacked100 values as 0-1 fractions after processPercentStacking\n if (isStacked100) {\n config.y.tickFmt = (v): string => `${Math.round(v * 100)}%`;\n config.y.range = () => [0, 1];\n }\n return config;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [yAxisTitle, yAxisAbbreviation, yAxisScale, yAxisLabelVisibility, yAxisMin, yAxisMax, isStacked100]\n );\n const y2ScaleConfig = useMemo(() => {\n if (y2Enabled) {\n return getY2ScaleConfig(\n y2AxisTitle,\n y2AxisAbbreviation,\n y2AxisScale,\n y2IntegerUnits,\n y2AxisLabelVisibility,\n y2AxisMin,\n y2AxisMax\n );\n }\n return {};\n }, [\n y2Enabled,\n y2AxisTitle,\n y2AxisAbbreviation,\n y2AxisScale,\n y2IntegerUnits,\n y2AxisLabelVisibility,\n y2AxisMin,\n y2AxisMax,\n ]);\n const uplotContainerElement = useRef(null);\n\n const seriesDataFormatted = [\n filteredChartData.columns[0],\n ...convert2DArrayToNumbers(filteredChartData.columns.slice(1)),\n ];\n chartData.fields = filteredChartData.fields;\n chartData.columns = seriesDataFormatted;\n\n // Map SimpleXML stackMode value ('default' | 'stacked' | 'stacked100') to getSeriesOverrides param\n const normalizedStackMode = stackMode === 'stacked' || stackMode === 'stacked100' ? stackMode : 'auto';\n\n // Memoize seriesOverrides to prevent unnecessary recreations\n const seriesOverrides = useMemo(\n () =>\n getSeriesOverrides({\n yfields: yFields,\n y2fields: y2Fields,\n lineWidth,\n overlayFields,\n y2Enabled,\n nullValueMode,\n markerDisplay,\n lineDashStyle,\n lineDashStylesByField,\n stepPosition,\n stepPositionsByField,\n type: chartType,\n stackMode: normalizedStackMode,\n showLines,\n }),\n [\n yFields,\n y2Fields,\n lineWidth,\n overlayFields,\n y2Enabled,\n nullValueMode,\n markerDisplay,\n lineDashStyle,\n lineDashStylesByField,\n stepPosition,\n stepPositionsByField,\n chartType,\n normalizedStackMode,\n showLines,\n ]\n );\n\n // Memoize annotations to prevent unnecessary recreations\n const chartingEventAnnotations = useMemo(\n () =>\n getAnnotationsForCanvas({\n annotationX,\n annotationColor,\n annotationLabel,\n }),\n [annotationX, annotationColor, annotationLabel]\n );\n\n // Memoize scaleConfig to prevent unnecessary recreations\n const scaleConfig = useMemo(\n () => ({ ...xScaleConfig, ...yScaleConfig, ...y2ScaleConfig }),\n [xScaleConfig, yScaleConfig, y2ScaleConfig]\n );\n\n // Memoize legend configuration\n // In seriesCompare mode, force the legend to the right side so that the legend's\n // fixed width (needed to prevent jitter when hover values appear/disappear) doesn't\n // affect layouts that would otherwise place it on the left.\n const isSeriesCompare = legendMode === 'seriesCompare';\n const legend = useMemo(\n () =>\n getLegend({\n legendDisplay: isSeriesCompare && legendDisplay !== 'off' ? 'right' : legendDisplay,\n isSeriesCompare,\n legendTruncation,\n }),\n [legendDisplay, isSeriesCompare, legendTruncation]\n );\n\n // Memoize click handlers to avoid recreating them on every render\n const handleChartClick = React.useCallback(\n event => {\n // Only invoke if onClick is defined to avoid unnecessary work\n if (onClick) {\n handleClick(event, onClick, trellisKey, trellisSplitBy);\n }\n },\n [onClick, trellisKey, trellisSplitBy]\n );\n\n const handleChartLegendClick = React.useCallback(\n event => {\n // Only invoke if onClick is defined to avoid unnecessary work\n if (onClick) {\n handleLegendClick(event, onClick, trellisKey, trellisSplitBy);\n }\n },\n [onClick, trellisKey, trellisSplitBy]\n );\n\n const handleChartRangeSelection = React.useCallback(\n range => {\n // Only invoke if onSelect is defined to avoid unnecessary work\n if (onSelect) {\n handleRangeSelection(range, onSelect, chartData, trellisKey, trellisSplitBy);\n }\n // Always allow range selection UI to appear, even if onSelect is undefined\n },\n [onSelect, chartData, trellisKey, trellisSplitBy]\n );\n\n const handleChartRangeZoom = React.useCallback(\n range => {\n // Only invoke if onSelect is defined to avoid unnecessary work\n if (onSelect) {\n handleRangeZoom(range, onSelect, chartData, trellisKey, trellisSplitBy);\n }\n },\n [onSelect, chartData, trellisKey, trellisSplitBy]\n );\n\n // Determine if search zoom should be enabled based on eventHandlers and xField\n // Use xFieldFromProps if available, otherwise fall back to computed xField from chartData\n const xFieldToUse = xFieldFromProps || xField;\n const enableSearchZoom = React.useMemo(\n () => shouldEnableSearchZoom(eventHandlers, xFieldToUse),\n [eventHandlers, xFieldToUse]\n );\n\n // Store the last payload and originalEvent to return on mouseout\n const lastPayloadRef = React.useRef<Record<string, any> | null>(null);\n const lastOriginalEventRef = React.useRef<any>(null);\n // Store the previous mouseover payload to check for changes\n const previousMouseoverPayloadRef = React.useRef<Record<string, unknown> | null>(null);\n // Store additionalTooltipValues in a ref to avoid chart remounts when it changes\n // The chart reads from this ref, so changes update the tooltip without remounting\n const additionalTooltipValuesRef = React.useRef(additionalTooltipValues);\n React.useEffect(() => {\n additionalTooltipValuesRef.current = additionalTooltipValues;\n }, [additionalTooltipValues]);\n\n const handleCrosshairMouseout = React.useCallback(() => {\n if (onPointMouseOut && lastPayloadRef.current) {\n onPointMouseOut({\n type: 'point.mouseout',\n originalEvent: lastOriginalEventRef.current,\n payload: lastPayloadRef.current,\n });\n }\n previousMouseoverPayloadRef.current = null;\n }, [onPointMouseOut]);\n\n const handleChartCrosshairChange = React.useCallback(\n event => {\n // Only invoke if onPointMouseOver or onPointMouseOut is defined to avoid unnecessary work\n if (!onPointMouseOver && !onPointMouseOut) {\n return;\n }\n\n // Handle mouseout when event is undefined\n if (!event) {\n handleCrosshairMouseout();\n return;\n }\n\n // Handle mouseover\n const payload = {\n ...pick(event, 'value', 'seriesKey', 'time', 'index', 'seriesIndex'),\n name: event.seriesKey,\n };\n delete payload.seriesKey;\n\n // Add row context fields in the format: row.${fieldName}.value\n if (event.rowContext) {\n Object.assign(\n payload,\n Object.keys(event.rowContext).reduce((acc, fieldName) => {\n acc[`row.${fieldName}.value`] = event.rowContext[fieldName];\n return acc;\n }, {})\n );\n }\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n // Check if the payload has actually changed to avoid emitting duplicate events\n if (!hasMouseoverPayloadChanged(updatedPayload, previousMouseoverPayloadRef.current)) {\n return;\n }\n\n // Store payload and originalEvent for mouseout\n lastPayloadRef.current = updatedPayload;\n lastOriginalEventRef.current = event;\n // Store current payload for next comparison\n previousMouseoverPayloadRef.current = { ...updatedPayload };\n\n if (onPointMouseOver) {\n onPointMouseOver({\n type: 'point.mouseover',\n originalEvent: event,\n payload: updatedPayload,\n });\n }\n },\n [onPointMouseOver, onPointMouseOut, trellisKey, trellisSplitBy, handleCrosshairMouseout]\n );\n\n // Create a key to reset RangeSelectionProvider when data changes\n const dataKey = `${chartData.columns[0]?.[0]}-${chartData.columns[0]?.[chartData.columns[0].length - 1]}-${chartData.columns[0]?.length}`;\n\n const memoizedChart = useMemo(() => {\n // Always pass zoom handler when onSelect exists, serverSideZoom controls behavior\n const computedOnRangeZoom = onSelect ? handleChartRangeZoom : undefined;\n\n return (\n <RangeSelectionProvider key={dataKey}>\n <TimeSeriesChart\n data={chartData as GenericDataSet}\n width={containerWidth}\n height={containerHeight}\n seriesColors={seriesColors}\n seriesColorsByField={seriesColorsByField}\n seriesConfig={seriesOverrides}\n legend={legend}\n legendLabels={legendLabels}\n legendTruncation={legendTruncation}\n isSeriesCompare={legendMode === 'seriesCompare'}\n maxSeriesFocus={legendMode === 'seriesCompare' ? 0 : undefined}\n scaleConfig={scaleConfig}\n timestampFormat=\"expanded\"\n onCrosshairClick={onClick ? handleChartClick : undefined}\n onCrosshairChange={\n onPointMouseOver || onPointMouseOut ? handleChartCrosshairChange : undefined\n }\n onSeriesClick={onClick ? handleChartLegendClick : undefined}\n onRangeSelection={handleChartRangeSelection}\n onRangeZoom={computedOnRangeZoom}\n serverSideZoom={enableSearchZoom}\n userLocale={userLocale}\n events={chartingEventAnnotations}\n eventsConfig={{ renderer: triangleEventAnnotationRenderer }}\n additionalTooltipValuesRef={additionalTooltipValuesRef}\n showXMajorGridLines={showXMajorGridLines}\n showYMajorGridLines={showYMajorGridLines}\n showY2MajorGridLines={showY2MajorGridLines}\n showYMinorGridLines={showYMinorGridLines}\n showY2MinorGridLines={showY2MinorGridLines}\n showLineSmoothing={showLineSmoothing}\n dataValuesDisplay={dataValuesDisplay}\n showXMajorTicks={showXMajorTicks}\n xAxisMajorTickSize={xAxisMajorTickSizeNum}\n showYMajorTicks={showYMajorTicks}\n showY2MajorTicks={showY2MajorTicks}\n yAxisMajorTickSize={yAxisMajorTickSizeNum}\n y2AxisMajorTickSize={y2AxisMajorTickSizeNum}\n yAxisMajorTickInterval={yAxisMajorTickIntervalNum}\n y2AxisMajorTickInterval={y2AxisMajorTickIntervalNum}\n showYMinorTicks={showYMinorTicks}\n showY2MinorTicks={showY2MinorTicks}\n yAxisMinorTickSize={yAxisMinorTickSizeNum}\n y2AxisMinorTickSize={y2AxisMinorTickSizeNum}\n showYAxisWithZero={showYAxisWithZero}\n showY2AxisWithZero={showY2AxisWithZero}\n showXAxisLine={showXAxisLine}\n showYAxisLine={showYAxisLine}\n showY2AxisLine={showY2AxisLine}\n xAxisMaxLabelParts={xAxisMaxLabelParts}\n areaOpacity={areaOpacityForCanvas}\n />\n </RangeSelectionProvider>\n );\n // Note: additionalTooltipValues passed via ref to avoid chart remount when switching stories.\n // The ref is updated via useEffect, so tooltip gets latest values without remounting chart.\n }, [\n onSelect,\n handleChartRangeZoom,\n dataKey,\n chartData,\n containerWidth,\n containerHeight,\n seriesColors,\n seriesColorsByField,\n seriesOverrides,\n legend,\n legendLabels,\n legendTruncation,\n scaleConfig,\n onClick,\n handleChartClick,\n onPointMouseOver,\n onPointMouseOut,\n handleChartCrosshairChange,\n handleChartLegendClick,\n handleChartRangeSelection,\n enableSearchZoom,\n userLocale,\n chartingEventAnnotations,\n showXMajorGridLines,\n showYMajorGridLines,\n showY2MajorGridLines,\n showYMinorGridLines,\n showY2MinorGridLines,\n showLineSmoothing,\n dataValuesDisplay,\n showXMajorTicks,\n xAxisMajorTickSizeNum,\n showYMajorTicks,\n showY2MajorTicks,\n yAxisMajorTickSizeNum,\n y2AxisMajorTickSizeNum,\n yAxisMajorTickIntervalNum,\n y2AxisMajorTickIntervalNum,\n showYMinorTicks,\n showY2MinorTicks,\n yAxisMinorTickSizeNum,\n y2AxisMinorTickSizeNum,\n showYAxisWithZero,\n showY2AxisWithZero,\n showXAxisLine,\n showYAxisLine,\n showY2AxisLine,\n legendMode,\n xAxisMaxLabelParts,\n areaOpacityForCanvas,\n ]);\n\n const memoizedVisualization = useMemo(() => {\n return <VizStyleWrapper backgroundColor={bgColor}>{memoizedChart}</VizStyleWrapper>;\n }, [bgColor, memoizedChart]);\n\n return (\n <>\n {trellisEnabled && (\n <TrellisTitle\n trellisKey={trellisKey}\n backgroundColor={bgColor}\n fontColor={defaultFontColor}\n />\n )}\n <TimeSeriesChartContainer\n height={trellisEnabled ? Number(height) - TRELLIS_TITLE_HEIGHT : height}\n width={width}\n ref={uplotContainerElement}\n data-test=\"timeseries-chart-wrapper\"\n >\n <SizeAwareWrapper width={width} height={height} onResize={cachedHandleResize} />\n {memoizedVisualization}\n </TimeSeriesChartContainer>\n </>\n );\n};\n\nexport default TimeSeriesChartWrapper;\n", "import * as React from 'react';\nimport { camelCase, has, get, defaultsDeep, noop } from 'lodash';\nimport getSettingsFromThemedProps from '@splunk/themes/getSettingsFromThemedProps';\nimport { Options as Opts } from '@splunk/visualization-encoding/Options';\nimport { withSanitizedProps } from '@splunk/visualizations-shared/SanitizeProps';\nimport type { TimezoneContextInterface } from '@splunk/visualization-context/TimezoneContext';\nimport TimezoneContext from '@splunk/visualization-context/TimezoneContext';\nimport moment from '@splunk/moment';\nimport FeatureFlagContext from '@splunk/visualization-context/FeatureFlagContext';\nimport { withTheme } from 'styled-components';\nimport { deepMergeWithArrayPrimitiveOverrides } from '@splunk/visualizations-shared/hocUtils';\nimport { pickFieldFromJSONSchema } from '@splunk/visualizations-shared/JSONSchemaUtils';\nimport AsyncDynamicOptionsEvaluator, {\n AsyncDynamicOptionsEvaluatorParams,\n} from '@splunk/async-dynamic-options-evaluator';\nimport { createGUID } from '@splunk/ui-utils/id';\nimport type { Frames } from '@splunk/visualization-encoding/EncodingExecutor';\nimport type { OptionsStanza } from '@splunk/visualization-encoding/AST';\nimport SplunkVisualization from './SplunkVisualization';\nimport type { DashboardVizProps, DataSource, VizConfig, VizProps } from './interfaces';\nimport { VizBehavior } from './interfaces/VizBehavior';\nimport { useSortingParams } from './hooks/useSorting';\nimport { usePaginationParams } from './hooks/usePagination';\nimport { useDeepMemo } from './hooks/useDeepMemo';\nimport MissingPropsMessage, { missingKeys } from './components/MissingPropsMessage';\nimport withEditModeCover from './hocs/withEditModeCover';\nimport withPlaceholder from './hocs/withPlaceholder';\nimport { ChartingProps } from './Charting';\nimport useDownsampleDataSources from './hooks/useDownsampleDataSources';\nimport { isDownsamplingEnabledForViz } from './utils/dataUtils';\nimport { getFeatureFlag } from '../common/utils/featureFlagUtils';\nimport { turnOffLegendDisplayWhenTrellisIsOn } from '../common/utils/trellisUtils';\nimport TimeSeriesChartWrapper from './TimeSeriesChartWrapper';\nimport { isTimeSeriesCanvasRenderSupported } from './chartingUtils';\n\n// Create the sanitized version once, outside the component to prevent remounting\nconst SanitizedTimeSeriesChartWrapper = withSanitizedProps(TimeSeriesChartWrapper);\n\ntype FeatureFlagContextValue = Record<string, boolean | undefined> | null;\n\ntype HOC = React.ComponentType<DashboardVizProps> & {\n config: VizConfig;\n};\nexport interface DashboardVizOpts {\n ReactViz: React.ComponentType<ChartingProps | VizProps>; // we will wrap this in DashboardViz (see const DashboardViz = ...)\n vizConfig: VizConfig;\n computeVizProps?: (props) => any;\n computeVizPropsBeforeEval?: (props) => any;\n computeDataFrames?: (args: {\n dataSources: { [key: string]: DataSource };\n options: Record<string, unknown>;\n }) => Partial<Frames>;\n disableEditModeCover?: boolean;\n useIconPlaceholder?: (\n dataSources: { [name: string]: DataSource },\n loading: boolean,\n options: Record<string, unknown>\n ) => boolean;\n}\n\nconst buildEventCallbackProps = (\n supportedEvents,\n evaluatedOptionsToUse,\n onEventTrigger\n): Record<string, unknown> => {\n const result = {};\n Object.keys(supportedEvents).forEach((eventName): void => {\n const { parentKeys, payloadKeys } = supportedEvents[eventName];\n const eventCallbackPropName = camelCase(`on.${eventName}`);\n\n let payload = {};\n if (Array.isArray(payloadKeys) && payloadKeys.length) {\n payloadKeys.forEach(p => {\n payload[p] = evaluatedOptionsToUse[p];\n });\n }\n\n result[eventCallbackPropName] = (ev): Record<string, unknown> => {\n if (ev?.payload) {\n payload = { ...ev.payload };\n }\n return onEventTrigger({\n originalEvent: ev,\n payload,\n type: eventName,\n });\n };\n\n if (parentKeys) {\n for (let i = parentKeys.length - 1; i >= 0; i -= 1) {\n const newObject = {};\n newObject[parentKeys[i]] = result[eventCallbackPropName];\n result[eventCallbackPropName] = newObject;\n }\n }\n });\n return result;\n};\n\n// Build the event callback props for a viz, splitting declared events by source.\n// 'default' events (e.g. RichText link.open) act as default handlers: injected\n// whenever the viz supports events, ungated by hasEventHandlers and in edit mode.\n// 'user' events (the default) only fire in view mode once handlers are bound.\nconst buildAllEventCallbackProps = (\n events: Record<string, { source?: 'default' | 'user' }>,\n evaluatedOptionsToUse,\n onEventTrigger,\n { supportsEvents, hasEventHandlers, mode }\n): Record<string, unknown> => {\n if (!supportsEvents) return {};\n const defaultEvents = {};\n const userEvents = {};\n Object.entries(events || {}).forEach(([eventKey, eventConfig]) => {\n (eventConfig.source === 'default' ? defaultEvents : userEvents)[eventKey] = eventConfig;\n });\n const userProps =\n hasEventHandlers && mode === 'view'\n ? buildEventCallbackProps(userEvents, evaluatedOptionsToUse, onEventTrigger)\n : {};\n return {\n ...userProps,\n ...buildEventCallbackProps(defaultEvents, evaluatedOptionsToUse, onEventTrigger),\n };\n};\n\n/**\n * @splunk/moment currently does not allow us to customize the timezone on a per\n * visualization basis. This ensures that if a timezone was provided via\n * TimezoneContext, @splunk/moment time formatting will use it.\n */\nconst applyContextTimezone = (localeContext: TimezoneContextInterface): void => {\n if (localeContext.serializedTimezone && !moment.getDefaultSplunkTimezone()) {\n moment.setDefaultSplunkTimezone(localeContext.serializedTimezone);\n }\n};\n\ninterface AsyncOptionsEvalArgs {\n visualizationID: string;\n props: DashboardVizProps;\n optionsToEvaluate: OptionsStanza;\n downsampledDataSources: Record<string, DataSource>;\n vizConfig: VizConfig;\n bypassCloneDeepOptionScope: boolean;\n lazyLoadingDataFrame: boolean;\n}\n\n/**\n * Builds the inputs for async (web worker) DSL evaluation without starting work during render.\n */\nconst getAsyncOptionsEvaluationParams = ({\n visualizationID,\n props,\n optionsToEvaluate,\n downsampledDataSources,\n vizConfig,\n bypassCloneDeepOptionScope,\n lazyLoadingDataFrame,\n}: AsyncOptionsEvalArgs): AsyncDynamicOptionsEvaluatorParams => {\n return {\n visualizationID,\n props,\n options: { ...optionsToEvaluate },\n dataSources: downsampledDataSources,\n theme: vizConfig.themes,\n bypassCloneDeepOptionScope,\n lazyLoadingDataFrame,\n };\n};\n\ninterface SyncOptionsEvalArgs {\n optionsToEvaluate: OptionsStanza;\n downsampledDataSources: Record<string, DataSource>;\n dataSourcesInState: Record<string, DataSource>;\n dataFramesInState: Frames | undefined;\n setDataSourcesInState: (dataSources: Record<string, DataSource>) => void;\n setDataFramesInState: (frames: Frames | undefined) => void;\n computeDataFrames?: DashboardVizOpts['computeDataFrames'];\n featureFlagContext: FeatureFlagContextValue;\n themeFunc: (themeVar: string) => unknown;\n}\n\n/**\n * Synchronously builds data frames (memoizing them in component state) and evaluates DSL\n * options against them. Extracted out of the DashboardViz render body to keep its cognitive\n * complexity down.\n */\nconst evaluateOptionsSync = ({\n optionsToEvaluate,\n downsampledDataSources,\n dataSourcesInState,\n dataFramesInState,\n setDataSourcesInState,\n setDataFramesInState,\n computeDataFrames,\n featureFlagContext,\n themeFunc,\n}: SyncOptionsEvalArgs): Record<string, unknown> => {\n let dataFrames: Frames | undefined = dataFramesInState;\n if (downsampledDataSources !== dataSourcesInState) {\n setDataSourcesInState(downsampledDataSources);\n dataFrames = Opts.dataFrameFromDataSource(\n downsampledDataSources,\n getFeatureFlag(featureFlagContext, 'visualizations_lazyLoadingDataFrame')\n );\n setDataFramesInState(dataFrames);\n }\n // Merge derived frames when provided\n let mergedFrames = dataFrames;\n if (computeDataFrames && dataFrames) {\n const derivedFrames = computeDataFrames({\n dataSources: downsampledDataSources,\n options: optionsToEvaluate.options as Record<string, unknown>,\n });\n mergedFrames = { ...dataFrames, ...derivedFrames };\n }\n return Opts.evaluate(\n optionsToEvaluate,\n downsampledDataSources,\n themeFunc,\n mergedFrames,\n getFeatureFlag(featureFlagContext, 'visualizations_bypassCloneDeepOptionScope')\n );\n};\n\n/**\n * hoc that wraps a pure react visualization in a Dashboard visualization\n * @param {DashboardVizOpts} opts\n * @returns {HOC}\n */\nconst withDashboardViz = (opts: DashboardVizOpts): HOC => {\n const {\n ReactViz,\n vizConfig,\n computeVizProps = () => {},\n computeVizPropsBeforeEval = () => {},\n computeDataFrames,\n disableEditModeCover,\n useIconPlaceholder,\n } = opts;\n\n // sanitizing props before sending them to reactviz.\n const SanitizedReactViz = withSanitizedProps(ReactViz); // Default assigned to ReactViz\n const defaultOptions = pickFieldFromJSONSchema(vizConfig.optionsSchema, 'default');\n\n const DashboardViz = (props: DashboardVizProps): React.ReactElement<DashboardVizProps> => {\n const {\n mode = 'view',\n hasEventHandlers,\n dataSources, // type of { [key: string]: DataSource }\n options = {},\n context = {},\n width,\n height,\n onComputedProps = noop,\n onEventTrigger = SplunkVisualization.defaults.onEventTrigger,\n theme,\n onRequestParamsChange = noop,\n } = props;\n const localeContext = React.useContext<TimezoneContextInterface>(TimezoneContext);\n applyContextTimezone(localeContext);\n\n const themeFunc = themeVar => vizConfig.themes[themeVar]?.(props);\n const {\n family: currentThemeFamily,\n colorScheme: currentThemeColorScheme,\n density: currentThemeDensity,\n } = getSettingsFromThemedProps({ theme });\n let evaluatedOptions: Record<string, unknown> = {}; // evaluatedOptions need to be initialized as an empty object\n const [evaluatedOptionsAsync, setEvaluatedOptionsAsync] = React.useState({}); // evaluatedOptions need to be initialized as an empty object\n const featureFlagContext = React.useContext<FeatureFlagContextValue>(FeatureFlagContext);\n\n const [visualizationID] = React.useState(`${vizConfig.name} - ${createGUID()}`);\n\n const [dataSourcesInState, setDataSourcesInState] = React.useState({});\n const [dataFramesInState, setDataFramesInState] = React.useState<Frames | undefined>();\n\n const [useAsyncEvaluatedOptions, setUseAsyncEvaluatedOptions] = React.useState(\n Boolean(getFeatureFlag(featureFlagContext, 'visualizations_useWebWorkersForDSL'))\n );\n const isDownsamplingEnabledByFeatureFlag = Boolean(\n featureFlagContext?.visualizations_enableDownsampling\n );\n const isTrellisFeatureFlagOn = Boolean(featureFlagContext?.visualizations_enableTrellis);\n const isTrellisOn =\n isTrellisFeatureFlagOn &&\n vizConfig?.supports?.includes(VizBehavior.TRELLIS) &&\n options?.splitByLayout === VizBehavior.TRELLIS;\n\n const isAcceleratedRenderFeatureFlagOn = Boolean(\n featureFlagContext?.visualizations_enableAcceleratedRender\n );\n const isAcceleratedRenderOn =\n isAcceleratedRenderFeatureFlagOn &&\n isTimeSeriesCanvasRenderSupported(vizConfig.key) &&\n options?.acceleratedRender === true;\n const bypassCloneDeepOptionScope = Boolean(\n getFeatureFlag(featureFlagContext, 'visualizations_bypassCloneDeepOptionScope')\n );\n const lazyLoadingDataFrame = Boolean(\n getFeatureFlag(featureFlagContext, 'visualizations_lazyLoadingDataFrame')\n );\n const optionsToEvaluate = React.useMemo(() => {\n const legendDisplay = turnOffLegendDisplayWhenTrellisIsOn(isTrellisOn, options);\n // computeVizPropsBeforeEval will run before DSL gets evaluated\n const computedOptions = computeVizPropsBeforeEval(options) ?? {};\n return {\n context: defaultsDeep({}, context, vizConfig.defaultContext),\n options: deepMergeWithArrayPrimitiveOverrides(\n {},\n legendDisplay,\n computedOptions,\n options,\n defaultOptions\n ),\n };\n }, [isTrellisOn, options, context]);\n\n const [threshold, setThreshold] = React.useState(Number(width));\n const onDownsamplingThresholdChange = React.useCallback((newThreshold: number) => {\n setThreshold(newThreshold);\n }, []);\n const isDownsamplingEnabled = React.useMemo(() => {\n return isDownsamplingEnabledByFeatureFlag && isDownsamplingEnabledForViz({ vizConfig });\n }, [isDownsamplingEnabledByFeatureFlag]);\n\n const downsamplingProps = React.useMemo(() => {\n if (!isDownsamplingEnabled) {\n return {};\n }\n return {\n onDownsamplingThresholdChange,\n originalDataSources: dataSources,\n };\n }, [dataSources, isDownsamplingEnabled, onDownsamplingThresholdChange]);\n const downsampledDataSources = useDownsampleDataSources({\n options: optionsToEvaluate.options,\n context: optionsToEvaluate.context,\n dataSources,\n threshold,\n isDownsamplingEnabled,\n });\n\n const asyncOptionsEvaluationParams = useDeepMemo(\n () =>\n getAsyncOptionsEvaluationParams({\n visualizationID,\n props,\n optionsToEvaluate,\n downsampledDataSources,\n vizConfig,\n bypassCloneDeepOptionScope,\n lazyLoadingDataFrame,\n }),\n [\n visualizationID,\n optionsToEvaluate,\n downsampledDataSources,\n vizConfig,\n bypassCloneDeepOptionScope,\n lazyLoadingDataFrame,\n currentThemeFamily,\n currentThemeColorScheme,\n currentThemeDensity,\n localeContext.serializedTimezone,\n ]\n );\n\n React.useEffect(() => {\n if (!useAsyncEvaluatedOptions) {\n return undefined;\n }\n\n let ownsEvaluation = true;\n try {\n AsyncDynamicOptionsEvaluator.evaluate(asyncOptionsEvaluationParams)\n .then(results => {\n if (ownsEvaluation) {\n setEvaluatedOptionsAsync(results.results as Record<string, unknown>);\n }\n })\n .catch(() => {\n if (ownsEvaluation) {\n setUseAsyncEvaluatedOptions(false);\n }\n });\n } catch {\n setUseAsyncEvaluatedOptions(false);\n }\n\n return () => {\n ownsEvaluation = false;\n AsyncDynamicOptionsEvaluator.reset(visualizationID);\n };\n }, [asyncOptionsEvaluationParams, useAsyncEvaluatedOptions, visualizationID]);\n\n evaluatedOptions = useDeepMemo(() => {\n try {\n if (useAsyncEvaluatedOptions) {\n return {};\n }\n return evaluateOptionsSync({\n optionsToEvaluate,\n downsampledDataSources,\n dataSourcesInState,\n dataFramesInState,\n setDataSourcesInState,\n setDataFramesInState,\n computeDataFrames,\n featureFlagContext,\n themeFunc,\n });\n } catch (e) {\n if (e instanceof Error) {\n // eslint-disable-next-line no-console\n console.error(`unexpected error evaluating options: ${e.message}`);\n }\n return {};\n }\n }, [\n currentThemeFamily,\n currentThemeColorScheme,\n currentThemeDensity,\n optionsToEvaluate,\n downsampledDataSources,\n localeContext.serializedTimezone,\n useAsyncEvaluatedOptions,\n ]);\n\n const evaluatedOptionsToUse = useAsyncEvaluatedOptions ? evaluatedOptionsAsync : evaluatedOptions;\n\n /**\n * PAGE_AND_SORT behavior\n *\n * Some visualizations, like table, requires metadata about the datasource,\n * like total number of results, current count, offset, and sort, for rendering\n * paginator and sorting direction. In this approach, the visualization\n * allow users to set 'paginateDataSourceKey' to select which datasource\n * should the visualization extract the metadata from. It defaults to 'primary' datasource.\n * The visualization config should set the PAGE_AND_SORT behavior to receive\n * 'requestParams', 'meta' and onRequestParams callback as props.\n *\n * In future, we could automatically detect which all datasources are being used\n * and bind those magically to pagination/sorting behavior.\n */\n let dataSourceMetadata = {};\n const OptionKey = 'paginateDataSourceKey';\n const optsKey = has(evaluatedOptionsToUse, OptionKey) && evaluatedOptionsToUse[OptionKey];\n const paginateDataSourceKey = typeof optsKey === 'string' ? optsKey : 'primary';\n\n const requestParams = get(dataSources, [paginateDataSourceKey, 'requestParams'], {});\n const meta = get(dataSources, [paginateDataSourceKey, 'meta'], {});\n const handleRequestParamsChange = (payload: Record<string, unknown>): void =>\n onRequestParamsChange(paginateDataSourceKey, payload);\n\n const sortParams = useSortingParams({\n requestParams,\n meta,\n onRequestParamsChange: handleRequestParamsChange,\n });\n\n const paginatorParams = usePaginationParams({\n requestParams,\n meta,\n onRequestParamsChange: handleRequestParamsChange,\n });\n\n dataSourceMetadata = {\n sortParams,\n paginatorParams,\n };\n\n if (\n !vizConfig.supports.includes(VizBehavior.PAGE_AND_SORT) &&\n !has(dataSources, paginateDataSourceKey)\n ) {\n dataSourceMetadata = {};\n }\n\n // trellis specific backgroundColor update for onComputedProps\n // if trellis is enabled following these three criteria - 1) trellis feature flag is enabled 2) vizConfig supports array has 'trellis' 3) option 'splitByLayout' is set to 'trellis\n // onComputedProps api should return back trellisBackgroundColor value for backgroundColor option to support coloring of sibling panels (for eg:- title/ description on UDF side)\n const clonedEvaluatedOptions: Record<string, unknown> = { ...evaluatedOptionsToUse };\n if (isTrellisOn) {\n clonedEvaluatedOptions.backgroundColor = clonedEvaluatedOptions?.trellisBackgroundColor;\n }\n // useEffect hook needs to be initialized before any early returns\n // this is in accordance with the order of hook calls being the same on each render https://reactjs.org/docs/hooks-rules.html#explanation\n React.useEffect((): void => {\n onComputedProps(clonedEvaluatedOptions);\n });\n\n // present warning message if any required props are missing\n const { requiredProps = [], supports } = vizConfig;\n const missing = missingKeys(requiredProps, evaluatedOptionsToUse);\n if (\n missing.length > 0 &&\n supports.includes(VizBehavior.PLACEHOLDER) &&\n vizConfig.key !== 'splunk.singlevalue' // For SV missing props msg is not displayed if required props majorValue is missing, instead this will be handled from the component, instead handled within component\n ) {\n return (\n <MissingPropsMessage\n data-test=\"missing-props-message\"\n width={width}\n height={height}\n missingProps={missing}\n backgroundColor={themeFunc('defaultBackgroundColor')}\n />\n );\n }\n\n // events\n const eventCallbackProps = buildAllEventCallbackProps(\n vizConfig.events,\n evaluatedOptionsToUse,\n onEventTrigger,\n {\n supportsEvents: vizConfig.supports.includes(VizBehavior.EVENTS),\n hasEventHandlers,\n mode,\n }\n );\n\n // compute pure viz props which are not from options\n const computedVizProps = computeVizProps({\n ...props,\n ...evaluatedOptionsToUse,\n // Align option transformation with the actual renderer selected below.\n // This prevents canvas-only option preservation from leaking into Highcharts mode.\n isAcceleratedRenderOn,\n ...eventCallbackProps,\n themeFunc,\n });\n\n // if were using webworkers and this is the first render we dont want to show a viz with missing data so we return null\n if (useAsyncEvaluatedOptions && Object.keys(evaluatedOptionsToUse).length === 0) {\n return null;\n }\n\n // if acceleratedRender mode is on, then use canvas viz\n const SanitizedViz = isAcceleratedRenderOn ? SanitizedTimeSeriesChartWrapper : SanitizedReactViz;\n\n return (\n <SanitizedViz\n {...SplunkVisualization.defaults}\n mode={mode}\n width={width || SplunkVisualization.defaults.width}\n height={height || SplunkVisualization.defaults.height}\n userLocale={localeContext}\n {...downsamplingProps}\n {...evaluatedOptionsToUse}\n {...computedVizProps}\n {...eventCallbackProps}\n {...dataSourceMetadata}\n />\n );\n };\n\n DashboardViz.propTypes = {\n ...SplunkVisualization.propTypes,\n ...ReactViz.propTypes,\n };\n\n DashboardViz.defaultProps = {\n ...ReactViz.defaultProps, // we still need ReactViz.defaultProps for the visualizations that still have them\n onEventTrigger: SplunkVisualization.defaults.onEventTrigger,\n };\n\n // attach viz config\n DashboardViz.config = vizConfig;\n\n return Object.assign(\n withTheme(withPlaceholder(withEditModeCover(DashboardViz, disableEditModeCover), useIconPlaceholder)),\n { config: vizConfig }\n );\n};\n\nexport default withDashboardViz;\n", "\nimport * as defaultImport from \"@splunk/visualization-color-palettes\";\nexport * from \"@splunk/visualization-color-palettes\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import { TreemapInputData, TreemapNodeData } from './treemapTypes';\n\nexport const PARENT_VALUE_LESS_THAN_CHILDREN_ERROR =\n 'Error: The given parent values is less than the sum of its children. Set sumFromLeafNodes true to generate parent values from children.';\n\nconst UNKNOWN_NODE_NAME = 'Unknown';\nconst FLAT_PARENT_NAME = 'root';\nconst VALUE_EPSILON = 1e-9;\n\ninterface BuildTreeOptions {\n sumFromLeafNodes?: boolean;\n}\n\nlet nodeIdCounter = 0;\n\ninterface TreemapEdge {\n toId: string;\n toName: string;\n value: number;\n rowIndex: number;\n additionalFields?: Record<string, unknown>;\n}\n\ninterface TreemapBuildData {\n edgesByParent: Map<string, Map<string, TreemapEdge>>;\n parentIds: Set<string>;\n childIds: Set<string>;\n labelsById: Map<string, string>;\n}\n\nconst createNode = (\n name: string,\n depth: number,\n path: string[],\n rootCategory: string,\n additionalFields?: Record<string, unknown>,\n value = 0\n): TreemapNodeData => {\n nodeIdCounter += 1;\n return {\n id: `node-${nodeIdCounter}`,\n name,\n value,\n depth,\n path,\n rootCategory,\n children: [],\n additionalFields,\n };\n};\n\n/**\n * Recursively rolls up values from leaf nodes to parent nodes.\n * A parent's value is the sum of its children's values.\n * Uses a visited set to guard against cycles.\n */\nconst rollUpValues = (node: TreemapNodeData, visited = new Set<string>()): number => {\n if (visited.has(node.id)) {\n return 0;\n }\n visited.add(node.id);\n if (!node.children || node.children.length === 0) {\n return node.value;\n }\n const childSum = node.children.reduce((sum, child) => sum + rollUpValues(child, visited), 0);\n const currentNode = node;\n currentNode.value = childSum;\n return childSum;\n};\n\nconst appendUnknownChild = (node: TreemapNodeData, value: number): void => {\n const unknownNode = createNode(\n UNKNOWN_NODE_NAME,\n node.depth + 1,\n [...node.path, UNKNOWN_NODE_NAME],\n node.rootCategory,\n undefined,\n value\n );\n unknownNode.parent = node;\n const currentNode = node;\n currentNode.children = [...(currentNode.children || []), unknownNode];\n};\n\nconst reconcileProvidedParentValues = (\n node: TreemapNodeData,\n validateNodeValue: boolean\n): string | undefined => {\n if (!node.children || node.children.length === 0) {\n return undefined;\n }\n\n for (const child of node.children) {\n const childError = reconcileProvidedParentValues(child, true);\n if (childError) {\n return childError;\n }\n }\n\n const childSum = node.children.reduce((sum, child) => sum + child.value, 0);\n const hasProvidedNodeValue = validateNodeValue && node.rowIndex !== undefined;\n if (!hasProvidedNodeValue) {\n const currentNode = node;\n currentNode.value = childSum;\n return undefined;\n }\n\n if (node.value + VALUE_EPSILON < childSum) {\n return PARENT_VALUE_LESS_THAN_CHILDREN_ERROR;\n }\n\n if (node.value > childSum + VALUE_EPSILON) {\n appendUnknownChild(node, node.value - childSum);\n }\n\n return undefined;\n};\n\nconst finalizeValues = (root: TreemapNodeData, sumFromLeafNodes: boolean): void => {\n if (sumFromLeafNodes) {\n rollUpValues(root);\n return;\n }\n\n const validationError = reconcileProvidedParentValues(root, false);\n if (validationError) {\n const currentRoot = root;\n currentRoot.validationError = validationError;\n }\n};\n\nconst getAdditionalFieldsForRow = (\n additionalTooltipFieldValues: TreemapInputData['additionalTooltipFieldValues'],\n row: number\n): Record<string, unknown> | undefined => {\n if (!additionalTooltipFieldValues || additionalTooltipFieldValues.length === 0) {\n return undefined;\n }\n const extraFields: Record<string, unknown> = {};\n for (const field of additionalTooltipFieldValues) {\n extraFields[field.name] = field.values[row];\n }\n return extraFields;\n};\n\nconst createEdge = (\n toId: string,\n toName: string,\n value: number,\n row: number,\n additionalFields: Record<string, unknown> | undefined\n): TreemapEdge => {\n return {\n toId,\n toName,\n value,\n rowIndex: row,\n additionalFields,\n };\n};\n\nconst addEdge = (buildData: TreemapBuildData, fromId: string, toId: string, edge: TreemapEdge): void => {\n let edgesForParent = buildData.edgesByParent.get(fromId);\n if (!edgesForParent) {\n edgesForParent = new Map<string, TreemapEdge>();\n buildData.edgesByParent.set(fromId, edgesForParent);\n }\n edgesForParent.set(toId, edge);\n};\n\nconst collectBuildData = (inputData: TreemapInputData): TreemapBuildData => {\n const buildData: TreemapBuildData = {\n edgesByParent: new Map<string, Map<string, TreemapEdge>>(),\n parentIds: new Set<string>(),\n childIds: new Set<string>(),\n labelsById: new Map<string, string>(),\n };\n const { parent, nodeIds, nodeLabels, value, additionalTooltipFieldValues } = inputData;\n const rowCount = nodeIds?.length ?? 0;\n\n for (let row = 0; row < rowCount; row += 1) {\n const fromId = parent ? String(parent[row]) : FLAT_PARENT_NAME;\n const toId = String(nodeIds?.[row]);\n const toName = nodeLabels ? String(nodeLabels[row]) : toId;\n const nodeValue = value ? Number(value[row]) || 0 : 0;\n const additionalFields = getAdditionalFieldsForRow(additionalTooltipFieldValues, row);\n\n buildData.parentIds.add(fromId);\n buildData.labelsById.set(toId, toName);\n if (fromId !== toId) {\n buildData.childIds.add(toId);\n addEdge(buildData, fromId, toId, createEdge(toId, toName, nodeValue, row, additionalFields));\n }\n }\n return buildData;\n};\n\nconst createPathKey = (path: string[]): string => path.join('\\0');\n\nconst applyEdgeData = (node: TreemapNodeData, edge: TreemapEdge): void => {\n const currentNode = node;\n currentNode.value = edge.value;\n currentNode.rowIndex = edge.rowIndex;\n if (edge.additionalFields) {\n currentNode.additionalFields = edge.additionalFields;\n }\n};\n\nconst buildNodeFromEdges = (\n nodeId: string,\n parent: TreemapNodeData | undefined,\n pathIds: string[],\n edge: TreemapEdge | undefined,\n buildData: TreemapBuildData,\n nodeMap: Map<string, TreemapNodeData>\n): TreemapNodeData => {\n const pathKey = createPathKey(pathIds);\n const name = edge?.toName ?? buildData.labelsById.get(nodeId) ?? nodeId;\n const path = parent ? [...parent.path, name] : [name];\n let node = nodeMap.get(pathKey);\n if (!node) {\n node = createNode(name, parent ? parent.depth + 1 : 0, path, parent?.rootCategory || name);\n node.sourcePath = [...pathIds];\n node.parent = parent;\n nodeMap.set(pathKey, node);\n }\n if (edge) {\n applyEdgeData(node, edge);\n }\n\n const childEdges = buildData.edgesByParent.get(nodeId);\n if (!childEdges || childEdges.size === 0) {\n return node;\n }\n\n const children: TreemapNodeData[] = [];\n for (const childEdge of childEdges.values()) {\n if (!pathIds.includes(childEdge.toId)) {\n const childPath = [...pathIds, childEdge.toId];\n children.push(buildNodeFromEdges(childEdge.toId, node, childPath, childEdge, buildData, nodeMap));\n }\n }\n node.children = children;\n return node;\n};\n\nconst buildRoots = (buildData: TreemapBuildData): TreemapNodeData[] => {\n const nodeMap = new Map<string, TreemapNodeData>();\n const rootIds = Array.from(buildData.parentIds).filter(name => !buildData.childIds.has(name));\n return rootIds.map(rootId =>\n buildNodeFromEdges(rootId, undefined, [rootId], undefined, buildData, nodeMap)\n );\n};\n\nconst fixDepthAndPath = (\n node: TreemapNodeData,\n depth: number,\n path: string[],\n visited = new Set<string>()\n): void => {\n if (visited.has(node.id)) {\n return;\n }\n visited.add(node.id);\n const currentNode = node;\n currentNode.depth = depth;\n currentNode.path = path;\n if (depth === 1) {\n currentNode.rootCategory = currentNode.name;\n }\n currentNode.children?.forEach(child => {\n const currentChild = child;\n currentChild.rootCategory = currentNode.rootCategory || currentChild.rootCategory;\n currentChild.parent = currentNode;\n fixDepthAndPath(child, depth + 1, [...path, child.name], visited);\n });\n};\n\nconst finalizeSingleRoot = (root: TreemapNodeData, sumFromLeafNodes: boolean): TreemapNodeData => {\n fixDepthAndPath(root, 0, [root.name]);\n finalizeValues(root, sumFromLeafNodes);\n return root;\n};\n\nconst createSyntheticRoot = (roots: TreemapNodeData[], sumFromLeafNodes: boolean): TreemapNodeData => {\n const syntheticRoot = createNode('root', 0, [], '');\n syntheticRoot.children = roots;\n roots.forEach(root => {\n const rootNode = root;\n rootNode.parent = syntheticRoot;\n fixDepthAndPath(root, 1, [root.name]);\n });\n finalizeValues(syntheticRoot, sumFromLeafNodes);\n return syntheticRoot;\n};\n\n/**\n * Builds a tree from explicit parent-node pair data.\n *\n * @param inputData - Resolved treemap option data arrays\n * @returns Root TreemapNodeData\n */\nexport const buildTree = (\n inputData: TreemapInputData,\n options: BuildTreeOptions = {}\n): TreemapNodeData | null => {\n if (!inputData?.nodeIds || inputData.nodeIds.length === 0) {\n return null;\n }\n\n nodeIdCounter = 0;\n const roots = buildRoots(collectBuildData(inputData));\n\n if (roots.length === 0) {\n return null;\n }\n\n if (roots.length === 1) {\n return finalizeSingleRoot(roots[0], options.sumFromLeafNodes ?? false);\n }\n\n return createSyntheticRoot(roots, options.sumFromLeafNodes ?? false);\n};\n", "\nimport * as defaultImport from \"d3-hierarchy\";\nexport * from \"d3-hierarchy\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import { hierarchy as d3Hierarchy, treemap as d3Treemap } from 'd3-hierarchy';\nimport type { HierarchyNode } from 'd3-hierarchy';\n\nimport { TreemapNodeData } from './treemapTypes';\n\n/**\n * Represents a positioned rectangle in the treemap layout.\n * x0, y0 = top-left corner; x1, y1 = bottom-right corner.\n * Children are nested rects laid out inside this rect.\n */\nexport interface TreemapRect {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n node: TreemapNodeData;\n children?: TreemapRect[];\n}\n\ninterface ComputeTreemapLayoutOptions {\n svgMode?: boolean;\n showSubdivisions?: boolean;\n}\n\ntype RawTreemapRect = Omit<TreemapRect, 'children'>;\n\ninterface RectsFitOptions {\n applyGap?: boolean;\n allowSmallSynthetic?: boolean;\n}\n\ninterface CollapsedTreemapChildrenResult {\n children: TreemapNodeData[] | null;\n collapsedCount: number;\n tooManySameSizeNodes: boolean;\n}\n\n/** Gap between adjacent rects */\nconst GAP = 4;\n/** Half-gap applied to each side of a rect */\nconst HALF_GAP = GAP / 2;\n/** Pointer target padding that lets adjacent nodes each own half of the visual gap. */\nconst HOVER_TARGET_PADDING = HALF_GAP;\n/** Height reserved for the parent header label */\nconst HEADER_HEIGHT = 22;\n/** Border radius for all rects */\nconst BORDER_RADIUS = 2;\n/** Minimum parent cell height to allow nesting (header + content) */\nconst MIN_PARENT_HEIGHT = 48;\n/** Minimum parent cell width to allow nesting */\nconst MIN_PARENT_WIDTH = 24;\n/** Minimum dimension (px) for a leaf node after gap inset */\nconst MIN_LEAF_DIM = 12;\n/** Synthetic \"others\" may be smaller than normal leaf nodes, but must remain renderable. */\nconst MIN_SYNTHETIC_DIM = 1;\n/**\n * Largest visible-count candidate window that we test with exact d3 layouts\n * before falling back to binary search.\n *\n * This is a layout-search guard, not a rendered-node cap. Dense data can have\n * thousands of possible \"visible children + others\" counts, and each exact\n * check runs a squarify layout. Squarify fit is not strictly monotone, so we\n * scan the largest nearby candidates exactly to avoid collapsing too many\n * nodes, then binary-search the remaining lower range to keep resize work\n * bounded.\n */\nconst EXACT_PAGE_SIZE_SCAN_LIMIT = 300;\n/**\n * Maximum descendant count for nested SVG subdivision rendering.\n *\n * When subdivisions are enabled and this threshold is not exceeded, each\n * visible parent body uses the same \"others\" collapse logic for its direct\n * children. This raw descendant guard still exists because the nested layout\n * pass has to inspect parent child sets before it can collapse them; above the\n * threshold, parent nodes render as solid drillable blocks instead. Zooming into\n * a parent makes its children the current level, where collapse still applies.\n */\nconst SVG_NODE_LIMIT = 500;\n/**\n * Minimum area (px) a leaf must be allocated for it to reach MIN_LEAF_DIM on\n * its shortest side. Accounts for gap inset and worst-case squarify aspect\n * ratio (~4:1): shortSide = sqrt(area / 4), so area >= (dim+gap)^2 * 4.\n */\nconst MIN_LEAF_AREA = (MIN_LEAF_DIM + GAP) * (MIN_LEAF_DIM + GAP) * 4;\n\ntype SyntheticRoot = { children: TreemapNodeData[] };\n\nconst filterValidRects = <T extends RawTreemapRect>(rects: T[]): T[] =>\n rects.filter(r => r.x1 > r.x0 && r.y1 > r.y0);\n\nconst applyGapToRects = (rects: RawTreemapRect[]): TreemapRect[] =>\n filterValidRects(\n rects.map(r => {\n const rectWidth = r.x1 - r.x0;\n const rectHeight = r.y1 - r.y0;\n const insetX = r.node.isSynthetic\n ? Math.min(HALF_GAP, Math.max(0, (rectWidth - MIN_SYNTHETIC_DIM) / 2))\n : HALF_GAP;\n const insetY = r.node.isSynthetic\n ? Math.min(HALF_GAP, Math.max(0, (rectHeight - MIN_SYNTHETIC_DIM) / 2))\n : HALF_GAP;\n return {\n x0: r.x0 + insetX,\n y0: r.y0 + insetY,\n x1: r.x1 - insetX,\n y1: r.y1 - insetY,\n node: r.node,\n };\n })\n );\n\nconst compareTreemapNodes = (\n a: HierarchyNode<SyntheticRoot | TreemapNodeData>,\n b: HierarchyNode<SyntheticRoot | TreemapNodeData>\n): number => {\n const aSynthetic = Boolean((a.data as TreemapNodeData).isSynthetic);\n const bSynthetic = Boolean((b.data as TreemapNodeData).isSynthetic);\n\n if (aSynthetic !== bSynthetic) {\n return aSynthetic ? 1 : -1;\n }\n\n return (b.value ?? 0) - (a.value ?? 0);\n};\n\n/**\n * Lays out weighted rectangles inside a container using d3-hierarchy's default\n * squarify tiling algorithm (Bruls, Huizing, van Wijk 2000).\n *\n * When `applyGap` is true, each rect is inset by HALF_GAP on all sides so\n * adjacent rects have a full GAP between them. When false, rects tile\n * edge-to-edge (used for children inside a parent body).\n *\n * d3's default squarify tiling uses the golden ratio as its target ratio.\n */\nconst squarify = (\n children: TreemapNodeData[],\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n applyGap = true\n): TreemapRect[] => {\n const w = x1 - x0;\n const h = y1 - y0;\n\n const validChildren = children.filter(c => c.value > 0);\n if (validChildren.length === 0 || w <= 0 || h <= 0) {\n return [];\n }\n\n const syntheticRoot: SyntheticRoot = { children: validChildren };\n\n const root = d3Hierarchy<SyntheticRoot | TreemapNodeData>(\n syntheticRoot,\n (d): Array<SyntheticRoot | TreemapNodeData> | undefined =>\n d === syntheticRoot ? (d as SyntheticRoot).children : undefined\n )\n .sum(d => (d as TreemapNodeData).value ?? 0)\n .sort(compareTreemapNodes);\n\n const laidOut = d3Treemap<SyntheticRoot | TreemapNodeData>().size([w, h])(root);\n\n const rawRects: RawTreemapRect[] = (laidOut.children ?? []).map(node => ({\n x0: x0 + node.x0,\n y0: y0 + node.y0,\n x1: x0 + node.x1,\n y1: y0 + node.y1,\n node: node.data as TreemapNodeData,\n }));\n\n if (!applyGap) {\n return filterValidRects(rawRects);\n }\n\n return applyGapToRects(rawRects);\n};\n\n/**\n * Recursively computes the nested treemap layout.\n * Parent nodes always get a header area, then their children are laid out in the remaining space.\n */\nconst layoutRecursive = (\n children: TreemapNodeData[],\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n maxDepth: number,\n applyGap = true\n): TreemapRect[] => {\n const validChildren = children.filter(c => c.value > 0);\n if (validChildren.length === 0) {\n return [];\n }\n\n const parentRects = squarify(validChildren, x0, y0, x1, y1, applyGap);\n\n if (maxDepth <= 0) {\n return parentRects;\n }\n\n for (const rect of parentRects) {\n // Synthetic \"others\" nodes retain their collapsed children for drill-in,\n // but must remain a compact aggregate in their parent's layout.\n const hasChildren = !rect.node.isSynthetic && rect.node.children && rect.node.children.length > 0;\n const rectWidth = rect.x1 - rect.x0;\n const rectHeight = rect.y1 - rect.y0;\n\n if (hasChildren && rectWidth >= MIN_PARENT_WIDTH && rectHeight >= MIN_PARENT_HEIGHT) {\n // Children fill the body area edge-to-edge (no inner padding, no gaps)\n const childX0 = rect.x0;\n const childY0 = rect.y0 + HEADER_HEIGHT;\n const childX1 = rect.x1;\n const childY1 = rect.y1;\n\n if (childX1 > childX0 && childY1 > childY0) {\n const collapsedChildResult = getCollapsedTreemapChildren(\n rect.node,\n rect.node.children || [],\n childX1 - childX0,\n childY1 - childY0,\n false\n );\n rect.children = collapsedChildResult.children\n ? layoutRecursive(\n collapsedChildResult.children,\n childX0,\n childY0,\n childX1,\n childY1,\n maxDepth - 1,\n false\n )\n : [];\n }\n }\n }\n\n return parentRects;\n};\n\n/** Returns as soon as the nested SVG descendant cap is exceeded. */\nconst exceedsDescendantLimit = (node: TreemapNodeData, limit: number): boolean => {\n let count = 0;\n const stack = [node];\n\n while (stack.length > 0) {\n const currentNode = stack.pop();\n count += 1;\n if (count > limit) {\n return true;\n }\n // Collapsed children are hidden behind a synthetic drill level and do not\n // contribute to the amount of subdivision SVG rendered at this level.\n if (!currentNode.isSynthetic) {\n currentNode.children?.forEach(child => stack.push(child));\n }\n }\n\n return false;\n};\n\nconst normalizeComputeOptions = (\n options: ComputeTreemapLayoutOptions | boolean\n): Required<ComputeTreemapLayoutOptions> => {\n if (typeof options === 'boolean') {\n return {\n svgMode: options,\n showSubdivisions: false,\n };\n }\n return {\n svgMode: options.svgMode ?? true,\n showSubdivisions: options.showSubdivisions ?? false,\n };\n};\n\n/**\n * Computes the full nested treemap layout for a given node's children.\n * Nested subdivisions are opt-in; otherwise only the current node's direct\n * children are laid out. When the total descendant count exceeds\n * SVG_NODE_LIMIT, nesting is disabled so parents render as solid blocks.\n */\nexport const computeTreemapLayout = (\n node: TreemapNodeData,\n width: number,\n height: number,\n options: ComputeTreemapLayoutOptions | boolean = {}\n): TreemapRect[] => {\n const { svgMode, showSubdivisions } = normalizeComputeOptions(options);\n\n if (!node.children || node.children.length === 0) {\n return [\n {\n x0: HALF_GAP,\n y0: HALF_GAP,\n x1: width - HALF_GAP,\n y1: height - HALF_GAP,\n node,\n },\n ];\n }\n\n const validChildren = node.children.filter(c => c.value > 0);\n if (validChildren.length === 0) {\n return [];\n }\n\n if (!showSubdivisions) {\n return layoutRecursive(validChildren, 0, 0, width, height, 0);\n }\n\n // Avoid inspecting and rendering nested subdivision bodies when the raw tree is too large.\n const maxDepth = svgMode && exceedsDescendantLimit(node, SVG_NODE_LIMIT) ? 0 : 1;\n\n return layoutRecursive(validChildren, 0, 0, width, height, maxDepth);\n};\n\nexport interface CollapsedTreemapNodeResult {\n node: TreemapNodeData | null;\n collapsedCount: number;\n tooManySameSizeNodes: boolean;\n}\n\nconst formatOtherNodeName = (count: number): string => `${count} ${count === 1 ? 'other' : 'others'}`;\n\nconst createOtherNode = (\n parentNode: TreemapNodeData,\n collapsedChildren: TreemapNodeData[]\n): TreemapNodeData => {\n const collapsedCount = collapsedChildren.length;\n const name = formatOtherNodeName(collapsedCount);\n return {\n id: `${parentNode.id}-others`,\n name,\n value: collapsedChildren.reduce((sum, child) => sum + child.value, 0),\n depth: parentNode.depth + 1,\n parent: parentNode,\n path: [...parentNode.path, name],\n rootCategory: collapsedChildren[0]?.rootCategory || name,\n children: collapsedChildren,\n isSynthetic: true,\n };\n};\n\nconst rectsFit = (\n children: TreemapNodeData[],\n width: number,\n height: number,\n { applyGap = true, allowSmallSynthetic = false }: RectsFitOptions = {}\n): boolean => {\n const rects = squarify(children, 0, 0, width, height, applyGap);\n if (!allowSmallSynthetic) {\n return (\n rects.length === children.length &&\n rects.every(rect => rect.x1 - rect.x0 >= MIN_LEAF_DIM && rect.y1 - rect.y0 >= MIN_LEAF_DIM)\n );\n }\n\n const rectByNodeId = new Map(rects.map(rect => [rect.node.id, rect]));\n return children.every(child => {\n if (child.isSynthetic) {\n return true;\n }\n const rect = rectByNodeId.get(child.id);\n return Boolean(rect && rect.x1 - rect.x0 >= MIN_LEAF_DIM && rect.y1 - rect.y0 >= MIN_LEAF_DIM);\n });\n};\n\nconst getCollapsedChildren = (\n parentNode: TreemapNodeData,\n sortedChildren: TreemapNodeData[],\n visibleCount: number\n): TreemapNodeData[] => {\n const visibleChildren = sortedChildren.slice(0, visibleCount);\n const collapsedChildren = sortedChildren.slice(visibleCount);\n return [...visibleChildren, createOtherNode(parentNode, collapsedChildren)];\n};\n\nconst findLargestFittingVisibleCount = (\n parentNode: TreemapNodeData,\n sortedChildren: TreemapNodeData[],\n width: number,\n height: number,\n high: number,\n applyGap: boolean\n): number => {\n const fitsVisibleCount = (visibleCount: number): boolean =>\n rectsFit(getCollapsedChildren(parentNode, sortedChildren, visibleCount), width, height, {\n applyGap,\n allowSmallSynthetic: true,\n });\n\n if (high <= EXACT_PAGE_SIZE_SCAN_LIMIT) {\n for (let visibleCount = high; visibleCount >= 1; visibleCount -= 1) {\n if (fitsVisibleCount(visibleCount)) {\n return visibleCount;\n }\n }\n return 0;\n }\n\n for (let visibleCount = high; visibleCount > high - EXACT_PAGE_SIZE_SCAN_LIMIT; visibleCount -= 1) {\n if (fitsVisibleCount(visibleCount)) {\n return visibleCount;\n }\n }\n\n // Squarify fit is not strictly monotone, so this is a conservative fallback\n // for very large candidate ranges after checking the largest nearby values.\n let lo = 1;\n let hi = Math.max(1, high - EXACT_PAGE_SIZE_SCAN_LIMIT);\n let best = 0;\n while (lo <= hi) {\n const mid = Math.floor((lo + hi) / 2);\n if (fitsVisibleCount(mid)) {\n best = mid;\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return best;\n};\n\nconst getSortedPositiveChildren = (children: TreemapNodeData[]): TreemapNodeData[] =>\n [...children].filter(c => c.value > 0).sort((a, b) => b.value - a.value);\n\nconst getCollapsedSortedTreemapChildren = (\n parentNode: TreemapNodeData,\n sortedChildren: TreemapNodeData[],\n width: number,\n height: number,\n applyGap = true\n): CollapsedTreemapChildrenResult => {\n if (width <= 0 || height <= 0 || sortedChildren.length < 2) {\n return { children: sortedChildren, collapsedCount: 0, tooManySameSizeNodes: false };\n }\n\n if (rectsFit(sortedChildren, width, height, { applyGap })) {\n return {\n children: sortedChildren,\n collapsedCount: 0,\n tooManySameSizeNodes: false,\n };\n }\n\n const minCellDim = MIN_LEAF_DIM + (applyGap ? GAP : 0);\n const searchBound = Math.floor((width * height) / (minCellDim * minCellDim));\n const visibleHigh = Math.min(sortedChildren.length - 1, searchBound - 1);\n if (visibleHigh < 1) {\n return { children: null, collapsedCount: 0, tooManySameSizeNodes: true };\n }\n\n const visibleCount = findLargestFittingVisibleCount(\n parentNode,\n sortedChildren,\n width,\n height,\n visibleHigh,\n applyGap\n );\n\n if (visibleCount < 1) {\n return { children: null, collapsedCount: 0, tooManySameSizeNodes: true };\n }\n\n return {\n children: getCollapsedChildren(parentNode, sortedChildren, visibleCount),\n collapsedCount: sortedChildren.length - visibleCount,\n tooManySameSizeNodes: false,\n };\n};\n\nconst getCollapsedTreemapChildren = (\n parentNode: TreemapNodeData,\n children: TreemapNodeData[],\n width: number,\n height: number,\n applyGap = true\n): CollapsedTreemapChildrenResult =>\n getCollapsedSortedTreemapChildren(\n parentNode,\n getSortedPositiveChildren(children),\n width,\n height,\n applyGap\n );\n\n/**\n * Collapses small tail nodes into a synthetic \"N others\" node so all data is\n * represented in one treemap without pagination.\n */\nexport const getCollapsedTreemapNode = (\n currentNode: TreemapNodeData | null | undefined,\n width: number,\n height: number,\n sortedChildren: TreemapNodeData[]\n): CollapsedTreemapNodeResult => {\n if (!currentNode) {\n return { node: null, collapsedCount: 0, tooManySameSizeNodes: false };\n }\n\n if (width <= 0 || height <= 0 || sortedChildren.length < 2) {\n return { node: currentNode, collapsedCount: 0, tooManySameSizeNodes: false };\n }\n\n const collapsedResult = getCollapsedSortedTreemapChildren(\n currentNode,\n sortedChildren,\n width,\n height,\n true\n );\n if (!collapsedResult.children) {\n return { node: null, collapsedCount: 0, tooManySameSizeNodes: true };\n }\n\n return {\n node: {\n ...currentNode,\n children: collapsedResult.children,\n },\n collapsedCount: collapsedResult.collapsedCount,\n tooManySameSizeNodes: collapsedResult.tooManySameSizeNodes,\n };\n};\n\nexport { HEADER_HEIGHT, BORDER_RADIUS, MIN_LEAF_AREA, HOVER_TARGET_PADDING };\n", "\nimport * as defaultImport from \"chroma-js\";\nexport * from \"chroma-js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import chroma from 'chroma-js';\nimport { TreemapNodeData } from './treemapTypes';\n\nconst WCAG_LUMINANCE_THRESHOLD = 0.182;\n\n/**\n * Converts any supported CSS color string to RGB components.\n */\nconst colorToRgb = (color?: string): { r: number; g: number; b: number } => {\n try {\n const [r, g, b] = chroma(color || '#000000').rgb();\n return { r, g, b };\n } catch {\n return { r: 0, g: 0, b: 0 };\n }\n};\n\n/**\n * Returns true when a CSS color has transparency.\n */\nexport const isTransparentColor = (color?: string): boolean => {\n const normalizedColor = color?.trim().toLowerCase();\n if (!normalizedColor) {\n return false;\n }\n if (normalizedColor === 'transparent') {\n return true;\n }\n\n try {\n return chroma(normalizedColor).alpha() < 1;\n } catch {\n return false;\n }\n};\n\n/**\n * Calculates the relative luminance of a color per WCAG 2.0.\n * @param color - CSS color string (e.g. \"#7B56DB\", \"black\", \"rgb(0,0,0)\")\n * @returns Relative luminance (0 = black, 1 = white)\n */\nconst getRelativeLuminance = (color?: string): number => {\n const { r, g, b } = colorToRgb(color);\n const linearize = (c: number): number => {\n const x = c / 255;\n return x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4;\n };\n return 0.2126 * linearize(r) + 0.7152 * linearize(g) + 0.0722 * linearize(b);\n};\n\n/**\n * Returns the appropriate text color (light or dark) for a given background color,\n * following WCAG luminance contrast guidelines.\n *\n * @param bgColor - CSS background color string\n * @returns '#ffffff' for dark backgrounds, '#000000' for light backgrounds\n */\nexport const getTextColorForBackground = (bgColor?: string): string => {\n const luminance = getRelativeLuminance(bgColor);\n return luminance > WCAG_LUMINANCE_THRESHOLD ? '#000000' : '#ffffff';\n};\n\n/**\n * Returns the fill color for a treemap node based on series coloring.\n * Level 1 categories each get a distinct color from the palette.\n *\n * @param node - The node to color\n * @param seriesColors - The categorical color palette\n * @param categoryIndex - Map of root category name to palette index\n * @returns CSS color string\n */\nexport const getSeriesColor = (\n node: TreemapNodeData,\n seriesColors: string[],\n categoryIndex: Map<string, number>\n): string => {\n const index = categoryIndex.get(node.rootCategory) ?? 0;\n return seriesColors[index % seriesColors.length];\n};\n\n/**\n * Darkens a CSS color by a factor (0-1).\n * factor=0 returns original, factor=1 returns black.\n */\nexport const darkenColor = (hex: string, factor: number): string => {\n const { r, g, b } = colorToRgb(hex);\n const dr = Math.round(r * (1 - factor));\n const dg = Math.round(g * (1 - factor));\n const db = Math.round(b * (1 - factor));\n return `#${dr.toString(16).padStart(2, '0')}${dg.toString(16).padStart(2, '0')}${db.toString(16).padStart(2, '0')}`;\n};\n\n/**\n * Lightens a CSS color by a factor (0-1).\n * factor=0 returns original, factor=1 returns white.\n */\nexport const lightenColor = (hex: string, factor: number): string => {\n const { r, g, b } = colorToRgb(hex);\n const lr = Math.round(r + (255 - r) * factor);\n const lg = Math.round(g + (255 - g) * factor);\n const lb = Math.round(b + (255 - b) * factor);\n return `#${lr.toString(16).padStart(2, '0')}${lg.toString(16).padStart(2, '0')}${lb.toString(16).padStart(2, '0')}`;\n};\n\n/**\n * Returns a stroke color for a node rect that contrasts with the dashboard background.\n * Dark backgrounds get a lighter stroke; light backgrounds get a darker stroke.\n *\n * @param fillColor - The node's CSS fill color\n * @param bgColor - The dashboard CSS background color\n * @param factor - How much to lighten or darken (0-1)\n */\nexport const getStrokeColor = (fillColor: string, bgColor: string, factor: number): string => {\n const bgLuminance = getRelativeLuminance(bgColor);\n return bgLuminance > WCAG_LUMINANCE_THRESHOLD\n ? darkenColor(fillColor, factor)\n : lightenColor(fillColor, factor);\n};\n\nexport interface StandaloneNodeStyle {\n nodeFillColor: string;\n strokeColor: string;\n strokeWidth: number;\n}\n\nexport const getStandaloneNodeStyle = ({\n isSynthetic,\n backgroundColor,\n baseColor,\n strokeFactor,\n defaultStrokeWidth,\n}: {\n isSynthetic: boolean;\n backgroundColor: string;\n baseColor: string;\n strokeFactor: number;\n defaultStrokeWidth: number;\n}): StandaloneNodeStyle => {\n if (isSynthetic) {\n return {\n nodeFillColor: backgroundColor,\n strokeColor: 'none',\n strokeWidth: 0,\n };\n }\n\n return {\n nodeFillColor: baseColor,\n strokeColor: getStrokeColor(baseColor, backgroundColor, strokeFactor),\n strokeWidth: defaultStrokeWidth,\n };\n};\n\n/**\n * Builds a map from Level 1 category names to their index in the color palette.\n */\nexport const buildCategoryIndex = (rootChildren: TreemapNodeData[]): Map<string, number> => {\n const map = new Map<string, number>();\n rootChildren.forEach((child, index) => {\n map.set(child.name, index);\n });\n return map;\n};\n\n/**\n * Determines whether label text should be light or dark based on the background color.\n * Uses WCAG relative luminance calculation.\n *\n * @param bgColor - CSS background color string\n * @returns 'light' or 'dark'\n */\nexport const getLabelColorMode = (bgColor: string): 'light' | 'dark' => {\n const luminance = getRelativeLuminance(bgColor);\n return luminance > WCAG_LUMINANCE_THRESHOLD ? 'dark' : 'light';\n};\n", "import { formatNumber } from '@splunk/visualizations-shared/numberUtils';\nimport { isArrayOfColors, sanitizeArrayOfColors } from '@splunk/visualizations-shared/colorUtils';\nimport chroma from 'chroma-js';\nimport type {\n TreemapAdditionalTooltipField,\n TreemapDataColorValue,\n TreemapDataColumn,\n TreemapInputData,\n TreemapNodeData,\n} from './treemapTypes';\n\nexport type { TreemapDataColorValue } from './treemapTypes';\n\nexport interface RangeEntry {\n from?: number;\n to?: number;\n value: string;\n}\n\nexport interface MatchEntry {\n match: string;\n value: string;\n}\n\nexport interface GradientConfig {\n colors: string[];\n stops?: number[];\n}\n\nexport interface DataColorLegendConfig {\n type: 'gradient' | 'matchValue' | 'rangeValue';\n gradient?: GradientConfig;\n ranges?: RangeEntry[];\n matches?: MatchEntry[];\n minVal?: number;\n maxVal?: number;\n}\n\nexport interface MatchLegendItem {\n label: string;\n color: string;\n}\n\nexport interface BuildTreemapDataColorMapOptions {\n dataColorValues?: TreemapDataColorValue[];\n useComputedValuesForDataColors?: boolean;\n}\n\ninterface OptionSchemaDefaults {\n [optionName: string]: { default?: unknown } | undefined;\n}\n\nexport type TreemapPopoverPlacement = 'above' | 'below' | 'left' | 'right';\n\nconst DEFAULT_PLACEMENT: TreemapPopoverPlacement = 'below';\nconst EDGE_THRESHOLD = 15;\nconst MIN_NAME_FONT_SIZE = 9;\nconst MAX_NAME_FONT_SIZE = 13;\nconst FONT_SIZE_FACTOR = 0.28;\nconst MIN_LABEL_WIDTH = 30;\nconst MIN_LABEL_HEIGHT = 16;\nconst DEFAULT_MIN_COLOR = 'rgba(123,86,219,0.4)';\nconst DEFAULT_MAX_COLOR = 'rgba(123,86,219,1)';\nconst { hasOwnProperty } = Object.prototype;\n\nconst TREEMAP_THEME_COLOR_VARIABLES = [\n 'contentTextColor',\n 'tooltipBodyColor',\n 'tooltipTitleColor',\n 'defaultNodeColor',\n];\n\nconst TREEMAP_DATA_COLUMN_OPTIONS = ['parent', 'nodeIds', 'nodeLabels', 'value', 'dataColorValues'] as const;\n\nconst normalizeDataColors = (dataColors: unknown): string[] | undefined =>\n Array.isArray(dataColors) && dataColors.length > 0\n ? sanitizeArrayOfColors(dataColors as string[])\n : undefined;\n\nconst normalizeArrayOption = <T>(value: unknown): T[] | undefined =>\n Array.isArray(value) ? (value as T[]) : undefined;\n\nconst normalizeSeriesColors = (seriesColors: unknown): string[] | undefined =>\n isArrayOfColors(seriesColors as string[]) ? [...(seriesColors as string[])] : undefined;\n\nconst normalizeAdditionalTooltipFields = (additionalTooltipFields: unknown): string[] =>\n normalizeArrayOption<string>(additionalTooltipFields) ?? [];\n\nconst getFieldName = (field: { name: string } | string): string => {\n if (typeof field === 'object' && field !== null) {\n return field.name;\n }\n return (field as string) ?? '';\n};\n\nconst normalizeSelectorExpression = (selector: unknown): string | undefined => {\n if (typeof selector !== 'string') {\n return undefined;\n }\n const trimmedSelector = selector.trim();\n if (!trimmedSelector.startsWith('>')) {\n return undefined;\n }\n return trimmedSelector.replaceAll('\"', \"'\").replaceAll(/\\s+/g, ' ');\n};\n\nconst getConfiguredOption = (\n options: Record<string, unknown> | undefined,\n optionDefaults: OptionSchemaDefaults,\n optionName: string\n): unknown => options?.[optionName] ?? optionDefaults[optionName]?.default;\n\nconst limitColumn = <T>(column: T[] | undefined, resultLimit: number | undefined): T[] | undefined => {\n if (!column || resultLimit === undefined) {\n return column;\n }\n return column.slice(0, resultLimit);\n};\n\nconst limitTooltipFieldValues = (\n fields: TreemapAdditionalTooltipField[] | undefined,\n resultLimit: number | undefined\n): TreemapAdditionalTooltipField[] | undefined => {\n if (!fields || resultLimit === undefined) {\n return fields;\n }\n return fields.map(field => ({\n ...field,\n values: field.values.slice(0, resultLimit),\n }));\n};\n\nexport const getTreemapThemeColors = (themeFunc: unknown): Record<string, unknown> => {\n const getThemeColor = themeFunc as (key: string) => unknown;\n const themeColors: Record<string, unknown> = {};\n TREEMAP_THEME_COLOR_VARIABLES.forEach(variable => {\n themeColors[variable] = getThemeColor(variable);\n });\n return themeColors;\n};\n\nexport const getFieldNames = (fields: unknown): string[] =>\n Array.isArray(fields) ? (fields as Array<{ name: string } | string>).map(getFieldName) : [];\n\nexport const normalizeTreemapOptions = (options: Record<string, unknown>): Record<string, unknown> => {\n const normalizedOptions = { ...options };\n\n TREEMAP_DATA_COLUMN_OPTIONS.forEach(key => {\n normalizedOptions[key] = normalizeArrayOption<TreemapDataColumn[number]>(normalizedOptions[key]);\n });\n normalizedOptions.seriesColors = normalizeSeriesColors(normalizedOptions.seriesColors);\n normalizedOptions.dataColors = normalizeDataColors(normalizedOptions.dataColors);\n normalizedOptions.additionalTooltipFields = normalizeAdditionalTooltipFields(\n normalizedOptions.additionalTooltipFields\n );\n\n return normalizedOptions;\n};\n\nexport const areDataColorValuesUsingValueField = ({\n options,\n optionDefaults,\n value,\n dataColorValues,\n}: {\n options: Record<string, unknown> | undefined;\n optionDefaults: OptionSchemaDefaults;\n value: unknown;\n dataColorValues: unknown;\n}): boolean => {\n const valueSelector = normalizeSelectorExpression(getConfiguredOption(options, optionDefaults, 'value'));\n const dataColorValuesSelector = normalizeSelectorExpression(\n getConfiguredOption(options, optionDefaults, 'dataColorValues')\n );\n if (valueSelector && dataColorValuesSelector && valueSelector === dataColorValuesSelector) {\n return true;\n }\n return Array.isArray(value) && value === dataColorValues;\n};\n\nexport const resolveAdditionalTooltipFieldValues = ({\n columns,\n fieldNames,\n additionalTooltipFields,\n}: {\n columns: unknown[] | undefined;\n fieldNames: string[];\n additionalTooltipFields: unknown;\n}): TreemapAdditionalTooltipField[] => {\n if (!Array.isArray(columns) || !Array.isArray(additionalTooltipFields)) {\n return [];\n }\n\n return (additionalTooltipFields as string[]).reduce<TreemapAdditionalTooltipField[]>((items, name) => {\n const fieldIndex = fieldNames.indexOf(name);\n const values = columns[fieldIndex];\n if (fieldIndex >= 0 && Array.isArray(values)) {\n items.push({ name, values: [...values] });\n }\n return items;\n }, []);\n};\n\nexport const getZoomPathForNode = (\n node: TreemapNodeData,\n rootNode: TreemapNodeData | null\n): TreemapNodeData[] => {\n const path: TreemapNodeData[] = [];\n const visitedNodeIds = new Set<string>();\n let currentNode: TreemapNodeData | undefined = node;\n while (\n currentNode &&\n currentNode !== rootNode &&\n currentNode.depth > 0 &&\n !visitedNodeIds.has(currentNode.id)\n ) {\n visitedNodeIds.add(currentNode.id);\n path.unshift(currentNode);\n currentNode = currentNode.parent;\n }\n return path;\n};\n\nconst getTreemapSourcePathKey = (sourcePath: string[]): string => sourcePath.join('\\0');\n\n/**\n * Replaces a drill path's stale nodes with nodes from a rebuilt tree.\n * Returns Overview when any breadcrumb no longer exists in the source hierarchy.\n */\nexport const reconcileTreemapZoomPath = (\n zoomPath: TreemapNodeData[],\n rootNode: TreemapNodeData | null\n): TreemapNodeData[] => {\n if (zoomPath.length === 0 || !rootNode) {\n return [];\n }\n\n const nodesBySourcePath = new Map<string, TreemapNodeData>();\n const stack = [rootNode];\n const visitedNodeIds = new Set<string>();\n while (stack.length > 0) {\n const node = stack.pop();\n if (node && !visitedNodeIds.has(node.id)) {\n visitedNodeIds.add(node.id);\n if (node.sourcePath) {\n nodesBySourcePath.set(getTreemapSourcePathKey(node.sourcePath), node);\n }\n node.children?.forEach(child => stack.push(child));\n }\n }\n\n const reconciledPath: TreemapNodeData[] = [];\n for (const staleNode of zoomPath) {\n // Synthetic Other levels depend on the old layout's collapsed set and\n // cannot be safely mapped into newly resolved data.\n if (staleNode.isSynthetic || !staleNode.sourcePath) {\n return [];\n }\n const freshNode = nodesBySourcePath.get(getTreemapSourcePathKey(staleNode.sourcePath));\n if (!freshNode) {\n return [];\n }\n reconciledPath.push(freshNode);\n }\n return reconciledPath;\n};\n\nexport const limitTreemapInputData = (\n data: TreemapInputData,\n resultLimit: number | undefined\n): TreemapInputData => ({\n parent: limitColumn(data.parent, resultLimit),\n nodeIds: limitColumn(data.nodeIds, resultLimit),\n nodeLabels: limitColumn(data.nodeLabels, resultLimit),\n value: limitColumn(data.value, resultLimit),\n dataColorValues: limitColumn(data.dataColorValues, resultLimit),\n additionalTooltipFieldValues: limitTooltipFieldValues(data.additionalTooltipFieldValues, resultLimit),\n});\n\nconst hasNonEmptyValue = (value: unknown): boolean => {\n if (typeof value === 'string') {\n return value.trim() !== '';\n }\n return typeof value === 'number';\n};\n\nexport const hasParentValues = (parent: TreemapDataColumn | undefined): boolean =>\n Array.isArray(parent) && parent.some(hasNonEmptyValue);\n\nexport const getTreemapLegendHeight = (legendElement: HTMLDivElement, minimumHeight: number): number => {\n if (legendElement.childElementCount === 0) {\n return 0;\n }\n const legendRect = legendElement.getBoundingClientRect?.();\n const measuredHeight =\n legendRect?.height || legendElement.scrollHeight || legendElement.offsetHeight || minimumHeight;\n return Math.max(minimumHeight, Math.ceil(measuredHeight));\n};\n\nexport const formatTreemapValue = (value: number): string => formatNumber(value, 0, { useTrendUnits: true });\n\nexport const formatRangeLabel = (entry: RangeEntry): string => {\n if (entry.from !== undefined && entry.to !== undefined) {\n return `${formatTreemapValue(entry.from)} - ${formatTreemapValue(entry.to)}`;\n }\n if (entry.to !== undefined) {\n return `< ${formatTreemapValue(entry.to)}`;\n }\n if (entry.from !== undefined) {\n return `> ${formatTreemapValue(entry.from)}`;\n }\n return '';\n};\n\nexport const getRangeEntryKey = (entry: RangeEntry): string =>\n `${entry.from ?? 'min'}-${entry.to ?? 'max'}-${entry.value}`;\n\nexport const getMatchItemKey = ({ color, label }: MatchLegendItem): string => `${color}-${label}`;\n\n/** Deduplicate match entries by color, grouping match names. */\nexport const deduplicateMatches = (matches: MatchEntry[]): MatchLegendItem[] => {\n const colorMap = new Map<string, string[]>();\n for (const m of matches) {\n const names = colorMap.get(m.value) || [];\n names.push(m.match);\n colorMap.set(m.value, names);\n }\n const result: MatchLegendItem[] = [];\n colorMap.forEach((names, color) => {\n result.push({ label: names.join(', '), color });\n });\n return result;\n};\n\nexport const getGradientCss = (colors: string[]): string => {\n if (colors.length === 0) {\n return '';\n }\n if (colors.length === 1) {\n return `linear-gradient(to right, ${colors[0]} 0%, ${colors[0]} 100%)`;\n }\n const stops = colors.map((color, i) => {\n const pct = (i / (colors.length - 1)) * 100;\n return `${color} ${pct}%`;\n });\n return `linear-gradient(to right, ${stops.join(', ')})`;\n};\n\nexport const getAdaptiveNameFontSize = (cellHeight: number): number =>\n Math.max(MIN_NAME_FONT_SIZE, Math.min(MAX_NAME_FONT_SIZE, Math.round(FONT_SIZE_FACTOR * cellHeight)));\n\nexport const getAdaptiveValueFontSize = (nameFontSize: number): number => Math.max(8, nameFontSize - 2);\n\nexport const hasSpaceForTreemapLabel = (\n cellWidth: number,\n cellHeight: number,\n minLabelWidth = MIN_LABEL_WIDTH,\n minLabelHeight = MIN_LABEL_HEIGHT\n): boolean => cellWidth > minLabelWidth && cellHeight > minLabelHeight;\n\nexport const getTreemapPopoverPlacement = (\n anchorElement: SVGElement | HTMLElement | null | undefined,\n containerWidth: number,\n edgeThreshold = EDGE_THRESHOLD,\n defaultPlacement: TreemapPopoverPlacement = DEFAULT_PLACEMENT\n): TreemapPopoverPlacement => {\n if (!anchorElement) {\n return defaultPlacement;\n }\n const bBox = anchorElement.getBoundingClientRect?.();\n if (!bBox) {\n return defaultPlacement;\n }\n\n if (bBox.x <= edgeThreshold) {\n return 'right';\n }\n if (bBox.x >= containerWidth - edgeThreshold) {\n return 'left';\n }\n\n return defaultPlacement;\n};\n\nexport const formatTooltipFieldValue = (fieldValue: unknown): string => {\n if (typeof fieldValue === 'string') {\n return fieldValue;\n }\n if (typeof fieldValue === 'number' || typeof fieldValue === 'boolean' || typeof fieldValue === 'bigint') {\n return `${fieldValue}`;\n }\n if (fieldValue instanceof Date) {\n return fieldValue.toISOString();\n }\n if (Array.isArray(fieldValue) || typeof fieldValue === 'object') {\n try {\n return JSON.stringify(fieldValue);\n } catch {\n return '[unserializable object]';\n }\n }\n if (typeof fieldValue === 'function') {\n return fieldValue.name || '[function]';\n }\n if (typeof fieldValue === 'symbol') {\n return fieldValue.description || fieldValue.toString();\n }\n return '';\n};\n\nconst getColorableTreemapNodes = (rootNode: TreemapNodeData): TreemapNodeData[] => {\n const nodes: TreemapNodeData[] = [];\n const collectNodes = (node: TreemapNodeData): void => {\n const shouldColorNode = node.depth > 0 || !node.children || node.children.length === 0;\n if (shouldColorNode && typeof node.value === 'number' && Number.isFinite(node.value)) {\n nodes.push(node);\n }\n node.children?.forEach(collectNodes);\n };\n collectNodes(rootNode);\n return nodes;\n};\n\nconst getColorableTreemapNodeValues = (\n rootNode: TreemapNodeData,\n dataColorValues?: TreemapDataColorValue[]\n): Array<{ node: TreemapNodeData; value: number }> => {\n const nodes = getColorableTreemapNodes(rootNode);\n if (!dataColorValues) {\n return nodes.map(node => ({ node, value: node.value }));\n }\n return nodes.reduce<Array<{ node: TreemapNodeData; value: number }>>((items, node) => {\n if (node.rowIndex === undefined || node.rowIndex >= dataColorValues.length) {\n return items;\n }\n const dataColorValue = dataColorValues[node.rowIndex];\n if (\n dataColorValue === null ||\n dataColorValue === undefined ||\n (typeof dataColorValue === 'string' && dataColorValue.trim() === '')\n ) {\n return items;\n }\n const value = Number(dataColorValue);\n if (Number.isFinite(value)) {\n items.push({ node, value });\n }\n return items;\n }, []);\n};\n\nconst getRangeColorForValue = (value: number, ranges: RangeEntry[]): string | undefined => {\n for (const range of ranges) {\n const hasFrom = hasOwnProperty.call(range, 'from');\n const hasTo = hasOwnProperty.call(range, 'to');\n const fromVal = hasFrom ? Number(range.from) : undefined;\n const toVal = hasTo ? Number(range.to) : undefined;\n if (\n (hasFrom && !hasTo && value >= fromVal) ||\n (hasFrom && hasTo && value >= fromVal && value < toVal) ||\n (!hasFrom && hasTo && value < toVal)\n ) {\n return range.value;\n }\n }\n return undefined;\n};\n\nconst ignoreMinMaxWhenNeeded = (\n min: number,\n max: number,\n stops: number[],\n newStops: number[],\n newColors: string[]\n): void => {\n if (min >= stops[0]) {\n newStops.shift();\n newColors.shift();\n }\n if (max <= stops.at(-1)) {\n newStops.pop();\n newColors.pop();\n }\n};\n\nconst addDefaultEndingColors = (colors: string[], count: number): void => {\n for (let i = 0; i < count; i += 1) {\n colors.push(DEFAULT_MAX_COLOR);\n }\n};\n\nconst computeNoStopsGradient = (\n min: number,\n max: number,\n colors: string[]\n): { newStops: number[]; newColors: string[] } => {\n if (colors.length > 2) {\n return {\n newStops: colors.map((_, i) => min + ((max - min) * i) / (colors.length - 1)),\n newColors: colors,\n };\n }\n const newColors = [DEFAULT_MIN_COLOR, DEFAULT_MAX_COLOR];\n colors.forEach((color, i) => {\n newColors[i] = color;\n });\n return { newStops: [min, max], newColors };\n};\n\nconst computeColorsForStopsOnly = (stopsLength: number): string[] | undefined => {\n if (stopsLength === 1) {\n return [DEFAULT_MIN_COLOR, DEFAULT_MAX_COLOR, DEFAULT_MAX_COLOR];\n }\n if (stopsLength === 2) {\n return [DEFAULT_MIN_COLOR, DEFAULT_MIN_COLOR, DEFAULT_MAX_COLOR, DEFAULT_MAX_COLOR];\n }\n return undefined;\n};\n\nconst alignGradientColorsWithStops = (\n min: number,\n max: number,\n stops: number[],\n newStops: number[],\n colors: string[]\n): { newStops: number[]; newColors: string[] } | undefined => {\n const tmpColors = [...colors];\n if (stops.length >= colors.length) {\n tmpColors.unshift(DEFAULT_MIN_COLOR);\n }\n addDefaultEndingColors(tmpColors, stops.length + 2 - tmpColors.length);\n ignoreMinMaxWhenNeeded(min, max, stops, newStops, tmpColors);\n if (newStops.length !== tmpColors.length) {\n return undefined;\n }\n return { newStops, newColors: tmpColors };\n};\n\nconst prepareGradientStopsAndColors = (\n min: number,\n max: number,\n gradient: GradientConfig\n): { newStops: number[]; newColors: string[] } | undefined => {\n const colors = gradient.colors || [];\n const stops = [...(gradient.stops || [])].sort((a, b) => a - b);\n if (stops.length === 0) {\n return computeNoStopsGradient(min, max, colors);\n }\n\n const newStops = [min, ...stops, max];\n if (colors.length === 0) {\n const newColors = computeColorsForStopsOnly(stops.length);\n if (!newColors) {\n return undefined;\n }\n ignoreMinMaxWhenNeeded(min, max, stops, newStops, newColors);\n return { newStops, newColors };\n }\n if (stops.length + 2 >= colors.length) {\n return alignGradientColorsWithStops(min, max, stops, newStops, colors);\n }\n return undefined;\n};\n\nconst getGradientColorForValue = (value: number, newStops: number[], newColors: string[]): string => {\n if (newStops.length === 1) {\n return chroma(newColors[0]).hex().toUpperCase();\n }\n\n const firstStop = newStops[0];\n const lastStop = newStops.at(-1);\n if (value < firstStop || value > lastStop) {\n return chroma(value > lastStop ? newColors.at(-1) : newColors[0])\n .hex()\n .toUpperCase();\n }\n\n let idx = newStops.findIndex(stop => value <= stop);\n if (idx <= 0) {\n idx = Math.min(1, newStops.length - 1);\n }\n\n const lowerVal = newStops[idx - 1];\n const upperVal = newStops[idx];\n let tau: number;\n if (upperVal === lowerVal) {\n tau = value === 0 ? 0 : 1;\n } else {\n tau = (value - lowerVal) / (upperVal - lowerVal);\n }\n return chroma\n .scale([newColors[idx - 1], newColors[idx]])(tau)\n .hex()\n .toUpperCase();\n};\n\nconst buildTreemapRangeValueColorMap = (\n nodeValues: Array<{ node: TreemapNodeData; value: number }>,\n ranges: RangeEntry[]\n): Map<string, string> | undefined => {\n const map = new Map<string, string>();\n for (const { node, value } of nodeValues) {\n const color = getRangeColorForValue(value, ranges);\n if (color) {\n map.set(node.id, color);\n }\n }\n return map.size > 0 ? map : undefined;\n};\n\nconst buildTreemapGradientColorMap = (\n nodeValues: Array<{ node: TreemapNodeData; value: number }>,\n gradient: GradientConfig\n): Map<string, string> | undefined => {\n if (nodeValues.length === 0) {\n return undefined;\n }\n\n const values = nodeValues.map(({ value }) => value);\n const stopsAndColors = prepareGradientStopsAndColors(Math.min(...values), Math.max(...values), gradient);\n if (!stopsAndColors) {\n return undefined;\n }\n\n const map = new Map<string, string>();\n for (const { node, value } of nodeValues) {\n map.set(node.id, getGradientColorForValue(value, stopsAndColors.newStops, stopsAndColors.newColors));\n }\n return map.size > 0 ? map : undefined;\n};\n\nconst buildTreemapResolvedDataColorMap = (\n rootNode: TreemapNodeData,\n dataColors: string[] | undefined\n): Map<string, string> | undefined => {\n if (!dataColors || dataColors.length === 0) {\n return undefined;\n }\n const map = new Map<string, string>();\n const collectNodes = (node: TreemapNodeData): void => {\n if (node.rowIndex !== undefined && node.rowIndex < dataColors.length) {\n const color = dataColors[node.rowIndex];\n if (color) {\n map.set(node.id, color);\n }\n }\n node.children?.forEach(collectNodes);\n };\n collectNodes(rootNode);\n return map.size > 0 ? map : undefined;\n};\n\nconst mergeTreemapDataColorMaps = (\n computedColorMap: Map<string, string> | undefined,\n resolvedDataColorMap: Map<string, string> | undefined,\n options: BuildTreemapDataColorMapOptions = {}\n): Map<string, string> | undefined => {\n if (options.useComputedValuesForDataColors) {\n return computedColorMap;\n }\n if (!computedColorMap && !resolvedDataColorMap) {\n return undefined;\n }\n const mergedColorMap = computedColorMap ? new Map(computedColorMap) : new Map<string, string>();\n resolvedDataColorMap?.forEach((color, nodeId) => {\n mergedColorMap.set(nodeId, color);\n });\n return mergedColorMap.size > 0 ? mergedColorMap : undefined;\n};\n\nexport const buildTreemapDataColorMap = (\n rootNode: TreemapNodeData | null | undefined,\n dataColors: string[] | undefined,\n dataColorConfig?: DataColorLegendConfig,\n options: BuildTreemapDataColorMapOptions = {}\n): Map<string, string> | undefined => {\n if (!rootNode) {\n return undefined;\n }\n const resolvedDataColorMap = buildTreemapResolvedDataColorMap(rootNode, dataColors);\n const nodeValues = getColorableTreemapNodeValues(\n rootNode,\n options.useComputedValuesForDataColors ? undefined : options.dataColorValues\n );\n let computedColorMap: Map<string, string> | undefined;\n if (dataColorConfig?.type === 'rangeValue' && dataColorConfig.ranges) {\n computedColorMap = buildTreemapRangeValueColorMap(nodeValues, dataColorConfig.ranges);\n }\n if (dataColorConfig?.type === 'gradient' && dataColorConfig.gradient) {\n computedColorMap = buildTreemapGradientColorMap(nodeValues, dataColorConfig.gradient);\n }\n return mergeTreemapDataColorMaps(computedColorMap, resolvedDataColorMap, options);\n};\n\nexport const enrichTreemapDataColorConfig = (\n dataColorConfig: DataColorLegendConfig | undefined,\n rootNode: TreemapNodeData | null | undefined,\n options: BuildTreemapDataColorMapOptions = {}\n): DataColorLegendConfig | undefined => {\n if (!dataColorConfig) {\n return undefined;\n }\n if (dataColorConfig.type === 'gradient' && dataColorConfig.gradient && rootNode) {\n const values = getColorableTreemapNodeValues(\n rootNode,\n options.useComputedValuesForDataColors ? undefined : options.dataColorValues\n ).map(({ value }) => value);\n if (values.length > 0) {\n return {\n ...dataColorConfig,\n minVal: Math.min(...values),\n maxVal: Math.max(...values),\n };\n }\n }\n return dataColorConfig;\n};\n\nexport const getSortedPositiveTreemapChildren = (\n currentNode: TreemapNodeData | null | undefined\n): TreemapNodeData[] => {\n if (!currentNode?.children) {\n return [];\n }\n return [...currentNode.children].filter(c => c.value > 0).sort((a, b) => b.value - a.value);\n};\n", "export const VIZ_FONT_FAMILY =\n \"'Splunk Platform Sans', 'Splunk Data Sans', Roboto, Droid, 'Helvetica Neue', Helvetica, Arial, sans-serif\";\n\n/**\n * Return text width\n * @method computeTextWidth\n * @param {String} text\n * @param {String} font\n * @returns {Number} width of text with font\n */\nexport const computeTextWidth = (text: string, font: string): number => {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n context.font = font;\n const measure = context.measureText(text);\n return measure.width;\n};\n\nconst truncateEnd = (\n text: string,\n context: CanvasRenderingContext2D,\n maxWidth: number,\n ellipsis: string\n): string => {\n for (let i = text.length - 1; i > 0; i -= 1) {\n const truncatedText = text.slice(0, i) + ellipsis;\n if (context.measureText(truncatedText).width <= maxWidth) {\n return truncatedText;\n }\n }\n return ellipsis;\n};\n\nconst truncateStart = (\n text: string,\n context: CanvasRenderingContext2D,\n maxWidth: number,\n ellipsis: string\n): string => {\n for (let i = 0; i < text.length; i += 1) {\n const truncatedText = ellipsis + text.slice(i);\n if (context.measureText(truncatedText).width <= maxWidth) {\n return truncatedText;\n }\n }\n return ellipsis;\n};\n\nconst truncateMiddle = (\n text: string,\n context: CanvasRenderingContext2D,\n maxWidth: number,\n ellipsis: string\n): string => {\n const ellipsisWidth = context.measureText(ellipsis).width;\n for (let i = 0; i < text.length / 2; i += 1) {\n const left = text.slice(0, Math.floor(text.length / 2) - i);\n const right = text.slice(Math.ceil(text.length / 2) + i);\n const truncatedText = left + ellipsis + right;\n if (context.measureText(left).width + ellipsisWidth + context.measureText(right).width <= maxWidth) {\n return truncatedText;\n }\n }\n return ellipsis;\n};\n\n/**\n * Return truncated text\n * @method truncateText\n * @param {String} text\n * @param {Number} maxWidth\n * @param {String} truncationType\n * @param {String} font\n * @returns {String} truncated text\n */\nexport const truncateText = (\n text: string,\n maxWidth: number,\n truncationType: 'ellipsisEnd' | 'ellipsisMiddle' | 'ellipsisStart',\n font = `10px ${VIZ_FONT_FAMILY}`\n): string => {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) return text;\n\n context.font = font;\n\n const ellipsis = '...';\n const fullTextWidth = context.measureText(text).width;\n\n if (fullTextWidth <= maxWidth) {\n return text;\n }\n\n if (truncationType === 'ellipsisEnd') {\n return truncateEnd(text, context, maxWidth, ellipsis);\n }\n if (truncationType === 'ellipsisStart') {\n return truncateStart(text, context, maxWidth, ellipsis);\n }\n if (truncationType === 'ellipsisMiddle') {\n return truncateMiddle(text, context, maxWidth, ellipsis);\n }\n\n return ellipsis;\n};\n", "import * as React from 'react';\nimport { truncateText, VIZ_FONT_FAMILY } from '../../../common/utils/textUtils';\nimport { TreemapRect, HOVER_TARGET_PADDING } from './treemapLayout';\nimport { TreemapNodeData } from './treemapTypes';\n\nexport const LABEL_PADDING = 8;\nexport const LABEL_PADDING_DOUBLE = LABEL_PADDING * 2;\nexport const STROKE_WIDTH = 1;\nexport const STROKE_FACTOR = 0.4;\nexport const PARENT_FONT_SIZE = 12;\nexport const HEADER_VALUE_FONT_SIZE = 12;\nexport const CHILD_FONT_WEIGHT = 500; // fontWeightSemiBold\nexport const PARENT_FONT_WEIGHT = 'bold';\nexport const VALUE_FONT_FAMILY = VIZ_FONT_FAMILY;\nexport const VALUE_LABEL_PADDING = LABEL_PADDING + 2;\nexport const VALUE_LABEL_PADDING_DOUBLE = VALUE_LABEL_PADDING * 2;\nexport const VALUE_OPACITY = 0.8;\nexport const VALUE_TEXT_GAP = 2;\nexport const MIN_VALUE_TEXT_WIDTH = 12;\nexport const MIN_HEADER_LABEL_WIDTH = 12;\nexport const DIM_OPACITY = 0.5;\n\nexport const PARENT_FONT = `${PARENT_FONT_WEIGHT} ${PARENT_FONT_SIZE}px ${VIZ_FONT_FAMILY}`;\nexport const HEADER_VALUE_FONT = `${HEADER_VALUE_FONT_SIZE}px ${VALUE_FONT_FAMILY}`;\n\nexport type TextAnchor = 'start' | 'middle' | 'end' | 'inherit';\nexport type NodeMouseDownHandler = (e: React.MouseEvent<SVGGElement | SVGRectElement>) => void;\nexport type NodeKeyDownHandler = (e: React.KeyboardEvent<SVGGElement | SVGRectElement>) => void;\nexport type NodeMouseEnterHandler = (e: React.MouseEvent<SVGElement>) => void;\n\nexport interface TreemapNodeProps {\n treemapInstanceId?: string;\n rect: TreemapRect;\n seriesColors: string[];\n categoryIndex: Map<string, number>;\n backgroundColor: string;\n nodeColorMap?: Map<string, string>;\n defaultNodeColor?: string;\n clickNode?: TreemapNodeData;\n showChildValues?: boolean;\n showParentValues: boolean;\n centerStandaloneText?: boolean;\n hoveredNodeId?: string | null;\n ancestorDimmed?: boolean;\n onClick: (node: TreemapNodeData) => void;\n onMouseEnter: (node: TreemapNodeData, element: SVGElement, forceTooltip?: boolean) => void;\n onMouseLeave: () => void;\n}\n\nexport interface RenderNodeState {\n nodeWidth: number;\n nodeHeight: number;\n baseColor: string;\n formattedValue: string;\n activationAriaLabel: string;\n hasSpaceForLabel: boolean;\n availableTextWidth: number;\n handleMouseDown: NodeMouseDownHandler;\n handleClick: () => void;\n handleKeyDown: NodeKeyDownHandler;\n}\n\nexport type RenderNestedNode = (\n childRect: TreemapRect,\n clickNode: TreemapNodeData,\n ancestorDimmed: boolean\n) => React.ReactElement;\n\ninterface TextLayout {\n text: string;\n isTruncated: boolean;\n}\n\nexport interface HoverTargetBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport const getHoverTargetBounds = ({\n x,\n y,\n width,\n height,\n expandTop = true,\n expandRight = true,\n expandBottom = true,\n expandLeft = true,\n}: HoverTargetBounds & {\n expandTop?: boolean;\n expandRight?: boolean;\n expandBottom?: boolean;\n expandLeft?: boolean;\n}): HoverTargetBounds => {\n const horizontalPadding = Math.min(HOVER_TARGET_PADDING, Math.max(0, width / 2));\n const verticalPadding = Math.min(HOVER_TARGET_PADDING, Math.max(0, height / 2));\n const leftPadding = expandLeft ? horizontalPadding : 0;\n const rightPadding = expandRight ? horizontalPadding : 0;\n const topPadding = expandTop ? verticalPadding : 0;\n const bottomPadding = expandBottom ? verticalPadding : 0;\n\n return {\n x: x - leftPadding,\n y: y - topPadding,\n width: width + leftPadding + rightPadding,\n height: height + topPadding + bottomPadding,\n };\n};\n\nexport const getTextLayout = (\n text: string,\n availableWidth: number,\n font: string,\n shouldRender = true\n): TextLayout => {\n if (!shouldRender || !text || availableWidth <= 0) {\n return { text: '', isTruncated: false };\n }\n const truncatedText = truncateText(text, availableWidth, 'ellipsisEnd', font);\n return {\n text: truncatedText,\n isTruncated: truncatedText !== text,\n };\n};\n\nexport const callNodeMouseEnter = (\n onMouseEnter: TreemapNodeProps['onMouseEnter'],\n node: TreemapNodeData,\n element: SVGElement,\n forceTooltip: boolean\n): void => {\n if (forceTooltip) {\n onMouseEnter(node, element, true);\n return;\n }\n onMouseEnter(node, element);\n};\n\nexport const getParentFocusTargetTestId = (nodeId: string): string => `treemap-parent-focus-target-${nodeId}`;\n\nexport const getParentFocusTargetId = (treemapInstanceId: string, nodeId: string): string =>\n `${treemapInstanceId}-${getParentFocusTargetTestId(nodeId)}`;\n\nexport const focusParentTarget = (treemapInstanceId: string, nodeId: string): void => {\n if (typeof document === 'undefined') {\n return;\n }\n document.getElementById(getParentFocusTargetId(treemapInstanceId, nodeId))?.focus();\n};\n\nexport const getActivationAriaLabel = (\n node: TreemapNodeData,\n clickNode: TreemapNodeData,\n formattedValue: string\n): string => {\n if (clickNode.id !== node.id) {\n return `Drill into ${clickNode.name} from ${node.name}`;\n }\n if (node.children && node.children.length > 0) {\n return `Drill into ${node.name}`;\n }\n return `${node.name}: ${formattedValue}. ${node.path.join(' > ')}`;\n};\n\nexport const rectContainsNodeId = (rect: TreemapRect, nodeId: string): boolean => {\n if (rect.node.id === nodeId) {\n return true;\n }\n return rect.children?.some(childRect => rectContainsNodeId(childRect, nodeId)) ?? false;\n};\n", "import * as React from 'react';\nimport {\n getHoverTargetBounds,\n HoverTargetBounds,\n NodeMouseDownHandler,\n NodeMouseEnterHandler,\n} from '../utils/treemapNodeUtils';\n\nexport interface TreemapHoverTargetProps extends HoverTargetBounds {\n nodeId: string;\n dataTest?: string;\n expandTop?: boolean;\n expandRight?: boolean;\n expandBottom?: boolean;\n expandLeft?: boolean;\n onMouseDown?: NodeMouseDownHandler;\n onClick?: () => void;\n onMouseEnter?: NodeMouseEnterHandler;\n onMouseLeave?: () => void;\n}\n\nconst TreemapHoverTarget = ({\n nodeId,\n x,\n y,\n width,\n height,\n dataTest = `treemap-hover-target-${nodeId}`,\n expandTop,\n expandRight,\n expandBottom,\n expandLeft,\n onMouseDown,\n onClick,\n onMouseEnter,\n onMouseLeave,\n}: TreemapHoverTargetProps): React.ReactElement | null => {\n if (width <= 0 || height <= 0) {\n return null;\n }\n\n const bounds = getHoverTargetBounds({\n x,\n y,\n width,\n height,\n expandTop,\n expandRight,\n expandBottom,\n expandLeft,\n });\n\n return (\n <rect\n x={bounds.x}\n y={bounds.y}\n width={bounds.width}\n height={bounds.height}\n fill=\"transparent\"\n stroke=\"none\"\n pointerEvents=\"all\"\n onMouseDown={onMouseDown}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n data-test={dataTest}\n style={{ cursor: 'pointer' }}\n />\n );\n};\n\nexport default TreemapHoverTarget;\n", "import * as React from 'react';\nimport { useCallback, useMemo } from 'react';\nimport { VIZ_FONT_FAMILY } from '../../../common/utils/textUtils';\nimport { isTransparentColor } from '../utils/treemapColorUtils';\nimport { TreemapRect } from '../utils/treemapLayout';\nimport { TreemapNodeData } from '../utils/treemapTypes';\nimport {\n formatTreemapValue,\n getAdaptiveNameFontSize,\n getAdaptiveValueFontSize,\n hasSpaceForTreemapLabel,\n} from '../utils/treemapUtils';\nimport TreemapHoverTarget from './TreemapHoverTarget';\nimport {\n callNodeMouseEnter,\n focusParentTarget,\n getActivationAriaLabel,\n getTextLayout,\n LABEL_PADDING,\n LABEL_PADDING_DOUBLE,\n MIN_VALUE_TEXT_WIDTH,\n STROKE_WIDTH,\n TextAnchor,\n VALUE_FONT_FAMILY,\n VALUE_LABEL_PADDING_DOUBLE,\n VALUE_OPACITY,\n VALUE_TEXT_GAP,\n} from '../utils/treemapNodeUtils';\n\nexport interface TreemapChildCellProps {\n treemapInstanceId: string;\n rect: TreemapRect;\n parentBounds: ChildPaintBounds;\n clickNode: TreemapNodeData;\n fillColor?: string;\n textColor: string;\n dividerColor: string;\n backgroundColor: string;\n labelFontWeight: string | number;\n showChildValues: boolean;\n centerText?: boolean;\n onClick: (node: TreemapNodeData) => void;\n onMouseEnter: (node: TreemapNodeData, element: SVGElement, forceTooltip?: boolean) => void;\n onMouseLeave: () => void;\n}\n\ninterface ChildTextPosition {\n nameX: number;\n nameY: number;\n valueX: number;\n valueY: number;\n textAnchor: TextAnchor;\n}\n\ninterface ChildTextPositionOptions {\n x0: number;\n y0: number;\n cellWidth: number;\n cellHeight: number;\n isSynthetic: boolean;\n centerText: boolean;\n nameFontSize: number;\n valueFontSize: number;\n hasVisibleName: boolean;\n hasVisibleValue: boolean;\n}\n\ninterface ChildPaintStyle {\n x: number;\n y: number;\n width: number;\n height: number;\n stroke: string;\n strokeWidth: number;\n}\n\ninterface ChildPaintBounds {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n}\n\ninterface ChildPaintInsets {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\nconst EDGE_EPSILON = 0.001;\nconst TRANSPARENT_DIVIDER_INSET = STROKE_WIDTH / 2;\n\nconst isOnContainerEdge = (edge: number, containerEdge: number): boolean =>\n Math.abs(edge - containerEdge) <= EDGE_EPSILON;\n\nconst limitInsets = (startInset: number, endInset: number, size: number): [number, number] => {\n const totalInset = startInset + endInset;\n if (totalInset === 0 || totalInset <= size) {\n return [startInset, endInset];\n }\n const scale = size / totalInset;\n return [startInset * scale, endInset * scale];\n};\n\nconst getTransparentDividerInsets = ({\n x0,\n y0,\n cellWidth,\n cellHeight,\n parentBounds,\n}: Pick<ChildTextPositionOptions, 'x0' | 'y0' | 'cellWidth' | 'cellHeight'> & {\n parentBounds: ChildPaintBounds;\n}): ChildPaintInsets => {\n const x1 = x0 + cellWidth;\n const y1 = y0 + cellHeight;\n const left = isOnContainerEdge(x0, parentBounds.x0) ? 0 : TRANSPARENT_DIVIDER_INSET;\n const right = isOnContainerEdge(x1, parentBounds.x1) ? 0 : TRANSPARENT_DIVIDER_INSET;\n const top = isOnContainerEdge(y0, parentBounds.y0) ? 0 : TRANSPARENT_DIVIDER_INSET;\n const bottom = isOnContainerEdge(y1, parentBounds.y1) ? 0 : TRANSPARENT_DIVIDER_INSET;\n const [limitedLeft, limitedRight] = limitInsets(left, right, cellWidth);\n const [limitedTop, limitedBottom] = limitInsets(top, bottom, cellHeight);\n\n return {\n top: limitedTop,\n right: limitedRight,\n bottom: limitedBottom,\n left: limitedLeft,\n };\n};\n\nconst getChildPaintStyle = ({\n x0,\n y0,\n cellWidth,\n cellHeight,\n isSynthetic,\n dividerColor,\n parentBounds,\n}: Pick<ChildTextPositionOptions, 'x0' | 'y0' | 'cellWidth' | 'cellHeight' | 'isSynthetic'> & {\n dividerColor: string;\n parentBounds: ChildPaintBounds;\n}): ChildPaintStyle => {\n if (isSynthetic) {\n return {\n x: x0,\n y: y0,\n width: cellWidth,\n height: cellHeight,\n stroke: 'none',\n strokeWidth: 0,\n };\n }\n\n if (isTransparentColor(dividerColor)) {\n const insets = getTransparentDividerInsets({ x0, y0, cellWidth, cellHeight, parentBounds });\n return {\n x: x0 + insets.left,\n y: y0 + insets.top,\n width: Math.max(0, cellWidth - insets.left - insets.right),\n height: Math.max(0, cellHeight - insets.top - insets.bottom),\n stroke: 'none',\n strokeWidth: 0,\n };\n }\n\n return {\n x: x0,\n y: y0,\n width: cellWidth,\n height: cellHeight,\n stroke: dividerColor,\n strokeWidth: STROKE_WIDTH,\n };\n};\n\nconst getVisibleTextHeight = ({\n hasVisibleName,\n hasVisibleValue,\n nameFontSize,\n valueFontSize,\n}: Pick<\n ChildTextPositionOptions,\n 'hasVisibleName' | 'hasVisibleValue' | 'nameFontSize' | 'valueFontSize'\n>): number => {\n let textHeight = 0;\n if (hasVisibleName) {\n textHeight += nameFontSize;\n }\n if (hasVisibleName && hasVisibleValue) {\n textHeight += VALUE_TEXT_GAP;\n }\n if (hasVisibleValue) {\n textHeight += valueFontSize;\n }\n return textHeight;\n};\n\nconst getCenteredTextPosition = ({\n y0,\n cellHeight,\n nameFontSize,\n valueFontSize,\n hasVisibleName,\n hasVisibleValue,\n}: Pick<\n ChildTextPositionOptions,\n 'y0' | 'cellHeight' | 'nameFontSize' | 'valueFontSize' | 'hasVisibleName' | 'hasVisibleValue'\n>): Pick<ChildTextPosition, 'nameY' | 'valueY'> => {\n const centeredTextTop =\n y0 +\n (cellHeight -\n getVisibleTextHeight({ hasVisibleName, hasVisibleValue, nameFontSize, valueFontSize })) /\n 2;\n const nameOffset = hasVisibleName ? nameFontSize : 0;\n const valueOffset = hasVisibleName ? nameFontSize + VALUE_TEXT_GAP : 0;\n\n return {\n nameY: centeredTextTop + nameOffset,\n valueY: centeredTextTop + valueOffset + valueFontSize,\n };\n};\n\nconst getChildTextPosition = ({\n x0,\n y0,\n cellWidth,\n cellHeight,\n isSynthetic,\n centerText,\n nameFontSize,\n valueFontSize,\n hasVisibleName,\n hasVisibleValue,\n}: ChildTextPositionOptions): ChildTextPosition => {\n const shouldCenterText = isSynthetic || centerText;\n const textX = shouldCenterText ? x0 + cellWidth / 2 : x0 + LABEL_PADDING;\n const textAnchor: TextAnchor = shouldCenterText ? 'middle' : 'start';\n let nameY = y0 + LABEL_PADDING + nameFontSize;\n let valueY = nameY + nameFontSize + VALUE_TEXT_GAP;\n\n if (isSynthetic) {\n nameY = y0 + cellHeight / 2;\n } else if (centerText) {\n const centeredPosition = getCenteredTextPosition({\n y0,\n cellHeight,\n nameFontSize,\n valueFontSize,\n hasVisibleName,\n hasVisibleValue,\n });\n nameY = centeredPosition.nameY;\n valueY = centeredPosition.valueY;\n }\n\n return {\n nameX: textX,\n nameY,\n valueX: textX,\n valueY,\n textAnchor,\n };\n};\n\nconst TreemapChildCell = ({\n treemapInstanceId,\n rect,\n parentBounds,\n clickNode,\n fillColor,\n textColor,\n dividerColor,\n backgroundColor,\n labelFontWeight,\n showChildValues,\n centerText = false,\n onClick,\n onMouseEnter,\n onMouseLeave,\n}: TreemapChildCellProps): React.ReactElement | null => {\n const { x0, y0, x1, y1, node } = rect;\n const cellWidth = x1 - x0;\n const cellHeight = y1 - y0;\n const isSynthetic = Boolean(node.isSynthetic);\n const isActivationProxy = clickNode.id !== node.id;\n\n const handleClick = useCallback(() => {\n if (isActivationProxy) {\n focusParentTarget(treemapInstanceId, clickNode.id);\n }\n onClick(clickNode);\n }, [clickNode, isActivationProxy, onClick, treemapInstanceId]);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent<SVGGElement>) => {\n if (isActivationProxy) {\n e.preventDefault();\n focusParentTarget(treemapInstanceId, clickNode.id);\n }\n },\n [clickNode, isActivationProxy, treemapInstanceId]\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<SVGGElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (isActivationProxy) {\n focusParentTarget(treemapInstanceId, clickNode.id);\n }\n onClick(clickNode);\n }\n },\n [clickNode, isActivationProxy, onClick, treemapInstanceId]\n );\n\n const formattedValue = useMemo(() => formatTreemapValue(node.value), [node.value]);\n\n const hasSpaceForLabel = hasSpaceForTreemapLabel(cellWidth, cellHeight);\n const availableTextWidth = Math.max(0, cellWidth - LABEL_PADDING_DOUBLE);\n const availableValueTextWidth = Math.max(0, cellWidth - VALUE_LABEL_PADDING_DOUBLE);\n\n const nameFontSize = getAdaptiveNameFontSize(cellHeight);\n const valueFontSize = getAdaptiveValueFontSize(nameFontSize);\n const leafNameFont = `${labelFontWeight} ${nameFontSize}px ${VIZ_FONT_FAMILY}`;\n const leafValueFont = `${valueFontSize}px ${VALUE_FONT_FAMILY}`;\n const canShowValue =\n !isSynthetic &&\n showChildValues &&\n hasSpaceForLabel &&\n availableValueTextWidth >= MIN_VALUE_TEXT_WIDTH &&\n cellHeight >= LABEL_PADDING + nameFontSize + VALUE_TEXT_GAP + valueFontSize + LABEL_PADDING;\n\n const leafNameLayout = getTextLayout(node.name, availableTextWidth, leafNameFont, hasSpaceForLabel);\n const leafValueLayout = getTextLayout(\n formattedValue,\n availableValueTextWidth,\n leafValueFont,\n canShowValue\n );\n const hasVisibleName = Boolean(leafNameLayout.text);\n const hasVisibleValue = Boolean(leafValueLayout.text);\n const { nameX, nameY, valueX, valueY, textAnchor } = getChildTextPosition({\n x0,\n y0,\n cellWidth,\n cellHeight,\n isSynthetic,\n centerText,\n nameFontSize,\n valueFontSize,\n hasVisibleName,\n hasVisibleValue,\n });\n const hasTruncatedText =\n leafNameLayout.isTruncated ||\n leafValueLayout.isTruncated ||\n (!isSynthetic && showChildValues && hasSpaceForLabel && !canShowValue);\n const hasNodeTextToShow = Boolean(node.name || (!isSynthetic && showChildValues && formattedValue));\n const hasVisibleText = Boolean(leafNameLayout.text || leafValueLayout.text);\n const shouldForceTooltip = hasTruncatedText || (hasNodeTextToShow && !hasVisibleText);\n\n const handleMouseEnter = useCallback(\n (e: React.MouseEvent<SVGElement>) => {\n callNodeMouseEnter(onMouseEnter, node, e.currentTarget, shouldForceTooltip);\n },\n [shouldForceTooltip, onMouseEnter, node]\n );\n\n if (cellWidth <= 0 || cellHeight <= 0) {\n return null;\n }\n\n const ariaLabel = getActivationAriaLabel(node, clickNode, formattedValue);\n const paintStyle = getChildPaintStyle({\n x0,\n y0,\n cellWidth,\n cellHeight,\n isSynthetic,\n dividerColor,\n parentBounds,\n });\n\n return (\n <g\n data-test={`treemap-node-${node.id}`}\n onClick={handleClick}\n onMouseDown={handleMouseDown}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={onMouseLeave}\n onKeyDown={handleKeyDown}\n tabIndex={isActivationProxy ? -1 : 0}\n aria-label={ariaLabel}\n style={{ cursor: 'pointer' }}\n >\n <rect\n x={paintStyle.x}\n y={paintStyle.y}\n width={paintStyle.width}\n height={paintStyle.height}\n fill={isSynthetic ? backgroundColor : fillColor || 'transparent'}\n stroke={paintStyle.stroke}\n strokeWidth={paintStyle.strokeWidth}\n />\n <TreemapHoverTarget nodeId={node.id} x={x0} y={y0} width={cellWidth} height={cellHeight} />\n {leafNameLayout.text && (\n <text\n x={nameX}\n y={nameY}\n fill={textColor}\n fontSize={nameFontSize}\n fontWeight={labelFontWeight}\n textAnchor={textAnchor}\n dominantBaseline={isSynthetic ? 'middle' : undefined}\n pointerEvents=\"none\"\n data-test={`treemap-label-${node.id}`}\n >\n {leafNameLayout.text}\n </text>\n )}\n {leafValueLayout.text && (\n <text\n x={valueX}\n y={valueY}\n fill={textColor}\n fontSize={valueFontSize}\n fontFamily={VALUE_FONT_FAMILY}\n textAnchor={textAnchor}\n opacity={VALUE_OPACITY}\n pointerEvents=\"none\"\n data-test={`treemap-value-${node.id}`}\n >\n {leafValueLayout.text}\n </text>\n )}\n </g>\n );\n};\n\nexport default TreemapChildCell;\n", "import * as React from 'react';\nimport { computeTextWidth } from '../../../common/utils/textUtils';\nimport { TreemapRect, HEADER_HEIGHT, BORDER_RADIUS } from '../utils/treemapLayout';\nimport { TreemapNodeData } from '../utils/treemapTypes';\nimport { getStrokeColor, getTextColorForBackground } from '../utils/treemapColorUtils';\nimport TreemapHoverTarget from './TreemapHoverTarget';\nimport TreemapChildCell from './TreemapChildCell';\nimport {\n callNodeMouseEnter,\n CHILD_FONT_WEIGHT,\n DIM_OPACITY,\n getHoverTargetBounds,\n getParentFocusTargetId,\n getParentFocusTargetTestId,\n getTextLayout,\n HEADER_VALUE_FONT,\n HEADER_VALUE_FONT_SIZE,\n LABEL_PADDING,\n MIN_HEADER_LABEL_WIDTH,\n NodeMouseDownHandler,\n NodeMouseEnterHandler,\n PARENT_FONT,\n PARENT_FONT_SIZE,\n PARENT_FONT_WEIGHT,\n rectContainsNodeId,\n RenderNestedNode,\n RenderNodeState,\n STROKE_FACTOR,\n STROKE_WIDTH,\n TreemapNodeProps,\n VALUE_OPACITY,\n} from '../utils/treemapNodeUtils';\n\ntype TreemapParentNodeProps = TreemapNodeProps &\n RenderNodeState & {\n childRects: TreemapRect[];\n renderNestedNode: RenderNestedNode;\n };\n\nconst SUBDIVISION_TITLE_HORIZONTAL_PADDING = 4;\n\ninterface ParentTextLayout {\n text: string;\n isTruncated: boolean;\n}\n\ninterface ParentHoverState {\n isParentDimmed: boolean;\n hasHoveredDirectChild: boolean;\n dimUnhoveredChildren: boolean;\n childAncestorDimmed: boolean;\n}\n\ninterface ParentHeaderLayout {\n headerName: string;\n headerValue: string;\n forceTooltip: boolean;\n}\n\nconst ParentBodyBorder = ({\n nodeId,\n x,\n y,\n width,\n height,\n stroke,\n dataTest,\n}: {\n nodeId: string;\n x: number;\n y: number;\n width: number;\n height: number;\n stroke: string;\n dataTest: string;\n}): React.ReactElement | null => {\n if (width <= 0 || height <= 0) {\n return null;\n }\n return (\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n rx={BORDER_RADIUS}\n ry={BORDER_RADIUS}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={STROKE_WIDTH}\n pointerEvents=\"none\"\n data-test={dataTest || nodeId}\n />\n );\n};\n\nconst ParentBody = ({\n nodeId,\n x,\n y,\n width,\n height,\n stroke,\n onMouseDown,\n onClick,\n onMouseEnter,\n onMouseLeave,\n}: {\n nodeId: string;\n x: number;\n y: number;\n width: number;\n height: number;\n stroke: string;\n onMouseDown: NodeMouseDownHandler;\n onClick: () => void;\n onMouseEnter: (e: React.MouseEvent<SVGElement>) => void;\n onMouseLeave: () => void;\n}): React.ReactElement | null => {\n if (height <= 0 || width <= 0) {\n return null;\n }\n return (\n <>\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n rx={BORDER_RADIUS}\n ry={BORDER_RADIUS}\n fill=\"transparent\"\n stroke={stroke}\n strokeWidth={STROKE_WIDTH}\n onMouseDown={onMouseDown}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n data-test={`treemap-parent-body-${nodeId}`}\n style={{ cursor: 'pointer' }}\n />\n <TreemapHoverTarget\n nodeId={nodeId}\n x={x}\n y={y}\n width={width}\n height={height}\n dataTest={`treemap-parent-body-hover-target-${nodeId}`}\n onMouseDown={onMouseDown}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n />\n </>\n );\n};\n\nconst HeaderValue = ({\n showParentValues,\n x,\n y,\n textColor,\n formattedValue,\n nodeId,\n}: {\n showParentValues: boolean;\n x: number;\n y: number;\n textColor: string;\n formattedValue: string;\n nodeId: string;\n}): React.ReactElement | null => {\n if (!showParentValues || !formattedValue) {\n return null;\n }\n return (\n <text\n x={x}\n y={y}\n fill={textColor}\n fontSize={HEADER_VALUE_FONT_SIZE}\n textAnchor=\"end\"\n opacity={VALUE_OPACITY}\n pointerEvents=\"none\"\n data-test={`treemap-headervalue-${nodeId}`}\n >\n {formattedValue}\n </text>\n );\n};\n\nconst ParentHeader = ({\n showHeader,\n node,\n x,\n valueX,\n textY,\n textColor,\n headerName,\n headerValue,\n targetX,\n targetY,\n targetWidth,\n targetHeight,\n focusTargetId,\n focusTargetTestId,\n focusX,\n focusY,\n focusWidth,\n focusHeight,\n tabIndex,\n onMouseDown,\n onClick,\n onKeyDown,\n onMouseEnter,\n onMouseLeave,\n ariaLabel,\n}: {\n showHeader: boolean;\n node: TreemapNodeData;\n x: number;\n valueX: number;\n textY: number;\n textColor: string;\n headerName: string;\n headerValue: string;\n targetX: number;\n targetY: number;\n targetWidth: number;\n targetHeight: number;\n focusTargetId: string;\n focusTargetTestId: string;\n focusX: number;\n focusY: number;\n focusWidth: number;\n focusHeight: number;\n tabIndex: number;\n onMouseDown: NodeMouseDownHandler;\n onClick: () => void;\n onKeyDown: (e: React.KeyboardEvent<SVGGElement | SVGRectElement>) => void;\n onMouseEnter: (e: React.MouseEvent<SVGElement>) => void;\n onMouseLeave: () => void;\n ariaLabel: string;\n}): React.ReactElement | null => {\n if (!showHeader) {\n return null;\n }\n return (\n <g\n id={focusTargetId}\n data-test={focusTargetTestId}\n style={{ cursor: 'pointer' }}\n onMouseDown={onMouseDown}\n onClick={onClick}\n onKeyDown={onKeyDown}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n tabIndex={tabIndex}\n aria-label={ariaLabel}\n >\n <rect\n x={focusX}\n y={focusY}\n width={focusWidth}\n height={focusHeight}\n fill=\"transparent\"\n pointerEvents=\"none\"\n data-test={`treemap-parent-focus-bounds-${node.id}`}\n />\n <TreemapHoverTarget\n nodeId={node.id}\n x={targetX}\n y={targetY}\n width={targetWidth}\n height={targetHeight}\n dataTest={`treemap-parent-header-target-${node.id}`}\n expandBottom={false}\n />\n <text\n x={x}\n y={textY}\n fill={textColor}\n fontSize={PARENT_FONT_SIZE}\n fontWeight={PARENT_FONT_WEIGHT}\n pointerEvents=\"none\"\n data-test={`treemap-label-${node.id}`}\n >\n {headerName}\n </text>\n <HeaderValue\n showParentValues={Boolean(headerValue)}\n x={valueX}\n y={textY}\n textColor={textColor}\n formattedValue={headerValue}\n nodeId={node.id}\n />\n </g>\n );\n};\n\nconst HiddenParentDrillTarget = ({\n showHeader,\n x,\n y,\n width,\n height,\n focusTargetId,\n focusTargetTestId,\n tabIndex,\n onClick,\n onMouseEnter,\n onMouseLeave,\n onMouseDown,\n onKeyDown,\n ariaLabel,\n}: {\n showHeader: boolean;\n x: number;\n y: number;\n width: number;\n height: number;\n focusTargetId: string;\n focusTargetTestId: string;\n tabIndex: number;\n onClick: () => void;\n onMouseEnter: (e: React.MouseEvent<SVGElement>) => void;\n onMouseLeave: () => void;\n onMouseDown: NodeMouseDownHandler;\n onKeyDown: (e: React.KeyboardEvent<SVGGElement | SVGRectElement>) => void;\n ariaLabel: string;\n}): React.ReactElement | null => {\n if (showHeader) {\n return null;\n }\n const bounds = getHoverTargetBounds({ x, y, width, height });\n return (\n <rect\n id={focusTargetId}\n data-test={focusTargetTestId}\n x={bounds.x}\n y={bounds.y}\n width={bounds.width}\n height={bounds.height}\n fill=\"transparent\"\n pointerEvents=\"all\"\n onMouseDown={onMouseDown}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onKeyDown={onKeyDown}\n tabIndex={tabIndex}\n aria-label={ariaLabel}\n style={{ cursor: 'pointer' }}\n />\n );\n};\n\nconst TreemapChildren = ({\n treemapInstanceId,\n parentNode,\n childRects,\n parentBounds,\n backgroundColor,\n nodeColorMap,\n defaultNodeColor,\n showChildValues,\n bodyTextColor,\n fallbackFillColor,\n dimUnhoveredChildren,\n hoveredNodeId,\n ancestorDimmed,\n onClick,\n onMouseEnter,\n onMouseLeave,\n renderNestedNode,\n}: {\n treemapInstanceId: string;\n parentNode: TreemapNodeData;\n childRects: TreemapRect[];\n parentBounds: Pick<TreemapRect, 'x0' | 'y0' | 'x1' | 'y1'>;\n backgroundColor: string;\n nodeColorMap?: Map<string, string>;\n defaultNodeColor?: string;\n showChildValues: boolean;\n bodyTextColor: string;\n fallbackFillColor: string;\n dimUnhoveredChildren: boolean;\n hoveredNodeId?: string | null;\n ancestorDimmed: boolean;\n onClick: (node: TreemapNodeData) => void;\n onMouseEnter: (node: TreemapNodeData, element: SVGElement, forceTooltip?: boolean) => void;\n onMouseLeave: () => void;\n renderNestedNode: RenderNestedNode;\n}): React.ReactElement[] =>\n childRects.map(childRect => {\n const childHasChildren = childRect.children && childRect.children.length > 0;\n const childDimmed =\n dimUnhoveredChildren && hoveredNodeId != null && !rectContainsNodeId(childRect, hoveredNodeId);\n if (childHasChildren) {\n return renderNestedNode(childRect, parentNode, ancestorDimmed);\n }\n const childColor = nodeColorMap?.get(childRect.node.id) || defaultNodeColor;\n const childFillColor = childColor || fallbackFillColor;\n let childTextColor = bodyTextColor;\n if (childRect.node.isSynthetic) {\n childTextColor = getTextColorForBackground(backgroundColor);\n } else if (childColor) {\n childTextColor = getTextColorForBackground(childColor);\n }\n return (\n <g key={childRect.node.id} opacity={childDimmed ? DIM_OPACITY : 1}>\n <TreemapChildCell\n treemapInstanceId={treemapInstanceId}\n rect={childRect}\n parentBounds={parentBounds}\n clickNode={parentNode}\n fillColor={childFillColor}\n textColor={childTextColor}\n dividerColor={backgroundColor}\n backgroundColor={backgroundColor}\n labelFontWeight={CHILD_FONT_WEIGHT}\n showChildValues={showChildValues}\n centerText\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n />\n </g>\n );\n });\n\nconst getParentStrokeColor = ({\n nodeColorMap,\n defaultNodeColor,\n backgroundColor,\n baseColor,\n}: {\n nodeColorMap?: Map<string, string>;\n defaultNodeColor?: string;\n backgroundColor: string;\n baseColor: string;\n}): string => {\n const usesDynamicColoring = nodeColorMap !== undefined || defaultNodeColor !== undefined;\n const parentStrokeBaseColor = usesDynamicColoring ? backgroundColor : baseColor;\n return getStrokeColor(parentStrokeBaseColor, backgroundColor, STROKE_FACTOR);\n};\n\nconst getParentHoverState = ({\n rect,\n childRects,\n hoveredNodeId,\n ancestorDimmed,\n nodeId,\n}: {\n rect: TreemapRect;\n childRects: TreemapRect[];\n hoveredNodeId?: string | null;\n ancestorDimmed: boolean;\n nodeId: string;\n}): ParentHoverState => {\n const isHoveredNode = hoveredNodeId === nodeId;\n const hasHoveredDirectChild =\n hoveredNodeId != null && childRects.some(childRect => childRect.node.id === hoveredNodeId);\n\n if (hoveredNodeId == null || ancestorDimmed) {\n return {\n isParentDimmed: false,\n hasHoveredDirectChild,\n dimUnhoveredChildren: false,\n childAncestorDimmed: ancestorDimmed || hasHoveredDirectChild || isHoveredNode,\n };\n }\n\n const containsHoveredNode = rectContainsNodeId(rect, hoveredNodeId);\n const isParentDimmed = !containsHoveredNode;\n const descendantAncestorDimmed = ancestorDimmed || isParentDimmed;\n\n return {\n isParentDimmed,\n hasHoveredDirectChild,\n dimUnhoveredChildren: !isHoveredNode && containsHoveredNode && !hasHoveredDirectChild,\n childAncestorDimmed: descendantAncestorDimmed || hasHoveredDirectChild || isHoveredNode,\n };\n};\n\nconst getHeaderValueWidth = (showParentValues: boolean, formattedValue: string): number => {\n if (!showParentValues) {\n return 0;\n }\n return computeTextWidth(formattedValue, HEADER_VALUE_FONT);\n};\n\nconst canShowParentHeaderValue = ({\n showParentValues,\n hasSpaceForLabel,\n headerAvailableTextWidth,\n headerValueWidth,\n}: {\n showParentValues: boolean;\n hasSpaceForLabel: boolean;\n headerAvailableTextWidth: number;\n headerValueWidth: number;\n}): boolean => {\n if (!showParentValues || !hasSpaceForLabel) {\n return false;\n }\n return headerAvailableTextWidth >= headerValueWidth + LABEL_PADDING + MIN_HEADER_LABEL_WIDTH;\n};\n\nconst getHeaderNameWidth = (\n canShowHeaderValue: boolean,\n headerAvailableTextWidth: number,\n headerValueWidth: number\n): number => {\n if (!canShowHeaderValue) {\n return headerAvailableTextWidth;\n }\n return Math.max(0, headerAvailableTextWidth - headerValueWidth - LABEL_PADDING);\n};\n\nconst getHeaderValue = (\n canShowHeaderValue: boolean,\n formattedValue: string,\n headerValueWidth: number\n): string => {\n if (!canShowHeaderValue) {\n return '';\n }\n return getTextLayout(formattedValue, headerValueWidth, HEADER_VALUE_FONT, true).text;\n};\n\nconst shouldForceParentHeaderTooltip = ({\n nodeName,\n formattedValue,\n showParentValues,\n hasSpaceForLabel,\n canShowHeaderValue,\n headerNameLayout,\n headerValue,\n}: {\n nodeName: string;\n formattedValue: string;\n showParentValues: boolean;\n hasSpaceForLabel: boolean;\n canShowHeaderValue: boolean;\n headerNameLayout: ParentTextLayout;\n headerValue: string;\n}): boolean => {\n if (headerNameLayout.isTruncated) {\n return true;\n }\n if (showParentValues && hasSpaceForLabel && !canShowHeaderValue) {\n return true;\n }\n if (canShowHeaderValue && !headerValue) {\n return true;\n }\n const hasHeaderTextToShow = Boolean(nodeName || (showParentValues && formattedValue));\n const hasVisibleHeaderText = Boolean(headerNameLayout.text || headerValue);\n return hasHeaderTextToShow && !hasVisibleHeaderText;\n};\n\nconst getParentHeaderLayout = ({\n nodeName,\n nodeWidth,\n formattedValue,\n showParentValues,\n hasSpaceForLabel,\n}: {\n nodeName: string;\n nodeWidth: number;\n formattedValue: string;\n showParentValues: boolean;\n hasSpaceForLabel: boolean;\n}): ParentHeaderLayout => {\n const headerAvailableTextWidth = Math.max(0, nodeWidth - SUBDIVISION_TITLE_HORIZONTAL_PADDING * 2);\n const headerValueWidth = getHeaderValueWidth(showParentValues, formattedValue);\n const canShowHeaderValue = canShowParentHeaderValue({\n showParentValues,\n hasSpaceForLabel,\n headerAvailableTextWidth,\n headerValueWidth,\n });\n const headerNameWidth = getHeaderNameWidth(\n canShowHeaderValue,\n headerAvailableTextWidth,\n headerValueWidth\n );\n const headerNameLayout = getTextLayout(nodeName, headerNameWidth, PARENT_FONT, hasSpaceForLabel);\n const headerValue = getHeaderValue(canShowHeaderValue, formattedValue, headerValueWidth);\n const forceTooltip = shouldForceParentHeaderTooltip({\n nodeName,\n formattedValue,\n showParentValues,\n hasSpaceForLabel,\n canShowHeaderValue,\n headerNameLayout,\n headerValue,\n });\n\n return {\n headerName: headerNameLayout.text,\n headerValue,\n forceTooltip,\n };\n};\n\nconst getParentActivationTabIndex = (clickNode: TreemapNodeData | undefined, nodeId: string): number => {\n if (clickNode != null && clickNode.id !== nodeId) {\n return -1;\n }\n return 0;\n};\n\nconst TreemapParentNode = ({\n treemapInstanceId = 'treemap',\n rect,\n childRects,\n backgroundColor,\n nodeColorMap,\n defaultNodeColor,\n clickNode,\n showChildValues = true,\n showParentValues,\n hoveredNodeId,\n ancestorDimmed = false,\n onClick,\n onMouseEnter,\n onMouseLeave,\n nodeWidth,\n nodeHeight,\n baseColor,\n formattedValue,\n activationAriaLabel,\n hasSpaceForLabel,\n handleMouseDown,\n handleClick,\n handleKeyDown,\n renderNestedNode,\n}: TreemapParentNodeProps): React.ReactElement => {\n const { x0, y0, x1, y1, node } = rect;\n const headerTextColor = getTextColorForBackground(backgroundColor);\n const bodyTextColor = getTextColorForBackground(baseColor);\n const strokeColor = getParentStrokeColor({ nodeColorMap, defaultNodeColor, backgroundColor, baseColor });\n const headerTextY = y0 + HEADER_HEIGHT - 6;\n const headerTextX = x0 + SUBDIVISION_TITLE_HORIZONTAL_PADDING;\n const headerValueX = x1 - SUBDIVISION_TITLE_HORIZONTAL_PADDING;\n const bodyY0 = y0 + HEADER_HEIGHT;\n const bodyWidth = x1 - x0;\n const bodyHeight = y1 - bodyY0;\n const { isParentDimmed, hasHoveredDirectChild, dimUnhoveredChildren, childAncestorDimmed } =\n getParentHoverState({ rect, childRects, hoveredNodeId, ancestorDimmed, nodeId: node.id });\n const {\n headerName,\n headerValue,\n forceTooltip: forceHeaderTooltip,\n } = getParentHeaderLayout({\n nodeName: node.name,\n nodeWidth,\n formattedValue,\n showParentValues,\n hasSpaceForLabel,\n });\n const handleParentMouseEnter: NodeMouseEnterHandler = e => {\n callNodeMouseEnter(onMouseEnter, node, e.currentTarget, forceHeaderTooltip);\n };\n const parentFocusTargetId = getParentFocusTargetId(treemapInstanceId, node.id);\n const parentFocusTargetTestId = getParentFocusTargetTestId(node.id);\n const activationTabIndex = getParentActivationTabIndex(clickNode, node.id);\n\n return (\n <g data-test={`treemap-node-${node.id}`} opacity={isParentDimmed ? DIM_OPACITY : 1}>\n <ParentBody\n nodeId={node.id}\n x={x0}\n y={bodyY0}\n width={bodyWidth}\n height={bodyHeight}\n stroke={strokeColor}\n onMouseDown={handleMouseDown}\n onClick={handleClick}\n onMouseEnter={handleParentMouseEnter}\n onMouseLeave={onMouseLeave}\n />\n <TreemapChildren\n treemapInstanceId={treemapInstanceId}\n parentNode={node}\n childRects={childRects}\n parentBounds={{ x0, y0: bodyY0, x1, y1 }}\n backgroundColor={backgroundColor}\n nodeColorMap={nodeColorMap}\n defaultNodeColor={defaultNodeColor}\n showChildValues={showChildValues}\n bodyTextColor={bodyTextColor}\n fallbackFillColor={baseColor}\n dimUnhoveredChildren={dimUnhoveredChildren}\n hoveredNodeId={hoveredNodeId}\n ancestorDimmed={childAncestorDimmed}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n renderNestedNode={renderNestedNode}\n />\n <ParentBodyBorder\n nodeId={node.id}\n x={x0}\n y={bodyY0}\n width={bodyWidth}\n height={bodyHeight}\n stroke={strokeColor}\n dataTest={`treemap-parent-body-border-${node.id}`}\n />\n <ParentHeader\n showHeader={hasSpaceForLabel}\n node={node}\n x={headerTextX}\n valueX={headerValueX}\n textY={headerTextY}\n textColor={headerTextColor}\n headerName={headerName}\n headerValue={headerValue}\n targetX={x0}\n targetY={y0}\n targetWidth={nodeWidth}\n targetHeight={Math.min(HEADER_HEIGHT, nodeHeight)}\n focusTargetId={parentFocusTargetId}\n focusTargetTestId={parentFocusTargetTestId}\n focusX={x0}\n focusY={y0}\n focusWidth={nodeWidth}\n focusHeight={nodeHeight}\n tabIndex={activationTabIndex}\n onMouseDown={handleMouseDown}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseEnter={handleParentMouseEnter}\n onMouseLeave={onMouseLeave}\n ariaLabel={activationAriaLabel}\n />\n <HiddenParentDrillTarget\n showHeader={hasSpaceForLabel}\n x={x0}\n y={y0}\n width={nodeWidth}\n height={nodeHeight}\n focusTargetId={parentFocusTargetId}\n focusTargetTestId={parentFocusTargetTestId}\n tabIndex={activationTabIndex}\n onClick={handleClick}\n onMouseEnter={handleParentMouseEnter}\n onMouseLeave={onMouseLeave}\n onMouseDown={handleMouseDown}\n onKeyDown={handleKeyDown}\n ariaLabel={activationAriaLabel}\n />\n {hasHoveredDirectChild && (\n <ParentBodyBorder\n nodeId={node.id}\n x={x0}\n y={bodyY0}\n width={bodyWidth}\n height={bodyHeight}\n stroke={strokeColor}\n dataTest={`treemap-parent-highlight-border-${node.id}`}\n />\n )}\n </g>\n );\n};\n\nexport default TreemapParentNode;\n", "import * as React from 'react';\nimport { VIZ_FONT_FAMILY } from '../../../common/utils/textUtils';\nimport { BORDER_RADIUS } from '../utils/treemapLayout';\nimport { getStandaloneNodeStyle, getTextColorForBackground } from '../utils/treemapColorUtils';\nimport { TreemapNodeData } from '../utils/treemapTypes';\nimport { getAdaptiveNameFontSize, getAdaptiveValueFontSize } from '../utils/treemapUtils';\nimport TreemapHoverTarget from './TreemapHoverTarget';\nimport {\n callNodeMouseEnter,\n CHILD_FONT_WEIGHT,\n DIM_OPACITY,\n getTextLayout,\n LABEL_PADDING,\n MIN_VALUE_TEXT_WIDTH,\n RenderNodeState,\n STROKE_FACTOR,\n STROKE_WIDTH,\n TextAnchor,\n TreemapNodeProps,\n VALUE_FONT_FAMILY,\n VALUE_LABEL_PADDING_DOUBLE,\n VALUE_OPACITY,\n VALUE_TEXT_GAP,\n} from '../utils/treemapNodeUtils';\n\ntype TreemapStandaloneNodeProps = TreemapNodeProps & RenderNodeState;\n\ninterface StandaloneTextLayout {\n text: string;\n isTruncated: boolean;\n}\n\ninterface StandaloneTextPosition {\n textX: number;\n nameY: number;\n valueY: number;\n textAnchor: TextAnchor;\n}\n\ninterface StandaloneTextPositionOptions {\n x0: number;\n y0: number;\n nodeWidth: number;\n nodeHeight: number;\n centerText: boolean;\n nameFontSize: number;\n valueFontSize: number;\n hasVisibleName: boolean;\n hasVisibleValue: boolean;\n}\n\nconst NodeText = ({\n text,\n x,\n y,\n fill,\n fontSize,\n fontWeight,\n fontFamily,\n textAnchor,\n opacity,\n dataTest,\n}: {\n text: string;\n x: number;\n y: number;\n fill: string;\n fontSize: number;\n fontWeight?: string | number;\n fontFamily?: string;\n textAnchor?: TextAnchor;\n opacity?: number;\n dataTest: string;\n}): React.ReactElement | null => {\n if (!text) {\n return null;\n }\n return (\n <text\n x={x}\n y={y}\n fill={fill}\n fontSize={fontSize}\n fontWeight={fontWeight}\n fontFamily={fontFamily}\n textAnchor={textAnchor}\n opacity={opacity}\n pointerEvents=\"none\"\n data-test={dataTest}\n >\n {text}\n </text>\n );\n};\n\nconst canShowStandaloneValue = ({\n isSynthetic,\n showChildValues,\n availableValueTextWidth,\n nodeHeight,\n nameFontSize,\n valueFontSize,\n}: {\n isSynthetic: boolean;\n showChildValues: boolean;\n availableValueTextWidth: number;\n nodeHeight: number;\n nameFontSize: number;\n valueFontSize: number;\n}): boolean =>\n !isSynthetic &&\n showChildValues &&\n availableValueTextWidth >= MIN_VALUE_TEXT_WIDTH &&\n nodeHeight >= LABEL_PADDING + nameFontSize + VALUE_TEXT_GAP + valueFontSize + LABEL_PADDING;\n\nconst getStandaloneTextPosition = ({\n x0,\n y0,\n nodeWidth,\n nodeHeight,\n centerText,\n nameFontSize,\n valueFontSize,\n hasVisibleName,\n hasVisibleValue,\n}: StandaloneTextPositionOptions): StandaloneTextPosition => {\n if (centerText) {\n const textHeight =\n (hasVisibleName ? nameFontSize : 0) +\n (hasVisibleName && hasVisibleValue ? VALUE_TEXT_GAP : 0) +\n (hasVisibleValue ? valueFontSize : 0);\n const textTop = y0 + (nodeHeight - textHeight) / 2;\n const nameOffset = hasVisibleName ? nameFontSize : 0;\n const valueOffset = hasVisibleName ? nameFontSize + VALUE_TEXT_GAP : 0;\n\n return {\n textX: x0 + nodeWidth / 2,\n nameY: textTop + nameOffset,\n valueY: textTop + valueOffset + valueFontSize,\n textAnchor: 'middle',\n };\n }\n\n const nameY = y0 + LABEL_PADDING + nameFontSize;\n\n return {\n textX: x0 + LABEL_PADDING,\n nameY,\n valueY: nameY + nameFontSize + VALUE_TEXT_GAP,\n textAnchor: 'start',\n };\n};\n\nconst shouldForceStandaloneTooltip = ({\n isSynthetic,\n showChildValues,\n hasSpaceForLabel,\n showValue,\n nodeName,\n formattedValue,\n leafNameLayout,\n leafValueLayout,\n}: {\n isSynthetic: boolean;\n showChildValues: boolean;\n hasSpaceForLabel: boolean;\n showValue: boolean;\n nodeName: string;\n formattedValue: string;\n leafNameLayout: StandaloneTextLayout;\n leafValueLayout: StandaloneTextLayout;\n}): boolean => {\n if (leafNameLayout.isTruncated || leafValueLayout.isTruncated) {\n return true;\n }\n if (!isSynthetic && showChildValues && hasSpaceForLabel && !showValue) {\n return true;\n }\n const hasNodeTextToShow = Boolean(nodeName || (!isSynthetic && showChildValues && formattedValue));\n const hasVisibleText = Boolean(leafNameLayout.text || leafValueLayout.text);\n return hasNodeTextToShow && !hasVisibleText;\n};\n\nconst getStandaloneTabIndex = (clickNode: TreemapNodeData | undefined, nodeId: string): number => {\n if (clickNode && clickNode.id !== nodeId) {\n return -1;\n }\n return 0;\n};\n\nconst getStandaloneOpacity = ({\n hoveredNodeId,\n ancestorDimmed,\n nodeId,\n}: {\n hoveredNodeId?: string | null;\n ancestorDimmed: boolean;\n nodeId: string;\n}): number => {\n const isDimmed = hoveredNodeId != null && !ancestorDimmed && hoveredNodeId !== nodeId;\n return isDimmed ? DIM_OPACITY : 1;\n};\n\nconst TreemapStandaloneNode = ({\n rect,\n backgroundColor,\n clickNode,\n showChildValues = true,\n hoveredNodeId,\n centerStandaloneText = false,\n ancestorDimmed = false,\n onMouseEnter,\n onMouseLeave,\n nodeWidth,\n nodeHeight,\n baseColor,\n formattedValue,\n activationAriaLabel,\n hasSpaceForLabel,\n availableTextWidth,\n handleMouseDown,\n handleClick,\n handleKeyDown,\n}: TreemapStandaloneNodeProps): React.ReactElement => {\n const { x0, y0, node } = rect;\n const isSynthetic = Boolean(node.isSynthetic);\n const { nodeFillColor, strokeColor, strokeWidth } = getStandaloneNodeStyle({\n isSynthetic,\n backgroundColor,\n baseColor,\n strokeFactor: STROKE_FACTOR,\n defaultStrokeWidth: STROKE_WIDTH,\n });\n const textColor = getTextColorForBackground(nodeFillColor);\n const nameFontSize = getAdaptiveNameFontSize(nodeHeight);\n const valueFontSize = getAdaptiveValueFontSize(nameFontSize);\n const labelFontWeight = CHILD_FONT_WEIGHT;\n const leafNameFont = `${labelFontWeight} ${nameFontSize}px ${VIZ_FONT_FAMILY}`;\n const leafValueFont = `${valueFontSize}px ${VALUE_FONT_FAMILY}`;\n const availableValueTextWidth = Math.max(0, nodeWidth - VALUE_LABEL_PADDING_DOUBLE);\n const showValue = canShowStandaloneValue({\n isSynthetic,\n showChildValues,\n availableValueTextWidth,\n nodeHeight,\n nameFontSize,\n valueFontSize,\n });\n const leafNameLayout = getTextLayout(node.name, availableTextWidth, leafNameFont, hasSpaceForLabel);\n const leafValueLayout = getTextLayout(\n formattedValue,\n availableValueTextWidth,\n leafValueFont,\n hasSpaceForLabel && showValue\n );\n const { textX, nameY, valueY, textAnchor } = getStandaloneTextPosition({\n x0,\n y0,\n nodeWidth,\n nodeHeight,\n centerText: centerStandaloneText,\n nameFontSize,\n valueFontSize,\n hasVisibleName: Boolean(leafNameLayout.text),\n hasVisibleValue: Boolean(leafValueLayout.text),\n });\n const shouldForceTooltip = shouldForceStandaloneTooltip({\n isSynthetic,\n showChildValues,\n hasSpaceForLabel,\n showValue,\n nodeName: node.name,\n formattedValue,\n leafNameLayout,\n leafValueLayout,\n });\n const handleStandaloneMouseEnter = (e: React.MouseEvent<SVGElement>): void => {\n callNodeMouseEnter(onMouseEnter, node, e.currentTarget, shouldForceTooltip);\n };\n const opacity = getStandaloneOpacity({ hoveredNodeId, ancestorDimmed, nodeId: node.id });\n\n return (\n <g\n data-test={`treemap-node-${node.id}`}\n onMouseDown={handleMouseDown}\n onClick={handleClick}\n onMouseEnter={handleStandaloneMouseEnter}\n onMouseLeave={onMouseLeave}\n onKeyDown={handleKeyDown}\n tabIndex={getStandaloneTabIndex(clickNode, node.id)}\n aria-label={activationAriaLabel}\n style={{ cursor: 'pointer' }}\n opacity={opacity}\n >\n <rect\n x={x0}\n y={y0}\n width={nodeWidth}\n height={nodeHeight}\n rx={BORDER_RADIUS}\n ry={BORDER_RADIUS}\n fill={nodeFillColor}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n />\n <TreemapHoverTarget nodeId={node.id} x={x0} y={y0} width={nodeWidth} height={nodeHeight} />\n <NodeText\n text={leafNameLayout.text}\n x={textX}\n y={nameY}\n fill={textColor}\n fontSize={nameFontSize}\n fontWeight={labelFontWeight}\n textAnchor={textAnchor}\n dataTest={`treemap-label-${node.id}`}\n />\n <NodeText\n text={leafValueLayout.text}\n x={textX}\n y={valueY}\n fill={textColor}\n fontSize={valueFontSize}\n fontFamily={VALUE_FONT_FAMILY}\n textAnchor={textAnchor}\n opacity={VALUE_OPACITY}\n dataTest={`treemap-value-${node.id}`}\n />\n </g>\n );\n};\n\nexport default TreemapStandaloneNode;\n", "import * as React from 'react';\nimport { useCallback, useMemo } from 'react';\nimport { getSeriesColor } from '../utils/treemapColorUtils';\nimport { formatTreemapValue, hasSpaceForTreemapLabel } from '../utils/treemapUtils';\nimport TreemapParentNode from './TreemapParentNode';\nimport TreemapStandaloneNode from './TreemapStandaloneNode';\nimport {\n focusParentTarget,\n getActivationAriaLabel,\n LABEL_PADDING_DOUBLE,\n type TreemapNodeProps,\n} from '../utils/treemapNodeUtils';\n\nconst TreemapNode = ({\n treemapInstanceId = 'treemap',\n rect,\n seriesColors,\n categoryIndex,\n backgroundColor,\n nodeColorMap,\n defaultNodeColor,\n clickNode,\n showChildValues = true,\n showParentValues,\n centerStandaloneText = false,\n hoveredNodeId,\n ancestorDimmed,\n onClick,\n onMouseEnter,\n onMouseLeave,\n}: TreemapNodeProps): React.ReactElement => {\n const { x0, y0, x1, y1, node, children: childRects } = rect;\n const nodeWidth = x1 - x0;\n const nodeHeight = y1 - y0;\n const isParent = Boolean(childRects && childRects.length > 0);\n const activationNode = clickNode || node;\n const focusNode = clickNode || (isParent ? node : undefined);\n\n const handleClick = useCallback(() => {\n if (focusNode) {\n focusParentTarget(treemapInstanceId, focusNode.id);\n }\n onClick(activationNode);\n }, [activationNode, focusNode, onClick, treemapInstanceId]);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent<SVGGElement | SVGRectElement>) => {\n if (focusNode) {\n e.preventDefault();\n focusParentTarget(treemapInstanceId, focusNode.id);\n }\n },\n [focusNode, treemapInstanceId]\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<SVGGElement | SVGRectElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (focusNode) {\n focusParentTarget(treemapInstanceId, focusNode.id);\n }\n onClick(activationNode);\n }\n },\n [activationNode, focusNode, onClick, treemapInstanceId]\n );\n\n const baseColor =\n nodeColorMap?.get(node.id) || defaultNodeColor || getSeriesColor(node, seriesColors, categoryIndex);\n\n const hasSpaceForLabel = hasSpaceForTreemapLabel(nodeWidth, nodeHeight);\n const availableTextWidth = Math.max(0, nodeWidth - LABEL_PADDING_DOUBLE);\n\n const formattedValue = useMemo(() => formatTreemapValue(node.value), [node.value]);\n const activationAriaLabel = getActivationAriaLabel(node, activationNode, formattedValue);\n const renderNodeProps = {\n rect,\n treemapInstanceId,\n seriesColors,\n categoryIndex,\n backgroundColor,\n nodeColorMap,\n defaultNodeColor,\n clickNode,\n showChildValues,\n showParentValues,\n centerStandaloneText,\n hoveredNodeId,\n ancestorDimmed,\n onClick,\n onMouseEnter,\n onMouseLeave,\n nodeWidth,\n nodeHeight,\n baseColor,\n formattedValue,\n activationAriaLabel,\n hasSpaceForLabel,\n availableTextWidth,\n handleMouseDown,\n handleClick,\n handleKeyDown,\n };\n\n if (childRects && childRects.length > 0) {\n return (\n <TreemapParentNode\n {...renderNodeProps}\n childRects={childRects}\n renderNestedNode={(childRect, nestedClickNode, nestedAncestorDimmed) => (\n <TreemapNode\n key={childRect.node.id}\n treemapInstanceId={treemapInstanceId}\n rect={childRect}\n seriesColors={seriesColors}\n categoryIndex={categoryIndex}\n backgroundColor={backgroundColor}\n nodeColorMap={nodeColorMap}\n defaultNodeColor={defaultNodeColor}\n clickNode={nestedClickNode}\n showChildValues={showChildValues}\n showParentValues={showParentValues}\n centerStandaloneText={centerStandaloneText}\n hoveredNodeId={hoveredNodeId}\n ancestorDimmed={nestedAncestorDimmed}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n />\n )}\n />\n );\n }\n\n return <TreemapStandaloneNode {...renderNodeProps} />;\n};\n\nexport default TreemapNode;\n", "import * as React from 'react';\nimport { useCallback } from 'react';\nimport styled from 'styled-components';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport { TreemapNodeData } from '../utils/treemapTypes';\n\nexport interface TreemapBreadcrumbProps {\n path: TreemapNodeData[];\n onNavigate: (index: number) => void;\n textColor: string;\n}\n\nconst BreadcrumbContainer = styled.nav`\n display: flex;\n align-items: center;\n padding: 4px 8px;\n font-size: 12px;\n gap: 4px;\n`;\n\nconst BreadcrumbLink = styled.button<{ textColor: string }>`\n background: none;\n border: none;\n color: ${props => props.textColor};\n cursor: pointer;\n padding: 2px 4px;\n font-size: 12px;\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n text-decoration: underline;\n }\n`;\n\nconst BreadcrumbSeparator = styled.span<{ textColor: string }>`\n color: ${props => props.textColor};\n opacity: 0.5;\n`;\n\nconst BreadcrumbCurrent = styled.span<{ textColor: string }>`\n color: ${props => props.textColor};\n font-weight: bold;\n padding: 2px 4px;\n`;\n\nconst TreemapBreadcrumb = ({ path, onNavigate, textColor }: TreemapBreadcrumbProps): React.ReactElement => {\n const handleRootClick = useCallback(() => {\n onNavigate(-1);\n }, [onNavigate]);\n\n return (\n <BreadcrumbContainer data-test=\"treemap-breadcrumb\" aria-label={_('Treemap breadcrumb')}>\n <BreadcrumbLink\n textColor={textColor}\n onClick={handleRootClick}\n data-test=\"treemap-breadcrumb-root\"\n >\n {_('Overview')}\n </BreadcrumbLink>\n {path.map((node, index) => {\n const isLast = index === path.length - 1;\n const label = node.isSynthetic ? _('Other') : node.name;\n return (\n <React.Fragment key={node.id}>\n <BreadcrumbSeparator textColor={textColor}>/</BreadcrumbSeparator>\n {isLast ? (\n <BreadcrumbCurrent\n textColor={textColor}\n aria-current=\"location\"\n data-test={`treemap-breadcrumb-${node.id}`}\n >\n {label}\n </BreadcrumbCurrent>\n ) : (\n <BreadcrumbLink\n textColor={textColor}\n onClick={() => onNavigate(index)}\n data-test={`treemap-breadcrumb-${node.id}`}\n >\n {label}\n </BreadcrumbLink>\n )}\n </React.Fragment>\n );\n })}\n </BreadcrumbContainer>\n );\n};\n\nexport default TreemapBreadcrumb;\n", "\nimport * as defaultImport from \"@splunk/react-ui/Popover\";\nexport * from \"@splunk/react-ui/Popover\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import * as React from 'react';\nimport Popover from '@splunk/react-ui/Popover';\nimport styled from 'styled-components';\nimport { formatNumber } from '@splunk/visualizations-shared/numberUtils';\nimport { TreemapNodeData } from '../utils/treemapTypes';\nimport { getSeriesColor } from '../utils/treemapColorUtils';\nimport { formatTooltipFieldValue, getTreemapPopoverPlacement } from '../utils/treemapUtils';\n\nconst StyledPopover = styled(Popover)`\n pointer-events: none;\n`;\n\nconst tooltipPointerEventsStyle: React.CSSProperties = { pointerEvents: 'none' };\n\nexport interface TreemapTooltipProps {\n node: TreemapNodeData;\n anchor: SVGElement | HTMLElement;\n additionalFields: string[];\n textColor: string;\n headerColor: string;\n seriesColors: string[];\n categoryIndex: Map<string, number>;\n nodeColorMap?: Map<string, string>;\n defaultNodeColor?: string;\n containerWidth: number;\n}\n\nconst StyledTooltipContainer = styled.div`\n display: flex;\n min-width: 200px;\n max-width: 300px;\n padding: 16px;\n flex-direction: column;\n`;\n\nconst StyledTooltipHeader = styled.div<{ headerColor: string }>`\n font-size: 14px;\n font-weight: bold;\n color: ${props => props.headerColor};\n margin-bottom: 8px;\n`;\n\nconst StyledTooltipRow = styled.div<{ rowColor: string }>`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n font-size: 12px;\n color: ${props => props.rowColor};\n margin-bottom: 6px;\n`;\n\nconst StyledTooltipLeftCell = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-items: center;\n`;\n\nconst StyledTooltipRightCell = styled.div`\n margin-left: 16px;\n white-space: nowrap;\n`;\n\nconst StyledColorSwatch = styled.div<{ color: string }>`\n width: 6px;\n height: 16px;\n border-radius: 2px;\n background-color: ${props => props.color};\n flex-shrink: 0;\n`;\n\nconst StyledFieldName = styled.div`\n margin-left: 8px;\n max-width: 200px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n`;\n\nconst TreemapTooltip = ({\n node,\n anchor,\n additionalFields,\n textColor,\n headerColor,\n seriesColors,\n categoryIndex,\n nodeColorMap,\n defaultNodeColor,\n containerWidth,\n}: TreemapTooltipProps): React.ReactElement => {\n const parentNode = node.parent;\n const parentColor = parentNode ? getSeriesColor(parentNode, seriesColors, categoryIndex) : null;\n const swatchColor =\n nodeColorMap?.get(node.id) ||\n (parentNode && nodeColorMap?.get(parentNode.id)) ||\n defaultNodeColor ||\n parentColor;\n\n const handleRequestClose = React.useCallback(() => {\n // Tooltip closes via mouse leave on the node, not via Popover close\n }, []);\n\n const handleOuterRef = React.useCallback((element: HTMLDivElement | null) => {\n if (element) {\n element.style.setProperty('pointer-events', 'none');\n }\n }, []);\n\n return (\n <StyledPopover\n open\n anchor={anchor as unknown as HTMLElement}\n outerRef={handleOuterRef}\n style={tooltipPointerEventsStyle}\n onRequestClose={handleRequestClose}\n defaultPlacement={getTreemapPopoverPlacement(anchor, containerWidth)}\n >\n <StyledTooltipContainer data-test=\"treemap-tooltip\">\n {/* Node name header */}\n <StyledTooltipHeader headerColor={headerColor} data-test=\"tooltip-header\">\n {node.name}\n </StyledTooltipHeader>\n\n {/* Value row */}\n <StyledTooltipRow rowColor={textColor} data-test=\"tooltip-value-row\">\n <StyledTooltipLeftCell>value</StyledTooltipLeftCell>\n <StyledTooltipRightCell>\n {formatNumber(node.value, 0, { useTrendUnits: true })}\n </StyledTooltipRightCell>\n </StyledTooltipRow>\n\n {/* Additional fields */}\n {additionalFields.map(fieldName => {\n const fieldValue = node.additionalFields?.[fieldName];\n if (fieldValue === undefined || fieldValue === null) {\n return null;\n }\n return (\n <StyledTooltipRow\n key={fieldName}\n rowColor={textColor}\n data-test={`tooltip-field-${fieldName}`}\n >\n <StyledTooltipLeftCell>{fieldName}</StyledTooltipLeftCell>\n <StyledTooltipRightCell>\n {formatTooltipFieldValue(fieldValue)}\n </StyledTooltipRightCell>\n </StyledTooltipRow>\n );\n })}\n\n {/* Parent row with color swatch */}\n {parentNode && parentNode.name !== 'root' && (\n <StyledTooltipRow rowColor={textColor} data-test=\"tooltip-parent-row\">\n <StyledTooltipLeftCell>\n {swatchColor && (\n <StyledColorSwatch color={swatchColor} data-test=\"tooltip-parent-color\" />\n )}\n <StyledFieldName>parent_id</StyledFieldName>\n </StyledTooltipLeftCell>\n <StyledTooltipRightCell>{parentNode.name}</StyledTooltipRightCell>\n </StyledTooltipRow>\n )}\n </StyledTooltipContainer>\n </StyledPopover>\n );\n};\n\nexport default TreemapTooltip;\n", "import * as React from 'react';\nimport { useMemo } from 'react';\nimport styled from 'styled-components';\nimport {\n deduplicateMatches,\n formatRangeLabel,\n formatTreemapValue,\n getGradientCss,\n getMatchItemKey,\n getRangeEntryKey,\n} from '../utils/treemapUtils';\nimport type { DataColorLegendConfig, GradientConfig, MatchEntry, RangeEntry } from '../utils/treemapUtils';\n\nexport type { DataColorLegendConfig, GradientConfig, MatchEntry, RangeEntry } from '../utils/treemapUtils';\n\nexport interface DataColorsTreemapLegendProps {\n config: DataColorLegendConfig;\n textColor: string;\n}\n\nexport interface SeriesColorLegendItem {\n id: string;\n label: string;\n color: string;\n}\n\nexport interface SeriesColorLegendProps {\n items: SeriesColorLegendItem[];\n textColor: string;\n}\n\nconst LegendContainer = styled.div`\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n align-content: center;\n justify-content: center;\n min-height: 32px;\n padding: 4px 8px;\n column-gap: 10px;\n row-gap: 4px;\n overflow: visible;\n box-sizing: border-box;\n`;\n\nconst LegendItem = styled.div`\n display: flex;\n align-items: center;\n gap: 4px;\n min-width: 0;\n`;\n\nconst LegendSwatch = styled.div<{ color: string }>`\n width: 12px;\n height: 12px;\n border-radius: 2px;\n flex-shrink: 0;\n background-color: ${props => props.color};\n`;\n\nconst LegendLabel = styled.span<{ textColor: string }>`\n font-size: 11px;\n color: ${props => props.textColor};\n opacity: 0.7;\n overflow-wrap: anywhere;\n`;\n\nconst GradientBar = styled.div`\n width: 200px;\n max-width: 50%;\n height: 14px;\n border-radius: 2px;\n flex-shrink: 0;\n`;\n\nconst SeriesLegendContainer = styled.ul`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n align-items: center;\n align-content: center;\n min-height: 32px;\n padding: 4px 8px;\n margin: 0;\n column-gap: 12px;\n row-gap: 4px;\n list-style: none;\n overflow: visible;\n box-sizing: border-box;\n`;\n\nconst SeriesLegendItem = styled.li`\n display: flex;\n align-items: center;\n gap: 4px;\n min-width: 0;\n`;\n\nconst SeriesLegendSwatch = styled.div<{ color: string }>`\n width: 12px;\n height: 12px;\n flex-shrink: 0;\n align-self: center;\n border-radius: 2px;\n background-color: ${props => props.color};\n`;\n\nconst SeriesLegendLabel = styled.span<{ textColor: string }>`\n font-size: 11px;\n color: ${props => props.textColor};\n overflow-wrap: anywhere;\n`;\n\nexport const SeriesColorLegend = ({ items, textColor }: SeriesColorLegendProps): React.ReactElement => {\n return (\n <SeriesLegendContainer data-test=\"treemap-legend\">\n {items.map(item => (\n <SeriesLegendItem key={item.id}>\n <SeriesLegendSwatch color={item.color} />\n <SeriesLegendLabel textColor={textColor}>{item.label}</SeriesLegendLabel>\n </SeriesLegendItem>\n ))}\n </SeriesLegendContainer>\n );\n};\n\nconst RangeValueLegend = ({\n ranges,\n textColor,\n}: {\n ranges: RangeEntry[];\n textColor: string;\n}): React.ReactElement => (\n <LegendContainer data-test=\"treemap-range-legend\">\n {ranges.map(entry => (\n <LegendItem key={getRangeEntryKey(entry)}>\n <LegendSwatch color={entry.value} />\n <LegendLabel textColor={textColor}>{formatRangeLabel(entry)}</LegendLabel>\n </LegendItem>\n ))}\n </LegendContainer>\n);\n\nconst MatchValueLegend = ({\n matches,\n textColor,\n}: {\n matches: MatchEntry[];\n textColor: string;\n}): React.ReactElement => {\n const items = useMemo(() => {\n return deduplicateMatches(matches);\n }, [matches]);\n return (\n <LegendContainer data-test=\"treemap-match-legend\">\n {items.map(item => (\n <LegendItem key={getMatchItemKey(item)}>\n <LegendSwatch color={item.color} />\n <LegendLabel textColor={textColor}>{item.label}</LegendLabel>\n </LegendItem>\n ))}\n </LegendContainer>\n );\n};\n\nconst GradientLegend = ({\n gradient,\n minVal,\n maxVal,\n textColor,\n}: {\n gradient: GradientConfig;\n minVal: number;\n maxVal: number;\n textColor: string;\n}): React.ReactElement => {\n const gradientCss = useMemo(() => getGradientCss(gradient.colors), [gradient.colors]);\n\n return (\n <LegendContainer data-test=\"treemap-gradient-legend\">\n <LegendLabel textColor={textColor}>{formatTreemapValue(minVal)}</LegendLabel>\n <GradientBar style={{ background: gradientCss }} />\n <LegendLabel textColor={textColor}>{formatTreemapValue(maxVal)}</LegendLabel>\n </LegendContainer>\n );\n};\n\nconst DataColorsTreemapLegend = ({\n config,\n textColor,\n}: DataColorsTreemapLegendProps): React.ReactElement | null => {\n if (config.type === 'rangeValue' && config.ranges) {\n return <RangeValueLegend ranges={config.ranges} textColor={textColor} />;\n }\n if (config.type === 'matchValue' && config.matches) {\n return <MatchValueLegend matches={config.matches} textColor={textColor} />;\n }\n if (\n config.type === 'gradient' &&\n config.gradient &&\n config.minVal !== undefined &&\n config.maxVal !== undefined\n ) {\n return (\n <GradientLegend\n gradient={config.gradient}\n minVal={config.minVal}\n maxVal={config.maxVal}\n textColor={textColor}\n />\n );\n }\n return null;\n};\n\nexport default DataColorsTreemapLegend;\n", "import * as React from 'react';\nimport { useCallback, useId, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { pick } from 'lodash';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport SizeAwareWrapper from '@splunk/visualizations-shared/SizeAwareWrapper';\nimport { toDimension } from '@splunk/visualizations-shared/style';\nimport { VIZ_CATEGORICAL } from '@splunk/visualization-color-palettes';\nimport Message from '@splunk/visualizations-shared/Message';\nimport VizStyleWrapper from '../../../common/components/VizStyleWrapper';\nimport { buildTree } from '../utils/treemapDataUtils';\nimport { computeTreemapLayout, getCollapsedTreemapNode, TreemapRect } from '../utils/treemapLayout';\nimport { buildCategoryIndex, getSeriesColor, getTextColorForBackground } from '../utils/treemapColorUtils';\nimport TreemapNode from './TreemapNode';\nimport TreemapBreadcrumb from './TreemapBreadcrumb';\nimport TreemapTooltip from './TreemapTooltip';\nimport DataColorsTreemapLegend, { SeriesColorLegend, type SeriesColorLegendItem } from './TreemapLegend';\nimport { TreemapNodeData } from '../utils/treemapTypes';\nimport {\n buildTreemapDataColorMap,\n enrichTreemapDataColorConfig,\n getSortedPositiveTreemapChildren,\n getTreemapLegendHeight,\n getZoomPathForNode,\n hasParentValues,\n limitTreemapInputData,\n reconcileTreemapZoomPath,\n} from '../utils/treemapUtils';\nimport type { DataColorLegendConfig, TreemapDataColorValue } from '../utils/treemapUtils';\nimport type { TreemapAdditionalTooltipField, TreemapDataColumn } from '../utils/treemapTypes';\n\nexport const DEFAULT_CHART_WIDTH = 600;\nexport const DEFAULT_CHART_HEIGHT = 400;\nexport const CHART_MIN_WIDTH = 200;\nexport const CHART_MIN_HEIGHT = 150;\n\n/** Height reserved for the breadcrumb bar when zoomed in */\nconst BREADCRUMB_HEIGHT = 28;\n/** Height reserved for the legend bar */\nconst LEGEND_HEIGHT = 32;\n/** Horizontal padding between the SVG boundary and rendered treemap content */\nconst TREEMAP_SVG_HORIZONTAL_PADDING = 10;\n/** Bottom padding between the SVG boundary and rendered treemap content */\nconst TREEMAP_SVG_BOTTOM_PADDING = 10;\nconst EMPTY_METADATA: Record<string, unknown>[] = [];\n\nconst createRowPayload = (row: Record<string, unknown> = {}): Record<string, unknown> =>\n Object.fromEntries(Object.entries(row).map(([field, fieldValue]) => [`row.${field}.value`, fieldValue]));\n\nconst createNodeEventPayload = (\n node: TreemapNodeData,\n metadata: Record<string, unknown>[]\n): Record<string, unknown> => ({\n name: node.name,\n value: node.value,\n ...createRowPayload(node.rowIndex === undefined ? undefined : metadata[node.rowIndex]),\n});\n\nexport interface PureTreemapProps {\n parent?: TreemapDataColumn;\n nodeIds?: TreemapDataColumn;\n nodeLabels?: TreemapDataColumn;\n value?: TreemapDataColumn;\n width?: string | number;\n height?: string | number;\n backgroundColor?: string;\n seriesColors?: string[];\n dataColors?: string[];\n dataColorValues?: TreemapDataColorValue[];\n additionalTooltipFieldValues?: TreemapAdditionalTooltipField[];\n additionalTooltipFields?: string[];\n resultLimit?: number;\n showTooltip?: boolean;\n showChildValues?: boolean;\n showParentValues?: boolean;\n showSubdivisions?: boolean;\n sumFromLeafNodes?: boolean;\n legendDisplay?: 'bottom' | 'off';\n dataColorConfig?: DataColorLegendConfig;\n contentTextColor?: string;\n tooltipBodyColor?: string;\n tooltipTitleColor?: string;\n defaultNodeColor?: string;\n dataColorValuesUseValueField?: boolean;\n metadata?: Record<string, unknown>[];\n onEventTrigger?: (event: { type: string; payload: Record<string, unknown> }) => void;\n}\n\nconst TreemapContainer = styled.div<{\n width: number | string;\n height: number | string;\n}>`\n overflow: hidden;\n position: relative;\n ${props => toDimension(pick(props, ['width', 'height']))};\n`;\n\nconst LegendWrapper = styled.div`\n width: 100%;\n`;\n\nconst PureTreemap = ({\n width = DEFAULT_CHART_WIDTH,\n height = DEFAULT_CHART_HEIGHT,\n parent,\n nodeIds,\n nodeLabels,\n value,\n backgroundColor = '#0b0c0e',\n seriesColors = VIZ_CATEGORICAL,\n dataColors,\n dataColorValues,\n additionalTooltipFieldValues,\n additionalTooltipFields = [],\n resultLimit,\n showTooltip = false,\n showChildValues = true,\n showParentValues = true,\n showSubdivisions = false,\n sumFromLeafNodes = false,\n legendDisplay = 'off',\n dataColorConfig,\n tooltipBodyColor = 'rgba(255, 255, 255, 0.98)',\n tooltipTitleColor = 'rgba(255, 255, 255, 0.5)',\n defaultNodeColor = '#d9d9d9',\n dataColorValuesUseValueField = false,\n metadata = EMPTY_METADATA,\n onEventTrigger,\n}: PureTreemapProps) => {\n const treemapInstanceId = useId();\n const [containerWidth, setContainerWidth] = useState(Number(width));\n const [containerHeight, setContainerHeight] = useState(Number(height));\n const [hoveredNode, setHoveredNode] = useState<TreemapNodeData | null>(null);\n const [tooltipAnchor, setTooltipAnchor] = useState<SVGElement | null>(null);\n const [forceHoveredNodeTooltip, setForceHoveredNodeTooltip] = useState(false);\n const [legendHeight, setLegendHeight] = useState(LEGEND_HEIGHT);\n const containerRef = useRef<HTMLDivElement>(null);\n const legendRef = useRef<HTMLDivElement>(null);\n\n const handleResize = useCallback((w: number, h: number) => {\n setContainerWidth(w);\n setContainerHeight(h);\n }, []);\n\n const updateLegendHeight = useCallback(() => {\n const legendElement = legendRef.current;\n if (!legendElement) {\n return;\n }\n const nextLegendHeight = getTreemapLegendHeight(legendElement, LEGEND_HEIGHT);\n setLegendHeight(currentLegendHeight =>\n currentLegendHeight === nextLegendHeight ? currentLegendHeight : nextLegendHeight\n );\n }, []);\n\n const normalizedResultLimit = useMemo(() => {\n const numericResultLimit = Number(resultLimit);\n return Number.isFinite(numericResultLimit) && numericResultLimit >= 0\n ? Math.floor(numericResultLimit)\n : undefined;\n }, [resultLimit]);\n\n const limitedTreemapData = useMemo(\n () =>\n limitTreemapInputData(\n {\n parent,\n nodeIds,\n nodeLabels,\n value,\n dataColorValues,\n additionalTooltipFieldValues,\n },\n normalizedResultLimit\n ),\n [\n additionalTooltipFieldValues,\n dataColorValues,\n nodeIds,\n nodeLabels,\n normalizedResultLimit,\n parent,\n value,\n ]\n );\n\n // Build the hierarchy tree from resolved treemap data options\n const rootNode = useMemo(() => {\n if (!limitedTreemapData.nodeIds) {\n return null;\n }\n return buildTree(limitedTreemapData, { sumFromLeafNodes });\n }, [limitedTreemapData, sumFromLeafNodes]);\n\n const [zoomState, setZoomState] = useState<{\n rootNode: TreemapNodeData | null;\n path: TreemapNodeData[];\n }>({ rootNode, path: [] });\n const zoomPath = useMemo(\n () =>\n zoomState.rootNode === rootNode\n ? zoomState.path\n : reconcileTreemapZoomPath(zoomState.path, rootNode),\n [rootNode, zoomState]\n );\n const setZoomPath = useCallback(\n (update: React.SetStateAction<TreemapNodeData[]>) => {\n setZoomState(previousState => {\n const currentPath =\n previousState.rootNode === rootNode\n ? previousState.path\n : reconcileTreemapZoomPath(previousState.path, rootNode);\n return {\n rootNode,\n path: typeof update === 'function' ? update(currentPath) : update,\n };\n });\n },\n [rootNode]\n );\n\n useLayoutEffect(() => {\n if (zoomState.rootNode === rootNode) {\n return;\n }\n setZoomState({ rootNode, path: zoomPath });\n setHoveredNode(null);\n setTooltipAnchor(null);\n setForceHoveredNodeTooltip(false);\n }, [rootNode, zoomPath, zoomState.rootNode]);\n\n // Build a stable category-to-index map from root's children for series coloring\n const categoryIndex = useMemo(() => {\n if (!rootNode?.children) {\n return new Map<string, number>();\n }\n return buildCategoryIndex(rootNode.children);\n }, [rootNode]);\n\n const seriesLegendItems = useMemo((): SeriesColorLegendItem[] => {\n if (!rootNode?.children) {\n return [];\n }\n const seenLegendItems = new Set<string>();\n return rootNode.children.reduce<SeriesColorLegendItem[]>((items, child) => {\n const color = getSeriesColor(child, seriesColors, categoryIndex);\n const key = JSON.stringify([child.name, color]);\n if (seenLegendItems.has(key)) {\n return items;\n }\n seenLegendItems.add(key);\n items.push({\n id: child.id,\n label: child.name,\n color,\n });\n return items;\n }, []);\n }, [categoryIndex, rootNode, seriesColors]);\n\n const hasDynamicColoring = dataColors !== undefined || dataColorConfig !== undefined;\n const useComputedValuesForDataColors =\n sumFromLeafNodes &&\n dataColorValuesUseValueField &&\n (dataColorConfig?.type === 'rangeValue' || dataColorConfig?.type === 'gradient');\n\n // Build node-to-color map from resolved colors or numeric formatter config.\n const dataColorMap = useMemo((): Map<string, string> | undefined => {\n return buildTreemapDataColorMap(rootNode, dataColors, dataColorConfig, {\n dataColorValues: limitedTreemapData.dataColorValues,\n useComputedValuesForDataColors,\n });\n }, [\n dataColors,\n dataColorConfig,\n limitedTreemapData.dataColorValues,\n rootNode,\n useComputedValuesForDataColors,\n ]);\n\n const nodeColorMap = dataColorMap;\n const dynamicDefaultNodeColor = hasDynamicColoring ? defaultNodeColor : undefined;\n const resolvedShowSubdivisions = hasParentValues(parent) && showSubdivisions !== false;\n\n // Enrich gradient dataColorConfig with min/max from actual data\n const enrichedDataColorConfig = useMemo((): DataColorLegendConfig | undefined => {\n return enrichTreemapDataColorConfig(dataColorConfig, rootNode, {\n dataColorValues: limitedTreemapData.dataColorValues,\n useComputedValuesForDataColors,\n });\n }, [dataColorConfig, limitedTreemapData.dataColorValues, rootNode, useComputedValuesForDataColors]);\n\n useLayoutEffect(() => {\n if (legendDisplay !== 'bottom') {\n setLegendHeight(LEGEND_HEIGHT);\n return undefined;\n }\n\n updateLegendHeight();\n\n const legendElement = legendRef.current;\n if (!legendElement || typeof ResizeObserver === 'undefined') {\n return undefined;\n }\n\n const resizeObserver = new ResizeObserver(updateLegendHeight);\n resizeObserver.observe(legendElement);\n return () => resizeObserver.disconnect();\n }, [\n containerWidth,\n enrichedDataColorConfig,\n hasDynamicColoring,\n legendDisplay,\n seriesLegendItems,\n seriesColors,\n updateLegendHeight,\n ]);\n\n // Compute the layout for the current zoom level\n const currentNode = zoomPath.length > 0 ? zoomPath[zoomPath.length - 1] : rootNode;\n\n const bcOffset = zoomPath.length > 0 ? BREADCRUMB_HEIGHT : 0;\n const showLegend = legendDisplay === 'bottom';\n const legendOffset = showLegend ? legendHeight : 0;\n const shouldShowParentValues = resolvedShowSubdivisions && showParentValues;\n const breadcrumbTextColor = getTextColorForBackground(backgroundColor);\n const chartWidth = Math.max(0, containerWidth - TREEMAP_SVG_HORIZONTAL_PADDING * 2);\n\n const sortedChildren = useMemo(() => {\n return getSortedPositiveTreemapChildren(currentNode);\n }, [currentNode]);\n const centerStandaloneText =\n resolvedShowSubdivisions &&\n sortedChildren.length > 0 &&\n sortedChildren.every(child => !child.children?.length);\n\n const availableHeight = Math.max(0, containerHeight - bcOffset - legendOffset);\n const chartBottomPadding = showLegend ? 0 : TREEMAP_SVG_BOTTOM_PADDING;\n const chartHeight = Math.max(0, availableHeight - chartBottomPadding);\n const collapsedNodeResult = useMemo(() => {\n return getCollapsedTreemapNode(currentNode, chartWidth, chartHeight, sortedChildren);\n }, [currentNode, chartWidth, chartHeight, sortedChildren]);\n\n const layoutRects: TreemapRect[] = useMemo(() => {\n if (!collapsedNodeResult.node || chartWidth <= 0 || chartHeight <= 0) {\n return [];\n }\n return computeTreemapLayout(collapsedNodeResult.node, chartWidth, chartHeight, {\n showSubdivisions: resolvedShowSubdivisions,\n });\n }, [collapsedNodeResult.node, chartWidth, chartHeight, resolvedShowSubdivisions]);\n\n const handleNodeClick = useCallback(\n (node: TreemapNodeData) => {\n if (node.children && node.children.length > 0) {\n // Synthetic nodes are navigation-only and do not represent a\n // source row, so they should not emit a data click event.\n if (!node.isSynthetic) {\n onEventTrigger?.({\n type: 'parent.click',\n payload: createNodeEventPayload(node, metadata),\n });\n }\n // Zoom into parent node\n setHoveredNode(null);\n setTooltipAnchor(null);\n setForceHoveredNodeTooltip(false);\n setZoomPath(previousPath => {\n const naturalPath = getZoomPathForNode(node, rootNode);\n const currentZoomNode = previousPath.at(-1);\n if (!currentZoomNode) {\n return naturalPath;\n }\n\n const currentIndex = naturalPath.findIndex(\n pathNode => pathNode.id === currentZoomNode.id\n );\n if (currentIndex >= 0) {\n return [...previousPath, ...naturalPath.slice(currentIndex + 1)];\n }\n\n // Children grouped under Other retain their original parent\n // pointers. Append them to keep the synthetic drill level in\n // the breadcrumb even though it is not in the source tree.\n if (currentZoomNode.isSynthetic) {\n return [...previousPath, node];\n }\n\n return naturalPath;\n });\n } else if (!node.isSynthetic && onEventTrigger) {\n // Drilldown on leaf node\n onEventTrigger({\n type: 'node.click',\n payload: createNodeEventPayload(node, metadata),\n });\n }\n },\n [metadata, onEventTrigger, rootNode, setZoomPath]\n );\n\n const handleBreadcrumbClick = useCallback(\n (index: number) => {\n if (index < 0) {\n // Go back to root\n setZoomPath([]);\n } else {\n setZoomPath(prev => prev.slice(0, index + 1));\n }\n },\n [setZoomPath]\n );\n\n const handleNodeMouseEnter = useCallback(\n (node: TreemapNodeData, element: SVGElement, forceTooltip = false) => {\n setHoveredNode(node);\n setTooltipAnchor(element);\n setForceHoveredNodeTooltip(forceTooltip);\n },\n []\n );\n\n const handleNodeMouseLeave = useCallback(() => {\n setHoveredNode(null);\n setTooltipAnchor(null);\n setForceHoveredNodeTooltip(false);\n }, []);\n\n const shouldShowTooltip = Boolean(\n hoveredNode && tooltipAnchor && (showTooltip || forceHoveredNodeTooltip)\n );\n\n const renderLegend = (): React.ReactNode => {\n if (enrichedDataColorConfig) {\n return (\n <DataColorsTreemapLegend config={enrichedDataColorConfig} textColor={breadcrumbTextColor} />\n );\n }\n if (hasDynamicColoring) {\n return null;\n }\n if (seriesLegendItems.length > 0) {\n return <SeriesColorLegend items={seriesLegendItems} textColor={breadcrumbTextColor} />;\n }\n return null;\n };\n\n const renderMessage = (message: string, level: 'info' | 'error'): React.ReactElement => (\n <TreemapContainer height={height} width={width} ref={containerRef}>\n <SizeAwareWrapper width={width} height={height} onResize={handleResize} />\n <VizStyleWrapper backgroundColor={backgroundColor} dataTestKey=\"TreemapWrapper\">\n <Message width={containerWidth} height={containerHeight} message={message} level={level} />\n </VizStyleWrapper>\n </TreemapContainer>\n );\n\n if (!rootNode || !nodeIds) {\n return <Message width={width} height={height} message={_('Invalid data to render')} level=\"info\" />;\n }\n\n if (rootNode.validationError) {\n return renderMessage(_(rootNode.validationError), 'error');\n }\n\n if (containerWidth < CHART_MIN_WIDTH || containerHeight < CHART_MIN_HEIGHT) {\n return renderMessage(_('Too small to render content'), 'info');\n }\n\n if (collapsedNodeResult.tooManySameSizeNodes) {\n return renderMessage(_('Too many same size nodes'), 'error');\n }\n\n return (\n <TreemapContainer height={height} width={width} ref={containerRef}>\n <SizeAwareWrapper width={width} height={height} onResize={handleResize} />\n <VizStyleWrapper backgroundColor={backgroundColor} dataTestKey=\"TreemapWrapper\">\n {zoomPath.length > 0 && (\n <TreemapBreadcrumb\n path={zoomPath}\n onNavigate={handleBreadcrumbClick}\n textColor={breadcrumbTextColor}\n />\n )}\n <svg\n width={containerWidth}\n height={availableHeight}\n data-test=\"treemap-svg\"\n role=\"graphics-document\"\n aria-roledescription=\"treemap\"\n aria-label={_('Treemap visualization')}\n >\n <g data-test=\"treemap-chart\" transform={`translate(${TREEMAP_SVG_HORIZONTAL_PADDING} 0)`}>\n {layoutRects.map(rect => (\n <TreemapNode\n key={rect.node.id}\n treemapInstanceId={treemapInstanceId}\n rect={rect}\n seriesColors={seriesColors}\n categoryIndex={categoryIndex}\n backgroundColor={backgroundColor}\n nodeColorMap={nodeColorMap}\n defaultNodeColor={dynamicDefaultNodeColor}\n showChildValues={showChildValues}\n showParentValues={shouldShowParentValues}\n centerStandaloneText={centerStandaloneText}\n hoveredNodeId={hoveredNode?.id ?? null}\n onClick={handleNodeClick}\n onMouseEnter={handleNodeMouseEnter}\n onMouseLeave={handleNodeMouseLeave}\n />\n ))}\n </g>\n </svg>\n {shouldShowTooltip && hoveredNode && tooltipAnchor && (\n <TreemapTooltip\n node={hoveredNode}\n anchor={tooltipAnchor}\n additionalFields={additionalTooltipFields}\n textColor={tooltipBodyColor}\n headerColor={tooltipTitleColor}\n seriesColors={seriesColors}\n categoryIndex={categoryIndex}\n nodeColorMap={nodeColorMap}\n defaultNodeColor={dynamicDefaultNodeColor}\n containerWidth={containerWidth}\n />\n )}\n {legendDisplay === 'bottom' && (\n <LegendWrapper ref={legendRef} data-test=\"treemap-legend-wrapper\">\n {renderLegend()}\n </LegendWrapper>\n )}\n </VizStyleWrapper>\n </TreemapContainer>\n );\n};\n\nexport default PureTreemap;\n", "import type { DataColorLegendConfig } from './treemapUtils';\n\nconst GRADIENT_PATTERN = /gradient\\((\\w+)\\)/;\nconst RANGE_VALUE_PATTERN = /rangeValue\\((\\w+)\\)/;\nconst MATCH_VALUE_PATTERN = /matchValue\\((\\w+)\\)/;\n\nconst getDslConfigKey = (dsl: string, pattern: RegExp): string | undefined => pattern.exec(dsl)?.[1];\n\nconst buildGradientConfig = (\n dsl: string,\n context: Record<string, unknown>\n): DataColorLegendConfig | undefined => {\n const key = getDslConfigKey(dsl, GRADIENT_PATTERN);\n const cfg = key ? (context[key] as { colors?: string[]; stops?: number[] }) : undefined;\n return cfg?.colors\n ? { type: 'gradient', gradient: { colors: cfg.colors, ...(cfg.stops ? { stops: cfg.stops } : {}) } }\n : undefined;\n};\n\nconst buildRangeValueConfig = (\n dsl: string,\n context: Record<string, unknown>\n): DataColorLegendConfig | undefined => {\n const key = getDslConfigKey(dsl, RANGE_VALUE_PATTERN);\n const ranges = key ? (context[key] as { from?: number; to?: number; value: string }[]) : undefined;\n return Array.isArray(ranges) ? { type: 'rangeValue', ranges } : undefined;\n};\n\nconst buildMatchValueConfig = (\n dsl: string,\n context: Record<string, unknown>\n): DataColorLegendConfig | undefined => {\n const key = getDslConfigKey(dsl, MATCH_VALUE_PATTERN);\n const matches = key ? (context[key] as { match: string; value: string }[]) : undefined;\n return Array.isArray(matches) ? { type: 'matchValue', matches } : undefined;\n};\n\n/** Build data color config from the original DSL string and context. */\nconst buildDataColorConfig = (\n options: Record<string, unknown>,\n context: Record<string, unknown>\n): DataColorLegendConfig | undefined => {\n const dsl = options?.dataColors;\n if (typeof dsl !== 'string' || !dsl) {\n return undefined;\n }\n return (\n buildGradientConfig(dsl, context) ||\n buildRangeValueConfig(dsl, context) ||\n buildMatchValueConfig(dsl, context)\n );\n};\n\nexport default buildDataColorConfig;\n", "\nimport * as defaultImport from \"@splunk/visualization-color-palettes/editors/PresetPalettes\";\nexport * from \"@splunk/visualization-color-palettes/editors/PresetPalettes\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Treemap\";\nexport * from \"@splunk/react-icons/Treemap\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-icons/placeholders\";\nexport * from \"@splunk/visualization-icons/placeholders\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/configUtils\";\nexport * from \"@splunk/visualizations-shared/configUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import { get, range } from 'lodash';\nimport { isDynamicOption } from '@splunk/visualizations-shared/configUtils';\nimport { VizConfig } from '../interfaces/VizConfig';\nimport { EditorLayoutConfig, EditorConfig } from '../interfaces/Editor';\n\n// included for backwards compatibility\nexport { enhanceOptionsSchemaWithDynamicOptions } from '@splunk/visualization-schemas';\n\nexport interface PresetEntry {\n name: string;\n value: any;\n label: string;\n}\n\n/**\n * Helper function to enhance a Visualization Config as needed based on behaviors specified in supports block\n * this function also collapse all editor panels\n * @param vizConfig a Visualization Config\n * @returns an enhanced Visualization Config containing updated config entries based on behaviors it supports\n * and containing `open: false` for all editor panels in editorConfig\n */\nfunction enhanceConfig(vizConfig: VizConfig): VizConfig {\n const enhancedConfig: VizConfig = { ...vizConfig };\n\n enhancedConfig.editorConfig = vizConfig.editorConfig.map((config: EditorConfig): EditorConfig => {\n return { ...config, open: config.open || false };\n });\n return enhancedConfig;\n}\n\n/**\n * Helper function to uncollapse all editor panels by adding `open: true` to the editorConfig\n * Created for editor unit tests\n * @param vizConfig a Visualization Config\n * @returns a Visualization Config containing `open: true` for all editor panels in editorConfig\n */\nfunction uncollapseEditorConfig(vizConfig: VizConfig): VizConfig {\n const editorPanelUncollapsedConfig: VizConfig = { ...vizConfig };\n editorPanelUncollapsedConfig.editorConfig = vizConfig.editorConfig.map(\n (config: EditorConfig): EditorConfig => {\n return { ...config, open: true };\n }\n );\n return editorPanelUncollapsedConfig;\n}\n\n// private helpers to improve readability of getInitialPreset\n// this shouldn't be tested since this util isn't something that we expect to use outside of getInitialPreset\n\n/**\n * this checks to make sure that all values within vizContext are compatible with the given preset's context to determine the initialPreset\n * if a preset has explicitly specified a key as being undefined, the vizContext must also has that key as undefined, or else this CANNOT be the initialPreset\n * the inverse is true; if a preset has key is NOT undefined, it must also be NOT undefined in the corresponding vizContext\n * the internal config contents are irrelevant (as the user could customize them in source), just as long as the presence of `undefined`s match up\n *\n * Since the presetConfigs have explicit undefined keys to override the existing config, we need to explicitly check the undefined values\n */\nfunction hasCompatibleContexts(\n vizContext: { [configKey: string]: any },\n presetContext: { [configKey: string]: any }\n): boolean {\n const presetContextKeys = Object.keys(presetContext);\n return presetContextKeys.every(\n (contextKey): boolean =>\n (presetContext[contextKey] === undefined && vizContext[contextKey] === undefined) ||\n (presetContext[contextKey] !== undefined && vizContext[contextKey] !== undefined)\n );\n}\n\n/**\n * Checks to make sure that dynamic (non-dynamic) options in a given preset are also dynamic (non-dynamic) in the vizOptions\n */\nfunction hasCompatibleOptions(\n vizOptions: { [configKey: string]: any },\n presetOptions: { [configKey: string]: any }\n): boolean {\n const presetOptionKeys = Object.keys(presetOptions);\n return presetOptionKeys.every(\n (optionKey): boolean =>\n isDynamicOption(presetOptions[optionKey]) === isDynamicOption(vizOptions[optionKey])\n );\n}\n\n/**\n * Evaluates whether there is an initialPreset that fits the current state of vizContext + vizOptions\n * This function ignores extraneous vizOptions or vizContext keys, as they could be outside the scope of what the preset is intended to configure\n *\n * @param {Object} vizContext - the current vizContext definition\n * @param {Object} vizOptions - the current vizOptions definition\n * @param {PresetEntry[]} presets - the list of presets, one of which can be considered an initialPreset\n */\nfunction getInitialPreset(\n vizContext: { [configKey: string]: any },\n vizOptions: { [configKey: string]: any },\n presets: PresetEntry[]\n): PresetEntry | null {\n return presets.find((preset): boolean => {\n const presetContext = get(preset, ['value', 'context'], {});\n const presetOptions = get(preset, ['value', 'options'], {});\n const presetContextKeys = Object.keys(presetContext);\n const presetOptionKeys = Object.keys(presetOptions);\n\n // all presets have to explicitly specify which options to reset (i.e. need explicitly undefined keys)\n // if not, then the preset is invalid in config.ts\n if (presetContextKeys.length === 0 || presetOptionKeys.length === 0) return false;\n\n return (\n hasCompatibleContexts(vizContext, presetContext) &&\n hasCompatibleOptions(vizOptions, presetOptions)\n );\n });\n}\n\ninterface PrecisionOption {\n label: string;\n value: number;\n}\n\n/**\n * generates number precision values for a Select editor\n *\n * @param {Number} numPrecisionValues - number of integer precision values to generate\n * @returns {{ label: string; value; string }[]} array of { label, value } tuples\n */\nfunction generatePrecisionValues(numPrecisionValues: number): PrecisionOption[] {\n return range(0, numPrecisionValues + 1).map(\n (i): PrecisionOption => ({\n label: `${i} (0${i > 0 ? '.' : ''}${'0'.repeat(i)})`, // e.g. 0.000 for numPrecisionValues = 3\n value: i,\n })\n );\n}\n\nexport { enhanceConfig, getInitialPreset, generatePrecisionValues, uncollapseEditorConfig, isDynamicOption };\n\n/**\n * insert layout in layout array, return a new layout array instead of updating the original\n *\n * @param {EditorLayoutConfig[][]} layout - editor layout\n * @param {Number} index - the index to insert layout item(s)\n * @param {EditorLayoutConfig[][]} layoutItems - the item(s) to insert\n * @returns {EditorLayoutConfig[][]} new editor layout with insertion\n */\nexport const insertLayout = (\n layout: EditorLayoutConfig[][],\n index: number,\n ...layoutItems: EditorLayoutConfig[][]\n): EditorLayoutConfig[][] => [\n // copy part of the array before the specified index\n ...layout.slice(0, index),\n // inserted layout item\n ...layoutItems,\n // copy part of the array after the specified index\n ...layout.slice(index),\n];\n", "import { _ } from '@splunk/ui-utils/i18n';\nimport { EditorLayoutConfig } from '../interfaces/Editor';\nimport { ThemedDefaults } from '../interfaces/ThemedDefaults';\n\ninterface BackgroundEditorProps {\n label?: string;\n themes: ThemedDefaults;\n labelPosition?: string;\n}\n\nconst background: ({ label, themes, labelPosition }: BackgroundEditorProps) => EditorLayoutConfig[] = ({\n label,\n themes,\n labelPosition,\n}) => [\n {\n label: _(label || 'Background color'),\n option: 'backgroundColor',\n editor: 'editor.color',\n editorProps: {\n labelPosition: labelPosition || 'top',\n themes,\n },\n },\n];\n\nexport default background;\n", "\nimport * as defaultImport from \"@splunk/themes/pick\";\nexport * from \"@splunk/themes/pick\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import pick from '@splunk/themes/pick';\nimport variables from '@splunk/themes/variables';\n\nexport const defaultBackgroundColor = props =>\n pick({\n enterprise: {\n dark: variables.black(props),\n light: variables.white(props),\n },\n prisma: variables.backgroundColorSection(props),\n })(props);\n", "import { treemapOptionsSchema as optionsSchema } from '@splunk/visualization-schemas';\nimport { defaultPalettesConfig } from '@splunk/visualization-color-palettes/editors/PresetPalettes';\nimport { pick, variables } from '@splunk/themes';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport TreemapIcon from '@splunk/react-icons/Treemap';\nimport { Treemap as TreemapPlaceholderIcon } from '@splunk/visualization-icons/placeholders';\nimport { DataContract } from '../common/interfaces/DataContract';\nimport { DefaultContext } from '../common/interfaces/DefaultContext';\nimport { EditorConfig } from '../common/interfaces/Editor';\nimport { ThemedDefaults } from '../common/interfaces/ThemedDefaults';\nimport { VizBehavior } from '../common/interfaces/VizBehavior';\nimport { VizCategory } from '../common/interfaces/VizCategory';\nimport { VizConfig } from '../common/interfaces/VizConfig';\nimport { VizSize } from '../common/interfaces/VizSize';\nimport { enhanceConfig } from '../common/utils/configUtils';\nimport getBackgroundColorEditor from '../common/editorConfig/BackgroundColor';\nimport { defaultBackgroundColor } from '../common/ThemedDefaults';\n\nconst dataContract: DataContract = {\n requiredDataSources: [\n {\n name: 'primary',\n description: 'DataSource that powers the visualization',\n },\n ],\n optionalDataSources: [],\n initialRequestParams: {\n primary: { offset: 0, count: 10000 },\n },\n};\n\nconst size: VizSize = {\n initialWidth: 600,\n initialHeight: 400,\n};\n\nconst defaultContext: DefaultContext = {\n colorRangeConfig: [\n { to: 20, value: '#D41F1F' },\n { from: 20, to: 40, value: '#D94E17' },\n { from: 40, to: 60, value: '#CBA700' },\n { from: 60, to: 80, value: '#669922' },\n { from: 80, value: '#118832' },\n ],\n colorMatchConfig: [{ match: '', value: '#5C33FF' }],\n colorGradientConfig: { colors: ['#252214', '#B846BB'] },\n};\n\nconst themes: ThemedDefaults = {\n defaultBackgroundColor,\n contentTextColor: props =>\n pick({\n enterprise: variables.contentColorActive(props),\n prisma: variables.contentColorActive(props),\n })(props),\n tooltipBodyColor: props =>\n pick({\n enterprise: {\n dark: variables.textColor(props),\n light: variables.textColor(props),\n },\n prisma: variables.contentColorActive(props),\n })(props),\n tooltipTitleColor: props =>\n pick({\n enterprise: {\n dark: variables.textGray(props),\n light: variables.textGray(props),\n },\n prisma: variables.contentColorMuted(props),\n })(props),\n defaultNodeColor: props => variables.neutral100(props),\n};\n\nconst primaryColumnSelectorProps = {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n shouldShowInternalFields: false,\n};\n\nconst hasDefinedValue = (value: unknown): boolean => {\n if (value === null || value === undefined) {\n return false;\n }\n\n return typeof value === 'string' ? value.trim() !== '' : true;\n};\n\nconst hasParentOption = (parent: unknown): boolean =>\n Array.isArray(parent) ? parent.some(hasDefinedValue) : hasDefinedValue(parent);\n\nconst editorConfig: EditorConfig[] = [\n {\n label: _('Data configurations'),\n layout: [\n [\n {\n label: _('Value'),\n option: 'value',\n editor: 'editor.columnSelector',\n editorProps: {\n ...primaryColumnSelectorProps,\n filterByTypes: ['number'],\n },\n },\n ],\n [\n {\n label: _('Node ID'),\n option: 'nodeIds',\n editor: 'editor.columnSelector',\n editorProps: {\n ...primaryColumnSelectorProps,\n filterByTypes: ['string'],\n },\n },\n ],\n [\n {\n label: _('Label'),\n option: 'nodeLabels',\n editor: 'editor.columnSelector',\n editorProps: {\n ...primaryColumnSelectorProps,\n filterByTypes: ['string'],\n },\n },\n ],\n [\n {\n label: _('Parent ID'),\n option: 'parent',\n editor: 'editor.columnSelector',\n editorProps: {\n ...primaryColumnSelectorProps,\n filterByTypes: ['string'],\n },\n },\n ],\n [\n {\n label: _('Additional tooltip field(s)'),\n option: 'additionalTooltipFields',\n editor: 'editor.columnMultiSelectionByFieldNameEditor',\n },\n ],\n [\n {\n label: _('Result limit'),\n option: 'resultLimit',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 1,\n },\n },\n ],\n [\n {\n label: _('Sum from leaf nodes'),\n option: 'sumFromLeafNodes',\n editor: 'editor.toggle',\n },\n ],\n ],\n },\n {\n label: _('Data display'),\n layout: [\n [\n {\n label: _('Show values'),\n option: 'showChildValues',\n editor: 'editor.checkbox',\n },\n ],\n [\n {\n label: _('Show subdivisions'),\n option: 'showSubdivisions',\n editor: 'editor.toggle',\n showEditor: ({ options }) => hasParentOption(options.parent),\n },\n ],\n [\n {\n label: _('Show parent values'),\n option: 'showParentValues',\n editor: 'editor.checkbox',\n showEditor: ({ options }) =>\n hasParentOption(options.parent) && options.showSubdivisions !== false,\n },\n ],\n [\n {\n label: _('Show tooltip'),\n option: 'showTooltip',\n editor: 'editor.toggle',\n },\n ],\n [\n {\n label: _('Legend display'),\n option: 'legendDisplay',\n editor: 'editor.select',\n editorProps: {\n values: [\n { label: _('Off'), value: 'off' },\n { label: _('Bottom'), value: 'bottom' },\n ],\n },\n },\n ],\n ],\n },\n {\n label: _('Color and style'),\n layout: [\n [\n {\n label: _('Data colors'),\n option: 'dataColors',\n filterKeywords: ['range', 'match', 'gradient', 'dynamic coloring'],\n context: {\n colorRangeConfig: 'colorRangeConfig',\n colorMatchConfig: 'colorMatchConfig',\n colorGradientConfig: 'colorGradientConfig',\n },\n editor: 'editor.dynamicColorWithPrecedence',\n editorProps: {\n labelPosition: 'top',\n flyoutTitle: _('Dynamic coloring: value'),\n formatters: [\n {\n label: _('Gradient'),\n value: 'gradient',\n defaults: {\n dataColorValues: defaultContext.colorGradientConfig,\n },\n },\n {\n label: _('Ranges'),\n value: 'rangeValue',\n isDefault: true,\n defaults: {\n dataColorValues: defaultContext.colorRangeConfig,\n },\n },\n {\n label: _('Matches'),\n value: 'matchValue',\n defaults: {\n dataColorValues: defaultContext.colorMatchConfig,\n },\n },\n ],\n dataSelectors: [\n {\n label: _('Data values'),\n value: 'dataColorValues',\n },\n ],\n defaultPalettesConfig,\n },\n },\n ],\n [\n {\n label: _('Data values'),\n editor: 'editor.columnSelector',\n option: 'dataColorValues',\n showEditor: ({ options }) => options.dataColors,\n editorProps: {\n ...primaryColumnSelectorProps,\n filterByTypes: ['number', 'string'],\n },\n },\n ],\n [\n {\n label: _('Series colors'),\n option: 'seriesColors',\n editor: 'editor.seriesColors',\n showEditor: ({ options }) => !options.dataColors,\n },\n ],\n getBackgroundColorEditor({ themes }),\n ],\n },\n];\n\nconst config: VizConfig = {\n key: 'splunk.treemap',\n name: _('Treemap'),\n category: VizCategory.COMPARISONS,\n status: 'preview',\n icon: TreemapIcon,\n placeholderIcon: TreemapPlaceholderIcon,\n dataContract,\n size,\n defaultContext,\n optionsSchema,\n editorConfig,\n events: {\n 'node.click': {\n description: 'Triggered when user clicks on a leaf node',\n },\n 'parent.click': {\n description: 'Triggered when user clicks on a parent node',\n },\n },\n supports: [VizBehavior.DYNAMIC_OPTIONS, VizBehavior.EVENTS, VizBehavior.PLACEHOLDER],\n themes,\n requiredProps: [],\n};\n\nexport default enhanceConfig(config);\n", "import { getDataSourceStateInfo } from '@splunk/visualizations-shared/dataSourceUtils';\nimport withDashboardViz, { DashboardVizOpts } from '../common/withDashboardViz';\nimport PureTreemap from './PureTreemap/components/PureTreemap';\nimport buildDataColorConfig from './PureTreemap/utils/treemapDataColorUtils';\nimport {\n areDataColorValuesUsingValueField,\n getFieldNames,\n getTreemapThemeColors,\n normalizeTreemapOptions,\n resolveAdditionalTooltipFieldValues,\n} from './PureTreemap/utils/treemapUtils';\nimport config from './config';\nimport { DataSource } from '../common/interfaces/DataSource';\nimport { convertToArrOfObjects } from '../common/utils/dataUtils';\n\nexport const showPlaceHolderIcon = (dataSources: { [name: string]: DataSource }): boolean => {\n const columns = dataSources?.primary?.data?.columns;\n const noColumns = !(Array.isArray(columns) && columns.length);\n const dataSourceState = getDataSourceStateInfo(dataSources?.primary);\n return dataSourceState.hasError || dataSourceState.isLoading || dataSourceState.isMissing || noColumns;\n};\n\nexport const computeVizProps = ({\n themeFunc,\n dataSources,\n onEventTrigger,\n context,\n options: rawOptions = {},\n ...resolvedOptions\n}: Record<string, unknown>): Record<string, unknown> => {\n const { value, dataColorValues } = resolvedOptions;\n const rawTreemapOptions = rawOptions as Record<string, unknown>;\n const normalizedOptions = normalizeTreemapOptions(resolvedOptions);\n const primaryData = (dataSources as { [name: string]: DataSource })?.primary?.data;\n const columns = primaryData?.columns;\n const fields = primaryData?.fields;\n const fieldNames = getFieldNames(fields);\n\n // When dataColorValues resolves from value, PureTreemap can reuse computed rollups for coloring.\n const dataColorConfig = buildDataColorConfig(rawTreemapOptions, context as Record<string, unknown>);\n const dataColorValuesUseValueField = areDataColorValuesUsingValueField({\n options: rawTreemapOptions,\n optionDefaults: config.optionsSchema,\n value,\n dataColorValues,\n });\n\n return {\n ...normalizedOptions,\n ...getTreemapThemeColors(themeFunc),\n dataColorConfig,\n dataColorValuesUseValueField,\n additionalTooltipFieldValues: resolveAdditionalTooltipFieldValues({\n columns,\n fieldNames,\n additionalTooltipFields: normalizedOptions.additionalTooltipFields,\n }),\n metadata: convertToArrOfObjects(columns, fields),\n onEventTrigger,\n };\n};\n\nconst Treemap = withDashboardViz({\n ReactViz: PureTreemap,\n vizConfig: config,\n computeVizProps,\n useIconPlaceholder: (dataSources: { [name: string]: DataSource }) => showPlaceHolderIcon(dataSources),\n} as DashboardVizOpts);\n\nconst { themes } = config;\nexport default Treemap;\nexport { themes, config, PureTreemap };\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Treemap_exports", "Treemap_default", "themes", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "config", "themes", "defaultImport", "Opts", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "getFieldName", "_a", "defaultImport", "getFieldName", "config", "range", "Opts", "computeVizProps", "_a", "defaultImport", "defaultImport", "d3Hierarchy", "_a", "d3Treemap", "defaultImport", "getFieldName", "getFieldNames", "range", "_", "size", "handleClick", "handleClick", "handleClick", "handleClick", "defaultImport", "config", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "config", "themes", "defaultImport", "TreemapPlaceholderIcon", "optionsSchema", "_a", "getFieldNames", "themes", "Treemap_default"]
|
|
7
|
+
}
|