@milaboratories/miplots4 1.2.1 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/DataFrame.d.ts.map +1 -1
  2. package/dist/DataFrame.js +2 -1
  3. package/dist/DataFrame.js.map +1 -1
  4. package/dist/common/ContinuousGrid.d.ts.map +1 -1
  5. package/dist/common/ContinuousGrid.js +90 -56
  6. package/dist/common/ContinuousGrid.js.map +1 -1
  7. package/dist/histogram/ChartRenderer.d.ts.map +1 -1
  8. package/dist/histogram/ChartRenderer.js +6 -0
  9. package/dist/histogram/ChartRenderer.js.map +1 -1
  10. package/dist/histogram/HistogramSettingsImpl.d.ts +5 -1
  11. package/dist/histogram/HistogramSettingsImpl.d.ts.map +1 -1
  12. package/dist/histogram/HistogramSettingsImpl.js.map +1 -1
  13. package/dist/scatterplot/components/Grid.d.ts.map +1 -1
  14. package/dist/scatterplot/components/Grid.js +109 -71
  15. package/dist/scatterplot/components/Grid.js.map +1 -1
  16. package/dist/selection/ChartRenderer.d.ts.map +1 -1
  17. package/dist/selection/ChartRenderer.js +9 -11
  18. package/dist/selection/ChartRenderer.js.map +1 -1
  19. package/dist/selection/SelectionSettingsImpl.d.ts +0 -1
  20. package/dist/selection/SelectionSettingsImpl.d.ts.map +1 -1
  21. package/dist/selection/SelectionSettingsImpl.js +0 -1
  22. package/dist/selection/SelectionSettingsImpl.js.map +1 -1
  23. package/dist/selection/components/Chart/Bars/GroupSelectedBars.js +1 -1
  24. package/dist/selection/components/Chart/Bars/GroupSelectedBars.js.map +1 -1
  25. package/dist/selection/components/Chart/Bars/StackedBars.d.ts.map +1 -1
  26. package/dist/selection/components/Chart/Bars/StackedBars.js +11 -11
  27. package/dist/selection/components/Chart/Bars/StackedBars.js.map +1 -1
  28. package/dist/selection/components/Chart/ChartAxes.d.ts.map +1 -1
  29. package/dist/selection/components/Chart/ChartAxes.js +7 -8
  30. package/dist/selection/components/Chart/ChartAxes.js.map +1 -1
  31. package/dist/selection/components/Chart/ChartFrame.d.ts +1 -2
  32. package/dist/selection/components/Chart/ChartFrame.d.ts.map +1 -1
  33. package/dist/selection/components/Chart/ChartFrame.js +8 -8
  34. package/dist/selection/components/Chart/ChartFrame.js.map +1 -1
  35. package/dist/selection/components/Chart/Gridlines.d.ts +2 -6
  36. package/dist/selection/components/Chart/Gridlines.d.ts.map +1 -1
  37. package/dist/selection/components/Chart/Gridlines.js +14 -26
  38. package/dist/selection/components/Chart/Gridlines.js.map +1 -1
  39. package/dist/selection/components/Chart/Ribbons/GroupFlowRibbon.js +1 -1
  40. package/dist/selection/components/Chart/Ribbons/GroupFlowRibbon.js.map +1 -1
  41. package/dist/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.d.ts.map +1 -1
  42. package/dist/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.js +27 -27
  43. package/dist/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.js.map +1 -1
  44. package/dist/selection/components/Chart/SelectionXAxis.d.ts +18 -0
  45. package/dist/selection/components/Chart/SelectionXAxis.d.ts.map +1 -0
  46. package/dist/selection/components/Chart/SelectionXAxis.js +47 -0
  47. package/dist/selection/components/Chart/SelectionXAxis.js.map +1 -0
  48. package/dist/selection/components/Chart/types.d.ts +0 -1
  49. package/dist/selection/components/Chart/types.d.ts.map +1 -1
  50. package/dist/selection/components/Chart.d.ts.map +1 -1
  51. package/dist/selection/components/Chart.js +7 -12
  52. package/dist/selection/components/Chart.js.map +1 -1
  53. package/dist/selection/components/ChartsGroup.d.ts.map +1 -1
  54. package/dist/selection/components/ChartsGroup.js +73 -72
  55. package/dist/selection/components/ChartsGroup.js.map +1 -1
  56. package/dist/selection/components/types.d.ts +0 -1
  57. package/dist/selection/components/types.d.ts.map +1 -1
  58. package/dist/selection/constants.d.ts +1 -2
  59. package/dist/selection/constants.d.ts.map +1 -1
  60. package/dist/selection/constants.js +2 -2
  61. package/dist/selection/constants.js.map +1 -1
  62. package/dist/selection/createSelectionData.d.ts +2 -6
  63. package/dist/selection/createSelectionData.d.ts.map +1 -1
  64. package/dist/selection/createSelectionData.js +45 -59
  65. package/dist/selection/createSelectionData.js.map +1 -1
  66. package/dist/types/bubble.d.ts +8 -8
  67. package/dist/types/common.d.ts +62 -6
  68. package/dist/types/common.d.ts.map +1 -1
  69. package/dist/types/common.js +15 -6
  70. package/dist/types/common.js.map +1 -1
  71. package/dist/types/dendro.d.ts +6 -6
  72. package/dist/types/discrete.d.ts +41 -13
  73. package/dist/types/discrete.d.ts.map +1 -1
  74. package/dist/types/heatmap.d.ts +4 -4
  75. package/dist/types/histogram.d.ts +59 -10
  76. package/dist/types/histogram.d.ts.map +1 -1
  77. package/dist/types/histogram.js +60 -66
  78. package/dist/types/histogram.js.map +1 -1
  79. package/dist/types/scatterplot-umap.d.ts +74 -18
  80. package/dist/types/scatterplot-umap.d.ts.map +1 -1
  81. package/dist/types/scatterplot.d.ts +74 -18
  82. package/dist/types/scatterplot.d.ts.map +1 -1
  83. package/dist/types/selection.d.ts +8 -13
  84. package/dist/types/selection.d.ts.map +1 -1
  85. package/dist/types/selection.js +0 -1
  86. package/dist/types/selection.js.map +1 -1
  87. package/dist/utils/getChartEdgeSides.d.ts +1 -1
  88. package/dist/utils/significantLinesStyle.d.ts +8 -0
  89. package/dist/utils/significantLinesStyle.d.ts.map +1 -0
  90. package/dist/utils/significantLinesStyle.js +12 -0
  91. package/dist/utils/significantLinesStyle.js.map +1 -0
  92. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ChartAxes.d.ts","sourceRoot":"","sources":["../../../../src/selection/components/Chart/ChartAxes.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAKlE,eAAO,MAAM,SAAS;YAKZ,UAAU;WACX,UAAU;WACV,UAAU;EAkEjB,CAAC"}
1
+ {"version":3,"file":"ChartAxes.d.ts","sourceRoot":"","sources":["../../../../src/selection/components/Chart/ChartAxes.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAKlE,eAAO,MAAM,SAAS;YAKZ,UAAU;WACX,UAAU;WACV,UAAU;EAiEjB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import "../../../constants.js";
2
- import { BandAxis as e } from "../../../common/BandAxis.js";
3
- import { ContinuousAxis as t } from "../../../common/ContinuousAxis.js";
4
- import { formatPercent as n } from "../../utils.js";
2
+ import { ContinuousAxis as e } from "../../../common/ContinuousAxis.js";
3
+ import { formatPercent as t } from "../../utils.js";
4
+ import { SelectionXAxis as n } from "./SelectionXAxis.js";
5
5
  import { memo as r } from "react";
6
6
  import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
7
7
  const s = r(function({ layout: r, xAxis: s, yAxis: c }) {
@@ -9,20 +9,19 @@ const s = r(function({ layout: r, xAxis: s, yAxis: c }) {
9
9
  return /* @__PURE__ */ o(i, { children: [
10
10
  h && /* @__PURE__ */ a("g", {
11
11
  transform: `translate(0,${f})`,
12
- children: /* @__PURE__ */ a(e, {
12
+ children: /* @__PURE__ */ a(n, {
13
13
  scale: l,
14
- orient: "bottom",
15
14
  labels: s.labels,
16
15
  labelsPosition: _,
17
- tickSize: v ? 4 : 0,
16
+ showTicks: v,
18
17
  hiddenLabels: y
19
18
  })
20
19
  }),
21
- g && /* @__PURE__ */ a(t, {
20
+ g && /* @__PURE__ */ a(e, {
22
21
  scale: u,
23
22
  orient: "left",
24
23
  tickSize: x ? 4 : 0,
25
- tickFormat: n,
24
+ tickFormat: t,
26
25
  hiddenLabels: S
27
26
  }),
28
27
  b && /* @__PURE__ */ a("text", {
@@ -1 +1 @@
1
- {"version":3,"file":"ChartAxes.js","names":[],"sources":["../../../../src/selection/components/Chart/ChartAxes.tsx"],"sourcesContent":["import { memo } from 'react';\n\nimport { BandAxis } from '../../../common/BandAxis';\nimport { ContinuousAxis } from '../../../common/ContinuousAxis';\nimport { BLACK } from '../../../constants';\nimport { formatPercent } from '../../utils';\nimport type { CellLayout, ChartXAxis, ChartYAxis } from './types';\n\n// X (band) axis at the bottom + Y (continuous, percent) axis on the left.\n// Each is gated by show flag; titles render as separate <text> nodes outside\n// the axis components for layout independence.\nexport const ChartAxes = memo(function ChartAxes({\n layout,\n xAxis,\n yAxis,\n}: {\n layout: CellLayout;\n xAxis: ChartXAxis;\n yAxis: ChartYAxis;\n}) {\n const { xScale, yScale, width, height, paddingLeft, paddingBottom, showXAxis, showYAxis } =\n layout;\n const {\n labelsPosition: xLabelsPosition = 'center',\n showTicks: xShowTicks = true,\n hiddenLabels: xHiddenLabels = false,\n title: xAxisTitle = '',\n } = xAxis;\n const {\n showTicks: yShowTicks = true,\n hiddenLabels: yHiddenLabels = false,\n title: yAxisTitle = '',\n } = yAxis;\n\n return (\n <>\n {showXAxis && (\n <g transform={`translate(0,${height})`}>\n <BandAxis\n scale={xScale}\n orient=\"bottom\"\n labels={xAxis.labels}\n labelsPosition={xLabelsPosition}\n tickSize={xShowTicks ? 4 : 0}\n hiddenLabels={xHiddenLabels}\n />\n </g>\n )}\n {showYAxis && (\n <ContinuousAxis\n scale={yScale}\n orient=\"left\"\n tickSize={yShowTicks ? 4 : 0}\n tickFormat={formatPercent}\n hiddenLabels={yHiddenLabels}\n />\n )}\n {xAxisTitle && (\n <text\n x={width / 2}\n y={height + paddingBottom - 6}\n textAnchor=\"middle\"\n fontSize=\"14px\"\n fontWeight=\"500\"\n fontFamily=\"Manrope\"\n fill={BLACK}\n >\n {xAxisTitle}\n </text>\n )}\n {yAxisTitle && (\n <text\n transform={`translate(${-paddingLeft + 14},${height / 2}) rotate(-90)`}\n textAnchor=\"middle\"\n fontSize=\"14px\"\n fontWeight=\"500\"\n fontFamily=\"Manrope\"\n fill={BLACK}\n >\n {yAxisTitle}\n </text>\n )}\n </>\n );\n});\n"],"mappings":";;;;;;AAWA,MAAa,IAAY,EAAK,SAAmB,EAC/C,WACA,UACA,YAKC;CACD,IAAM,EAAE,WAAQ,WAAQ,UAAO,WAAQ,gBAAa,kBAAe,cAAW,iBAC5E,GACI,EACJ,gBAAgB,IAAkB,UAClC,WAAW,IAAa,IACxB,cAAc,IAAgB,IAC9B,OAAO,IAAa,OAClB,GACE,EACJ,WAAW,IAAa,IACxB,cAAc,IAAgB,IAC9B,OAAO,IAAa,OAClB;AAEJ,QACE,kBAAA,GAAA,EAAA,UAAA;EACG,KACC,kBAAC,KAAD;GAAG,WAAW,eAAe,EAAO;aAClC,kBAAC,GAAD;IACE,OAAO;IACP,QAAO;IACP,QAAQ,EAAM;IACd,gBAAgB;IAChB,UAAU,IAAa,IAAI;IAC3B,cAAc;IACd,CAAA;GACA,CAAA;EAEL,KACC,kBAAC,GAAD;GACE,OAAO;GACP,QAAO;GACP,UAAU,IAAa,IAAI;GAC3B,YAAY;GACZ,cAAc;GACd,CAAA;EAEH,KACC,kBAAC,QAAD;GACE,GAAG,IAAQ;GACX,GAAG,IAAS,IAAgB;GAC5B,YAAW;GACX,UAAS;GACT,YAAW;GACX,YAAW;GACX,MAAA;aAEC;GACI,CAAA;EAER,KACC,kBAAC,QAAD;GACE,WAAW,aAAa,CAAC,IAAc,GAAG,GAAG,IAAS,EAAE;GACxD,YAAW;GACX,UAAS;GACT,YAAW;GACX,YAAW;GACX,MAAA;aAEC;GACI,CAAA;EAER,EAAA,CAAA;EAEL"}
1
+ {"version":3,"file":"ChartAxes.js","names":[],"sources":["../../../../src/selection/components/Chart/ChartAxes.tsx"],"sourcesContent":["import { memo } from 'react';\n\nimport { ContinuousAxis } from '../../../common/ContinuousAxis';\nimport { SelectionXAxis } from './SelectionXAxis';\nimport { BLACK } from '../../../constants';\nimport { formatPercent } from '../../utils';\nimport type { CellLayout, ChartXAxis, ChartYAxis } from './types';\n\n// X (band) axis at the bottom + Y (continuous, percent) axis on the left.\n// Each is gated by show flag; titles render as separate <text> nodes outside\n// the axis components for layout independence.\nexport const ChartAxes = memo(function ChartAxes({\n layout,\n xAxis,\n yAxis,\n}: {\n layout: CellLayout;\n xAxis: ChartXAxis;\n yAxis: ChartYAxis;\n}) {\n const { xScale, yScale, width, height, paddingLeft, paddingBottom, showXAxis, showYAxis } =\n layout;\n const {\n labelsPosition: xLabelsPosition = 'center',\n showTicks: xShowTicks = true,\n hiddenLabels: xHiddenLabels = false,\n title: xAxisTitle = '',\n } = xAxis;\n const {\n showTicks: yShowTicks = true,\n hiddenLabels: yHiddenLabels = false,\n title: yAxisTitle = '',\n } = yAxis;\n\n return (\n <>\n {showXAxis && (\n <g transform={`translate(0,${height})`}>\n <SelectionXAxis\n scale={xScale}\n labels={xAxis.labels}\n labelsPosition={xLabelsPosition}\n showTicks={xShowTicks}\n hiddenLabels={xHiddenLabels}\n />\n </g>\n )}\n {showYAxis && (\n <ContinuousAxis\n scale={yScale}\n orient=\"left\"\n tickSize={yShowTicks ? 4 : 0}\n tickFormat={formatPercent}\n hiddenLabels={yHiddenLabels}\n />\n )}\n {xAxisTitle && (\n <text\n x={width / 2}\n y={height + paddingBottom - 6}\n textAnchor=\"middle\"\n fontSize=\"14px\"\n fontWeight=\"500\"\n fontFamily=\"Manrope\"\n fill={BLACK}\n >\n {xAxisTitle}\n </text>\n )}\n {yAxisTitle && (\n <text\n transform={`translate(${-paddingLeft + 14},${height / 2}) rotate(-90)`}\n textAnchor=\"middle\"\n fontSize=\"14px\"\n fontWeight=\"500\"\n fontFamily=\"Manrope\"\n fill={BLACK}\n >\n {yAxisTitle}\n </text>\n )}\n </>\n );\n});\n"],"mappings":";;;;;;AAWA,MAAa,IAAY,EAAK,SAAmB,EAC/C,WACA,UACA,YAKC;CACD,IAAM,EAAE,WAAQ,WAAQ,UAAO,WAAQ,gBAAa,kBAAe,cAAW,iBAC5E,GACI,EACJ,gBAAgB,IAAkB,UAClC,WAAW,IAAa,IACxB,cAAc,IAAgB,IAC9B,OAAO,IAAa,OAClB,GACE,EACJ,WAAW,IAAa,IACxB,cAAc,IAAgB,IAC9B,OAAO,IAAa,OAClB;AAEJ,QACE,kBAAA,GAAA,EAAA,UAAA;EACG,KACC,kBAAC,KAAD;GAAG,WAAW,eAAe,EAAO;aAClC,kBAAC,GAAD;IACE,OAAO;IACP,QAAQ,EAAM;IACd,gBAAgB;IAChB,WAAW;IACX,cAAc;IACd,CAAA;GACA,CAAA;EAEL,KACC,kBAAC,GAAD;GACE,OAAO;GACP,QAAO;GACP,UAAU,IAAa,IAAI;GAC3B,YAAY;GACZ,cAAc;GACd,CAAA;EAEH,KACC,kBAAC,QAAD;GACE,GAAG,IAAQ;GACX,GAAG,IAAS,IAAgB;GAC5B,YAAW;GACX,UAAS;GACT,YAAW;GACX,YAAW;GACX,MAAA;aAEC;GACI,CAAA;EAER,KACC,kBAAC,QAAD;GACE,WAAW,aAAa,CAAC,IAAc,GAAG,GAAG,IAAS,EAAE;GACxD,YAAW;GACX,UAAS;GACT,YAAW;GACX,YAAW;GACX,MAAA;aAEC;GACI,CAAA;EAER,EAAA,CAAA;EAEL"}
@@ -3,7 +3,6 @@ export declare const ChartFrame: import('react').NamedExoticComponent<{
3
3
  width: number;
4
4
  height: number;
5
5
  frameType: FrameType;
6
- xShowGrid: boolean;
7
- yShowGrid: boolean;
6
+ showGrid: boolean;
8
7
  }>;
9
8
  //# sourceMappingURL=ChartFrame.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChartFrame.d.ts","sourceRoot":"","sources":["../../../../src/selection/components/Chart/ChartFrame.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAKhD,eAAO,MAAM,UAAU;WAOd,MAAM;YACL,MAAM;eACH,SAAS;eACT,OAAO;eACP,OAAO;EAqClB,CAAC"}
1
+ {"version":3,"file":"ChartFrame.d.ts","sourceRoot":"","sources":["../../../../src/selection/components/Chart/ChartFrame.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAMhD,eAAO,MAAM,UAAU;WAMd,MAAM;YACL,MAAM;eACH,SAAS;cACV,OAAO;EAmBjB,CAAC"}
@@ -1,32 +1,32 @@
1
1
  import "../../../constants.js";
2
2
  import { memo as e } from "react";
3
3
  import { jsx as t, jsxs as n } from "react/jsx-runtime";
4
- const r = e(function({ width: e, height: r, frameType: i, xShowGrid: a, yShowGrid: o }) {
4
+ const r = e(function({ width: e, height: r, frameType: i, showGrid: a }) {
5
5
  return i === "empty" ? null : /* @__PURE__ */ n("g", {
6
6
  strokeWidth: 1,
7
7
  children: [
8
- (a || i !== "left") && /* @__PURE__ */ t("line", {
9
- stroke: i === "left" ? "#E1E3EB" : "#110529",
8
+ i !== "left" && /* @__PURE__ */ t("line", {
9
+ stroke: "#110529",
10
10
  x1: "0",
11
11
  x2: e,
12
12
  y1: r,
13
13
  y2: r
14
14
  }),
15
- (a || i !== "bottom") && /* @__PURE__ */ t("line", {
16
- stroke: i === "bottom" ? "#E1E3EB" : "#110529",
15
+ i !== "bottom" && /* @__PURE__ */ t("line", {
16
+ stroke: "#110529",
17
17
  x1: "0",
18
18
  x2: "0",
19
19
  y1: "0",
20
20
  y2: r
21
21
  }),
22
- (a || i === "full") && /* @__PURE__ */ t("line", {
23
- stroke: i === "full" ? "#110529" : "#E1E3EB",
22
+ i === "full" && /* @__PURE__ */ t("line", {
23
+ stroke: "#110529",
24
24
  x1: e,
25
25
  x2: e,
26
26
  y1: "0",
27
27
  y2: r
28
28
  }),
29
- (o || i === "full") && /* @__PURE__ */ t("line", {
29
+ (a || i === "full") && /* @__PURE__ */ t("line", {
30
30
  stroke: i === "full" ? "#110529" : "#E1E3EB",
31
31
  x1: "0",
32
32
  x2: e,
@@ -1 +1 @@
1
- {"version":3,"file":"ChartFrame.js","names":[],"sources":["../../../../src/selection/components/Chart/ChartFrame.tsx"],"sourcesContent":["import { memo } from 'react';\n\nimport { BLACK, GRID_GRAY } from '../../../constants';\nimport type { FrameType } from '../../../types';\n\n// Border lines around the plot body. `frameType` picks which sides are BLACK\n// (drawn as the prominent axis line) vs GRID_GRAY (drawn for visual closure\n// only when the corresponding gridline is on or `frameType === 'full'`).\nexport const ChartFrame = memo(function ChartFrame({\n width,\n height,\n frameType,\n xShowGrid,\n yShowGrid,\n}: {\n width: number;\n height: number;\n frameType: FrameType;\n xShowGrid: boolean;\n yShowGrid: boolean;\n}) {\n if (frameType === 'empty') return null;\n return (\n <g strokeWidth={1}>\n {(xShowGrid || frameType !== 'left') && (\n <line\n stroke={frameType === 'left' ? GRID_GRAY : BLACK}\n x1=\"0\"\n x2={width}\n y1={height}\n y2={height}\n />\n )}\n {(xShowGrid || frameType !== 'bottom') && (\n <line\n stroke={frameType === 'bottom' ? GRID_GRAY : BLACK}\n x1=\"0\"\n x2=\"0\"\n y1=\"0\"\n y2={height}\n />\n )}\n {(xShowGrid || frameType === 'full') && (\n <line\n stroke={frameType === 'full' ? BLACK : GRID_GRAY}\n x1={width}\n x2={width}\n y1=\"0\"\n y2={height}\n />\n )}\n {(yShowGrid || frameType === 'full') && (\n <line stroke={frameType === 'full' ? BLACK : GRID_GRAY} x1=\"0\" x2={width} y1=\"0\" y2=\"0\" />\n )}\n </g>\n );\n});\n"],"mappings":";;;AAQA,MAAa,IAAa,EAAK,SAAoB,EACjD,UACA,WACA,cACA,cACA,gBAOC;AAED,QADI,MAAc,UAAgB,OAEhC,kBAAC,KAAD;EAAG,aAAa;YAAhB;IACI,KAAa,MAAc,WAC3B,kBAAC,QAAD;IACE,QAAQ,MAAc,SAAA,YAAA;IACtB,IAAG;IACH,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,CAAA;IAEF,KAAa,MAAc,aAC3B,kBAAC,QAAD;IACE,QAAQ,MAAc,WAAA,YAAA;IACtB,IAAG;IACH,IAAG;IACH,IAAG;IACH,IAAI;IACJ,CAAA;IAEF,KAAa,MAAc,WAC3B,kBAAC,QAAD;IACE,QAAQ,MAAc,SAAA,YAAA;IACtB,IAAI;IACJ,IAAI;IACJ,IAAG;IACH,IAAI;IACJ,CAAA;IAEF,KAAa,MAAc,WAC3B,kBAAC,QAAD;IAAM,QAAQ,MAAc,SAAA,YAAA;IAA4B,IAAG;IAAI,IAAI;IAAO,IAAG;IAAI,IAAG;IAAM,CAAA;GAE1F;;EAEN"}
1
+ {"version":3,"file":"ChartFrame.js","names":[],"sources":["../../../../src/selection/components/Chart/ChartFrame.tsx"],"sourcesContent":["import { memo } from 'react';\n\nimport { BLACK, GRID_GRAY } from '../../../constants';\nimport type { FrameType } from '../../../types';\n\n// Border lines around the plot body. `frameType` picks which sides are BLACK\n// (drawn as the prominent axis line) vs GRID_GRAY (drawn for visual closure\n// only when `frameType === 'full'`). The Selection Plot has no X gridlines, so\n// the vertical/right borders depend on `frameType` alone.\nexport const ChartFrame = memo(function ChartFrame({\n width,\n height,\n frameType,\n showGrid,\n}: {\n width: number;\n height: number;\n frameType: FrameType;\n showGrid: boolean;\n}) {\n if (frameType === 'empty') return null;\n return (\n <g strokeWidth={1}>\n {frameType !== 'left' && (\n <line stroke={BLACK} x1=\"0\" x2={width} y1={height} y2={height} />\n )}\n {frameType !== 'bottom' && (\n <line stroke={BLACK} x1=\"0\" x2=\"0\" y1=\"0\" y2={height} />\n )}\n {frameType === 'full' && (\n <line stroke={BLACK} x1={width} x2={width} y1=\"0\" y2={height} />\n )}\n {(showGrid || frameType === 'full') && (\n <line stroke={frameType === 'full' ? BLACK : GRID_GRAY} x1=\"0\" x2={width} y1=\"0\" y2=\"0\" />\n )}\n </g>\n );\n});\n"],"mappings":";;;AASA,MAAa,IAAa,EAAK,SAAoB,EACjD,UACA,WACA,cACA,eAMC;AAED,QADI,MAAc,UAAgB,OAEhC,kBAAC,KAAD;EAAG,aAAa;YAAhB;GACG,MAAc,UACb,kBAAC,QAAD;IAAM,QAAA;IAAe,IAAG;IAAI,IAAI;IAAO,IAAI;IAAQ,IAAI;IAAU,CAAA;GAElE,MAAc,YACb,kBAAC,QAAD;IAAM,QAAA;IAAe,IAAG;IAAI,IAAG;IAAI,IAAG;IAAI,IAAI;IAAU,CAAA;GAEzD,MAAc,UACb,kBAAC,QAAD;IAAM,QAAA;IAAe,IAAI;IAAO,IAAI;IAAO,IAAG;IAAI,IAAI;IAAU,CAAA;IAEhE,KAAY,MAAc,WAC1B,kBAAC,QAAD;IAAM,QAAQ,MAAc,SAAA,YAAA;IAA4B,IAAG;IAAI,IAAI;IAAO,IAAG;IAAI,IAAG;IAAM,CAAA;GAE1F;;EAEN"}
@@ -1,10 +1,6 @@
1
- import { ScaleBand, ScaleLinear } from 'd3-scale';
1
+ import { ScaleLinear } from 'd3-scale';
2
2
  export declare const Gridlines: import('react').NamedExoticComponent<{
3
- xScale: ScaleBand<string>;
4
- yScale: ScaleLinear<number, number>;
3
+ scale: ScaleLinear<number, number>;
5
4
  width: number;
6
- height: number;
7
- xShow: boolean;
8
- yShow: boolean;
9
5
  }>;
10
6
  //# sourceMappingURL=Gridlines.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Gridlines.d.ts","sourceRoot":"","sources":["../../../../src/selection/components/Chart/Gridlines.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAMvD,eAAO,MAAM,SAAS;YAQZ,SAAS,CAAC,MAAM,CAAC;YACjB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;WAC5B,MAAM;YACL,MAAM;WACP,OAAO;WACP,OAAO;EA0Bd,CAAC"}
1
+ {"version":3,"file":"Gridlines.d.ts","sourceRoot":"","sources":["../../../../src/selection/components/Chart/Gridlines.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAM5C,eAAO,MAAM,SAAS;WAIb,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;WAC3B,MAAM;EAUb,CAAC"}
@@ -1,32 +1,20 @@
1
- import "../../../constants.js";
2
- import { memo as e } from "react";
3
- import { Fragment as t, jsx as n, jsxs as r } from "react/jsx-runtime";
4
- const i = e(function({ xScale: e, yScale: i, width: a, height: o, xShow: s, yShow: c }) {
5
- return /* @__PURE__ */ r(t, { children: [c && /* @__PURE__ */ n("g", {
6
- stroke: "#E1E3EB",
7
- children: i.ticks().map((e) => {
8
- let t = i(e);
1
+ import { GRID_GRAY as e } from "../../../constants.js";
2
+ import { memo as t } from "react";
3
+ import { jsx as n } from "react/jsx-runtime";
4
+ const r = t(function({ scale: t, width: r }) {
5
+ return /* @__PURE__ */ n("g", {
6
+ stroke: e,
7
+ children: t.ticks().map((e) => {
8
+ let i = t(e);
9
9
  return /* @__PURE__ */ n("line", {
10
10
  x1: 0,
11
- x2: a,
12
- y1: t,
13
- y2: t
14
- }, `yg-${t}`);
11
+ x2: r,
12
+ y1: i,
13
+ y2: i
14
+ }, `yg-${i}`);
15
15
  })
16
- }), s && /* @__PURE__ */ n("g", {
17
- stroke: "#E1E3EB",
18
- strokeWidth: 1,
19
- children: e.domain().slice(0, -1).map((t, r) => {
20
- let i = e.domain()[r + 1], a = ((e(t) ?? 0) + (e(i) ?? 0) + e.bandwidth()) / 2;
21
- return /* @__PURE__ */ n("line", {
22
- x1: a,
23
- x2: a,
24
- y1: 0,
25
- y2: o
26
- }, `xg-${t}`);
27
- })
28
- })] });
16
+ });
29
17
  });
30
- export { i as Gridlines };
18
+ export { r as Gridlines };
31
19
 
32
20
  //# sourceMappingURL=Gridlines.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Gridlines.js","names":[],"sources":["../../../../src/selection/components/Chart/Gridlines.tsx"],"sourcesContent":["import type { ScaleBand, ScaleLinear } from 'd3-scale';\nimport { memo } from 'react';\n\nimport { GRID_GRAY } from '../../../constants';\n\n// X gridlines run between stages (not under bars); Y gridlines at every tick.\nexport const Gridlines = memo(function Gridlines({\n xScale,\n yScale,\n width,\n height,\n xShow,\n yShow,\n}: {\n xScale: ScaleBand<string>;\n yScale: ScaleLinear<number, number>;\n width: number;\n height: number;\n xShow: boolean;\n yShow: boolean;\n}) {\n return (\n <>\n {yShow && (\n <g stroke={GRID_GRAY}>\n {yScale.ticks().map((tick) => {\n const y = yScale(tick);\n return <line key={`yg-${y}`} x1={0} x2={width} y1={y} y2={y} />;\n })}\n </g>\n )}\n {xShow && (\n <g stroke={GRID_GRAY} strokeWidth={1}>\n {xScale\n .domain()\n .slice(0, -1)\n .map((tick, i) => {\n const next = xScale.domain()[i + 1];\n const x = ((xScale(tick) ?? 0) + (xScale(next) ?? 0) + xScale.bandwidth()) / 2;\n return <line key={`xg-${tick}`} x1={x} x2={x} y1={0} y2={height} />;\n })}\n </g>\n )}\n </>\n );\n});\n"],"mappings":";;;AAMA,MAAa,IAAY,EAAK,SAAmB,EAC/C,WACA,WACA,UACA,WACA,UACA,YAQC;AACD,QACE,kBAAA,GAAA,EAAA,UAAA,CACG,KACC,kBAAC,KAAD;EAAG,QAAA;YACA,EAAO,OAAO,CAAC,KAAK,MAAS;GAC5B,IAAM,IAAI,EAAO,EAAK;AACtB,UAAO,kBAAC,QAAD;IAAsB,IAAI;IAAG,IAAI;IAAO,IAAI;IAAG,IAAI;IAAK,EAA7C,MAAM,IAAuC;IAC/D;EACA,CAAA,EAEL,KACC,kBAAC,KAAD;EAAG,QAAA;EAAmB,aAAa;YAChC,EACE,QAAQ,CACR,MAAM,GAAG,GAAG,CACZ,KAAK,GAAM,MAAM;GAChB,IAAM,IAAO,EAAO,QAAQ,CAAC,IAAI,IAC3B,MAAM,EAAO,EAAK,IAAI,MAAM,EAAO,EAAK,IAAI,KAAK,EAAO,WAAW,IAAI;AAC7E,UAAO,kBAAC,QAAD;IAAyB,IAAI;IAAG,IAAI;IAAG,IAAI;IAAG,IAAI;IAAU,EAAjD,MAAM,IAA2C;IACnE;EACF,CAAA,CAEL,EAAA,CAAA;EAEL"}
1
+ {"version":3,"file":"Gridlines.js","names":[],"sources":["../../../../src/selection/components/Chart/Gridlines.tsx"],"sourcesContent":["import type { ScaleLinear } from 'd3-scale';\nimport { memo } from 'react';\n\nimport { GRID_GRAY } from '../../../constants';\n\n// Y gridlines at every tick. The Selection Plot has no X gridlines.\nexport const Gridlines = memo(function Gridlines({\n scale,\n width,\n}: {\n scale: ScaleLinear<number, number>;\n width: number;\n}) {\n return (\n <g stroke={GRID_GRAY}>\n {scale.ticks().map((tick) => {\n const y = scale(tick);\n return <line key={`yg-${y}`} x1={0} x2={width} y1={y} y2={y} />;\n })}\n </g>\n );\n});\n"],"mappings":";;;AAMA,MAAa,IAAY,EAAK,SAAmB,EAC/C,UACA,YAIC;AACD,QACE,kBAAC,KAAD;EAAG,QAAQ;YACR,EAAM,OAAO,CAAC,KAAK,MAAS;GAC3B,IAAM,IAAI,EAAM,EAAK;AACrB,UAAO,kBAAC,QAAD;IAAsB,IAAI;IAAG,IAAI;IAAO,IAAI;IAAG,IAAI;IAAK,EAA7C,MAAM,IAAuC;IAC/D;EACA,CAAA;EAEN"}
@@ -4,7 +4,7 @@ import { ribbonPath as r } from "./ribbonPath.js";
4
4
  import { memo as i } from "react";
5
5
  import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
6
6
  const c = i(function({ context: i, yScale: c, stages: l, groupName: u, color: d }) {
7
- let { x0: f, x1: p, height: m, layerOpacity: h } = i, { current: g, next: _ } = l, v = g.groups.find((e) => e.name === u), y = _.groups.find((e) => e.name === u), b = (y?.surviving ?? 0) + (y?.discarded ?? 0), x = v?.surviving ?? 0;
7
+ let { x0: f, x1: p, height: m, layerOpacity: h } = i, { current: g, next: _ } = l, v = g.groups.get(u), y = _.groups.get(u), b = (y?.surviving ?? 0) + (y?.discarded ?? 0), x = v?.surviving ?? 0;
8
8
  if (x <= 0 || b <= 0) return null;
9
9
  let S = (y?.surviving ?? 0) / b, C = c(n(x / g.total)), w = c(n(b / _.total)), T = w + (m - w) * (1 - S), E = C + (m - C) * (1 - S);
10
10
  return /* @__PURE__ */ s(a, { children: [/* @__PURE__ */ o("path", {
@@ -1 +1 @@
1
- {"version":3,"file":"GroupFlowRibbon.js","names":[],"sources":["../../../../../src/selection/components/Chart/Ribbons/GroupFlowRibbon.tsx"],"sourcesContent":["import { memo } from 'react';\n\nimport { DESATURATE_ALPHA, RIBBON_OPACITY } from '../../../constants';\nimport { toPercent } from '../../../utils';\nimport type { RibbonContext, StagePair } from '../types';\nimport { ribbonPath } from './ribbonPath';\n\n// Single-group flow (used both for click-selected groups and hover-highlighted\n// groups). Two sub-bands in the group color: top sub-band is destined to be\n// discarded next stage (DESATURATE_ALPHA), bottom sub-band carries forward.\nexport const GroupFlowRibbon = memo(function GroupFlowRibbon({\n context,\n yScale,\n stages,\n groupName,\n color,\n}: {\n context: RibbonContext;\n yScale: (v: number) => number;\n stages: StagePair;\n groupName: string;\n color: string;\n}) {\n const { x0, x1, height, layerOpacity } = context;\n const { current: stage, next: nextStage } = stages;\n\n const groupData = stage.groups.find((g) => g.name === groupName);\n const nextGroupData = nextStage.groups.find((g) => g.name === groupName);\n const nextGroupTotal = (nextGroupData?.surviving ?? 0) + (nextGroupData?.discarded ?? 0);\n const surviving = groupData?.surviving ?? 0;\n if (surviving <= 0 || nextGroupTotal <= 0) return null;\n\n const nextSurvivingFrac = (nextGroupData?.surviving ?? 0) / nextGroupTotal;\n\n const survivingFrac = surviving / stage.total;\n const yTopSurviving = yScale(toPercent(survivingFrac));\n\n const nextGroupFrac = nextGroupTotal / nextStage.total;\n const yTopNextOverlay = yScale(toPercent(nextGroupFrac));\n const yNextDivider = yTopNextOverlay + (height - yTopNextOverlay) * (1 - nextSurvivingFrac);\n\n const splitY = yTopSurviving + (height - yTopSurviving) * (1 - nextSurvivingFrac);\n\n return (\n <>\n <path\n d={ribbonPath({\n leftX: x0,\n leftYTop: yTopSurviving,\n leftYBottom: splitY,\n rightX: x1,\n rightYTop: yTopNextOverlay,\n rightYBottom: yNextDivider,\n })}\n fill={color}\n opacity={RIBBON_OPACITY * DESATURATE_ALPHA * layerOpacity}\n />\n <path\n d={ribbonPath({\n leftX: x0,\n leftYTop: splitY,\n leftYBottom: height,\n rightX: x1,\n rightYTop: yNextDivider,\n rightYBottom: height,\n })}\n fill={color}\n opacity={RIBBON_OPACITY * layerOpacity}\n />\n </>\n );\n});\n"],"mappings":";;;;;AAUA,MAAa,IAAkB,EAAK,SAAyB,EAC3D,YACA,WACA,WACA,cACA,YAOC;CACD,IAAM,EAAE,OAAI,OAAI,WAAQ,oBAAiB,GACnC,EAAE,SAAS,GAAO,MAAM,MAAc,GAEtC,IAAY,EAAM,OAAO,MAAM,MAAM,EAAE,SAAS,EAAU,EAC1D,IAAgB,EAAU,OAAO,MAAM,MAAM,EAAE,SAAS,EAAU,EAClE,KAAkB,GAAe,aAAa,MAAM,GAAe,aAAa,IAChF,IAAY,GAAW,aAAa;AAC1C,KAAI,KAAa,KAAK,KAAkB,EAAG,QAAO;CAElD,IAAM,KAAqB,GAAe,aAAa,KAAK,GAGtD,IAAgB,EAAO,EADP,IAAY,EAAM,MACa,CAAC,EAGhD,IAAkB,EAAO,EADT,IAAiB,EAAU,MACM,CAAC,EAClD,IAAe,KAAmB,IAAS,MAAoB,IAAI,IAEnE,IAAS,KAAiB,IAAS,MAAkB,IAAI;AAE/D,QACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,QAAD;EACE,GAAG,EAAW;GACZ,OAAO;GACP,UAAU;GACV,aAAa;GACb,QAAQ;GACR,WAAW;GACX,cAAc;GACf,CAAC;EACF,MAAM;EACN,SAAS,IAAiB,IAAmB;EAC7C,CAAA,EACF,kBAAC,QAAD;EACE,GAAG,EAAW;GACZ,OAAO;GACP,UAAU;GACV,aAAa;GACb,QAAQ;GACR,WAAW;GACX,cAAc;GACf,CAAC;EACF,MAAM;EACN,SAAS,IAAiB;EAC1B,CAAA,CACD,EAAA,CAAA;EAEL"}
1
+ {"version":3,"file":"GroupFlowRibbon.js","names":[],"sources":["../../../../../src/selection/components/Chart/Ribbons/GroupFlowRibbon.tsx"],"sourcesContent":["import { memo } from 'react';\n\nimport { DESATURATE_ALPHA, RIBBON_OPACITY } from '../../../constants';\nimport { toPercent } from '../../../utils';\nimport type { RibbonContext, StagePair } from '../types';\nimport { ribbonPath } from './ribbonPath';\n\n// Single-group flow (used both for click-selected groups and hover-highlighted\n// groups). Two sub-bands in the group color: top sub-band is destined to be\n// discarded next stage (DESATURATE_ALPHA), bottom sub-band carries forward.\nexport const GroupFlowRibbon = memo(function GroupFlowRibbon({\n context,\n yScale,\n stages,\n groupName,\n color,\n}: {\n context: RibbonContext;\n yScale: (v: number) => number;\n stages: StagePair;\n groupName: string;\n color: string;\n}) {\n const { x0, x1, height, layerOpacity } = context;\n const { current: stage, next: nextStage } = stages;\n\n const groupData = stage.groups.get(groupName);\n const nextGroupData = nextStage.groups.get(groupName);\n const nextGroupTotal = (nextGroupData?.surviving ?? 0) + (nextGroupData?.discarded ?? 0);\n const surviving = groupData?.surviving ?? 0;\n if (surviving <= 0 || nextGroupTotal <= 0) return null;\n\n const nextSurvivingFrac = (nextGroupData?.surviving ?? 0) / nextGroupTotal;\n\n const survivingFrac = surviving / stage.total;\n const yTopSurviving = yScale(toPercent(survivingFrac));\n\n const nextGroupFrac = nextGroupTotal / nextStage.total;\n const yTopNextOverlay = yScale(toPercent(nextGroupFrac));\n const yNextDivider = yTopNextOverlay + (height - yTopNextOverlay) * (1 - nextSurvivingFrac);\n\n const splitY = yTopSurviving + (height - yTopSurviving) * (1 - nextSurvivingFrac);\n\n return (\n <>\n <path\n d={ribbonPath({\n leftX: x0,\n leftYTop: yTopSurviving,\n leftYBottom: splitY,\n rightX: x1,\n rightYTop: yTopNextOverlay,\n rightYBottom: yNextDivider,\n })}\n fill={color}\n opacity={RIBBON_OPACITY * DESATURATE_ALPHA * layerOpacity}\n />\n <path\n d={ribbonPath({\n leftX: x0,\n leftYTop: splitY,\n leftYBottom: height,\n rightX: x1,\n rightYTop: yNextDivider,\n rightYBottom: height,\n })}\n fill={color}\n opacity={RIBBON_OPACITY * layerOpacity}\n />\n </>\n );\n});\n"],"mappings":";;;;;AAUA,MAAa,IAAkB,EAAK,SAAyB,EAC3D,YACA,WACA,WACA,cACA,YAOC;CACD,IAAM,EAAE,OAAI,OAAI,WAAQ,oBAAiB,GACnC,EAAE,SAAS,GAAO,MAAM,MAAc,GAEtC,IAAY,EAAM,OAAO,IAAI,EAAU,EACvC,IAAgB,EAAU,OAAO,IAAI,EAAU,EAC/C,KAAkB,GAAe,aAAa,MAAM,GAAe,aAAa,IAChF,IAAY,GAAW,aAAa;AAC1C,KAAI,KAAa,KAAK,KAAkB,EAAG,QAAO;CAElD,IAAM,KAAqB,GAAe,aAAa,KAAK,GAGtD,IAAgB,EAAO,EADP,IAAY,EAAM,MACa,CAAC,EAGhD,IAAkB,EAAO,EADT,IAAiB,EAAU,MACM,CAAC,EAClD,IAAe,KAAmB,IAAS,MAAoB,IAAI,IAEnE,IAAS,KAAiB,IAAS,MAAkB,IAAI;AAE/D,QACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,QAAD;EACE,GAAG,EAAW;GACZ,OAAO;GACP,UAAU;GACV,aAAa;GACb,QAAQ;GACR,WAAW;GACX,cAAc;GACf,CAAC;EACF,MAAM;EACN,SAAS,IAAiB,IAAmB;EAC7C,CAAA,EACF,kBAAC,QAAD;EACE,GAAG,EAAW;GACZ,OAAO;GACP,UAAU;GACV,aAAa;GACb,QAAQ;GACR,WAAW;GACX,cAAc;GACf,CAAC;EACF,MAAM;EACN,SAAS,IAAiB;EAC1B,CAAA,CACD,EAAA,CAAA;EAEL"}
@@ -1 +1 @@
1
- {"version":3,"file":"StackedGroupFlowRibbon.d.ts","sourceRoot":"","sources":["../../../../../src/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAQzD,eAAO,MAAM,sBAAsB;aAQxB,aAAa;YACd,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM;YACrB,SAAS;gBACL,MAAM,EAAE;eACT,MAAM;WACV,MAAM;EAgGb,CAAC"}
1
+ {"version":3,"file":"StackedGroupFlowRibbon.d.ts","sourceRoot":"","sources":["../../../../../src/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAQzD,eAAO,MAAM,sBAAsB;aAQxB,aAAa;YACd,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM;YACrB,SAAS;gBACL,MAAM,EAAE;eACT,MAAM;WACV,MAAM;EA8Fb,CAAC"}
@@ -4,57 +4,57 @@ import { ribbonPath as t } from "./ribbonPath.js";
4
4
  import { memo as n } from "react";
5
5
  import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
6
6
  const o = n(function({ context: n, yScale: o, stages: s, stackOrder: c, groupName: l, color: u }) {
7
- let { x0: d, x1: f, height: p, layerOpacity: m } = n, { current: h, next: g } = s, _ = new Map(h.groups.map((e) => [e.name, e])), v = h.total > 0 ? o(e(h.surviving / h.total)) : p, y = 0;
7
+ let { x0: d, x1: f, height: p, layerOpacity: m } = n, { current: h, next: g } = s, _ = h.total > 0 ? o(e(h.surviving / h.total)) : p, v = 0;
8
8
  for (let e of c) {
9
- let t = _.get(e);
9
+ let t = h.groups.get(e);
10
10
  if (!t) continue;
11
11
  let n = t.surviving / h.total * p;
12
12
  if (e === l) {
13
- y = n;
13
+ v = n;
14
14
  break;
15
15
  }
16
- v += n;
16
+ _ += n;
17
17
  }
18
- if (y <= 0) return null;
19
- let b = v, x = v + y, S = new Map(g.groups.map((e) => [e.name, e])), C = g.total > 0 ? o(e(g.surviving / g.total)) : p, w = 0, T = null, E = null;
18
+ if (v <= 0) return null;
19
+ let y = _, b = _ + v, x = g.total > 0 ? o(e(g.surviving / g.total)) : p, S = 0, C = null, w = null;
20
20
  for (let e of c) {
21
- let t = S.get(e);
21
+ let t = g.groups.get(e);
22
22
  if (!t) continue;
23
23
  let n = t.surviving / g.total * p, r = t.discarded / g.total * p;
24
24
  if (e === l) {
25
- T = n > 0 ? {
26
- top: C,
27
- bottom: C + n
28
- } : null, E = r > 0 ? {
29
- top: w,
30
- bottom: w + r
25
+ C = n > 0 ? {
26
+ top: x,
27
+ bottom: x + n
28
+ } : null, w = r > 0 ? {
29
+ top: S,
30
+ bottom: S + r
31
31
  } : null;
32
32
  break;
33
33
  }
34
- C += n, w += r;
34
+ x += n, S += r;
35
35
  }
36
- let D = S.get(l), O = D?.surviving ?? 0, k = D?.discarded ?? 0, A = O + k;
37
- if (A <= 0) return null;
38
- let j = b + k / A * y;
39
- return /* @__PURE__ */ a(r, { children: [E && k > 0 && /* @__PURE__ */ i("path", {
36
+ let T = g.groups.get(l), E = T?.surviving ?? 0, D = T?.discarded ?? 0, O = E + D;
37
+ if (O <= 0) return null;
38
+ let k = y + D / O * v;
39
+ return /* @__PURE__ */ a(r, { children: [w && D > 0 && /* @__PURE__ */ i("path", {
40
40
  d: t({
41
41
  leftX: d,
42
- leftYTop: b,
43
- leftYBottom: j,
42
+ leftYTop: y,
43
+ leftYBottom: k,
44
44
  rightX: f,
45
- rightYTop: E.top,
46
- rightYBottom: E.bottom
45
+ rightYTop: w.top,
46
+ rightYBottom: w.bottom
47
47
  }),
48
48
  fill: u,
49
49
  opacity: .25 * .4 * m
50
- }), T && O > 0 && /* @__PURE__ */ i("path", {
50
+ }), C && E > 0 && /* @__PURE__ */ i("path", {
51
51
  d: t({
52
52
  leftX: d,
53
- leftYTop: j,
54
- leftYBottom: x,
53
+ leftYTop: k,
54
+ leftYBottom: b,
55
55
  rightX: f,
56
- rightYTop: T.top,
57
- rightYBottom: T.bottom
56
+ rightYTop: C.top,
57
+ rightYBottom: C.bottom
58
58
  }),
59
59
  fill: u,
60
60
  opacity: .25 * m
@@ -1 +1 @@
1
- {"version":3,"file":"StackedGroupFlowRibbon.js","names":[],"sources":["../../../../../src/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.tsx"],"sourcesContent":["import { memo } from 'react';\n\nimport { DESATURATE_ALPHA, RIBBON_OPACITY } from '../../../constants';\nimport { toPercent } from '../../../utils';\nimport type { RibbonContext, StagePair } from '../types';\nimport { ribbonPath } from './ribbonPath';\n\n// Hover-highlight ribbon for a single group in stacked layout. Connects the\n// group's preserved chunk in stage i (at its stacked Y position) to its\n// preserved+discarded chunks in stage i+1 (each at their own stacked Y\n// positions). Two sub-bands: top portion → discarded next (dimmer), bottom\n// portion → preserved next (vivid). Replaces the unified ribbon on hover.\nexport const StackedGroupFlowRibbon = memo(function StackedGroupFlowRibbon({\n context,\n yScale,\n stages,\n stackOrder,\n groupName,\n color,\n}: {\n context: RibbonContext;\n yScale: (v: number) => number;\n stages: StagePair;\n stackOrder: string[];\n groupName: string;\n color: string;\n}) {\n const { x0, x1, height, layerOpacity } = context;\n const { current: stage, next: nextStage } = stages;\n\n // Stage i: walk stackOrder until we find the hovered group; track the\n // running yP cursor (top of preserved area accumulating downward).\n const stageGroupMap = new Map(stage.groups.map((g) => [g.name, g]));\n const dividerY = stage.total > 0 ? yScale(toPercent(stage.surviving / stage.total)) : height;\n let yPreserved = dividerY;\n let groupSurvivingHeight = 0;\n for (const name of stackOrder) {\n const g = stageGroupMap.get(name);\n if (!g) continue;\n const h = (g.surviving / stage.total) * height;\n if (name === groupName) {\n groupSurvivingHeight = h;\n break;\n }\n yPreserved += h;\n }\n if (groupSurvivingHeight <= 0) return null;\n const yTop = yPreserved;\n const yBottom = yPreserved + groupSurvivingHeight;\n\n // Stage i+1: walk stackOrder for both preserved (yNextPreserved) and\n // discarded (yNextDiscarded) accumulators in parallel; capture the hovered\n // group's chunks.\n const nextStageGroupMap = new Map(nextStage.groups.map((g) => [g.name, g]));\n const nextDividerY =\n nextStage.total > 0 ? yScale(toPercent(nextStage.surviving / nextStage.total)) : height;\n let yNextPreserved = nextDividerY;\n let yNextDiscarded = 0;\n let nextPreservedRect: { top: number; bottom: number } | null = null;\n let nextDiscardedRect: { top: number; bottom: number } | null = null;\n for (const name of stackOrder) {\n const g = nextStageGroupMap.get(name);\n if (!g) continue;\n const preservedHeight = (g.surviving / nextStage.total) * height;\n const discardedHeight = (g.discarded / nextStage.total) * height;\n if (name === groupName) {\n nextPreservedRect =\n preservedHeight > 0\n ? { top: yNextPreserved, bottom: yNextPreserved + preservedHeight }\n : null;\n nextDiscardedRect =\n discardedHeight > 0\n ? { top: yNextDiscarded, bottom: yNextDiscarded + discardedHeight }\n : null;\n break;\n }\n yNextPreserved += preservedHeight;\n yNextDiscarded += discardedHeight;\n }\n\n const nextGroupData = nextStageGroupMap.get(groupName);\n const nextSurviving = nextGroupData?.surviving ?? 0;\n const nextDiscarded = nextGroupData?.discarded ?? 0;\n const nextGroupTotal = nextSurviving + nextDiscarded;\n if (nextGroupTotal <= 0) return null;\n\n // Split source proportionally: top portion → discarded next, bottom → preserved next.\n const splitY = yTop + groupSurvivingHeight * (nextDiscarded / nextGroupTotal);\n\n return (\n <>\n {nextDiscardedRect && nextDiscarded > 0 && (\n <path\n d={ribbonPath({\n leftX: x0,\n leftYTop: yTop,\n leftYBottom: splitY,\n rightX: x1,\n rightYTop: nextDiscardedRect.top,\n rightYBottom: nextDiscardedRect.bottom,\n })}\n fill={color}\n opacity={RIBBON_OPACITY * DESATURATE_ALPHA * layerOpacity}\n />\n )}\n {nextPreservedRect && nextSurviving > 0 && (\n <path\n d={ribbonPath({\n leftX: x0,\n leftYTop: splitY,\n leftYBottom: yBottom,\n rightX: x1,\n rightYTop: nextPreservedRect.top,\n rightYBottom: nextPreservedRect.bottom,\n })}\n fill={color}\n opacity={RIBBON_OPACITY * layerOpacity}\n />\n )}\n </>\n );\n});\n"],"mappings":";;;;;AAYA,MAAa,IAAyB,EAAK,SAAgC,EACzE,YACA,WACA,WACA,eACA,cACA,YAQC;CACD,IAAM,EAAE,OAAI,OAAI,WAAQ,oBAAiB,GACnC,EAAE,SAAS,GAAO,MAAM,MAAc,GAItC,IAAgB,IAAI,IAAI,EAAM,OAAO,KAAK,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAE/D,IADa,EAAM,QAAQ,IAAI,EAAO,EAAU,EAAM,YAAY,EAAM,MAAM,CAAC,GAAG,GAElF,IAAuB;AAC3B,MAAK,IAAM,KAAQ,GAAY;EAC7B,IAAM,IAAI,EAAc,IAAI,EAAK;AACjC,MAAI,CAAC,EAAG;EACR,IAAM,IAAK,EAAE,YAAY,EAAM,QAAS;AACxC,MAAI,MAAS,GAAW;AACtB,OAAuB;AACvB;;AAEF,OAAc;;AAEhB,KAAI,KAAwB,EAAG,QAAO;CACtC,IAAM,IAAO,GACP,IAAU,IAAa,GAKvB,IAAoB,IAAI,IAAI,EAAU,OAAO,KAAK,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAGvE,IADF,EAAU,QAAQ,IAAI,EAAO,EAAU,EAAU,YAAY,EAAU,MAAM,CAAC,GAAG,GAE/E,IAAiB,GACjB,IAA4D,MAC5D,IAA4D;AAChE,MAAK,IAAM,KAAQ,GAAY;EAC7B,IAAM,IAAI,EAAkB,IAAI,EAAK;AACrC,MAAI,CAAC,EAAG;EACR,IAAM,IAAmB,EAAE,YAAY,EAAU,QAAS,GACpD,IAAmB,EAAE,YAAY,EAAU,QAAS;AAC1D,MAAI,MAAS,GAAW;AAKtB,GAJA,IACE,IAAkB,IACd;IAAE,KAAK;IAAgB,QAAQ,IAAiB;IAAiB,GACjE,MACN,IACE,IAAkB,IACd;IAAE,KAAK;IAAgB,QAAQ,IAAiB;IAAiB,GACjE;AACN;;AAGF,EADA,KAAkB,GAClB,KAAkB;;CAGpB,IAAM,IAAgB,EAAkB,IAAI,EAAU,EAChD,IAAgB,GAAe,aAAa,GAC5C,IAAgB,GAAe,aAAa,GAC5C,IAAiB,IAAgB;AACvC,KAAI,KAAkB,EAAG,QAAO;CAGhC,IAAM,IAAS,IAA+B,IAAgB,IAAxC;AAEtB,QACE,kBAAA,GAAA,EAAA,UAAA,CACG,KAAqB,IAAgB,KACpC,kBAAC,QAAD;EACE,GAAG,EAAW;GACZ,OAAO;GACP,UAAU;GACV,aAAa;GACb,QAAQ;GACR,WAAW,EAAkB;GAC7B,cAAc,EAAkB;GACjC,CAAC;EACF,MAAM;EACN,SAAA,MAAA,KAA6C;EAC7C,CAAA,EAEH,KAAqB,IAAgB,KACpC,kBAAC,QAAD;EACE,GAAG,EAAW;GACZ,OAAO;GACP,UAAU;GACV,aAAa;GACb,QAAQ;GACR,WAAW,EAAkB;GAC7B,cAAc,EAAkB;GACjC,CAAC;EACF,MAAM;EACN,SAAA,MAA0B;EAC1B,CAAA,CAEH,EAAA,CAAA;EAEL"}
1
+ {"version":3,"file":"StackedGroupFlowRibbon.js","names":[],"sources":["../../../../../src/selection/components/Chart/Ribbons/StackedGroupFlowRibbon.tsx"],"sourcesContent":["import { memo } from 'react';\n\nimport { DESATURATE_ALPHA, RIBBON_OPACITY } from '../../../constants';\nimport { toPercent } from '../../../utils';\nimport type { RibbonContext, StagePair } from '../types';\nimport { ribbonPath } from './ribbonPath';\n\n// Hover-highlight ribbon for a single group in stacked layout. Connects the\n// group's preserved chunk in stage i (at its stacked Y position) to its\n// preserved+discarded chunks in stage i+1 (each at their own stacked Y\n// positions). Two sub-bands: top portion → discarded next (dimmer), bottom\n// portion → preserved next (vivid). Replaces the unified ribbon on hover.\nexport const StackedGroupFlowRibbon = memo(function StackedGroupFlowRibbon({\n context,\n yScale,\n stages,\n stackOrder,\n groupName,\n color,\n}: {\n context: RibbonContext;\n yScale: (v: number) => number;\n stages: StagePair;\n stackOrder: string[];\n groupName: string;\n color: string;\n}) {\n const { x0, x1, height, layerOpacity } = context;\n const { current: stage, next: nextStage } = stages;\n\n // Stage i: walk stackOrder until we find the hovered group; track the\n // running yP cursor (top of preserved area accumulating downward).\n const dividerY = stage.total > 0 ? yScale(toPercent(stage.surviving / stage.total)) : height;\n let yPreserved = dividerY;\n let groupSurvivingHeight = 0;\n for (const name of stackOrder) {\n const g = stage.groups.get(name);\n if (!g) continue;\n const h = (g.surviving / stage.total) * height;\n if (name === groupName) {\n groupSurvivingHeight = h;\n break;\n }\n yPreserved += h;\n }\n if (groupSurvivingHeight <= 0) return null;\n const yTop = yPreserved;\n const yBottom = yPreserved + groupSurvivingHeight;\n\n // Stage i+1: walk stackOrder for both preserved (yNextPreserved) and\n // discarded (yNextDiscarded) accumulators in parallel; capture the hovered\n // group's chunks.\n const nextDividerY =\n nextStage.total > 0 ? yScale(toPercent(nextStage.surviving / nextStage.total)) : height;\n let yNextPreserved = nextDividerY;\n let yNextDiscarded = 0;\n let nextPreservedRect: { top: number; bottom: number } | null = null;\n let nextDiscardedRect: { top: number; bottom: number } | null = null;\n for (const name of stackOrder) {\n const g = nextStage.groups.get(name);\n if (!g) continue;\n const preservedHeight = (g.surviving / nextStage.total) * height;\n const discardedHeight = (g.discarded / nextStage.total) * height;\n if (name === groupName) {\n nextPreservedRect =\n preservedHeight > 0\n ? { top: yNextPreserved, bottom: yNextPreserved + preservedHeight }\n : null;\n nextDiscardedRect =\n discardedHeight > 0\n ? { top: yNextDiscarded, bottom: yNextDiscarded + discardedHeight }\n : null;\n break;\n }\n yNextPreserved += preservedHeight;\n yNextDiscarded += discardedHeight;\n }\n\n const nextGroupData = nextStage.groups.get(groupName);\n const nextSurviving = nextGroupData?.surviving ?? 0;\n const nextDiscarded = nextGroupData?.discarded ?? 0;\n const nextGroupTotal = nextSurviving + nextDiscarded;\n if (nextGroupTotal <= 0) return null;\n\n // Split source proportionally: top portion → discarded next, bottom → preserved next.\n const splitY = yTop + groupSurvivingHeight * (nextDiscarded / nextGroupTotal);\n\n return (\n <>\n {nextDiscardedRect && nextDiscarded > 0 && (\n <path\n d={ribbonPath({\n leftX: x0,\n leftYTop: yTop,\n leftYBottom: splitY,\n rightX: x1,\n rightYTop: nextDiscardedRect.top,\n rightYBottom: nextDiscardedRect.bottom,\n })}\n fill={color}\n opacity={RIBBON_OPACITY * DESATURATE_ALPHA * layerOpacity}\n />\n )}\n {nextPreservedRect && nextSurviving > 0 && (\n <path\n d={ribbonPath({\n leftX: x0,\n leftYTop: splitY,\n leftYBottom: yBottom,\n rightX: x1,\n rightYTop: nextPreservedRect.top,\n rightYBottom: nextPreservedRect.bottom,\n })}\n fill={color}\n opacity={RIBBON_OPACITY * layerOpacity}\n />\n )}\n </>\n );\n});\n"],"mappings":";;;;;AAYA,MAAa,IAAyB,EAAK,SAAgC,EACzE,YACA,WACA,WACA,eACA,cACA,YAQC;CACD,IAAM,EAAE,OAAI,OAAI,WAAQ,oBAAiB,GACnC,EAAE,SAAS,GAAO,MAAM,MAAc,GAKxC,IADa,EAAM,QAAQ,IAAI,EAAO,EAAU,EAAM,YAAY,EAAM,MAAM,CAAC,GAAG,GAElF,IAAuB;AAC3B,MAAK,IAAM,KAAQ,GAAY;EAC7B,IAAM,IAAI,EAAM,OAAO,IAAI,EAAK;AAChC,MAAI,CAAC,EAAG;EACR,IAAM,IAAK,EAAE,YAAY,EAAM,QAAS;AACxC,MAAI,MAAS,GAAW;AACtB,OAAuB;AACvB;;AAEF,OAAc;;AAEhB,KAAI,KAAwB,EAAG,QAAO;CACtC,IAAM,IAAO,GACP,IAAU,IAAa,GAOzB,IADF,EAAU,QAAQ,IAAI,EAAO,EAAU,EAAU,YAAY,EAAU,MAAM,CAAC,GAAG,GAE/E,IAAiB,GACjB,IAA4D,MAC5D,IAA4D;AAChE,MAAK,IAAM,KAAQ,GAAY;EAC7B,IAAM,IAAI,EAAU,OAAO,IAAI,EAAK;AACpC,MAAI,CAAC,EAAG;EACR,IAAM,IAAmB,EAAE,YAAY,EAAU,QAAS,GACpD,IAAmB,EAAE,YAAY,EAAU,QAAS;AAC1D,MAAI,MAAS,GAAW;AAKtB,GAJA,IACE,IAAkB,IACd;IAAE,KAAK;IAAgB,QAAQ,IAAiB;IAAiB,GACjE,MACN,IACE,IAAkB,IACd;IAAE,KAAK;IAAgB,QAAQ,IAAiB;IAAiB,GACjE;AACN;;AAGF,EADA,KAAkB,GAClB,KAAkB;;CAGpB,IAAM,IAAgB,EAAU,OAAO,IAAI,EAAU,EAC/C,IAAgB,GAAe,aAAa,GAC5C,IAAgB,GAAe,aAAa,GAC5C,IAAiB,IAAgB;AACvC,KAAI,KAAkB,EAAG,QAAO;CAGhC,IAAM,IAAS,IAA+B,IAAgB,IAAxC;AAEtB,QACE,kBAAA,GAAA,EAAA,UAAA,CACG,KAAqB,IAAgB,KACpC,kBAAC,QAAD;EACE,GAAG,EAAW;GACZ,OAAO;GACP,UAAU;GACV,aAAa;GACb,QAAQ;GACR,WAAW,EAAkB;GAC7B,cAAc,EAAkB;GACjC,CAAC;EACF,MAAM;EACN,SAAA,MAAA,KAA6C;EAC7C,CAAA,EAEH,KAAqB,IAAgB,KACpC,kBAAC,QAAD;EACE,GAAG,EAAW;GACZ,OAAO;GACP,UAAU;GACV,aAAa;GACb,QAAQ;GACR,WAAW,EAAkB;GAC7B,cAAc,EAAkB;GACjC,CAAC;EACF,MAAM;EACN,SAAA,MAA0B;EAC1B,CAAA,CAEH,EAAA,CAAA;EAEL"}
@@ -0,0 +1,18 @@
1
+ import { ScaleBand } from 'd3-scale';
2
+ type LabelsPosition = 'center' | '45deg' | '90deg';
3
+ /**
4
+ * X-axis for the Selection Plot. Unlike the shared {@link BandAxis}, category
5
+ * labels (and their tick marks) are placed in the gaps BETWEEN bars — so they
6
+ * label the funnels (transitions) rather than the populations, and the terminal
7
+ * bar carries no tick/label. Rendered inside a `translate(0, height)` group
8
+ * (the axis baseline), so the ticks and labels hang below it.
9
+ */
10
+ export declare const SelectionXAxis: ({ scale, labels, labelsPosition, hiddenLabels, showTicks, }: {
11
+ scale: ScaleBand<string>;
12
+ labels?: Record<string, string[]>;
13
+ labelsPosition?: LabelsPosition;
14
+ hiddenLabels?: boolean;
15
+ showTicks?: boolean;
16
+ }) => import("react/jsx-runtime").JSX.Element | null;
17
+ export {};
18
+ //# sourceMappingURL=SelectionXAxis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionXAxis.d.ts","sourceRoot":"","sources":["../../../../src/selection/components/Chart/SelectionXAxis.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAI1C,KAAK,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;AAwBnD;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,6DAM5B;IACD,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,mDAuCA,CAAC"}
@@ -0,0 +1,47 @@
1
+ import "../../../constants.js";
2
+ import "react";
3
+ import { jsx as e, jsxs as t } from "react/jsx-runtime";
4
+ var n = 21;
5
+ function r(e) {
6
+ return e === "45deg" ? `translate(0,${n / 2}) rotate(-45)` : e === "90deg" ? `translate(${-n / 2},${4 + n / 2}) rotate(-90)` : "translate(0,4)";
7
+ }
8
+ function i(e) {
9
+ return e === "90deg" ? "central" : e === "center" ? "hanging" : "auto";
10
+ }
11
+ function a(e) {
12
+ return e === "center" ? "middle" : "end";
13
+ }
14
+ /**
15
+ * X-axis for the Selection Plot. Unlike the shared {@link BandAxis}, category
16
+ * labels (and their tick marks) are placed in the gaps BETWEEN bars — so they
17
+ * label the funnels (transitions) rather than the populations, and the terminal
18
+ * bar carries no tick/label. Rendered inside a `translate(0, height)` group
19
+ * (the axis baseline), so the ticks and labels hang below it.
20
+ */
21
+ const o = ({ scale: n, labels: o = {}, labelsPosition: s = "center", hiddenLabels: c = !1, showTicks: l = !0 }) => {
22
+ if (c && !l) return null;
23
+ let u = n.domain(), d = n.bandwidth(), f = (e) => n(e) ?? 0, p = (e) => (f(u[e]) + f(u[e + 1]) + d) / 2;
24
+ return /* @__PURE__ */ e("g", { children: u.slice(0, -1).map((n, u) => /* @__PURE__ */ t("g", {
25
+ transform: `translate(${p(u)},0)`,
26
+ children: [l && /* @__PURE__ */ e("line", {
27
+ y2: 4,
28
+ stroke: "#110529"
29
+ }), !c && /* @__PURE__ */ e("g", {
30
+ transform: r(s),
31
+ children: (o[n] ?? []).map((t, n) => /* @__PURE__ */ e("text", {
32
+ y: 4,
33
+ fill: "#110529",
34
+ fontSize: "14px",
35
+ fontWeight: "500",
36
+ fontFamily: "Manrope",
37
+ dominantBaseline: i(s),
38
+ textAnchor: a(s),
39
+ dy: 20 * n,
40
+ children: t
41
+ }, `${t}_${n}`))
42
+ })]
43
+ }, `xlabel_${u}`)) });
44
+ };
45
+ export { o as SelectionXAxis };
46
+
47
+ //# sourceMappingURL=SelectionXAxis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionXAxis.js","names":[],"sources":["../../../../src/selection/components/Chart/SelectionXAxis.tsx"],"sourcesContent":["import React from 'react';\nimport type { ScaleBand } from 'd3-scale';\nimport { BLACK } from '../../../constants';\nimport { DEFAULT_TICKS_SIZE, TICK_OFFSET } from '../../../discrete/constants';\n\ntype LabelsPosition = 'center' | '45deg' | '90deg';\n\nconst FONT_HEIGHT = 21;\n\nfunction getRotationTransform(labelsPosition: LabelsPosition) {\n if (labelsPosition === '45deg') {\n return `translate(0,${FONT_HEIGHT / 2}) rotate(-45)`;\n }\n if (labelsPosition === '90deg') {\n return `translate(${-FONT_HEIGHT / 2},${TICK_OFFSET + FONT_HEIGHT / 2}) rotate(-90)`;\n }\n return `translate(0,${TICK_OFFSET})`;\n}\n\nfunction getDominantBaseline(labelsPosition: LabelsPosition) {\n if (labelsPosition === '90deg') return 'central';\n if (labelsPosition === 'center') return 'hanging';\n return 'auto';\n}\n\nfunction getTextAnchor(labelsPosition: LabelsPosition) {\n return labelsPosition === 'center' ? 'middle' : 'end';\n}\n\n/**\n * X-axis for the Selection Plot. Unlike the shared {@link BandAxis}, category\n * labels (and their tick marks) are placed in the gaps BETWEEN bars — so they\n * label the funnels (transitions) rather than the populations, and the terminal\n * bar carries no tick/label. Rendered inside a `translate(0, height)` group\n * (the axis baseline), so the ticks and labels hang below it.\n */\nexport const SelectionXAxis = ({\n scale,\n labels = {},\n labelsPosition = 'center',\n hiddenLabels = false,\n showTicks = true,\n}: {\n scale: ScaleBand<string>;\n labels?: Record<string, string[]>;\n labelsPosition?: LabelsPosition;\n hiddenLabels?: boolean;\n showTicks?: boolean;\n}) => {\n if (hiddenLabels && !showTicks) return null;\n\n const values = scale.domain();\n const bandwidth = scale.bandwidth();\n const bandStart = (tick: string) => scale(tick) ?? 0;\n // Midpoint between consecutive band starts — the gap between bar i and i+1,\n // matching the between-band gridline positions.\n const gapMidpoint = (i: number) =>\n (bandStart(values[i]) + bandStart(values[i + 1]) + bandwidth) / 2;\n\n return (\n <g>\n {values.slice(0, -1).map((tick, i) => (\n <g key={`xlabel_${i}`} transform={`translate(${gapMidpoint(i)},0)`}>\n {showTicks && <line y2={DEFAULT_TICKS_SIZE} stroke={BLACK} />}\n {!hiddenLabels && (\n <g transform={getRotationTransform(labelsPosition)}>\n {(labels[tick] ?? []).map((line, idx) => (\n <text\n key={`${line}_${idx}`}\n y={TICK_OFFSET}\n fill={BLACK}\n fontSize=\"14px\"\n fontWeight=\"500\"\n fontFamily=\"Manrope\"\n dominantBaseline={getDominantBaseline(labelsPosition)}\n textAnchor={getTextAnchor(labelsPosition)}\n dy={20 * idx}\n >\n {line}\n </text>\n ))}\n </g>\n )}\n </g>\n ))}\n </g>\n );\n};\n"],"mappings":";;;AAOA,IAAM,IAAc;AAEpB,SAAS,EAAqB,GAAgC;AAO5D,QANI,MAAmB,UACd,eAAe,IAAc,EAAE,iBAEpC,MAAmB,UACd,aAAa,CAAC,IAAc,EAAE,GAAA,IAAiB,IAAc,EAAE,iBAEjE;;AAGT,SAAS,EAAoB,GAAgC;AAG3D,QAFI,MAAmB,UAAgB,YACnC,MAAmB,WAAiB,YACjC;;AAGT,SAAS,EAAc,GAAgC;AACrD,QAAO,MAAmB,WAAW,WAAW;;;;;;;;;AAUlD,MAAa,KAAkB,EAC7B,UACA,YAAS,EAAE,EACX,oBAAiB,UACjB,kBAAe,IACf,eAAY,SAOR;AACJ,KAAI,KAAgB,CAAC,EAAW,QAAO;CAEvC,IAAM,IAAS,EAAM,QAAQ,EACvB,IAAY,EAAM,WAAW,EAC7B,KAAa,MAAiB,EAAM,EAAK,IAAI,GAG7C,KAAe,OAClB,EAAU,EAAO,GAAG,GAAG,EAAU,EAAO,IAAI,GAAG,GAAG,KAAa;AAElE,QACE,kBAAC,KAAD,EAAA,UACG,EAAO,MAAM,GAAG,GAAG,CAAC,KAAK,GAAM,MAC9B,kBAAC,KAAD;EAAuB,WAAW,aAAa,EAAY,EAAE,CAAC;YAA9D,CACG,KAAa,kBAAC,QAAD;GAAM,IAAA;GAAwB,QAAA;GAAiB,CAAA,EAC5D,CAAC,KACF,kBAAC,KAAD;GAAG,WAAW,EAAqB,EAAe;cAC9C,EAAO,MAAS,EAAE,EAAE,KAAK,GAAM,MAC/B,kBAAC,QAAD;IAEE,GAAA;IACA,MAAA;IACA,UAAS;IACT,YAAW;IACX,YAAW;IACX,kBAAkB,EAAoB,EAAe;IACrD,YAAY,EAAc,EAAe;IACzC,IAAI,KAAK;cAER;IACI,EAXA,GAAG,EAAK,GAAG,IAWX,CACP;GACA,CAAA,CAEF;IArBI,UAAU,IAqBd,CACJ,EACA,CAAA"}
@@ -93,7 +93,6 @@ export type ChartXAxis = {
93
93
  counts?: Record<string, string>;
94
94
  countsFontSize?: number;
95
95
  labelsPosition?: 'center' | '45deg' | '90deg';
96
- showGrid?: boolean;
97
96
  showTicks?: boolean;
98
97
  hiddenLabels?: boolean;
99
98
  title?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/selection/components/Chart/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,0FAA0F;AAC1F,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,WAAW,GAAG,WAAW,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAEhB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,WAAW,GAAG,WAAW,CAAC;IACnC,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,gEAAgE;AAChE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC9C,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,kCAAkC;AAClC,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAC/B,CAAC;AAEF,6CAA6C;AAC7C,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,WAAW,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AAEF,oFAAoF;AACpF,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,oEAAoE;AACpE,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,SAAS,CAAC;IACnB,IAAI,EAAE,SAAS,CAAC;CACjB,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,4FAA4F;IAC5F,SAAS,EAAE,OAAO,CAAC;IACnB,yFAAyF;IACzF,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,oDAAoD;AACpD,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B,CAAC;AAEF,gFAAgF;AAChF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAC7C,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,qDAAqD;AACrD,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IAC9C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,qCAAqC;AACrC,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,6FAA6F;AAC7F,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,0DAA0D;AAC1D,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,yEAAyE;IACzE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gEAAgE;IAChE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,uFAAuF;IACvF,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAEF,oEAAoE;AACpE,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5C,cAAc,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACrD,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/selection/components/Chart/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,0FAA0F;AAC1F,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,WAAW,GAAG,WAAW,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAEhB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,WAAW,GAAG,WAAW,CAAC;IACnC,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,gEAAgE;AAChE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC9C,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,kCAAkC;AAClC,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAC/B,CAAC;AAEF,6CAA6C;AAC7C,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,WAAW,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AAEF,oFAAoF;AACpF,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,oEAAoE;AACpE,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,SAAS,CAAC;IACnB,IAAI,EAAE,SAAS,CAAC;CACjB,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,4FAA4F;IAC5F,SAAS,EAAE,OAAO,CAAC;IACnB,yFAAyF;IACzF,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,oDAAoD;AACpD,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B,CAAC;AAEF,gFAAgF;AAChF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAC7C,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,qDAAqD;AACrD,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,qCAAqC;AACrC,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,6FAA6F;AAC7F,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,0DAA0D;AAC1D,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,yEAAyE;IACzE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gEAAgE;IAChE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,uFAAuF;IACvF,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAEF,oEAAoE;AACpE,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5C,cAAc,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACrD,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../../src/selection/components/Chart.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAQtE,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,UAAU,EAIX,MAAM,eAAe,CAAC;AAEvB,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,uBAAuB,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,gBAAgB,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,KAAK,6CAoGhB,CAAC"}
1
+ {"version":3,"file":"Chart.d.ts","sourceRoot":"","sources":["../../../src/selection/components/Chart.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAQtE,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,UAAU,EAIX,MAAM,eAAe,CAAC;AAEvB,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,uBAAuB,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,gBAAgB,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,KAAK,6CA2FhB,CAAC"}
@@ -14,7 +14,7 @@ const d = c(function({ data: c, grouped: d, orderedGroupNames: f, layout: p, xAx
14
14
  let { width: b, height: x, dimensionsLeft: S, dimensionsTop: C, paddingLeft: w, paddingTop: T, xScale: E, yScale: D } = p, { hoveredGroup: O, selectedGroup: k, onGroupClick: A, onGroupHover: j, tooltipsData: M, facetKey: N } = _, P = k && y.includes(k) ? k : null, F = O && y.includes(O) ? O : null, I = f ? f.filter((e) => y.includes(e)) : y, L = e(({ stageIndex: e, section: t, stage: n, anchorX: r, anchorY: i, groupName: a }) => {
15
15
  let o = n.total, s = t === "preserved" ? n.surviving : n.discarded;
16
16
  if (a) {
17
- let e = n.groups.find((e) => e.name === a);
17
+ let e = n.groups.get(a);
18
18
  s = t === "preserved" ? e?.surviving ?? 0 : e?.discarded ?? 0;
19
19
  }
20
20
  M.onMouseEnter({
@@ -42,17 +42,13 @@ const d = c(function({ data: c, grouped: d, orderedGroupNames: f, layout: p, xAx
42
42
  onGroupHover: j,
43
43
  onTooltipEnter: L,
44
44
  onTooltipLeave: R
45
- }, H = m.showGrid ?? !1, U = h.showGrid ?? !0, W = g.frameType ?? "left-bottom";
45
+ }, H = h.showGrid ?? !0, U = g.frameType ?? "left-bottom";
46
46
  return /* @__PURE__ */ u("g", {
47
47
  transform: `translate(${S + w},${C + T})`,
48
48
  children: [
49
- /* @__PURE__ */ l(a, {
50
- xScale: E,
51
- yScale: D,
52
- width: b,
53
- height: x,
54
- xShow: H,
55
- yShow: U
49
+ H && /* @__PURE__ */ l(a, {
50
+ scale: D,
51
+ width: b
56
52
  }),
57
53
  /* @__PURE__ */ l(o, {
58
54
  stages: v,
@@ -75,9 +71,8 @@ const d = c(function({ data: c, grouped: d, orderedGroupNames: f, layout: p, xAx
75
71
  /* @__PURE__ */ l(r, {
76
72
  width: b,
77
73
  height: x,
78
- frameType: W,
79
- xShowGrid: H,
80
- yShowGrid: U
74
+ frameType: U,
75
+ showGrid: H
81
76
  }),
82
77
  /* @__PURE__ */ l(s, {
83
78
  xScale: E,
@@ -1 +1 @@
1
- {"version":3,"file":"Chart.js","names":[],"sources":["../../../src/selection/components/Chart.tsx"],"sourcesContent":["import { memo } from 'react';\n\nimport { useFunction } from '../../utils/hooks/useFunction';\nimport type { AggregatedSelectionData } from '../createSelectionData';\nimport { Bars } from './Chart/Bars';\nimport { ChartAxes } from './Chart/ChartAxes';\nimport { ChartFrame } from './Chart/ChartFrame';\nimport { Dividers } from './Chart/Dividers';\nimport { Gridlines } from './Chart/Gridlines';\nimport { Ribbons } from './Chart/Ribbons';\nimport { StageCounts } from './Chart/StageCounts';\nimport type {\n CellLayout,\n ChartInteraction,\n ChartStyle,\n ChartXAxis,\n ChartYAxis,\n GroupContext,\n StageHandlers,\n TooltipEnterParams,\n} from './Chart/types';\n\nexport type { StageTooltipData } from './Chart/types';\n\ntype Props = {\n data: AggregatedSelectionData;\n grouped: boolean;\n /**\n * User-preferred group iteration order (union across all facets) — drives\n * stacked-bar rendering. When omitted, falls back to the per-facet\n * `data.groupNames` order. Per-facet `data.groupNames` is alphabetical, so\n * without this prop the user's chosen order in the Layers form has no\n * effect on the chart.\n */\n orderedGroupNames?: string[];\n layout: CellLayout;\n xAxis: ChartXAxis;\n yAxis: ChartYAxis;\n style: ChartStyle;\n interaction: ChartInteraction;\n};\n\nexport const Chart = memo(function Chart({\n data,\n grouped,\n orderedGroupNames,\n layout,\n xAxis,\n yAxis,\n style,\n interaction,\n}: Props) {\n const { stages, groupNames } = data;\n if (stages.length === 0) return null;\n\n const { width, height, dimensionsLeft, dimensionsTop, paddingLeft, paddingTop, xScale, yScale } =\n layout;\n const { hoveredGroup, selectedGroup, onGroupClick, onGroupHover, tooltipsData, facetKey } =\n interaction;\n\n // Click-pinned active group (only): drives single-group bar rendering.\n // Hover never hides bars — only dims them and re-routes the ribbon flow.\n const facetActiveGroup =\n selectedGroup && groupNames.includes(selectedGroup) ? selectedGroup : null;\n const facetHoveredGroup = hoveredGroup && groupNames.includes(hoveredGroup) ? hoveredGroup : null;\n const stackOrder = orderedGroupNames\n ? orderedGroupNames.filter((g) => groupNames.includes(g))\n : groupNames;\n\n const onTooltipEnter = useFunction(\n ({ stageIndex, section, stage, anchorX, anchorY, groupName }: TooltipEnterParams) => {\n const total = stage.total;\n let count = section === 'preserved' ? stage.surviving : stage.discarded;\n if (groupName) {\n const g = stage.groups.find((gg) => gg.name === groupName);\n count = section === 'preserved' ? (g?.surviving ?? 0) : (g?.discarded ?? 0);\n }\n tooltipsData.onMouseEnter(\n {\n stageIndex,\n section,\n groupName,\n count,\n total,\n percent: total > 0 ? (count / total) * 100 : 0,\n x: anchorX,\n y: anchorY,\n },\n facetKey,\n );\n },\n );\n const onTooltipLeave = useFunction(() => tooltipsData.onMouseLeave());\n\n const geometry = { xScale, yScale, height };\n const groupCtx: GroupContext = {\n grouped,\n groupNames,\n facetActiveGroup,\n facetHoveredGroup,\n stackOrder,\n };\n const handlers: StageHandlers = {\n onGroupClick,\n onGroupHover,\n onTooltipEnter,\n onTooltipLeave,\n };\n const xShowGrid = xAxis.showGrid ?? false;\n const yShowGrid = yAxis.showGrid ?? true;\n const frameType = style.frameType ?? 'left-bottom';\n\n return (\n <g transform={`translate(${dimensionsLeft + paddingLeft},${dimensionsTop + paddingTop})`}>\n <Gridlines\n xScale={xScale}\n yScale={yScale}\n width={width}\n height={height}\n xShow={xShowGrid}\n yShow={yShowGrid}\n />\n <Ribbons stages={stages} geometry={geometry} groupCtx={groupCtx} style={style} />\n <Bars\n stages={stages}\n geometry={geometry}\n groupCtx={groupCtx}\n style={style}\n handlers={handlers}\n />\n <Dividers stages={stages} geometry={geometry} suppressed={facetActiveGroup !== null} />\n <ChartFrame\n width={width}\n height={height}\n frameType={frameType}\n xShowGrid={xShowGrid}\n yShowGrid={yShowGrid}\n />\n <StageCounts xScale={xScale} counts={xAxis.counts} fontSize={xAxis.countsFontSize} />\n <ChartAxes layout={layout} xAxis={xAxis} yAxis={yAxis} />\n </g>\n );\n});\n"],"mappings":";;;;;;;;;;AA0CA,MAAa,IAAQ,EAAK,SAAe,EACvC,SACA,YACA,sBACA,WACA,UACA,UACA,UACA,kBACQ;CACR,IAAM,EAAE,WAAQ,kBAAe;AAC/B,KAAI,EAAO,WAAW,EAAG,QAAO;CAEhC,IAAM,EAAE,UAAO,WAAQ,mBAAgB,kBAAe,gBAAa,eAAY,WAAQ,cACrF,GACI,EAAE,iBAAc,kBAAe,iBAAc,iBAAc,iBAAc,gBAC7E,GAII,IACJ,KAAiB,EAAW,SAAS,EAAc,GAAG,IAAgB,MAClE,IAAoB,KAAgB,EAAW,SAAS,EAAa,GAAG,IAAe,MACvF,IAAa,IACf,EAAkB,QAAQ,MAAM,EAAW,SAAS,EAAE,CAAC,GACvD,GAEE,IAAiB,GACpB,EAAE,eAAY,YAAS,UAAO,YAAS,YAAS,mBAAoC;EACnF,IAAM,IAAQ,EAAM,OAChB,IAAQ,MAAY,cAAc,EAAM,YAAY,EAAM;AAC9D,MAAI,GAAW;GACb,IAAM,IAAI,EAAM,OAAO,MAAM,MAAO,EAAG,SAAS,EAAU;AAC1D,OAAQ,MAAY,cAAe,GAAG,aAAa,IAAM,GAAG,aAAa;;AAE3E,IAAa,aACX;GACE;GACA;GACA;GACA;GACA;GACA,SAAS,IAAQ,IAAK,IAAQ,IAAS,MAAM;GAC7C,GAAG;GACH,GAAG;GACJ,EACD,EACD;GAEJ,EACK,IAAiB,QAAkB,EAAa,cAAc,CAAC,EAE/D,IAAW;EAAE;EAAQ;EAAQ;EAAQ,EACrC,IAAyB;EAC7B;EACA;EACA;EACA;EACA;EACD,EACK,IAA0B;EAC9B;EACA;EACA;EACA;EACD,EACK,IAAY,EAAM,YAAY,IAC9B,IAAY,EAAM,YAAY,IAC9B,IAAY,EAAM,aAAa;AAErC,QACE,kBAAC,KAAD;EAAG,WAAW,aAAa,IAAiB,EAAY,GAAG,IAAgB,EAAW;YAAtF;GACE,kBAAC,GAAD;IACU;IACA;IACD;IACC;IACR,OAAO;IACP,OAAO;IACP,CAAA;GACF,kBAAC,GAAD;IAAiB;IAAkB;IAAoB;IAAiB;IAAS,CAAA;GACjF,kBAAC,GAAD;IACU;IACE;IACA;IACH;IACG;IACV,CAAA;GACF,kBAAC,GAAD;IAAkB;IAAkB;IAAU,YAAY,MAAqB;IAAQ,CAAA;GACvF,kBAAC,GAAD;IACS;IACC;IACG;IACA;IACA;IACX,CAAA;GACF,kBAAC,GAAD;IAAqB;IAAQ,QAAQ,EAAM;IAAQ,UAAU,EAAM;IAAkB,CAAA;GACrF,kBAAC,GAAD;IAAmB;IAAe;IAAc;IAAS,CAAA;GACvD;;EAEN"}
1
+ {"version":3,"file":"Chart.js","names":[],"sources":["../../../src/selection/components/Chart.tsx"],"sourcesContent":["import { memo } from 'react';\n\nimport { useFunction } from '../../utils/hooks/useFunction';\nimport type { AggregatedSelectionData } from '../createSelectionData';\nimport { Bars } from './Chart/Bars';\nimport { ChartAxes } from './Chart/ChartAxes';\nimport { ChartFrame } from './Chart/ChartFrame';\nimport { Dividers } from './Chart/Dividers';\nimport { Gridlines } from './Chart/Gridlines';\nimport { Ribbons } from './Chart/Ribbons';\nimport { StageCounts } from './Chart/StageCounts';\nimport type {\n CellLayout,\n ChartInteraction,\n ChartStyle,\n ChartXAxis,\n ChartYAxis,\n GroupContext,\n StageHandlers,\n TooltipEnterParams,\n} from './Chart/types';\n\nexport type { StageTooltipData } from './Chart/types';\n\ntype Props = {\n data: AggregatedSelectionData;\n grouped: boolean;\n /**\n * User-preferred group iteration order (union across all facets) — drives\n * stacked-bar rendering. When omitted, falls back to the per-facet\n * `data.groupNames` order. Per-facet `data.groupNames` is alphabetical, so\n * without this prop the user's chosen order in the Layers form has no\n * effect on the chart.\n */\n orderedGroupNames?: string[];\n layout: CellLayout;\n xAxis: ChartXAxis;\n yAxis: ChartYAxis;\n style: ChartStyle;\n interaction: ChartInteraction;\n};\n\nexport const Chart = memo(function Chart({\n data,\n grouped,\n orderedGroupNames,\n layout,\n xAxis,\n yAxis,\n style,\n interaction,\n}: Props) {\n const { stages, groupNames } = data;\n if (stages.length === 0) return null;\n\n const { width, height, dimensionsLeft, dimensionsTop, paddingLeft, paddingTop, xScale, yScale } =\n layout;\n const { hoveredGroup, selectedGroup, onGroupClick, onGroupHover, tooltipsData, facetKey } =\n interaction;\n\n // Click-pinned active group (only): drives single-group bar rendering.\n // Hover never hides bars — only dims them and re-routes the ribbon flow.\n const facetActiveGroup =\n selectedGroup && groupNames.includes(selectedGroup) ? selectedGroup : null;\n const facetHoveredGroup = hoveredGroup && groupNames.includes(hoveredGroup) ? hoveredGroup : null;\n const stackOrder = orderedGroupNames\n ? orderedGroupNames.filter((g) => groupNames.includes(g))\n : groupNames;\n\n const onTooltipEnter = useFunction(\n ({ stageIndex, section, stage, anchorX, anchorY, groupName }: TooltipEnterParams) => {\n const total = stage.total;\n let count = section === 'preserved' ? stage.surviving : stage.discarded;\n if (groupName) {\n const g = stage.groups.get(groupName);\n count = section === 'preserved' ? (g?.surviving ?? 0) : (g?.discarded ?? 0);\n }\n tooltipsData.onMouseEnter(\n {\n stageIndex,\n section,\n groupName,\n count,\n total,\n percent: total > 0 ? (count / total) * 100 : 0,\n x: anchorX,\n y: anchorY,\n },\n facetKey,\n );\n },\n );\n const onTooltipLeave = useFunction(() => tooltipsData.onMouseLeave());\n\n const geometry = { xScale, yScale, height };\n const groupCtx: GroupContext = {\n grouped,\n groupNames,\n facetActiveGroup,\n facetHoveredGroup,\n stackOrder,\n };\n const handlers: StageHandlers = {\n onGroupClick,\n onGroupHover,\n onTooltipEnter,\n onTooltipLeave,\n };\n const showGrid = yAxis.showGrid ?? true;\n const frameType = style.frameType ?? 'left-bottom';\n\n return (\n <g transform={`translate(${dimensionsLeft + paddingLeft},${dimensionsTop + paddingTop})`}>\n {showGrid && <Gridlines scale={yScale} width={width} />}\n <Ribbons stages={stages} geometry={geometry} groupCtx={groupCtx} style={style} />\n <Bars\n stages={stages}\n geometry={geometry}\n groupCtx={groupCtx}\n style={style}\n handlers={handlers}\n />\n <Dividers stages={stages} geometry={geometry} suppressed={facetActiveGroup !== null} />\n <ChartFrame\n width={width}\n height={height}\n frameType={frameType}\n showGrid={showGrid}\n />\n <StageCounts xScale={xScale} counts={xAxis.counts} fontSize={xAxis.countsFontSize} />\n <ChartAxes layout={layout} xAxis={xAxis} yAxis={yAxis} />\n </g>\n );\n});\n"],"mappings":";;;;;;;;;;AA0CA,MAAa,IAAQ,EAAK,SAAe,EACvC,SACA,YACA,sBACA,WACA,UACA,UACA,UACA,kBACQ;CACR,IAAM,EAAE,WAAQ,kBAAe;AAC/B,KAAI,EAAO,WAAW,EAAG,QAAO;CAEhC,IAAM,EAAE,UAAO,WAAQ,mBAAgB,kBAAe,gBAAa,eAAY,WAAQ,cACrF,GACI,EAAE,iBAAc,kBAAe,iBAAc,iBAAc,iBAAc,gBAC7E,GAII,IACJ,KAAiB,EAAW,SAAS,EAAc,GAAG,IAAgB,MAClE,IAAoB,KAAgB,EAAW,SAAS,EAAa,GAAG,IAAe,MACvF,IAAa,IACf,EAAkB,QAAQ,MAAM,EAAW,SAAS,EAAE,CAAC,GACvD,GAEE,IAAiB,GACpB,EAAE,eAAY,YAAS,UAAO,YAAS,YAAS,mBAAoC;EACnF,IAAM,IAAQ,EAAM,OAChB,IAAQ,MAAY,cAAc,EAAM,YAAY,EAAM;AAC9D,MAAI,GAAW;GACb,IAAM,IAAI,EAAM,OAAO,IAAI,EAAU;AACrC,OAAQ,MAAY,cAAe,GAAG,aAAa,IAAM,GAAG,aAAa;;AAE3E,IAAa,aACX;GACE;GACA;GACA;GACA;GACA;GACA,SAAS,IAAQ,IAAK,IAAQ,IAAS,MAAM;GAC7C,GAAG;GACH,GAAG;GACJ,EACD,EACD;GAEJ,EACK,IAAiB,QAAkB,EAAa,cAAc,CAAC,EAE/D,IAAW;EAAE;EAAQ;EAAQ;EAAQ,EACrC,IAAyB;EAC7B;EACA;EACA;EACA;EACA;EACD,EACK,IAA0B;EAC9B;EACA;EACA;EACA;EACD,EACK,IAAW,EAAM,YAAY,IAC7B,IAAY,EAAM,aAAa;AAErC,QACE,kBAAC,KAAD;EAAG,WAAW,aAAa,IAAiB,EAAY,GAAG,IAAgB,EAAW;YAAtF;GACG,KAAY,kBAAC,GAAD;IAAW,OAAO;IAAe;IAAS,CAAA;GACvD,kBAAC,GAAD;IAAiB;IAAkB;IAAoB;IAAiB;IAAS,CAAA;GACjF,kBAAC,GAAD;IACU;IACE;IACA;IACH;IACG;IACV,CAAA;GACF,kBAAC,GAAD;IAAkB;IAAkB;IAAU,YAAY,MAAqB;IAAQ,CAAA;GACvF,kBAAC,GAAD;IACS;IACC;IACG;IACD;IACV,CAAA;GACF,kBAAC,GAAD;IAAqB;IAAQ,QAAQ,EAAM;IAAQ,UAAU,EAAM;IAAkB,CAAA;GACrF,kBAAC,GAAD;IAAmB;IAAe;IAAc;IAAS,CAAA;GACvD;;EAEN"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChartsGroup.d.ts","sourceRoot":"","sources":["../../../src/selection/components/ChartsGroup.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,UAAU,EACX,MAAM,SAAS,CAAC;AAajB,KAAK,KAAK,GAAG;IACX,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,gBAAgB,CAAC;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,UAAU,EACV,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,MAAM,EACN,eAAe,EACf,OAAO,EACP,iBAAiB,GAClB,EAAE,KAAK,2CAsOP"}
1
+ {"version":3,"file":"ChartsGroup.d.ts","sourceRoot":"","sources":["../../../src/selection/components/ChartsGroup.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,UAAU,EACX,MAAM,SAAS,CAAC;AAajB,KAAK,KAAK,GAAG;IACX,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,gBAAgB,CAAC;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,UAAU,EACV,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,MAAM,EACN,eAAe,EACf,OAAO,EACP,iBAAiB,GAClB,EAAE,KAAK,2CAqOP"}