@milaboratories/miplots4 1.2.4 → 1.3.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.
Files changed (30) hide show
  1. package/dist/discrete/components/layers/ErrorBarElement.d.ts.map +1 -1
  2. package/dist/discrete/components/layers/ErrorBarElement.js +1 -0
  3. package/dist/discrete/components/layers/ErrorBarElement.js.map +1 -1
  4. package/dist/discrete/components/layers/LineElement.d.ts.map +1 -1
  5. package/dist/discrete/components/layers/LineElement.js +1 -0
  6. package/dist/discrete/components/layers/LineElement.js.map +1 -1
  7. package/dist/scatterplot/ChartRenderer.d.ts.map +1 -1
  8. package/dist/scatterplot/ChartRenderer.js +2 -1
  9. package/dist/scatterplot/ChartRenderer.js.map +1 -1
  10. package/dist/scatterplot/ScatterplotSettingsImpl.d.ts +1 -0
  11. package/dist/scatterplot/ScatterplotSettingsImpl.d.ts.map +1 -1
  12. package/dist/scatterplot/ScatterplotSettingsImpl.js +2 -1
  13. package/dist/scatterplot/ScatterplotSettingsImpl.js.map +1 -1
  14. package/dist/scatterplot/components/ChartTrendsData.d.ts.map +1 -1
  15. package/dist/scatterplot/components/ChartTrendsData.js +2 -1
  16. package/dist/scatterplot/components/ChartTrendsData.js.map +1 -1
  17. package/dist/scatterplot/components/types.d.ts +1 -0
  18. package/dist/scatterplot/components/types.d.ts.map +1 -1
  19. package/dist/scatterplot-umap/ChartRenderer.d.ts.map +1 -1
  20. package/dist/scatterplot-umap/ChartRenderer.js +2 -0
  21. package/dist/scatterplot-umap/ChartRenderer.js.map +1 -1
  22. package/dist/scatterplot-umap/components/LowerSVG.js +1 -1
  23. package/dist/scatterplot-umap/components/LowerSVG.js.map +1 -1
  24. package/dist/scatterplot-umap/types.d.ts +1 -0
  25. package/dist/scatterplot-umap/types.d.ts.map +1 -1
  26. package/dist/types/scatterplot.d.ts +5 -0
  27. package/dist/types/scatterplot.d.ts.map +1 -1
  28. package/dist/types/scatterplot.js +2 -1
  29. package/dist/types/scatterplot.js.map +1 -1
  30. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorBarElement.d.ts","sourceRoot":"","sources":["../../../../src/discrete/components/layers/ErrorBarElement.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,KAAK,EAA+B,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG/E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,UAAU,aAAa;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1B,aAAa,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAmBD,wBAAgB,eAAe,CAAC,EAC5B,QAAQ,EACR,MAAM,EACN,WAAW,EACX,QAAQ,EACR,GAAG,EACH,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,iBAAiB,EACjB,YAAY,GACf,EAAE,aAAa,2CAuEf"}
1
+ {"version":3,"file":"ErrorBarElement.d.ts","sourceRoot":"","sources":["../../../../src/discrete/components/layers/ErrorBarElement.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,KAAK,EAA+B,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG/E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,UAAU,aAAa;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1B,aAAa,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAmBD,wBAAgB,eAAe,CAAC,EAC5B,QAAQ,EACR,MAAM,EACN,WAAW,EACX,QAAQ,EACR,GAAG,EACH,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,iBAAiB,EACjB,YAAY,GACf,EAAE,aAAa,2CAwEf"}
@@ -13,6 +13,7 @@ function o(e, t, n, r) {
13
13
  function s({ facetKey: s, scales: c, orientation: l, errorBar: u, aes: d, sideDistances: f, showTooltips: p, activeElementContainer: m, tooltipsContainer: h, tooltipsData: g }) {
14
14
  let _ = l === "vertical", v = o(c, "lineColor", d.lineColor, u), y = o(c, "fillColor", d.fillColor, u), b = o(c, "dotShape", d.dotShape, u), x = (c.xPrimary(u.primaryGrouping) ?? 0) + c.xPrimary.bandwidth() / 2, S = d.width === "auto" ? c.xPrimary.bandwidth() * .2 : d.width, C = c.y(u.min), w = c.y(u.max), T = c.y(u.value), E = n(b, d.dotSize, y), D = m && g.fixed, O = g.selectedData === u && D, k = d.showDots ? /* @__PURE__ */ i("g", {
15
15
  transform: _ ? `translate(${x},${T})` : `translate(${T},${x})`,
16
+ strokeWidth: 1,
16
17
  children: [
17
18
  E,
18
19
  p && h && /* @__PURE__ */ r("circle", {
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorBarElement.js","names":[],"sources":["../../../../src/discrete/components/layers/ErrorBarElement.tsx"],"sourcesContent":["import { createPortal } from 'react-dom';\nimport type { TooltipsData } from '../../../common/Tooltip';\nimport { Tooltip } from '../../../common/Tooltip';\nimport type { AesItem, InheritAesDiscrete, Orientation } from '../../../types';\nimport { getPointShape } from '../../../utils/getPointShape';\nimport { numberFormat } from '../../../utils/numberFormat';\nimport type { ErrorBar } from '../../layers';\nimport type { ErrorBarsData } from '../../layers/types';\nimport type { ChartScales } from '../types';\n\ninterface ErrorBarProps {\n facetKey: string;\n scales: ChartScales;\n errorBar: ErrorBar;\n orientation: Orientation;\n aes: ErrorBarsData['aes'];\n sideDistances: {\n left: number;\n right: number;\n top: number;\n bottom: number;\n };\n showTooltips: boolean;\n tooltipsData: TooltipsData<unknown>;\n activeElementContainer?: Element;\n tooltipsContainer?: Element;\n}\n\nfunction getAesValue<ValueType>(\n scales: ChartScales,\n field: keyof AesItem,\n value: ValueType | InheritAesDiscrete,\n geom: ErrorBar\n): ValueType {\n if (value && typeof value === 'object' && 'type' in value) {\n if (value.type === 'primaryGrouping') {\n return scales.xPrimaryAes(geom.primaryGrouping)[field] as ValueType;\n }\n if (value.type === 'secondaryGrouping') {\n return scales.xSecondaryAes(geom.secondaryGrouping)[field] as ValueType;\n }\n }\n return value as ValueType;\n}\n\nexport function ErrorBarElement({\n facetKey,\n scales,\n orientation,\n errorBar,\n aes,\n sideDistances,\n showTooltips,\n activeElementContainer,\n tooltipsContainer,\n tooltipsData,\n}: ErrorBarProps) {\n const isVertical = orientation === 'vertical';\n const lineColor = getAesValue(scales, 'lineColor', aes.lineColor, errorBar);\n const fillColor = getAesValue(scales, 'fillColor', aes.fillColor, errorBar);\n const dotShape = getAesValue(scales, 'dotShape', aes.dotShape, errorBar);\n const x = (scales.xPrimary(errorBar.primaryGrouping) ?? 0) + scales.xPrimary.bandwidth() / 2;\n const width = aes.width === 'auto' ? scales.xPrimary.bandwidth() * 0.2 : aes.width;\n const min = scales.y(errorBar.min);\n const max = scales.y(errorBar.max);\n const value = scales.y(errorBar.value);\n const shape = getPointShape(dotShape, aes.dotSize, fillColor);\n const dimmedBackground = activeElementContainer && tooltipsData.fixed;\n const highlightedDot = tooltipsData.selectedData === errorBar && dimmedBackground;\n\n const dot = aes.showDots ? (\n <g transform={isVertical ? `translate(${x},${value})` : `translate(${value},${x})`}>\n {shape}\n {showTooltips && tooltipsContainer && (\n <circle\n onMouseOver={() => tooltipsData.onMouseEnter(errorBar, facetKey)}\n onMouseLeave={() => tooltipsData.onMouseLeave()}\n r=\"15\"\n fill=\"transparent\"\n stroke=\"none\"\n />\n )}\n {showTooltips && (\n <Tooltip\n content={[numberFormat(errorBar.value)]}\n x={isVertical ? x : value}\n y={isVertical ? value : x}\n sideDistances={sideDistances}\n horizontal\n active={tooltipsData.active && tooltipsData.selectedData === errorBar && tooltipsData.currentFacet === facetKey}\n fixed={tooltipsData.fixed}\n onClose={tooltipsData.onClose}\n container={tooltipsContainer}\n />\n )}\n </g>\n ) : null;\n return (\n <g\n opacity={aes.opacity}\n stroke={lineColor}\n fill=\"none\"\n strokeWidth={aes.lineWidth}\n >\n <g transform={isVertical ? `translate(${x},0)` : `translate(0,${x})`}>\n <line\n x1={isVertical ? 0 : min}\n x2={isVertical ? 0 : max}\n y1={isVertical ? min : 0}\n y2={isVertical ? max : 0}\n />\n <line\n x1={isVertical ? -width / 2 : min}\n x2={isVertical ? width / 2 : min}\n y1={isVertical ? min : -width / 2}\n y2={isVertical ? min : width / 2}\n />\n <line\n x1={isVertical ? -width / 2 : max}\n x2={isVertical ? width / 2 : max}\n y1={isVertical ? max : -width / 2}\n y2={isVertical ? max : width / 2}\n />\n </g>\n {highlightedDot ? createPortal(dot, activeElementContainer) : dot}\n </g>\n );\n}\n"],"mappings":";;;;;AA4BA,SAAS,EACL,GACA,GACA,GACA,GACS;AACT,KAAI,KAAS,OAAO,KAAU,YAAY,UAAU,GAAO;AACvD,MAAI,EAAM,SAAS,kBACf,QAAO,EAAO,YAAY,EAAK,gBAAgB,CAAC;AAEpD,MAAI,EAAM,SAAS,oBACf,QAAO,EAAO,cAAc,EAAK,kBAAkB,CAAC;;AAG5D,QAAO;;AAGX,SAAgB,EAAgB,EAC5B,aACA,WACA,gBACA,aACA,QACA,kBACA,iBACA,2BACA,sBACA,mBACc;CACd,IAAM,IAAa,MAAgB,YAC7B,IAAY,EAAY,GAAQ,aAAa,EAAI,WAAW,EAAS,EACrE,IAAY,EAAY,GAAQ,aAAa,EAAI,WAAW,EAAS,EACrE,IAAW,EAAY,GAAQ,YAAY,EAAI,UAAU,EAAS,EAClE,KAAK,EAAO,SAAS,EAAS,gBAAgB,IAAI,KAAK,EAAO,SAAS,WAAW,GAAG,GACrF,IAAQ,EAAI,UAAU,SAAS,EAAO,SAAS,WAAW,GAAG,KAAM,EAAI,OACvE,IAAM,EAAO,EAAE,EAAS,IAAI,EAC5B,IAAM,EAAO,EAAE,EAAS,IAAI,EAC5B,IAAQ,EAAO,EAAE,EAAS,MAAM,EAChC,IAAQ,EAAc,GAAU,EAAI,SAAS,EAAU,EACvD,IAAmB,KAA0B,EAAa,OAC1D,IAAiB,EAAa,iBAAiB,KAAY,GAE3D,IAAM,EAAI,WACZ,kBAAC,KAAD;EAAG,WAAW,IAAa,aAAa,EAAE,GAAG,EAAM,KAAK,aAAa,EAAM,GAAG,EAAE;YAAhF;GACK;GACA,KAAgB,KACb,kBAAC,UAAD;IACI,mBAAmB,EAAa,aAAa,GAAU,EAAS;IAChE,oBAAoB,EAAa,cAAc;IAC/C,GAAE;IACF,MAAK;IACL,QAAO;IACT,CAAA;GAEL,KACG,kBAAC,GAAD;IACI,SAAS,CAAC,EAAa,EAAS,MAAM,CAAC;IACvC,GAAG,IAAa,IAAI;IACpB,GAAG,IAAa,IAAQ;IACT;IACf,YAAA;IACA,QAAQ,EAAa,UAAU,EAAa,iBAAiB,KAAY,EAAa,iBAAiB;IACvG,OAAO,EAAa;IACpB,SAAS,EAAa;IACtB,WAAW;IACb,CAAA;GAEN;MACJ;AACJ,QACI,kBAAC,KAAD;EACI,SAAS,EAAI;EACb,QAAQ;EACR,MAAK;EACL,aAAa,EAAI;YAJrB,CAMI,kBAAC,KAAD;GAAG,WAAW,IAAa,aAAa,EAAE,OAAO,eAAe,EAAE;aAAlE;IACI,kBAAC,QAAD;KACI,IAAI,IAAa,IAAI;KACrB,IAAI,IAAa,IAAI;KACrB,IAAI,IAAa,IAAM;KACvB,IAAI,IAAa,IAAM;KACzB,CAAA;IACF,kBAAC,QAAD;KACI,IAAI,IAAa,CAAC,IAAQ,IAAI;KAC9B,IAAI,IAAa,IAAQ,IAAI;KAC7B,IAAI,IAAa,IAAM,CAAC,IAAQ;KAChC,IAAI,IAAa,IAAM,IAAQ;KACjC,CAAA;IACF,kBAAC,QAAD;KACI,IAAI,IAAa,CAAC,IAAQ,IAAI;KAC9B,IAAI,IAAa,IAAQ,IAAI;KAC7B,IAAI,IAAa,IAAM,CAAC,IAAQ;KAChC,IAAI,IAAa,IAAM,IAAQ;KACjC,CAAA;IACF;MACH,IAAiB,EAAa,GAAK,EAAuB,GAAG,EAC9D"}
1
+ {"version":3,"file":"ErrorBarElement.js","names":[],"sources":["../../../../src/discrete/components/layers/ErrorBarElement.tsx"],"sourcesContent":["import { createPortal } from 'react-dom';\nimport type { TooltipsData } from '../../../common/Tooltip';\nimport { Tooltip } from '../../../common/Tooltip';\nimport type { AesItem, InheritAesDiscrete, Orientation } from '../../../types';\nimport { getPointShape } from '../../../utils/getPointShape';\nimport { numberFormat } from '../../../utils/numberFormat';\nimport type { ErrorBar } from '../../layers';\nimport type { ErrorBarsData } from '../../layers/types';\nimport type { ChartScales } from '../types';\n\ninterface ErrorBarProps {\n facetKey: string;\n scales: ChartScales;\n errorBar: ErrorBar;\n orientation: Orientation;\n aes: ErrorBarsData['aes'];\n sideDistances: {\n left: number;\n right: number;\n top: number;\n bottom: number;\n };\n showTooltips: boolean;\n tooltipsData: TooltipsData<unknown>;\n activeElementContainer?: Element;\n tooltipsContainer?: Element;\n}\n\nfunction getAesValue<ValueType>(\n scales: ChartScales,\n field: keyof AesItem,\n value: ValueType | InheritAesDiscrete,\n geom: ErrorBar\n): ValueType {\n if (value && typeof value === 'object' && 'type' in value) {\n if (value.type === 'primaryGrouping') {\n return scales.xPrimaryAes(geom.primaryGrouping)[field] as ValueType;\n }\n if (value.type === 'secondaryGrouping') {\n return scales.xSecondaryAes(geom.secondaryGrouping)[field] as ValueType;\n }\n }\n return value as ValueType;\n}\n\nexport function ErrorBarElement({\n facetKey,\n scales,\n orientation,\n errorBar,\n aes,\n sideDistances,\n showTooltips,\n activeElementContainer,\n tooltipsContainer,\n tooltipsData,\n}: ErrorBarProps) {\n const isVertical = orientation === 'vertical';\n const lineColor = getAesValue(scales, 'lineColor', aes.lineColor, errorBar);\n const fillColor = getAesValue(scales, 'fillColor', aes.fillColor, errorBar);\n const dotShape = getAesValue(scales, 'dotShape', aes.dotShape, errorBar);\n const x = (scales.xPrimary(errorBar.primaryGrouping) ?? 0) + scales.xPrimary.bandwidth() / 2;\n const width = aes.width === 'auto' ? scales.xPrimary.bandwidth() * 0.2 : aes.width;\n const min = scales.y(errorBar.min);\n const max = scales.y(errorBar.max);\n const value = scales.y(errorBar.value);\n const shape = getPointShape(dotShape, aes.dotSize, fillColor);\n const dimmedBackground = activeElementContainer && tooltipsData.fixed;\n const highlightedDot = tooltipsData.selectedData === errorBar && dimmedBackground;\n\n const dot = aes.showDots ? (\n // Dot border must not scale with the error bar's lineWidth; keep it at the fixed default.\n <g transform={isVertical ? `translate(${x},${value})` : `translate(${value},${x})`} strokeWidth={1}>\n {shape}\n {showTooltips && tooltipsContainer && (\n <circle\n onMouseOver={() => tooltipsData.onMouseEnter(errorBar, facetKey)}\n onMouseLeave={() => tooltipsData.onMouseLeave()}\n r=\"15\"\n fill=\"transparent\"\n stroke=\"none\"\n />\n )}\n {showTooltips && (\n <Tooltip\n content={[numberFormat(errorBar.value)]}\n x={isVertical ? x : value}\n y={isVertical ? value : x}\n sideDistances={sideDistances}\n horizontal\n active={tooltipsData.active && tooltipsData.selectedData === errorBar && tooltipsData.currentFacet === facetKey}\n fixed={tooltipsData.fixed}\n onClose={tooltipsData.onClose}\n container={tooltipsContainer}\n />\n )}\n </g>\n ) : null;\n return (\n <g\n opacity={aes.opacity}\n stroke={lineColor}\n fill=\"none\"\n strokeWidth={aes.lineWidth}\n >\n <g transform={isVertical ? `translate(${x},0)` : `translate(0,${x})`}>\n <line\n x1={isVertical ? 0 : min}\n x2={isVertical ? 0 : max}\n y1={isVertical ? min : 0}\n y2={isVertical ? max : 0}\n />\n <line\n x1={isVertical ? -width / 2 : min}\n x2={isVertical ? width / 2 : min}\n y1={isVertical ? min : -width / 2}\n y2={isVertical ? min : width / 2}\n />\n <line\n x1={isVertical ? -width / 2 : max}\n x2={isVertical ? width / 2 : max}\n y1={isVertical ? max : -width / 2}\n y2={isVertical ? max : width / 2}\n />\n </g>\n {highlightedDot ? createPortal(dot, activeElementContainer) : dot}\n </g>\n );\n}\n"],"mappings":";;;;;AA4BA,SAAS,EACL,GACA,GACA,GACA,GACS;AACT,KAAI,KAAS,OAAO,KAAU,YAAY,UAAU,GAAO;AACvD,MAAI,EAAM,SAAS,kBACf,QAAO,EAAO,YAAY,EAAK,gBAAgB,CAAC;AAEpD,MAAI,EAAM,SAAS,oBACf,QAAO,EAAO,cAAc,EAAK,kBAAkB,CAAC;;AAG5D,QAAO;;AAGX,SAAgB,EAAgB,EAC5B,aACA,WACA,gBACA,aACA,QACA,kBACA,iBACA,2BACA,sBACA,mBACc;CACd,IAAM,IAAa,MAAgB,YAC7B,IAAY,EAAY,GAAQ,aAAa,EAAI,WAAW,EAAS,EACrE,IAAY,EAAY,GAAQ,aAAa,EAAI,WAAW,EAAS,EACrE,IAAW,EAAY,GAAQ,YAAY,EAAI,UAAU,EAAS,EAClE,KAAK,EAAO,SAAS,EAAS,gBAAgB,IAAI,KAAK,EAAO,SAAS,WAAW,GAAG,GACrF,IAAQ,EAAI,UAAU,SAAS,EAAO,SAAS,WAAW,GAAG,KAAM,EAAI,OACvE,IAAM,EAAO,EAAE,EAAS,IAAI,EAC5B,IAAM,EAAO,EAAE,EAAS,IAAI,EAC5B,IAAQ,EAAO,EAAE,EAAS,MAAM,EAChC,IAAQ,EAAc,GAAU,EAAI,SAAS,EAAU,EACvD,IAAmB,KAA0B,EAAa,OAC1D,IAAiB,EAAa,iBAAiB,KAAY,GAE3D,IAAM,EAAI,WAEZ,kBAAC,KAAD;EAAG,WAAW,IAAa,aAAa,EAAE,GAAG,EAAM,KAAK,aAAa,EAAM,GAAG,EAAE;EAAI,aAAa;YAAjG;GACK;GACA,KAAgB,KACb,kBAAC,UAAD;IACI,mBAAmB,EAAa,aAAa,GAAU,EAAS;IAChE,oBAAoB,EAAa,cAAc;IAC/C,GAAE;IACF,MAAK;IACL,QAAO;IACT,CAAA;GAEL,KACG,kBAAC,GAAD;IACI,SAAS,CAAC,EAAa,EAAS,MAAM,CAAC;IACvC,GAAG,IAAa,IAAI;IACpB,GAAG,IAAa,IAAQ;IACT;IACf,YAAA;IACA,QAAQ,EAAa,UAAU,EAAa,iBAAiB,KAAY,EAAa,iBAAiB;IACvG,OAAO,EAAa;IACpB,SAAS,EAAa;IACtB,WAAW;IACb,CAAA;GAEN;MACJ;AACJ,QACI,kBAAC,KAAD;EACI,SAAS,EAAI;EACb,QAAQ;EACR,MAAK;EACL,aAAa,EAAI;YAJrB,CAMI,kBAAC,KAAD;GAAG,WAAW,IAAa,aAAa,EAAE,OAAO,eAAe,EAAE;aAAlE;IACI,kBAAC,QAAD;KACI,IAAI,IAAa,IAAI;KACrB,IAAI,IAAa,IAAI;KACrB,IAAI,IAAa,IAAM;KACvB,IAAI,IAAa,IAAM;KACzB,CAAA;IACF,kBAAC,QAAD;KACI,IAAI,IAAa,CAAC,IAAQ,IAAI;KAC9B,IAAI,IAAa,IAAQ,IAAI;KAC7B,IAAI,IAAa,IAAM,CAAC,IAAQ;KAChC,IAAI,IAAa,IAAM,IAAQ;KACjC,CAAA;IACF,kBAAC,QAAD;KACI,IAAI,IAAa,CAAC,IAAQ,IAAI;KAC9B,IAAI,IAAa,IAAQ,IAAI;KAC7B,IAAI,IAAa,IAAM,CAAC,IAAQ;KAChC,IAAI,IAAa,IAAM,IAAQ;KACjC,CAAA;IACF;MACH,IAAiB,EAAa,GAAK,EAAuB,GAAG,EAC9D"}
@@ -1 +1 @@
1
- {"version":3,"file":"LineElement.d.ts","sourceRoot":"","sources":["../../../../src/discrete/components/layers/LineElement.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,KAAK,EAAW,YAAY,EAAsB,WAAW,EAAc,MAAM,gBAAgB,CAAC;AAIzG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,UAAU,SAAS;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,EAAE,WAAW,CAAC;IACzB,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IACtB,aAAa,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,YAAY,CAAC;IAChC,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAyCD,wBAAgB,WAAW,CAAC,EACxB,QAAQ,EACR,MAAM,EACN,WAAW,EACX,IAAI,EACJ,GAAG,EACH,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,EACtB,iBAAiB,EACjB,YAAY,GACf,EAAE,SAAS,2CAoEX"}
1
+ {"version":3,"file":"LineElement.d.ts","sourceRoot":"","sources":["../../../../src/discrete/components/layers/LineElement.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,KAAK,EAAW,YAAY,EAAsB,WAAW,EAAc,MAAM,gBAAgB,CAAC;AAIzG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,UAAU,SAAS;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,EAAE,WAAW,CAAC;IACzB,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IACtB,aAAa,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,YAAY,CAAC;IAChC,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAyCD,wBAAgB,WAAW,CAAC,EACxB,QAAQ,EACR,MAAM,EACN,WAAW,EACX,IAAI,EACJ,GAAG,EACH,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,EACtB,iBAAiB,EACjB,YAAY,GACf,EAAE,SAAS,2CAsEX"}
@@ -41,6 +41,7 @@ function d({ facetKey: e, scales: d, orientation: f, line: p, aes: m, sideDistan
41
41
  transform: x ? `translate(${r},${c})` : `translate(${c},${r})`,
42
42
  strokeDasharray: "none",
43
43
  stroke: "none",
44
+ strokeWidth: 1,
44
45
  children: [
45
46
  D,
46
47
  g && y && /* @__PURE__ */ a("circle", {
@@ -1 +1 @@
1
- {"version":3,"file":"LineElement.js","names":[],"sources":["../../../../src/discrete/components/layers/LineElement.tsx"],"sourcesContent":["import { isArray } from 'lodash';\nimport { createPortal } from 'react-dom';\nimport type { TooltipsData } from '../../../common/Tooltip';\nimport { Tooltip } from '../../../common/Tooltip';\nimport type { AesItem, GroupingData, InheritAesDiscrete, Orientation, PointShape } from '../../../types';\nimport { getLineShape } from '../../../utils/getLineShape';\nimport { getPointShape } from '../../../utils/getPointShape';\nimport { numberFormat } from '../../../utils/numberFormat';\nimport type { Line } from '../../layers';\nimport type { LinesData } from '../../layers/types';\nimport type { ChartScales } from '../types';\n\ninterface LineProps {\n facetKey: string;\n scales: ChartScales;\n line: Line;\n orientation: Orientation;\n aes: LinesData['aes'];\n sideDistances: {\n left: number;\n right: number;\n top: number;\n bottom: number;\n };\n showTooltips: boolean;\n secondaryGrouping: GroupingData;\n tooltipsData: TooltipsData<unknown>;\n activeElementContainer?: Element;\n tooltipsContainer?: Element;\n}\n\nfunction getAesValue<ValueType>(\n scales: ChartScales,\n field: keyof AesItem,\n value: ValueType | InheritAesDiscrete,\n geom: Line\n): ValueType {\n if (value && typeof value === 'object' && 'type' in value) {\n if (value.type === 'primaryGrouping') {\n throw new Error('Line cannot have aesthetics by primary grouping');\n }\n if (value.type === 'secondaryGrouping') {\n return scales.xSecondaryAes(geom.key)[field] as ValueType;\n }\n }\n return value as ValueType;\n}\n\nfunction createPoints(\n points: Record<string, number>,\n primaryKeys: string[],\n scales: ChartScales\n): [number, number, string, number][] {\n const xShift = scales.xPrimary.bandwidth() / 2;\n return primaryKeys.map(\n key =>\n [(scales.xPrimary(key) ?? 0) + xShift, scales.y(points[key]), key, points[key]] as [\n number,\n number,\n string,\n number\n ]\n );\n}\n\nfunction getTooltipContent(secondaryGrouping:GroupingData, secondaryKey: string, value:number) {\n const keyLabel = secondaryGrouping.valueLabels[secondaryKey];\n return keyLabel ? [keyLabel, numberFormat(value)] : [numberFormat(value)];\n}\n\nexport function LineElement({\n facetKey,\n scales,\n orientation,\n line,\n aes,\n sideDistances,\n showTooltips,\n secondaryGrouping,\n activeElementContainer,\n tooltipsContainer,\n tooltipsData,\n}: LineProps) {\n const isVertical = orientation === 'vertical';\n const lineColor = getAesValue(scales, 'lineColor', aes.lineColor, line);\n const fillColor = getAesValue(scales, 'dotFill', aes.fillColor, line);\n const lineShape = getAesValue(scales, 'lineShape', aes.lineShape, line);\n const dotShape = getAesValue(scales, 'dotShape', aes.dotShape, line);\n const points = createPoints(line.dots, scales.xPrimary.domain(), scales);\n const shape = getPointShape(dotShape as PointShape, aes.dotSize, fillColor);\n const dimmedBackground = activeElementContainer && tooltipsData.fixed;\n\n return (\n <g\n opacity={aes.opacity}\n stroke={lineColor}\n strokeDasharray={getLineShape(lineShape)}\n strokeWidth={aes.lineWidth}\n >\n <polyline\n key={line.key}\n points={points.map(([x, y]) => (isVertical ? [x, y] : [y, x])).join(' ')}\n stroke={lineColor}\n fill=\"none\"\n />\n {aes.dotShape !== null && (\n <g>\n {points.map((geomValue) => {\n const [x, y, key, value] = geomValue;\n const data = tooltipsData.selectedData;\n const tooltipSelected = Boolean(data && facetKey === tooltipsData.currentFacet && isArray(data) && data.every((el, idx) => el === geomValue[idx]));\n const highlightedDot = tooltipSelected && dimmedBackground;\n const dot = (\n <g\n key={key}\n transform={isVertical ? `translate(${x},${y})` : `translate(${y},${x})`}\n strokeDasharray=\"none\"\n stroke=\"none\"\n >\n {shape}\n {showTooltips && tooltipsContainer && (\n <circle\n onMouseOver={() => tooltipsData.onMouseEnter(geomValue, facetKey)}\n onMouseLeave={() => tooltipsData.onMouseLeave()}\n r=\"15\"\n fill=\"transparent\"\n stroke=\"none\"\n />\n )}\n {showTooltips && (\n <Tooltip\n content={getTooltipContent(secondaryGrouping, line.key, value)}\n x={isVertical ? x : y}\n y={isVertical ? y : x}\n sideDistances={sideDistances}\n horizontal\n active={tooltipSelected}\n fixed={tooltipsData.fixed}\n onClose={tooltipsData.onClose}\n container={tooltipsContainer}\n />\n )}\n </g>\n );\n return highlightedDot ? createPortal(dot, activeElementContainer) : dot;\n })}\n </g>\n )}\n </g>\n );\n}\n"],"mappings":";;;;;;;AA+BA,SAAS,EACL,GACA,GACA,GACA,GACS;AACT,KAAI,KAAS,OAAO,KAAU,YAAY,UAAU,GAAO;AACvD,MAAI,EAAM,SAAS,kBACf,OAAU,MAAM,kDAAkD;AAEtE,MAAI,EAAM,SAAS,oBACf,QAAO,EAAO,cAAc,EAAK,IAAI,CAAC;;AAG9C,QAAO;;AAGX,SAAS,EACL,GACA,GACA,GACkC;CAClC,IAAM,IAAS,EAAO,SAAS,WAAW,GAAG;AAC7C,QAAO,EAAY,KACf,MACI;GAAE,EAAO,SAAS,EAAI,IAAI,KAAK;EAAQ,EAAO,EAAE,EAAO,GAAK;EAAE;EAAK,EAAO;EAAK,CAMtF;;AAGL,SAAS,EAAkB,GAAgC,GAAsB,GAAc;CAC3F,IAAM,IAAW,EAAkB,YAAY;AAC/C,QAAO,IAAW,CAAC,GAAU,EAAa,EAAM,CAAC,GAAG,CAAC,EAAa,EAAM,CAAC;;AAG7E,SAAgB,EAAY,EACxB,aACA,WACA,gBACA,SACA,QACA,kBACA,iBACA,sBACA,2BACA,sBACA,mBACU;CACV,IAAM,IAAa,MAAgB,YAC7B,IAAY,EAAY,GAAQ,aAAa,EAAI,WAAW,EAAK,EACjE,IAAY,EAAY,GAAQ,WAAW,EAAI,WAAW,EAAK,EAC/D,IAAY,EAAY,GAAQ,aAAa,EAAI,WAAW,EAAK,EACjE,IAAW,EAAY,GAAQ,YAAY,EAAI,UAAU,EAAK,EAC9D,IAAS,EAAa,EAAK,MAAM,EAAO,SAAS,QAAQ,EAAE,EAAO,EAClE,IAAQ,EAAc,GAAwB,EAAI,SAAS,EAAU,EACrE,IAAmB,KAA0B,EAAa;AAEhE,QACI,kBAAC,KAAD;EACI,SAAS,EAAI;EACb,QAAQ;EACR,iBAAiB,EAAa,EAAU;EACxC,aAAa,EAAI;YAJrB,CAMI,kBAAC,YAAD;GAEI,QAAQ,EAAO,KAAK,CAAC,GAAG,OAAQ,IAAa,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAE,CAAC,KAAK,IAAI;GACxE,QAAQ;GACR,MAAK;GACP,EAJO,EAAK,IAIZ,EACD,EAAI,aAAa,QACd,kBAAC,KAAD,EAAA,UACK,EAAO,KAAK,MAAc;GACvB,IAAM,CAAC,GAAG,GAAG,GAAK,KAAS,GACrB,IAAO,EAAa,cACpB,IAAkB,GAAQ,KAAQ,MAAa,EAAa,gBAAgB,EAAQ,EAAK,IAAI,EAAK,OAAO,GAAI,MAAQ,MAAO,EAAU,GAAK,GAC3I,IAAkB,KAAmB,GACrC,IACF,kBAAC,KAAD;IAEI,WAAW,IAAa,aAAa,EAAE,GAAG,EAAE,KAAK,aAAa,EAAE,GAAG,EAAE;IACrE,iBAAgB;IAChB,QAAO;cAJX;KAMK;KACA,KAAgB,KACb,kBAAC,UAAD;MACI,mBAAmB,EAAa,aAAa,GAAW,EAAS;MACjE,oBAAoB,EAAa,cAAc;MAC/C,GAAE;MACF,MAAK;MACL,QAAO;MACT,CAAA;KAEL,KACG,kBAAC,GAAD;MACI,SAAS,EAAkB,GAAmB,EAAK,KAAK,EAAM;MAC9D,GAAG,IAAa,IAAI;MACpB,GAAG,IAAa,IAAI;MACL;MACf,YAAA;MACA,QAAQ;MACR,OAAO,EAAa;MACpB,SAAS,EAAa;MACtB,WAAW;MACb,CAAA;KAEN;MA5BK,EA4BL;AAER,UAAO,IAAiB,EAAa,GAAK,EAAuB,GAAG;IACtE,EACF,CAAA,CAER"}
1
+ {"version":3,"file":"LineElement.js","names":[],"sources":["../../../../src/discrete/components/layers/LineElement.tsx"],"sourcesContent":["import { isArray } from 'lodash';\nimport { createPortal } from 'react-dom';\nimport type { TooltipsData } from '../../../common/Tooltip';\nimport { Tooltip } from '../../../common/Tooltip';\nimport type { AesItem, GroupingData, InheritAesDiscrete, Orientation, PointShape } from '../../../types';\nimport { getLineShape } from '../../../utils/getLineShape';\nimport { getPointShape } from '../../../utils/getPointShape';\nimport { numberFormat } from '../../../utils/numberFormat';\nimport type { Line } from '../../layers';\nimport type { LinesData } from '../../layers/types';\nimport type { ChartScales } from '../types';\n\ninterface LineProps {\n facetKey: string;\n scales: ChartScales;\n line: Line;\n orientation: Orientation;\n aes: LinesData['aes'];\n sideDistances: {\n left: number;\n right: number;\n top: number;\n bottom: number;\n };\n showTooltips: boolean;\n secondaryGrouping: GroupingData;\n tooltipsData: TooltipsData<unknown>;\n activeElementContainer?: Element;\n tooltipsContainer?: Element;\n}\n\nfunction getAesValue<ValueType>(\n scales: ChartScales,\n field: keyof AesItem,\n value: ValueType | InheritAesDiscrete,\n geom: Line\n): ValueType {\n if (value && typeof value === 'object' && 'type' in value) {\n if (value.type === 'primaryGrouping') {\n throw new Error('Line cannot have aesthetics by primary grouping');\n }\n if (value.type === 'secondaryGrouping') {\n return scales.xSecondaryAes(geom.key)[field] as ValueType;\n }\n }\n return value as ValueType;\n}\n\nfunction createPoints(\n points: Record<string, number>,\n primaryKeys: string[],\n scales: ChartScales\n): [number, number, string, number][] {\n const xShift = scales.xPrimary.bandwidth() / 2;\n return primaryKeys.map(\n key =>\n [(scales.xPrimary(key) ?? 0) + xShift, scales.y(points[key]), key, points[key]] as [\n number,\n number,\n string,\n number\n ]\n );\n}\n\nfunction getTooltipContent(secondaryGrouping:GroupingData, secondaryKey: string, value:number) {\n const keyLabel = secondaryGrouping.valueLabels[secondaryKey];\n return keyLabel ? [keyLabel, numberFormat(value)] : [numberFormat(value)];\n}\n\nexport function LineElement({\n facetKey,\n scales,\n orientation,\n line,\n aes,\n sideDistances,\n showTooltips,\n secondaryGrouping,\n activeElementContainer,\n tooltipsContainer,\n tooltipsData,\n}: LineProps) {\n const isVertical = orientation === 'vertical';\n const lineColor = getAesValue(scales, 'lineColor', aes.lineColor, line);\n const fillColor = getAesValue(scales, 'dotFill', aes.fillColor, line);\n const lineShape = getAesValue(scales, 'lineShape', aes.lineShape, line);\n const dotShape = getAesValue(scales, 'dotShape', aes.dotShape, line);\n const points = createPoints(line.dots, scales.xPrimary.domain(), scales);\n const shape = getPointShape(dotShape as PointShape, aes.dotSize, fillColor);\n const dimmedBackground = activeElementContainer && tooltipsData.fixed;\n\n return (\n <g\n opacity={aes.opacity}\n stroke={lineColor}\n strokeDasharray={getLineShape(lineShape)}\n strokeWidth={aes.lineWidth}\n >\n <polyline\n key={line.key}\n points={points.map(([x, y]) => (isVertical ? [x, y] : [y, x])).join(' ')}\n stroke={lineColor}\n fill=\"none\"\n />\n {aes.dotShape !== null && (\n <g>\n {points.map((geomValue) => {\n const [x, y, key, value] = geomValue;\n const data = tooltipsData.selectedData;\n const tooltipSelected = Boolean(data && facetKey === tooltipsData.currentFacet && isArray(data) && data.every((el, idx) => el === geomValue[idx]));\n const highlightedDot = tooltipSelected && dimmedBackground;\n const dot = (\n <g\n key={key}\n transform={isVertical ? `translate(${x},${y})` : `translate(${y},${x})`}\n strokeDasharray=\"none\"\n stroke=\"none\"\n // Dot border must not scale with the line's lineWidth; keep it at the fixed default.\n strokeWidth={1}\n >\n {shape}\n {showTooltips && tooltipsContainer && (\n <circle\n onMouseOver={() => tooltipsData.onMouseEnter(geomValue, facetKey)}\n onMouseLeave={() => tooltipsData.onMouseLeave()}\n r=\"15\"\n fill=\"transparent\"\n stroke=\"none\"\n />\n )}\n {showTooltips && (\n <Tooltip\n content={getTooltipContent(secondaryGrouping, line.key, value)}\n x={isVertical ? x : y}\n y={isVertical ? y : x}\n sideDistances={sideDistances}\n horizontal\n active={tooltipSelected}\n fixed={tooltipsData.fixed}\n onClose={tooltipsData.onClose}\n container={tooltipsContainer}\n />\n )}\n </g>\n );\n return highlightedDot ? createPortal(dot, activeElementContainer) : dot;\n })}\n </g>\n )}\n </g>\n );\n}\n"],"mappings":";;;;;;;AA+BA,SAAS,EACL,GACA,GACA,GACA,GACS;AACT,KAAI,KAAS,OAAO,KAAU,YAAY,UAAU,GAAO;AACvD,MAAI,EAAM,SAAS,kBACf,OAAU,MAAM,kDAAkD;AAEtE,MAAI,EAAM,SAAS,oBACf,QAAO,EAAO,cAAc,EAAK,IAAI,CAAC;;AAG9C,QAAO;;AAGX,SAAS,EACL,GACA,GACA,GACkC;CAClC,IAAM,IAAS,EAAO,SAAS,WAAW,GAAG;AAC7C,QAAO,EAAY,KACf,MACI;GAAE,EAAO,SAAS,EAAI,IAAI,KAAK;EAAQ,EAAO,EAAE,EAAO,GAAK;EAAE;EAAK,EAAO;EAAK,CAMtF;;AAGL,SAAS,EAAkB,GAAgC,GAAsB,GAAc;CAC3F,IAAM,IAAW,EAAkB,YAAY;AAC/C,QAAO,IAAW,CAAC,GAAU,EAAa,EAAM,CAAC,GAAG,CAAC,EAAa,EAAM,CAAC;;AAG7E,SAAgB,EAAY,EACxB,aACA,WACA,gBACA,SACA,QACA,kBACA,iBACA,sBACA,2BACA,sBACA,mBACU;CACV,IAAM,IAAa,MAAgB,YAC7B,IAAY,EAAY,GAAQ,aAAa,EAAI,WAAW,EAAK,EACjE,IAAY,EAAY,GAAQ,WAAW,EAAI,WAAW,EAAK,EAC/D,IAAY,EAAY,GAAQ,aAAa,EAAI,WAAW,EAAK,EACjE,IAAW,EAAY,GAAQ,YAAY,EAAI,UAAU,EAAK,EAC9D,IAAS,EAAa,EAAK,MAAM,EAAO,SAAS,QAAQ,EAAE,EAAO,EAClE,IAAQ,EAAc,GAAwB,EAAI,SAAS,EAAU,EACrE,IAAmB,KAA0B,EAAa;AAEhE,QACI,kBAAC,KAAD;EACI,SAAS,EAAI;EACb,QAAQ;EACR,iBAAiB,EAAa,EAAU;EACxC,aAAa,EAAI;YAJrB,CAMI,kBAAC,YAAD;GAEI,QAAQ,EAAO,KAAK,CAAC,GAAG,OAAQ,IAAa,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAE,CAAC,KAAK,IAAI;GACxE,QAAQ;GACR,MAAK;GACP,EAJO,EAAK,IAIZ,EACD,EAAI,aAAa,QACd,kBAAC,KAAD,EAAA,UACK,EAAO,KAAK,MAAc;GACvB,IAAM,CAAC,GAAG,GAAG,GAAK,KAAS,GACrB,IAAO,EAAa,cACpB,IAAkB,GAAQ,KAAQ,MAAa,EAAa,gBAAgB,EAAQ,EAAK,IAAI,EAAK,OAAO,GAAI,MAAQ,MAAO,EAAU,GAAK,GAC3I,IAAkB,KAAmB,GACrC,IACF,kBAAC,KAAD;IAEI,WAAW,IAAa,aAAa,EAAE,GAAG,EAAE,KAAK,aAAa,EAAE,GAAG,EAAE;IACrE,iBAAgB;IAChB,QAAO;IAEP,aAAa;cANjB;KAQK;KACA,KAAgB,KACb,kBAAC,UAAD;MACI,mBAAmB,EAAa,aAAa,GAAW,EAAS;MACjE,oBAAoB,EAAa,cAAc;MAC/C,GAAE;MACF,MAAK;MACL,QAAO;MACT,CAAA;KAEL,KACG,kBAAC,GAAD;MACI,SAAS,EAAkB,GAAmB,EAAK,KAAK,EAAM;MAC9D,GAAG,IAAa,IAAI;MACpB,GAAG,IAAa,IAAI;MACL;MACf,YAAA;MACA,QAAQ;MACR,OAAO,EAAa;MACpB,SAAS,EAAa;MACtB,WAAW;MACb,CAAA;KAEN;MA9BK,EA8BL;AAER,UAAO,IAAiB,EAAa,GAAK,EAAuB,GAAG;IACtE,EACF,CAAA,CAER"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChartRenderer.d.ts","sourceRoot":"","sources":["../../src/scatterplot/ChartRenderer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChartRenderer.d.ts","sourceRoot":"","sources":["../../src/scatterplot/ChartRenderer.tsx"],"names":[],"mappings":"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"}
@@ -59,6 +59,7 @@ function j(e, t, r, i, a) {
59
59
  lineShape: _(e, t, s?.aes.lineShape ?? "solid", "lineShape"),
60
60
  lineColor: _(e, t, s?.aes.lineColor ?? "#110529", "lineColor"),
61
61
  trendColor: _(e, t, i?.color ?? n.color, "fillColor"),
62
+ trendLineWidth: i?.lineWidth ?? 1,
62
63
  additionalCurveLineColor: (a?.curves ?? []).map((n) => _(e, t, n.lineColor, "lineColor")),
63
64
  additionalCurveTrendColor: (a?.curves ?? []).map((n) => _(e, t, n.trend?.color ?? n.lineColor, "lineColor"))
64
65
  };
@@ -177,7 +178,7 @@ var F = class {
177
178
  b[e] = i, C ||= E(o, i);
178
179
  });
179
180
  let T = e.reduce((e, t) => (e[t] = (c ? c[t] : []).reduce((e, n) => {
180
- let r = n.bounded ? n.xBounds : this.scales.x[t].domain(), i = n.getInterval(r[0]), a = n.getInterval(r[1]);
181
+ let r = n.bounded ? n.xBounds : b[t].domain(), i = n.getInterval(r[0]), a = n.getInterval(r[1]);
181
182
  return e.minY = Math.min(e.minY, isNaN(i.left) ? e.minY : i.left, isNaN(a.left) ? e.minY : a.left), e.maxY = Math.max(e.maxY, isNaN(i.right) ? e.maxY : i.right, isNaN(a.right) ? e.maxY : a.right), e;
182
183
  }, {
183
184
  minY: Infinity,
@@ -1 +1 @@
1
- {"version":3,"file":"ChartRenderer.js","names":[],"sources":["../../src/scatterplot/ChartRenderer.tsx"],"sourcesContent":["import type { ScaleLinear } from 'd3-scale';\nimport { scaleLinear, scaleLog, scaleOrdinal, scalePoint, scaleSymlog } from 'd3-scale';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { DotAesItem, LegendData, LegendItem } from '../common/types';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport {\n BLACK,\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n MAX_LEGEND_GRADIENT_HEIGHT,\n MAX_SHOWN_UNIQUE_VALUES_IN_LABELS,\n MIN_LEGEND_GRADIENT_HEIGHT,\n TITLE_LINE_HEIGHT,\n TITLE_MARGIN,\n} from '../constants';\nimport type { DataFrame } from '../DataFrame';\nimport { FACET_TITLE_LINE } from '../discrete/constants';\nimport { splitTextByWidth } from '../discrete/utils';\nimport type { AesItem, AxisSettingsDiscrete, ColumnName, PointShape, ScatterplotLegendInfo } from '../types';\nimport { isContinuousAes } from '../types';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { getSizeLegendItem } from '../utils/getSizeLegendItem';\nimport { getContinuousColorScale } from '../utils/getContinuousColorScale';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { ChartsGroup } from './components/ChartsGroup';\nimport type { AesGetters, CaptionsSizes, ChartDimensionsData, ChartScales, ChartSizes, ChartsScales, DiscreteAxisData, DiscreteScale, Margins } from './components/types';\nimport {\n DEFAULT_DOT_AES,\n DEFAULT_TICKS_SIZE,\n FACET_AXIS_OFFSET,\n FACET_TITLE_OFFSET,\n LEGEND_OFFSET,\n MIN_MARGIN,\n MIN_PADDING,\n PADDINGS,\n TICK_OFFSET,\n TITLE_LINE,\n} from './constants';\nimport type { GroupedDots } from './dots';\nimport type { ScatterplotLayerData } from './getLayersData';\nimport type { TrendsData } from './linearRegression';\nimport type { CurveLayer, DotsLayer, ScatterplotLayer, ScatterplotSettingsImpl } from './ScatterplotSettingsImpl';\nimport { createAesGetter } from './utils/createAesGetter';\nimport { getTicksAndFormat } from './utils/getTicksAndFormat';\nimport { isContinuousAxis } from './utils/isNumericScale';\nimport { createMultilineDiscreteLabels } from '../utils/createMultilineDiscreteLabels';\nimport { measureMultilineDiscreteLabels } from '../utils/measureMultilineDiscreteLabels';\n\nfunction scalesAreDifferent(prevScale:ChartScales['x'|'y'], currentScale:ChartScales['x'|'y']):boolean {\n if (prevScale === undefined) {\n return true;\n } else {\n const domain = prevScale.domain();\n const range = prevScale.range();\n const newDomain = currentScale.domain();\n const newRange = currentScale.range();\n if (\n domain.length !== newDomain.length ||\n domain.some((v, idx) => v !== newDomain[idx]) ||\n range[0] !== newRange[0] || range[1] !== newRange[1]\n ) {\n return true;\n }\n }\n return false;\n}\nfunction getChartEdgeSides(index: number, facetsCount: number, columnsCount: number, rowsCount: number) {\n const chartSides: ('left' | 'right' | 'top' | 'bottom')[] = [];\n if (index % columnsCount === columnsCount - 1) {\n chartSides.push('right');\n }\n if (index % columnsCount === 0) {\n chartSides.push('left');\n }\n if (index < columnsCount) {\n chartSides.push('top');\n }\n if (\n Math.ceil((index + 1) / columnsCount) === rowsCount ||\n (Math.ceil((index + 1) / columnsCount) === rowsCount - 1 &&\n index % columnsCount > (facetsCount - 1) % columnsCount)\n ) {\n chartSides.push('bottom');\n }\n return chartSides;\n}\n\nfunction calculatePaddings(\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis'],\n captionsSizes: CaptionsSizes,\n currentRowFacetKeys: string[],\n facetTitles: Record<string, string[]>,\n chartEdgeSides: ('left' | 'right' | 'top' | 'bottom')[],\n currentRow: number,\n currentColumn: number,\n lastInRow: boolean,\n facetSettings?: ScatterplotSettingsImpl['facetSettings'],\n) {\n const discreteX = xAxis.scale === 'discrete';\n const discreteY = yAxis.scale === 'discrete';\n\n const needLeftAxis = chartEdgeSides.includes('left') || !facetSettings?.sharedY;\n const needLeftAxisTitle = chartEdgeSides.includes('left') && yAxis.title !== '';\n const needBottomAxis = chartEdgeSides.includes('bottom') || !facetSettings?.sharedX;\n const needBottomAxisTitle = chartEdgeSides.includes('bottom') && xAxis.title !== '';\n\n const yCaptions = yAxis.hiddenLabels ? 0 : discreteY ? captionsSizes.leftAxisCaptionsWidthByColumns[currentColumn] + 2 * TICK_OFFSET : captionsSizes.yAxisCaptionsWidth + 2 * TICK_OFFSET;\n const yTicks = (yAxis.showTicks ? DEFAULT_TICKS_SIZE : 0) + TICK_OFFSET;\n const yAxisTitle = needLeftAxisTitle ? TITLE_LINE : 0;\n\n const xCaptions = xAxis.hiddenLabels ? 0 : discreteX ? captionsSizes.bottomAxisCaptionsWidthByRows[currentRow] + 2 * TICK_OFFSET: captionsSizes.xAxisCaptionsWidth + 2 * TICK_OFFSET;\n const xTicks = xAxis.showTicks ? DEFAULT_TICKS_SIZE : 0;\n const xAxisTitle = needBottomAxisTitle ? TITLE_LINE : 0;\n\n const leftAxisElements = yCaptions + yTicks + yAxisTitle + FACET_AXIS_OFFSET;\n const bottomAxisElements = xCaptions + xTicks + xAxisTitle + FACET_AXIS_OFFSET;\n\n const facetTitlesLinesCount = Math.max(...currentRowFacetKeys.map(key => facetTitles[key].length));\n return {\n left: needLeftAxis ? leftAxisElements : MIN_PADDING,\n top: facetTitlesLinesCount === 0 ? 0 : FACET_TITLE_OFFSET * 2 + facetTitlesLinesCount * FACET_TITLE_LINE,\n bottom: needBottomAxis ? bottomAxisElements + 8 : MIN_PADDING,\n right: lastInRow ? 0 : MIN_PADDING,\n };\n}\n\n// facet keys grouped by rows\nfunction getFacetRows(facetKeys: string[], nRows: number, nColumns: number): string[][] {\n const result: string[][] = [];\n for (let i = 0; i < nRows; i++) {\n result.push(facetKeys.slice(i * nColumns, i * nColumns + nColumns));\n }\n return result;\n}\n\nfunction getRowColumn(idx: number, columnsCount: number) {\n const row = Math.floor(idx / columnsCount);\n const column = idx - row * columnsCount;\n return [row, column];\n}\n\nfunction createAesGetters(\n dataFrame: DataFrame,\n legendInfo: ScatterplotLegendInfo,\n layers: ScatterplotLayer[],\n trend: ScatterplotSettingsImpl['trend'],\n additionalCurves: ScatterplotSettingsImpl['additionalCurves']\n): AesGetters {\n const dotLayer = layers.find(l => l.type === 'dots') as DotsLayer | undefined;\n const curveLayer = layers.find(l => l.type === 'curve') as CurveLayer | undefined;\n\n return {\n dotShape: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotShape ?? DEFAULT_DOT_AES.shape,'dotShape'),\n dotColor: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotFill ?? DEFAULT_DOT_AES.color, 'dotFill'),\n dotSize: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotSize ?? DEFAULT_DOT_AES.size, 'dotSize'),\n lineShape: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineShape ?? 'solid', 'lineShape'),\n lineColor: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineColor ?? BLACK, 'lineColor'),\n trendColor: createAesGetter(dataFrame, legendInfo, trend?.color ?? DEFAULT_DOT_AES.color, 'fillColor'),\n additionalCurveLineColor: (additionalCurves?.curves ?? []).map(\n (entry) => createAesGetter<string>(dataFrame, legendInfo, entry.lineColor, 'lineColor'),\n ),\n additionalCurveTrendColor: (additionalCurves?.curves ?? []).map(\n (entry) => createAesGetter<string>(dataFrame, legendInfo, entry.trend?.color ?? entry.lineColor, 'lineColor'),\n ),\n };\n}\n\nconst COS_PI_4 = Math.cos(Math.PI / 4);\nconst INCLINE_OFFSET = 5; // height of little triangle of text for captions inclined 45deg\n\nfunction getCaptionHeight (size: number, axis: ScatterplotSettingsImpl['chartSettings']['xAxis' | 'yAxis']) {\n if (axis.scale === 'discrete') {\n if (axis.labelsPosition === '90deg') {\n return size;\n }\n if (axis.labelsPosition === '45deg') {\n return size * COS_PI_4 + (size > 0 ? 2 * INCLINE_OFFSET : 0) ;\n }\n return TITLE_LINE;\n }\n return Math.max(size, TITLE_LINE);\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n component: ReactElement = (<></>);\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n chartsDimensions: Record<string, ChartDimensionsData> = {};\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n chartsWidth: DEFAULT_WIDTH, // width of all charts in charts row\n chartsHeight: DEFAULT_HEIGHT, // width of all charts in charts column, without axes\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n columnsCount = 1;\n rowsCount = 1;\n scales: ChartsScales = {\n x: {null: scaleLinear().domain([0, 1]).range([0, DEFAULT_WIDTH])},\n y: {null: scaleLinear().domain([0, 1]).range([DEFAULT_HEIGHT, 0])},\n };\n captionsSizes: CaptionsSizes = {\n xAxisCaptionsWidth: 30,\n yAxisCaptionsWidth: 100,\n bottomAxisCaptionsWidthByRows: [],\n leftAxisCaptionsWidthByColumns: [],\n bottomCaptionsTail: 0,\n leftCaptionsTail: 0,\n };\n facetTitles: Record<string, string[]> = {}; // can be multiline\n mainTitle: string[] = []; // can be multiline\n discreteAxesLabels: {\n x: Record<string, Record<string, string[]>>,\n y: Record<string, Record<string, string[]>>\n } = {x: {}, y: {}}; // only for discrete axes, by facets, can be multiline\n\n legend: LegendData = {width: 0, height: 0, items: []};\n\n clear() {\n if (this.parentNode && this.rootNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode = null;\n this.rootNode = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSizes(size: ScatterplotSettingsImpl['chartSettings']['size']) {\n this.chartSizes.chartWidth = size.width;\n this.chartSizes.chartHeight = size.height;\n }\n\n updateChartDimensions(\n facetKeys: string[],\n facetSettings: ScatterplotSettingsImpl['facetSettings'],\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis']\n ) {\n const {chartWidth, chartHeight} = this.chartSizes;\n let currentLeft = 0;\n let currentTop = 0;\n const facetRows = getFacetRows(facetKeys, this.rowsCount, this.columnsCount);\n this.chartsDimensions = facetKeys.reduce((res: Record<string, ChartDimensionsData>, key: string, index) => {\n const [currentRow, currentColumn] = getRowColumn(index, this.columnsCount);\n const chartEdgeSides = getChartEdgeSides(index, facetKeys.length, this.columnsCount, this.rowsCount);\n const padding = calculatePaddings(\n xAxis,\n yAxis,\n this.captionsSizes,\n facetRows[currentRow],\n this.facetTitles,\n chartEdgeSides,\n currentRow,\n currentColumn,\n currentColumn === this.columnsCount - 1,\n facetSettings\n );\n\n const outerWidth = chartWidth + padding.left + padding.right;\n const outerHeight = chartHeight + padding.top + padding.bottom;\n res[key] = {\n left: currentLeft,\n top: currentTop,\n chartEdgeSides,\n padding,\n inner: {width: chartWidth, height: chartHeight},\n outer: {width: outerWidth, height: outerHeight},\n };\n currentLeft += outerWidth;\n if (currentColumn === this.columnsCount - 1) {\n currentLeft = 0;\n currentTop += outerHeight;\n }\n return res;\n }, {});\n\n const chartsWidth = Math.max(\n ...facetKeys.map(key => this.chartsDimensions[key].outer.width + this.chartsDimensions[key].left)\n );\n const chartsHeight = Math.max(\n ...facetKeys.map(key => this.chartsDimensions[key].outer.height + this.chartsDimensions[key].top)\n );\n this.chartSizes.chartsWidth = chartsWidth;\n this.chartSizes.chartsHeight = chartsHeight;\n }\n\n updateViewport(\n facetKeys: string[],\n facetSettings: ScatterplotSettingsImpl['facetSettings'],\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis'],\n discreteAxisDataX: DiscreteAxisData,\n discreteAxisDataY: DiscreteAxisData,\n groupedDots: GroupedDots,\n trendsData: TrendsData | null\n ) {\n const facetCount = facetKeys.length;\n const maxNRows = Math.min(facetSettings.nRows ?? facetCount, facetCount);\n const maxNCols = Math.min(facetSettings.nCols ?? facetCount, facetCount);\n // Use columns/rows count from settings if some of them defined, else make 1 column\n this.columnsCount = facetSettings.nRows ? Math.ceil(facetCount / maxNRows) : maxNCols;\n this.rowsCount = Math.ceil(facetCount / this.columnsCount);\n\n let [minXAll, maxXAll] = [Infinity, -Infinity];\n let [minYAll, maxYAll] = [Infinity, -Infinity];\n const dotExtentsByKeys = facetKeys.reduce((res: Record<string, Record<string, number>>, key) => {\n const dotsData = groupedDots[key];\n const {minX, minY, maxX, maxY} = dotsData;\n minXAll = Math.min(minXAll, minX);\n minYAll = Math.min(minYAll, minY);\n maxXAll = Math.max(maxXAll, maxX);\n maxYAll = Math.max(maxYAll, maxY);\n res[key] = {minX, maxX, minY, maxY};\n return res;\n }, {});\n\n const newScalesX:ChartsScales['x'] = {};\n const newScalesY:ChartsScales['y'] = {};\n\n let needsUpdateXScales = false;\n let needsUpdateYScales = false;\n facetKeys.forEach(key => {\n let scaleX: ChartsScales['x'][string];\n if (!isContinuousAxis(xAxis)) {\n scaleX = scalePoint<string | number>()\n .range([0, this.chartSizes.chartWidth])\n .domain(discreteAxisDataX.keys ?? []).padding(0.5);\n\n } else {\n scaleX = xAxis.scale === 'log' ? scaleLog() : scaleLinear();\n const extents = dotExtentsByKeys[key];\n let minX = xAxis.lowerValue ? Number(xAxis.lowerValue) : facetSettings.sharedX ? minXAll : extents.minX;\n let maxX = xAxis.upperValue ? Number(xAxis.upperValue) : facetSettings.sharedX ? maxXAll : extents.maxX;\n\n if (typeof xAxis.symmetricRange !== 'undefined') {\n const middle = xAxis.symmetricRange;\n if (middle >= minX && middle <= maxX) {\n const halfRange = Math.max(middle - minX, maxX - middle);\n minX = middle - halfRange;\n maxX = middle + halfRange;\n }\n }\n\n const rangeH = [0, this.chartSizes.chartWidth];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempX = scaleX\n .copy()\n .domain([minX, maxX])\n .range([PADDINGS.LEFT, this.chartSizes.chartWidth - PADDINGS.RIGHT]);\n scaleX\n .domain([tempX.invert(0), tempX.invert(this.chartSizes.chartWidth)])\n .range(rangeH)\n .nice();\n\n }\n const prevScale = this.scales.x[key];\n newScalesX[key] = scaleX;\n needsUpdateXScales = needsUpdateXScales || scalesAreDifferent(prevScale, scaleX);\n });\n // for right Y viewport bounds we must know X bounds, to calculate trends area Y bounds\n const trendYBoundsByKeys = facetKeys.reduce((res: Record<string, Record<string, number>>, key) => {\n const trendsList = trendsData ? trendsData[key] : [];\n res[key] = trendsList.reduce(\n (res, trend) => {\n const xBounds = trend.bounded ? trend.xBounds : this.scales.x[key].domain(); // trends exist only with continuous scales\n const i1 = trend.getInterval(xBounds[0] as number);\n const i2 = trend.getInterval(xBounds[1] as number);\n res.minY = Math.min(res.minY, isNaN(i1.left) ? res.minY : i1.left, isNaN(i2.left) ? res.minY : i2.left);\n res.maxY = Math.max(res.maxY, isNaN(i1.right) ? res.maxY : i1.right, isNaN(i2.right) ? res.maxY : i2.right);\n return res;\n },\n {minY: Infinity, maxY: -Infinity}\n );\n minYAll = Math.min(minYAll, res[key].minY);\n maxYAll = Math.max(maxYAll, res[key].maxY);\n return res;\n }, {});\n facetKeys.forEach(key => {\n let scaleY: ChartsScales['y'][string];\n if (!isContinuousAxis(yAxis)) {\n scaleY = scalePoint<string | number>()\n .range([this.chartSizes.chartHeight, 0])\n .domain(discreteAxisDataY.keys ?? [])\n .padding(0.5);\n } else {\n scaleY = yAxis.scale === 'log' ? scaleLog() : scaleLinear();\n\n const dotExtents = dotExtentsByKeys[key];\n const trendExtents = trendYBoundsByKeys[key];\n let minY = yAxis.lowerValue ? Number(yAxis.lowerValue) : facetSettings.sharedY ? minYAll : Math.min(dotExtents.minY, trendExtents.minY);\n let maxY = yAxis.upperValue ? Number(yAxis.upperValue) : facetSettings.sharedY ? maxYAll : Math.max(dotExtents.maxY, trendExtents.maxY);\n\n if (typeof yAxis.symmetricRange !== 'undefined') {\n const middle = yAxis.symmetricRange;\n if (middle >= minY && middle <= maxY) {\n const halfRange = Math.max(middle - minY, maxY - middle);\n minY = middle - halfRange;\n maxY = middle + halfRange;\n }\n }\n\n const rangeV = [this.chartSizes.chartHeight, 0];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempY = scaleY\n .copy()\n .domain([minY, maxY])\n .range([this.chartSizes.chartHeight - PADDINGS.BOTTOM, PADDINGS.TOP]);\n scaleY\n .domain([tempY.invert(this.chartSizes.chartHeight), tempY.invert(0)])\n .range(rangeV)\n .nice();\n }\n const prevScale = this.scales.y[key];\n newScalesY[key] = scaleY;\n needsUpdateYScales = needsUpdateYScales || scalesAreDifferent(prevScale, scaleY);\n });\n\n if (needsUpdateXScales) {\n this.scales.x = newScalesX;\n }\n if (needsUpdateYScales) {\n this.scales.y = newScalesY;\n }\n }\n\n updateCaptionsSize(\n facetKeys: string[],\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis'],\n onlyPositive: boolean\n ) {\n const textMeasurer = new TextMeasurer('600 14px Manrope');\n function getMaxTickWidth(ticks: string[]) {\n return Math.max(...ticks.map(key => textMeasurer.getTextWidth(key)));\n }\n\n let xTail = 0;\n let yTail = 0;\n let xAxisCaptionsWidthByRows:number[] = [];\n let yAxisCaptionsWidthByColumns:number[] = [];\n let maxXLabelSize = 0;\n let maxYLabelSize = 0;\n if (xAxis.scale === 'discrete') {\n const sizes = measureMultilineDiscreteLabels(\n facetKeys,\n this.rowsCount,\n this.columnsCount,\n xAxis.labelsPosition ?? 'center',\n this.discreteAxesLabels.x,\n 'vertical',\n this.scales.x as Record<string, DiscreteScale>,\n );\n xTail = sizes.xTail;\n xAxisCaptionsWidthByRows = sizes.axisCaptionsWidthByRows;\n } else {\n maxXLabelSize = 20;\n }\n\n if (yAxis.scale === 'discrete') {\n const sizes = measureMultilineDiscreteLabels(\n facetKeys,\n this.rowsCount,\n this.columnsCount,\n yAxis.labelsPosition ?? 'center',\n this.discreteAxesLabels.y,\n 'horizontal',\n this.scales.y as Record<string, DiscreteScale>,\n );\n yTail = sizes.yTail;\n yAxisCaptionsWidthByColumns = sizes.axisCaptionsWidthByColumns;\n } else {\n Object.values(this.scales.y).forEach(scale => {\n const {ticks, format} = getTicksAndFormat(scale, onlyPositive);\n maxYLabelSize = Math.max(maxYLabelSize, getMaxTickWidth(ticks.map(format)));\n });\n }\n\n this.captionsSizes = {\n xAxisCaptionsWidth: xAxis.hiddenLabels ? 0 : getCaptionHeight(maxXLabelSize, xAxis),\n yAxisCaptionsWidth: yAxis.hiddenLabels ? 0 : getCaptionHeight(maxYLabelSize, yAxis),\n bottomAxisCaptionsWidthByRows: xAxisCaptionsWidthByRows,\n leftAxisCaptionsWidthByColumns: yAxisCaptionsWidthByColumns,\n bottomCaptionsTail: xTail,\n leftCaptionsTail: yTail\n };\n }\n\n createMainTitle(facetKeys: string[], title: ScatterplotSettingsImpl['chartSettings']['title']) {\n const firstChart = this.chartsDimensions[facetKeys[0]];\n const lastChart = this.chartsDimensions[facetKeys[facetKeys.length - 1]];\n\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.chartsWidth - firstChart.padding.left - lastChart.padding.right,\n 20\n );\n }\n\n createFacetTitles(facetKeys: string[], facetLabels: string[][]) {\n this.facetTitles = facetKeys.reduce((res: Record<string, string[]>, key, idx) => {\n if (facetLabels[idx].length === 1 && facetLabels[idx][0] === 'null') {\n res[key] = [];\n } else {\n res[key] = splitTextByWidth(facetLabels[idx].join(', '), this.chartSizes.chartWidth, 14);\n }\n return res;\n }, {});\n }\n\n createAxisLabels(\n facetKeys: string[],\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n discreteAxisDataX: DiscreteAxisData,\n discreteAxisDataY: DiscreteAxisData,\n ) {\n this.discreteAxesLabels = {\n x: xAxis.scale !== 'discrete' ? {} : createMultilineDiscreteLabels(\n facetKeys,\n (xAxis as AxisSettingsDiscrete)?.labelsPosition ?? 'center',\n discreteAxisDataX.labels,\n false,\n 'vertical',\n this.scales.x as Record<string, DiscreteScale>,\n ),\n y: yAxis.scale !== 'discrete' ? {} : createMultilineDiscreteLabels(\n facetKeys,\n (yAxis as AxisSettingsDiscrete).labelsPosition ?? 'center',\n discreteAxisDataY.labels,\n false,\n 'horizontal',\n this.scales.y as Record<string, DiscreteScale>,\n )\n };\n }\n\n updateMargins(facetKeys: string[]) {\n const titleTextHeight = TITLE_LINE_HEIGHT * this.mainTitle.length;\n const titleHeight = titleTextHeight > 0 ? titleTextHeight + TITLE_MARGIN * 2 : 0;\n const firstChart = this.chartsDimensions[facetKeys[0]];\n const lastChart = this.chartsDimensions[facetKeys[facetKeys.length - 1]];\n this.margins = {\n top: Math.max(titleHeight, MIN_MARGIN),\n bottom: Math.max(MIN_MARGIN, this.captionsSizes.leftCaptionsTail - lastChart.padding.bottom),\n left: Math.max(MIN_MARGIN, this.captionsSizes.bottomCaptionsTail - firstChart.padding.left),\n right: this.legend.width + MIN_MARGIN,\n }; \n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartsWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartsHeight, this.legend.height) + this.margins.bottom;\n }\n\n updateLegendSize(\n legend: ScatterplotSettingsImpl['chartSettings']['legend'],\n legendInfo: ScatterplotLegendInfo,\n grouping: ColumnName[],\n layers: ScatterplotLayer[],\n additionalCurves: ScatterplotSettingsImpl['additionalCurves'],\n yColumn: ColumnName,\n ) {\n if (!legend.show) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const legendItems: LegendItem[] = [];\n const emptySizes = {width:0, height:0, left:0, top: 0};\n const continuousHeight = Math.min(\n Math.max(this.chartSizes.chartHeight, MIN_LEGEND_GRADIENT_HEIGHT),\n MAX_LEGEND_GRADIENT_HEIGHT\n );\n const legendHeight = Math.max(this.chartSizes.chartHeight, continuousHeight);\n grouping.forEach(column => {\n const info = legendInfo[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n if (info.values.length > MAX_SHOWN_UNIQUE_VALUES_IN_LABELS) {\n console.warn(`Too many values for discrete legend (${info.values.length})`);\n return;\n }\n const aesData: Record<string, DotAesItem> = {};\n info.values.forEach(columnValue => {\n if (!aesData[columnValue]) {\n aesData[columnValue] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill' || key === 'lineColor') {\n aesData[columnValue].color = (info.aesMap(columnValue, key) ?? BLACK) as string;\n }\n if (key === 'dotShape') {\n aesData[columnValue].shape = (info.aesMap(columnValue,key) ?? '21') as PointShape;\n }\n if (key === 'dotSize') {\n aesData[columnValue].size = (info.aesMap(columnValue,key) ?? 3) as number;\n }\n });\n });\n\n const title = column.label ?? column.value;\n const scale = scaleOrdinal<DotAesItem>()\n .domain(info.values)\n .range(info.values.map(value => aesData[value]))\n .unknown(DEFAULT_DOT_AES);\n legendItems.push({...emptySizes, id: column.value, type: 'dots', title, scale, values:info.values, labels:info.labels});\n });\n\n layers.forEach(layer => {\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotFill)) {\n const {domain, range, columnName, type = 'linear'} = layer.aes.dotFill;\n const title = columnName.label ?? columnName.value;\n const colorScale = getContinuousColorScale(range, domain, 'linear') as ScaleLinear<string, string>; // always linear for legend - scale to render gradient, not for dots\n const tickPositionScale = (type === 'log' ? scaleSymlog<string, string>() : scaleLinear<string, string>())\n .domain(domain)\n // @ts-ignore\n .range([continuousHeight, 0]);\n const values = getContinuousLegendTicks(tickPositionScale, domain as [number, number]);\n legendItems.push({...emptySizes, id: 'dotFill', type: 'continuous', title, scale: colorScale, tickPositionScale, values});\n }\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotSize)) {\n legendItems.push(getSizeLegendItem(layer.aes.dotSize));\n }\n });\n\n // Dedicated curves section appears when at least one additional curve is active. Main curve layer\n // is the first entry when it's enabled. When grouping is active, line samples use a neutral color\n // (BLACK) — actual group colors live in the grouping legend; otherwise the curve's fixed lineColor\n // is used. InheritAes/continuous-mapping cases also render neutral (proper resolution is future work).\n if (additionalCurves && additionalCurves.curves.length > 0) {\n // Legend sample color: mirrors the curve's own `lineColor` when fixed (so a Fixed Red setting\n // shows a red sample), and falls back to neutral BLACK when the color inherits from grouping\n // (a single sample can't represent multiple group colors — actual group colors are shown in\n // the grouping's own color legend, per spec R19).\n const neutralColor = BLACK;\n const curveLegendValues: string[] = [];\n const curveLegendLabels: Record<string, string> = {};\n const curveLegendAes: Record<string, AesItem> = {};\n const curveLayer = layers.find(l => l.type === 'curve') as CurveLayer | undefined;\n if (curveLayer) {\n const label = yColumn.label ?? yColumn.value;\n const resolvedColor = typeof curveLayer.aes.lineColor === 'string'\n ? curveLayer.aes.lineColor\n : neutralColor;\n curveLegendValues.push(label);\n curveLegendLabels[label] = label;\n curveLegendAes[label] = {\n lineShape: curveLayer.aes.lineShape,\n lineColor: resolvedColor,\n };\n }\n for (const entry of additionalCurves.curves) {\n // Ensure labels are unique in the legend even if block authors repeat them\n let key = entry.label;\n let dedupeCounter = 1;\n while (curveLegendValues.includes(key)) {\n key = `${entry.label} (${++dedupeCounter})`;\n }\n const resolvedColor = typeof entry.lineColor === 'string'\n ? entry.lineColor\n : neutralColor;\n curveLegendValues.push(key);\n curveLegendLabels[key] = key;\n curveLegendAes[key] = {\n lineShape: entry.lineShape,\n lineColor: resolvedColor,\n };\n }\n if (curveLegendValues.length > 0) {\n const scale = scaleOrdinal<AesItem>()\n .domain(curveLegendValues)\n .range(curveLegendValues.map(v => curveLegendAes[v]))\n .unknown({});\n legendItems.push({\n ...emptySizes,\n id: 'additionalCurves',\n type: 'discreteMulti',\n title: 'Curves',\n scale,\n values: curveLegendValues,\n labels: curveLegendLabels,\n usedAes: { lineShape: true, lineColor: true, dotFill: false, dotShape: false, fillColor: false },\n });\n }\n }\n\n if (!legendItems.length) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const items = arrangeLegendParts(legendItems, legendHeight, continuousHeight);\n\n const maxRightEdge = items.reduce((max, item) => Math.max(max, item.left + item.width), 0);\n const legendWidth = maxRightEdge + LEGEND_OFFSET;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items,\n };\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: ScatterplotSettingsImpl['chartSettings'],\n facetSettings: ScatterplotSettingsImpl['facetSettings'],\n facetKeys: string[],\n facetLabels: string[][],\n groupedDots: GroupedDots,\n trendsData: TrendsData | null,\n keyColumn: ColumnName,\n onlyPositive: {x: boolean; y: boolean},\n legendInfo: ScatterplotLegendInfo,\n layersData: Record<string, ScatterplotLayerData[]>,\n grouping: ColumnName[],\n layers: ScatterplotLayer[],\n trend: ScatterplotSettingsImpl['trend'],\n discreteAxisDataX: DiscreteAxisData,\n discreteAxisDataY: DiscreteAxisData,\n onTooltipHintSwitch: (v:boolean) => void,\n additionalCurves: ScatterplotSettingsImpl['additionalCurves'],\n yColumn: ColumnName,\n ) {\n const {xAxis, yAxis, size, title, legend} = chartSettings;\n this.updateChartSizes(size);\n this.updateViewport(facetKeys, facetSettings, xAxis, yAxis, discreteAxisDataX, discreteAxisDataY, groupedDots, trendsData);\n this.createAxisLabels(facetKeys, xAxis, yAxis, discreteAxisDataX, discreteAxisDataY);\n this.updateCaptionsSize(facetKeys, xAxis, yAxis, onlyPositive.y);\n this.createFacetTitles(facetKeys, facetLabels);\n this.updateChartDimensions(facetKeys, facetSettings, xAxis, yAxis);\n this.updateLegendSize(legend, legendInfo, grouping, layers, additionalCurves, yColumn);\n this.createMainTitle(facetKeys, title);\n this.updateMargins(facetKeys);\n const component = (\n <DataFrameProvider dataFrame={dataFrame}>\n <ChartsGroup\n settingsId={settingsId}\n chartSettings={chartSettings}\n facetKeys={facetKeys}\n facetSettings={facetSettings}\n chartSizes={this.chartSizes}\n chartsDimensions={this.chartsDimensions}\n scales={this.scales}\n groupedDots={groupedDots}\n trendsData={trendsData}\n legendData={this.legend}\n columnsCount={this.columnsCount}\n margins={this.margins}\n keyColumn={keyColumn}\n mainTitle={this.mainTitle}\n facetTitles={this.facetTitles}\n captionsSizes={this.captionsSizes}\n onlyPositive={onlyPositive}\n layersData={layersData}\n aesGetters={createAesGetters(dataFrame, legendInfo, layers, trend, additionalCurves)}\n onTooltipHintSwitch={onTooltipHintSwitch}\n discreteAxesLabels={this.discreteAxesLabels}\n />\n </DataFrameProvider>\n );\n this.component = component;\n this.reactRoot?.render(component);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n}\n\nexport default ChartRenderer;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ChartRenderer.js","names":[],"sources":["../../src/scatterplot/ChartRenderer.tsx"],"sourcesContent":["import type { ScaleLinear } from 'd3-scale';\nimport { scaleLinear, scaleLog, scaleOrdinal, scalePoint, scaleSymlog } from 'd3-scale';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { DotAesItem, LegendData, LegendItem } from '../common/types';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport {\n BLACK,\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n MAX_LEGEND_GRADIENT_HEIGHT,\n MAX_SHOWN_UNIQUE_VALUES_IN_LABELS,\n MIN_LEGEND_GRADIENT_HEIGHT,\n TITLE_LINE_HEIGHT,\n TITLE_MARGIN,\n} from '../constants';\nimport type { DataFrame } from '../DataFrame';\nimport { FACET_TITLE_LINE } from '../discrete/constants';\nimport { splitTextByWidth } from '../discrete/utils';\nimport type { AesItem, AxisSettingsDiscrete, ColumnName, PointShape, ScatterplotLegendInfo } from '../types';\nimport { isContinuousAes } from '../types';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { getSizeLegendItem } from '../utils/getSizeLegendItem';\nimport { getContinuousColorScale } from '../utils/getContinuousColorScale';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { ChartsGroup } from './components/ChartsGroup';\nimport type { AesGetters, CaptionsSizes, ChartDimensionsData, ChartScales, ChartSizes, ChartsScales, DiscreteAxisData, DiscreteScale, Margins } from './components/types';\nimport {\n DEFAULT_DOT_AES,\n DEFAULT_TICKS_SIZE,\n FACET_AXIS_OFFSET,\n FACET_TITLE_OFFSET,\n LEGEND_OFFSET,\n MIN_MARGIN,\n MIN_PADDING,\n PADDINGS,\n TICK_OFFSET,\n TITLE_LINE,\n} from './constants';\nimport type { GroupedDots } from './dots';\nimport type { ScatterplotLayerData } from './getLayersData';\nimport type { TrendsData } from './linearRegression';\nimport type { CurveLayer, DotsLayer, ScatterplotLayer, ScatterplotSettingsImpl } from './ScatterplotSettingsImpl';\nimport { createAesGetter } from './utils/createAesGetter';\nimport { getTicksAndFormat } from './utils/getTicksAndFormat';\nimport { isContinuousAxis } from './utils/isNumericScale';\nimport { createMultilineDiscreteLabels } from '../utils/createMultilineDiscreteLabels';\nimport { measureMultilineDiscreteLabels } from '../utils/measureMultilineDiscreteLabels';\n\nfunction scalesAreDifferent(prevScale:ChartScales['x'|'y'], currentScale:ChartScales['x'|'y']):boolean {\n if (prevScale === undefined) {\n return true;\n } else {\n const domain = prevScale.domain();\n const range = prevScale.range();\n const newDomain = currentScale.domain();\n const newRange = currentScale.range();\n if (\n domain.length !== newDomain.length ||\n domain.some((v, idx) => v !== newDomain[idx]) ||\n range[0] !== newRange[0] || range[1] !== newRange[1]\n ) {\n return true;\n }\n }\n return false;\n}\nfunction getChartEdgeSides(index: number, facetsCount: number, columnsCount: number, rowsCount: number) {\n const chartSides: ('left' | 'right' | 'top' | 'bottom')[] = [];\n if (index % columnsCount === columnsCount - 1) {\n chartSides.push('right');\n }\n if (index % columnsCount === 0) {\n chartSides.push('left');\n }\n if (index < columnsCount) {\n chartSides.push('top');\n }\n if (\n Math.ceil((index + 1) / columnsCount) === rowsCount ||\n (Math.ceil((index + 1) / columnsCount) === rowsCount - 1 &&\n index % columnsCount > (facetsCount - 1) % columnsCount)\n ) {\n chartSides.push('bottom');\n }\n return chartSides;\n}\n\nfunction calculatePaddings(\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis'],\n captionsSizes: CaptionsSizes,\n currentRowFacetKeys: string[],\n facetTitles: Record<string, string[]>,\n chartEdgeSides: ('left' | 'right' | 'top' | 'bottom')[],\n currentRow: number,\n currentColumn: number,\n lastInRow: boolean,\n facetSettings?: ScatterplotSettingsImpl['facetSettings'],\n) {\n const discreteX = xAxis.scale === 'discrete';\n const discreteY = yAxis.scale === 'discrete';\n\n const needLeftAxis = chartEdgeSides.includes('left') || !facetSettings?.sharedY;\n const needLeftAxisTitle = chartEdgeSides.includes('left') && yAxis.title !== '';\n const needBottomAxis = chartEdgeSides.includes('bottom') || !facetSettings?.sharedX;\n const needBottomAxisTitle = chartEdgeSides.includes('bottom') && xAxis.title !== '';\n\n const yCaptions = yAxis.hiddenLabels ? 0 : discreteY ? captionsSizes.leftAxisCaptionsWidthByColumns[currentColumn] + 2 * TICK_OFFSET : captionsSizes.yAxisCaptionsWidth + 2 * TICK_OFFSET;\n const yTicks = (yAxis.showTicks ? DEFAULT_TICKS_SIZE : 0) + TICK_OFFSET;\n const yAxisTitle = needLeftAxisTitle ? TITLE_LINE : 0;\n\n const xCaptions = xAxis.hiddenLabels ? 0 : discreteX ? captionsSizes.bottomAxisCaptionsWidthByRows[currentRow] + 2 * TICK_OFFSET: captionsSizes.xAxisCaptionsWidth + 2 * TICK_OFFSET;\n const xTicks = xAxis.showTicks ? DEFAULT_TICKS_SIZE : 0;\n const xAxisTitle = needBottomAxisTitle ? TITLE_LINE : 0;\n\n const leftAxisElements = yCaptions + yTicks + yAxisTitle + FACET_AXIS_OFFSET;\n const bottomAxisElements = xCaptions + xTicks + xAxisTitle + FACET_AXIS_OFFSET;\n\n const facetTitlesLinesCount = Math.max(...currentRowFacetKeys.map(key => facetTitles[key].length));\n return {\n left: needLeftAxis ? leftAxisElements : MIN_PADDING,\n top: facetTitlesLinesCount === 0 ? 0 : FACET_TITLE_OFFSET * 2 + facetTitlesLinesCount * FACET_TITLE_LINE,\n bottom: needBottomAxis ? bottomAxisElements + 8 : MIN_PADDING,\n right: lastInRow ? 0 : MIN_PADDING,\n };\n}\n\n// facet keys grouped by rows\nfunction getFacetRows(facetKeys: string[], nRows: number, nColumns: number): string[][] {\n const result: string[][] = [];\n for (let i = 0; i < nRows; i++) {\n result.push(facetKeys.slice(i * nColumns, i * nColumns + nColumns));\n }\n return result;\n}\n\nfunction getRowColumn(idx: number, columnsCount: number) {\n const row = Math.floor(idx / columnsCount);\n const column = idx - row * columnsCount;\n return [row, column];\n}\n\nfunction createAesGetters(\n dataFrame: DataFrame,\n legendInfo: ScatterplotLegendInfo,\n layers: ScatterplotLayer[],\n trend: ScatterplotSettingsImpl['trend'],\n additionalCurves: ScatterplotSettingsImpl['additionalCurves']\n): AesGetters {\n const dotLayer = layers.find(l => l.type === 'dots') as DotsLayer | undefined;\n const curveLayer = layers.find(l => l.type === 'curve') as CurveLayer | undefined;\n\n return {\n dotShape: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotShape ?? DEFAULT_DOT_AES.shape,'dotShape'),\n dotColor: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotFill ?? DEFAULT_DOT_AES.color, 'dotFill'),\n dotSize: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotSize ?? DEFAULT_DOT_AES.size, 'dotSize'),\n lineShape: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineShape ?? 'solid', 'lineShape'),\n lineColor: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineColor ?? BLACK, 'lineColor'),\n trendColor: createAesGetter(dataFrame, legendInfo, trend?.color ?? DEFAULT_DOT_AES.color, 'fillColor'),\n trendLineWidth: trend?.lineWidth ?? 1,\n additionalCurveLineColor: (additionalCurves?.curves ?? []).map(\n (entry) => createAesGetter<string>(dataFrame, legendInfo, entry.lineColor, 'lineColor'),\n ),\n additionalCurveTrendColor: (additionalCurves?.curves ?? []).map(\n (entry) => createAesGetter<string>(dataFrame, legendInfo, entry.trend?.color ?? entry.lineColor, 'lineColor'),\n ),\n };\n}\n\nconst COS_PI_4 = Math.cos(Math.PI / 4);\nconst INCLINE_OFFSET = 5; // height of little triangle of text for captions inclined 45deg\n\nfunction getCaptionHeight (size: number, axis: ScatterplotSettingsImpl['chartSettings']['xAxis' | 'yAxis']) {\n if (axis.scale === 'discrete') {\n if (axis.labelsPosition === '90deg') {\n return size;\n }\n if (axis.labelsPosition === '45deg') {\n return size * COS_PI_4 + (size > 0 ? 2 * INCLINE_OFFSET : 0) ;\n }\n return TITLE_LINE;\n }\n return Math.max(size, TITLE_LINE);\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n component: ReactElement = (<></>);\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n chartsDimensions: Record<string, ChartDimensionsData> = {};\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n chartsWidth: DEFAULT_WIDTH, // width of all charts in charts row\n chartsHeight: DEFAULT_HEIGHT, // width of all charts in charts column, without axes\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n columnsCount = 1;\n rowsCount = 1;\n scales: ChartsScales = {\n x: {null: scaleLinear().domain([0, 1]).range([0, DEFAULT_WIDTH])},\n y: {null: scaleLinear().domain([0, 1]).range([DEFAULT_HEIGHT, 0])},\n };\n captionsSizes: CaptionsSizes = {\n xAxisCaptionsWidth: 30,\n yAxisCaptionsWidth: 100,\n bottomAxisCaptionsWidthByRows: [],\n leftAxisCaptionsWidthByColumns: [],\n bottomCaptionsTail: 0,\n leftCaptionsTail: 0,\n };\n facetTitles: Record<string, string[]> = {}; // can be multiline\n mainTitle: string[] = []; // can be multiline\n discreteAxesLabels: {\n x: Record<string, Record<string, string[]>>,\n y: Record<string, Record<string, string[]>>\n } = {x: {}, y: {}}; // only for discrete axes, by facets, can be multiline\n\n legend: LegendData = {width: 0, height: 0, items: []};\n\n clear() {\n if (this.parentNode && this.rootNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode = null;\n this.rootNode = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSizes(size: ScatterplotSettingsImpl['chartSettings']['size']) {\n this.chartSizes.chartWidth = size.width;\n this.chartSizes.chartHeight = size.height;\n }\n\n updateChartDimensions(\n facetKeys: string[],\n facetSettings: ScatterplotSettingsImpl['facetSettings'],\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis']\n ) {\n const {chartWidth, chartHeight} = this.chartSizes;\n let currentLeft = 0;\n let currentTop = 0;\n const facetRows = getFacetRows(facetKeys, this.rowsCount, this.columnsCount);\n this.chartsDimensions = facetKeys.reduce((res: Record<string, ChartDimensionsData>, key: string, index) => {\n const [currentRow, currentColumn] = getRowColumn(index, this.columnsCount);\n const chartEdgeSides = getChartEdgeSides(index, facetKeys.length, this.columnsCount, this.rowsCount);\n const padding = calculatePaddings(\n xAxis,\n yAxis,\n this.captionsSizes,\n facetRows[currentRow],\n this.facetTitles,\n chartEdgeSides,\n currentRow,\n currentColumn,\n currentColumn === this.columnsCount - 1,\n facetSettings\n );\n\n const outerWidth = chartWidth + padding.left + padding.right;\n const outerHeight = chartHeight + padding.top + padding.bottom;\n res[key] = {\n left: currentLeft,\n top: currentTop,\n chartEdgeSides,\n padding,\n inner: {width: chartWidth, height: chartHeight},\n outer: {width: outerWidth, height: outerHeight},\n };\n currentLeft += outerWidth;\n if (currentColumn === this.columnsCount - 1) {\n currentLeft = 0;\n currentTop += outerHeight;\n }\n return res;\n }, {});\n\n const chartsWidth = Math.max(\n ...facetKeys.map(key => this.chartsDimensions[key].outer.width + this.chartsDimensions[key].left)\n );\n const chartsHeight = Math.max(\n ...facetKeys.map(key => this.chartsDimensions[key].outer.height + this.chartsDimensions[key].top)\n );\n this.chartSizes.chartsWidth = chartsWidth;\n this.chartSizes.chartsHeight = chartsHeight;\n }\n\n updateViewport(\n facetKeys: string[],\n facetSettings: ScatterplotSettingsImpl['facetSettings'],\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis'],\n discreteAxisDataX: DiscreteAxisData,\n discreteAxisDataY: DiscreteAxisData,\n groupedDots: GroupedDots,\n trendsData: TrendsData | null\n ) {\n const facetCount = facetKeys.length;\n const maxNRows = Math.min(facetSettings.nRows ?? facetCount, facetCount);\n const maxNCols = Math.min(facetSettings.nCols ?? facetCount, facetCount);\n // Use columns/rows count from settings if some of them defined, else make 1 column\n this.columnsCount = facetSettings.nRows ? Math.ceil(facetCount / maxNRows) : maxNCols;\n this.rowsCount = Math.ceil(facetCount / this.columnsCount);\n\n let [minXAll, maxXAll] = [Infinity, -Infinity];\n let [minYAll, maxYAll] = [Infinity, -Infinity];\n const dotExtentsByKeys = facetKeys.reduce((res: Record<string, Record<string, number>>, key) => {\n const dotsData = groupedDots[key];\n const {minX, minY, maxX, maxY} = dotsData;\n minXAll = Math.min(minXAll, minX);\n minYAll = Math.min(minYAll, minY);\n maxXAll = Math.max(maxXAll, maxX);\n maxYAll = Math.max(maxYAll, maxY);\n res[key] = {minX, maxX, minY, maxY};\n return res;\n }, {});\n\n const newScalesX:ChartsScales['x'] = {};\n const newScalesY:ChartsScales['y'] = {};\n\n let needsUpdateXScales = false;\n let needsUpdateYScales = false;\n facetKeys.forEach(key => {\n let scaleX: ChartsScales['x'][string];\n if (!isContinuousAxis(xAxis)) {\n scaleX = scalePoint<string | number>()\n .range([0, this.chartSizes.chartWidth])\n .domain(discreteAxisDataX.keys ?? []).padding(0.5);\n\n } else {\n scaleX = xAxis.scale === 'log' ? scaleLog() : scaleLinear();\n const extents = dotExtentsByKeys[key];\n let minX = xAxis.lowerValue ? Number(xAxis.lowerValue) : facetSettings.sharedX ? minXAll : extents.minX;\n let maxX = xAxis.upperValue ? Number(xAxis.upperValue) : facetSettings.sharedX ? maxXAll : extents.maxX;\n\n if (typeof xAxis.symmetricRange !== 'undefined') {\n const middle = xAxis.symmetricRange;\n if (middle >= minX && middle <= maxX) {\n const halfRange = Math.max(middle - minX, maxX - middle);\n minX = middle - halfRange;\n maxX = middle + halfRange;\n }\n }\n\n const rangeH = [0, this.chartSizes.chartWidth];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempX = scaleX\n .copy()\n .domain([minX, maxX])\n .range([PADDINGS.LEFT, this.chartSizes.chartWidth - PADDINGS.RIGHT]);\n scaleX\n .domain([tempX.invert(0), tempX.invert(this.chartSizes.chartWidth)])\n .range(rangeH)\n .nice();\n\n }\n const prevScale = this.scales.x[key];\n newScalesX[key] = scaleX;\n needsUpdateXScales = needsUpdateXScales || scalesAreDifferent(prevScale, scaleX);\n });\n // for right Y viewport bounds we must know X bounds, to calculate trends area Y bounds\n const trendYBoundsByKeys = facetKeys.reduce((res: Record<string, Record<string, number>>, key) => {\n const trendsList = trendsData ? trendsData[key] : [];\n res[key] = trendsList.reduce(\n (res, trend) => {\n const xBounds = trend.bounded ? trend.xBounds : newScalesX[key].domain(); // trends exist only with continuous scales\n const i1 = trend.getInterval(xBounds[0] as number);\n const i2 = trend.getInterval(xBounds[1] as number);\n res.minY = Math.min(res.minY, isNaN(i1.left) ? res.minY : i1.left, isNaN(i2.left) ? res.minY : i2.left);\n res.maxY = Math.max(res.maxY, isNaN(i1.right) ? res.maxY : i1.right, isNaN(i2.right) ? res.maxY : i2.right);\n return res;\n },\n {minY: Infinity, maxY: -Infinity}\n );\n minYAll = Math.min(minYAll, res[key].minY);\n maxYAll = Math.max(maxYAll, res[key].maxY);\n return res;\n }, {});\n facetKeys.forEach(key => {\n let scaleY: ChartsScales['y'][string];\n if (!isContinuousAxis(yAxis)) {\n scaleY = scalePoint<string | number>()\n .range([this.chartSizes.chartHeight, 0])\n .domain(discreteAxisDataY.keys ?? [])\n .padding(0.5);\n } else {\n scaleY = yAxis.scale === 'log' ? scaleLog() : scaleLinear();\n\n const dotExtents = dotExtentsByKeys[key];\n const trendExtents = trendYBoundsByKeys[key];\n let minY = yAxis.lowerValue ? Number(yAxis.lowerValue) : facetSettings.sharedY ? minYAll : Math.min(dotExtents.minY, trendExtents.minY);\n let maxY = yAxis.upperValue ? Number(yAxis.upperValue) : facetSettings.sharedY ? maxYAll : Math.max(dotExtents.maxY, trendExtents.maxY);\n\n if (typeof yAxis.symmetricRange !== 'undefined') {\n const middle = yAxis.symmetricRange;\n if (middle >= minY && middle <= maxY) {\n const halfRange = Math.max(middle - minY, maxY - middle);\n minY = middle - halfRange;\n maxY = middle + halfRange;\n }\n }\n\n const rangeV = [this.chartSizes.chartHeight, 0];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempY = scaleY\n .copy()\n .domain([minY, maxY])\n .range([this.chartSizes.chartHeight - PADDINGS.BOTTOM, PADDINGS.TOP]);\n scaleY\n .domain([tempY.invert(this.chartSizes.chartHeight), tempY.invert(0)])\n .range(rangeV)\n .nice();\n }\n const prevScale = this.scales.y[key];\n newScalesY[key] = scaleY;\n needsUpdateYScales = needsUpdateYScales || scalesAreDifferent(prevScale, scaleY);\n });\n\n if (needsUpdateXScales) {\n this.scales.x = newScalesX;\n }\n if (needsUpdateYScales) {\n this.scales.y = newScalesY;\n }\n }\n\n updateCaptionsSize(\n facetKeys: string[],\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['yAxis'],\n onlyPositive: boolean\n ) {\n const textMeasurer = new TextMeasurer('600 14px Manrope');\n function getMaxTickWidth(ticks: string[]) {\n return Math.max(...ticks.map(key => textMeasurer.getTextWidth(key)));\n }\n\n let xTail = 0;\n let yTail = 0;\n let xAxisCaptionsWidthByRows:number[] = [];\n let yAxisCaptionsWidthByColumns:number[] = [];\n let maxXLabelSize = 0;\n let maxYLabelSize = 0;\n if (xAxis.scale === 'discrete') {\n const sizes = measureMultilineDiscreteLabels(\n facetKeys,\n this.rowsCount,\n this.columnsCount,\n xAxis.labelsPosition ?? 'center',\n this.discreteAxesLabels.x,\n 'vertical',\n this.scales.x as Record<string, DiscreteScale>,\n );\n xTail = sizes.xTail;\n xAxisCaptionsWidthByRows = sizes.axisCaptionsWidthByRows;\n } else {\n maxXLabelSize = 20;\n }\n\n if (yAxis.scale === 'discrete') {\n const sizes = measureMultilineDiscreteLabels(\n facetKeys,\n this.rowsCount,\n this.columnsCount,\n yAxis.labelsPosition ?? 'center',\n this.discreteAxesLabels.y,\n 'horizontal',\n this.scales.y as Record<string, DiscreteScale>,\n );\n yTail = sizes.yTail;\n yAxisCaptionsWidthByColumns = sizes.axisCaptionsWidthByColumns;\n } else {\n Object.values(this.scales.y).forEach(scale => {\n const {ticks, format} = getTicksAndFormat(scale, onlyPositive);\n maxYLabelSize = Math.max(maxYLabelSize, getMaxTickWidth(ticks.map(format)));\n });\n }\n\n this.captionsSizes = {\n xAxisCaptionsWidth: xAxis.hiddenLabels ? 0 : getCaptionHeight(maxXLabelSize, xAxis),\n yAxisCaptionsWidth: yAxis.hiddenLabels ? 0 : getCaptionHeight(maxYLabelSize, yAxis),\n bottomAxisCaptionsWidthByRows: xAxisCaptionsWidthByRows,\n leftAxisCaptionsWidthByColumns: yAxisCaptionsWidthByColumns,\n bottomCaptionsTail: xTail,\n leftCaptionsTail: yTail\n };\n }\n\n createMainTitle(facetKeys: string[], title: ScatterplotSettingsImpl['chartSettings']['title']) {\n const firstChart = this.chartsDimensions[facetKeys[0]];\n const lastChart = this.chartsDimensions[facetKeys[facetKeys.length - 1]];\n\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.chartsWidth - firstChart.padding.left - lastChart.padding.right,\n 20\n );\n }\n\n createFacetTitles(facetKeys: string[], facetLabels: string[][]) {\n this.facetTitles = facetKeys.reduce((res: Record<string, string[]>, key, idx) => {\n if (facetLabels[idx].length === 1 && facetLabels[idx][0] === 'null') {\n res[key] = [];\n } else {\n res[key] = splitTextByWidth(facetLabels[idx].join(', '), this.chartSizes.chartWidth, 14);\n }\n return res;\n }, {});\n }\n\n createAxisLabels(\n facetKeys: string[],\n xAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotSettingsImpl['chartSettings']['xAxis'],\n discreteAxisDataX: DiscreteAxisData,\n discreteAxisDataY: DiscreteAxisData,\n ) {\n this.discreteAxesLabels = {\n x: xAxis.scale !== 'discrete' ? {} : createMultilineDiscreteLabels(\n facetKeys,\n (xAxis as AxisSettingsDiscrete)?.labelsPosition ?? 'center',\n discreteAxisDataX.labels,\n false,\n 'vertical',\n this.scales.x as Record<string, DiscreteScale>,\n ),\n y: yAxis.scale !== 'discrete' ? {} : createMultilineDiscreteLabels(\n facetKeys,\n (yAxis as AxisSettingsDiscrete).labelsPosition ?? 'center',\n discreteAxisDataY.labels,\n false,\n 'horizontal',\n this.scales.y as Record<string, DiscreteScale>,\n )\n };\n }\n\n updateMargins(facetKeys: string[]) {\n const titleTextHeight = TITLE_LINE_HEIGHT * this.mainTitle.length;\n const titleHeight = titleTextHeight > 0 ? titleTextHeight + TITLE_MARGIN * 2 : 0;\n const firstChart = this.chartsDimensions[facetKeys[0]];\n const lastChart = this.chartsDimensions[facetKeys[facetKeys.length - 1]];\n this.margins = {\n top: Math.max(titleHeight, MIN_MARGIN),\n bottom: Math.max(MIN_MARGIN, this.captionsSizes.leftCaptionsTail - lastChart.padding.bottom),\n left: Math.max(MIN_MARGIN, this.captionsSizes.bottomCaptionsTail - firstChart.padding.left),\n right: this.legend.width + MIN_MARGIN,\n }; \n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartsWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartsHeight, this.legend.height) + this.margins.bottom;\n }\n\n updateLegendSize(\n legend: ScatterplotSettingsImpl['chartSettings']['legend'],\n legendInfo: ScatterplotLegendInfo,\n grouping: ColumnName[],\n layers: ScatterplotLayer[],\n additionalCurves: ScatterplotSettingsImpl['additionalCurves'],\n yColumn: ColumnName,\n ) {\n if (!legend.show) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const legendItems: LegendItem[] = [];\n const emptySizes = {width:0, height:0, left:0, top: 0};\n const continuousHeight = Math.min(\n Math.max(this.chartSizes.chartHeight, MIN_LEGEND_GRADIENT_HEIGHT),\n MAX_LEGEND_GRADIENT_HEIGHT\n );\n const legendHeight = Math.max(this.chartSizes.chartHeight, continuousHeight);\n grouping.forEach(column => {\n const info = legendInfo[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n if (info.values.length > MAX_SHOWN_UNIQUE_VALUES_IN_LABELS) {\n console.warn(`Too many values for discrete legend (${info.values.length})`);\n return;\n }\n const aesData: Record<string, DotAesItem> = {};\n info.values.forEach(columnValue => {\n if (!aesData[columnValue]) {\n aesData[columnValue] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill' || key === 'lineColor') {\n aesData[columnValue].color = (info.aesMap(columnValue, key) ?? BLACK) as string;\n }\n if (key === 'dotShape') {\n aesData[columnValue].shape = (info.aesMap(columnValue,key) ?? '21') as PointShape;\n }\n if (key === 'dotSize') {\n aesData[columnValue].size = (info.aesMap(columnValue,key) ?? 3) as number;\n }\n });\n });\n\n const title = column.label ?? column.value;\n const scale = scaleOrdinal<DotAesItem>()\n .domain(info.values)\n .range(info.values.map(value => aesData[value]))\n .unknown(DEFAULT_DOT_AES);\n legendItems.push({...emptySizes, id: column.value, type: 'dots', title, scale, values:info.values, labels:info.labels});\n });\n\n layers.forEach(layer => {\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotFill)) {\n const {domain, range, columnName, type = 'linear'} = layer.aes.dotFill;\n const title = columnName.label ?? columnName.value;\n const colorScale = getContinuousColorScale(range, domain, 'linear') as ScaleLinear<string, string>; // always linear for legend - scale to render gradient, not for dots\n const tickPositionScale = (type === 'log' ? scaleSymlog<string, string>() : scaleLinear<string, string>())\n .domain(domain)\n // @ts-ignore\n .range([continuousHeight, 0]);\n const values = getContinuousLegendTicks(tickPositionScale, domain as [number, number]);\n legendItems.push({...emptySizes, id: 'dotFill', type: 'continuous', title, scale: colorScale, tickPositionScale, values});\n }\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotSize)) {\n legendItems.push(getSizeLegendItem(layer.aes.dotSize));\n }\n });\n\n // Dedicated curves section appears when at least one additional curve is active. Main curve layer\n // is the first entry when it's enabled. When grouping is active, line samples use a neutral color\n // (BLACK) — actual group colors live in the grouping legend; otherwise the curve's fixed lineColor\n // is used. InheritAes/continuous-mapping cases also render neutral (proper resolution is future work).\n if (additionalCurves && additionalCurves.curves.length > 0) {\n // Legend sample color: mirrors the curve's own `lineColor` when fixed (so a Fixed Red setting\n // shows a red sample), and falls back to neutral BLACK when the color inherits from grouping\n // (a single sample can't represent multiple group colors — actual group colors are shown in\n // the grouping's own color legend, per spec R19).\n const neutralColor = BLACK;\n const curveLegendValues: string[] = [];\n const curveLegendLabels: Record<string, string> = {};\n const curveLegendAes: Record<string, AesItem> = {};\n const curveLayer = layers.find(l => l.type === 'curve') as CurveLayer | undefined;\n if (curveLayer) {\n const label = yColumn.label ?? yColumn.value;\n const resolvedColor = typeof curveLayer.aes.lineColor === 'string'\n ? curveLayer.aes.lineColor\n : neutralColor;\n curveLegendValues.push(label);\n curveLegendLabels[label] = label;\n curveLegendAes[label] = {\n lineShape: curveLayer.aes.lineShape,\n lineColor: resolvedColor,\n };\n }\n for (const entry of additionalCurves.curves) {\n // Ensure labels are unique in the legend even if block authors repeat them\n let key = entry.label;\n let dedupeCounter = 1;\n while (curveLegendValues.includes(key)) {\n key = `${entry.label} (${++dedupeCounter})`;\n }\n const resolvedColor = typeof entry.lineColor === 'string'\n ? entry.lineColor\n : neutralColor;\n curveLegendValues.push(key);\n curveLegendLabels[key] = key;\n curveLegendAes[key] = {\n lineShape: entry.lineShape,\n lineColor: resolvedColor,\n };\n }\n if (curveLegendValues.length > 0) {\n const scale = scaleOrdinal<AesItem>()\n .domain(curveLegendValues)\n .range(curveLegendValues.map(v => curveLegendAes[v]))\n .unknown({});\n legendItems.push({\n ...emptySizes,\n id: 'additionalCurves',\n type: 'discreteMulti',\n title: 'Curves',\n scale,\n values: curveLegendValues,\n labels: curveLegendLabels,\n usedAes: { lineShape: true, lineColor: true, dotFill: false, dotShape: false, fillColor: false },\n });\n }\n }\n\n if (!legendItems.length) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const items = arrangeLegendParts(legendItems, legendHeight, continuousHeight);\n\n const maxRightEdge = items.reduce((max, item) => Math.max(max, item.left + item.width), 0);\n const legendWidth = maxRightEdge + LEGEND_OFFSET;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items,\n };\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: ScatterplotSettingsImpl['chartSettings'],\n facetSettings: ScatterplotSettingsImpl['facetSettings'],\n facetKeys: string[],\n facetLabels: string[][],\n groupedDots: GroupedDots,\n trendsData: TrendsData | null,\n keyColumn: ColumnName,\n onlyPositive: {x: boolean; y: boolean},\n legendInfo: ScatterplotLegendInfo,\n layersData: Record<string, ScatterplotLayerData[]>,\n grouping: ColumnName[],\n layers: ScatterplotLayer[],\n trend: ScatterplotSettingsImpl['trend'],\n discreteAxisDataX: DiscreteAxisData,\n discreteAxisDataY: DiscreteAxisData,\n onTooltipHintSwitch: (v:boolean) => void,\n additionalCurves: ScatterplotSettingsImpl['additionalCurves'],\n yColumn: ColumnName,\n ) {\n const {xAxis, yAxis, size, title, legend} = chartSettings;\n this.updateChartSizes(size);\n this.updateViewport(facetKeys, facetSettings, xAxis, yAxis, discreteAxisDataX, discreteAxisDataY, groupedDots, trendsData);\n this.createAxisLabels(facetKeys, xAxis, yAxis, discreteAxisDataX, discreteAxisDataY);\n this.updateCaptionsSize(facetKeys, xAxis, yAxis, onlyPositive.y);\n this.createFacetTitles(facetKeys, facetLabels);\n this.updateChartDimensions(facetKeys, facetSettings, xAxis, yAxis);\n this.updateLegendSize(legend, legendInfo, grouping, layers, additionalCurves, yColumn);\n this.createMainTitle(facetKeys, title);\n this.updateMargins(facetKeys);\n const component = (\n <DataFrameProvider dataFrame={dataFrame}>\n <ChartsGroup\n settingsId={settingsId}\n chartSettings={chartSettings}\n facetKeys={facetKeys}\n facetSettings={facetSettings}\n chartSizes={this.chartSizes}\n chartsDimensions={this.chartsDimensions}\n scales={this.scales}\n groupedDots={groupedDots}\n trendsData={trendsData}\n legendData={this.legend}\n columnsCount={this.columnsCount}\n margins={this.margins}\n keyColumn={keyColumn}\n mainTitle={this.mainTitle}\n facetTitles={this.facetTitles}\n captionsSizes={this.captionsSizes}\n onlyPositive={onlyPositive}\n layersData={layersData}\n aesGetters={createAesGetters(dataFrame, legendInfo, layers, trend, additionalCurves)}\n onTooltipHintSwitch={onTooltipHintSwitch}\n discreteAxesLabels={this.discreteAxesLabels}\n />\n </DataFrameProvider>\n );\n this.component = component;\n this.reactRoot?.render(component);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n}\n\nexport default ChartRenderer;\n"],"mappings":"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"}
@@ -84,6 +84,7 @@ export declare class ScatterplotSettingsImpl implements SettingsInterface {
84
84
  readonly trend: {
85
85
  bounded: boolean;
86
86
  color: string | InheritAesScatterplot | ContinuousAesFromColumn<string>;
87
+ lineWidth: number;
87
88
  } | null;
88
89
  readonly additionalCurves: {
89
90
  curves: (AdditionalCurveEntry & {
@@ -1 +1 @@
1
- {"version":3,"file":"ScatterplotSettingsImpl.d.ts","sourceRoot":"","sources":["../../src/scatterplot/ScatterplotSettingsImpl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ScatterplotSettingsImpl.d.ts","sourceRoot":"","sources":["../../src/scatterplot/ScatterplotSettingsImpl.ts"],"names":[],"mappings":"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"}
@@ -92,7 +92,8 @@ var i = class {
92
92
  }
93
93
  }, this.trend = e?.trend && this.chartSettings.xAxis.scale !== "discrete" && this.chartSettings.yAxis.scale !== "discrete" ? {
94
94
  bounded: e.trend.bounded ?? !1,
95
- color: e.trend.color ?? "#110529"
95
+ color: e.trend.color ?? "#110529",
96
+ lineWidth: e.trend.lineWidth ?? 1
96
97
  } : null;
97
98
  let o = [
98
99
  "dashed",
@@ -1 +1 @@
1
- {"version":3,"file":"ScatterplotSettingsImpl.js","names":[],"sources":["../../src/scatterplot/ScatterplotSettingsImpl.ts"],"sourcesContent":["import lodash from 'lodash';\nimport {BLACK, DEFAULT_HEIGHT, DEFAULT_HEIGHT_SMALL, DEFAULT_WIDTH, DEFAULT_WIDTH_SMALL} from '../constants';\nimport type {\n AdditionalCurveEntry,\n AxisSettingsContinuous,\n AxisSettingsDiscrete,\n ColumnName,\n ContinuousAesFromColumn,\n DataValue,\n FrameType,\n InheritAesScatterplot,\n LegendPosition,\n LineShape,\n CurveLayer as OuterCurveLayer,\n DotsLayer as OuterDotsLayer,\n PointShape,\n ScatterplotSettings,\n SettingsInterface,\n TitlePosition,\n} from '../types';\nimport {type AesRecord, ScatterplotSettingsSchema} from '../types';\nimport {exhaustive} from '../utils';\n\nexport class DotsLayer {\n readonly type = 'dots';\n readonly aes: {\n dotFill: string | InheritAesScatterplot | ContinuousAesFromColumn<string>;\n dotShape: PointShape | InheritAesScatterplot;\n dotSize: number | ContinuousAesFromColumn<number>;\n opacity: number;\n } = {\n dotFill: BLACK,\n dotShape: '21',\n dotSize: 3,\n opacity: 1,\n };\n\n constructor(layer: OuterDotsLayer) {\n this.aes = {\n ...this.aes,\n ...layer.aes,\n };\n }\n}\n\nexport class CurveLayer {\n readonly type = 'curve';\n readonly smoothing: boolean;\n readonly aes: {\n lineColor: string | InheritAesScatterplot | ContinuousAesFromColumn<string>;\n lineWidth: number;\n lineShape: LineShape;\n opacity: number;\n } = {\n lineColor: BLACK,\n lineWidth: 1,\n lineShape: 'solid',\n opacity: 1,\n };\n\n constructor(layer: OuterCurveLayer) {\n this.smoothing = layer.smoothing ?? false;\n this.aes = {\n ...this.aes,\n ...layer.aes,\n };\n }\n}\n\nexport type ScatterplotLayer = DotsLayer | CurveLayer;\n\nexport type ScatterplotAxisSettings =\n AxisSettingsDiscrete & {title: string | ColumnName}\n | AxisSettingsContinuous & {title: string | ColumnName}\n\nexport class ScatterplotSettingsImpl implements SettingsInterface {\n readonly id: string;\n readonly type = 'scatterplot';\n readonly keyColumn: ColumnName;\n readonly facetSettings: {\n sharedX: boolean;\n sharedY: boolean;\n /** Ordered list of facet keys; only these facets are shown, in this order */\n order?: string[];\n nRows?: number;\n nCols?: number;\n titlePosition: 'left' | 'center' | 'right';\n };\n readonly x: ColumnName;\n readonly y: ColumnName;\n readonly facetBy: ColumnName[];\n readonly grouping: {\n columnName: ColumnName;\n order?: DataValue[];\n inheritedAes?: AesRecord;\n }[];\n readonly dotSize: {\n columnName: ColumnName;\n inheritedAes?: AesRecord;\n }[];\n readonly dotShape: {\n columnName: ColumnName;\n inheritedAes?: AesRecord;\n }[];\n readonly label: ColumnName | null;\n readonly highlight: ColumnName | null;\n readonly chartSettings: {\n readonly size: {width: number; height: number};\n readonly title: {name: string; show: boolean; position: TitlePosition};\n readonly yAxis: ScatterplotAxisSettings;\n readonly xAxis: ScatterplotAxisSettings;\n readonly frame: {type: FrameType};\n readonly legend: {show: boolean; position: LegendPosition};\n readonly tooltips: {show: boolean; content?: ColumnName[]};\n };\n\n readonly trend: {\n bounded: boolean;\n color: string | InheritAesScatterplot | ContinuousAesFromColumn<string>;\n } | null;\n\n readonly additionalCurves: {\n curves: (AdditionalCurveEntry & {\n lineShape: LineShape;\n lineWidth: number;\n lineColor: string | InheritAesScatterplot | ContinuousAesFromColumn<string>;\n opacity: number;\n showDots: boolean;\n })[];\n smoothing: boolean;\n } | null;\n\n readonly layers: ScatterplotLayer[];\n\n constructor(settings: ScatterplotSettings) {\n ScatterplotSettingsSchema.parse(settings);\n this.id = lodash.uniqueId('settings');\n this.keyColumn = settings.keyColumn;\n this.facetSettings = {sharedX: true, sharedY: true, titlePosition: 'left', ...settings.facetSettings};\n this.x = settings.x;\n this.y = settings.y;\n this.facetBy = settings.facetBy ?? [];\n this.grouping = settings.grouping ?? [];\n this.dotSize = settings.dotSize ?? [];\n this.dotShape = settings.dotShape ?? [];\n this.label = settings.label ?? null;\n this.highlight = settings.highlight ?? null;\n this.chartSettings = {\n size: {\n width: settings?.size?.width ?? (this.facetBy.length ? DEFAULT_WIDTH_SMALL : DEFAULT_WIDTH),\n height: settings?.size?.height ?? (this.facetBy.length ? DEFAULT_HEIGHT_SMALL : DEFAULT_HEIGHT),\n },\n title: {\n position: 'center',\n show: true,\n ...settings.title,\n name: settings.title?.name ?? 'Chart',\n },\n yAxis: {\n title: settings.y.label ?? settings.y.value,\n scale: 'linear',\n showGrid: true,\n showTicks: true,\n ...settings.yAxis,\n },\n xAxis: {\n title: settings.x.label ?? settings.x.value,\n scale: 'linear',\n showGrid: true,\n showTicks: true,\n ...settings.xAxis,\n },\n frame: {type: settings.frame?.type ?? 'full'},\n legend: {\n show: true,\n position: 'right',\n ...settings.legend,\n },\n tooltips: {\n ...settings.tooltips,\n show: !(settings.tooltips?.show === false) && (settings.tooltips?.content ?? []).length > 0,\n },\n };\n\n this.trend = settings?.trend && this.chartSettings.xAxis.scale !== 'discrete' && this.chartSettings.yAxis.scale !== 'discrete'\n ? {\n bounded: settings.trend.bounded ?? false,\n color: settings.trend.color ?? BLACK,\n }\n : null;\n\n // `lineShape` defaults cycle through a list that defers `solid` to keep it visually associated\n // with the primary curve layer.\n const DEFAULT_LINE_SHAPES: LineShape[] = ['dashed', 'dotted', 'dotdash', 'longdash', 'twodash', 'solid'];\n this.additionalCurves = settings.additionalCurves && settings.additionalCurves.curves.length > 0\n ? {\n curves: settings.additionalCurves.curves.map((entry, idx) => ({\n ...entry,\n lineShape: entry.lineShape ?? DEFAULT_LINE_SHAPES[idx % DEFAULT_LINE_SHAPES.length],\n lineWidth: entry.lineWidth ?? 1,\n lineColor: entry.lineColor ?? BLACK,\n opacity: entry.opacity ?? 1,\n showDots: entry.showDots ?? false,\n })),\n smoothing: settings.additionalCurves.smoothing ?? false,\n }\n : null;\n\n this.layers = settings.layers\n .map(layer => {\n if (layer.type === 'dots') {\n return new DotsLayer(layer);\n }\n if (layer.type === 'curve') {\n return new CurveLayer(layer);\n }\n exhaustive(layer, 'Unknown layer type');\n })\n .filter(Boolean) as ScatterplotLayer[];\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ScatterplotSettingsImpl.js","names":[],"sources":["../../src/scatterplot/ScatterplotSettingsImpl.ts"],"sourcesContent":["import lodash from 'lodash';\nimport {BLACK, DEFAULT_HEIGHT, DEFAULT_HEIGHT_SMALL, DEFAULT_WIDTH, DEFAULT_WIDTH_SMALL} from '../constants';\nimport type {\n AdditionalCurveEntry,\n AxisSettingsContinuous,\n AxisSettingsDiscrete,\n ColumnName,\n ContinuousAesFromColumn,\n DataValue,\n FrameType,\n InheritAesScatterplot,\n LegendPosition,\n LineShape,\n CurveLayer as OuterCurveLayer,\n DotsLayer as OuterDotsLayer,\n PointShape,\n ScatterplotSettings,\n SettingsInterface,\n TitlePosition,\n} from '../types';\nimport {type AesRecord, ScatterplotSettingsSchema} from '../types';\nimport {exhaustive} from '../utils';\n\nexport class DotsLayer {\n readonly type = 'dots';\n readonly aes: {\n dotFill: string | InheritAesScatterplot | ContinuousAesFromColumn<string>;\n dotShape: PointShape | InheritAesScatterplot;\n dotSize: number | ContinuousAesFromColumn<number>;\n opacity: number;\n } = {\n dotFill: BLACK,\n dotShape: '21',\n dotSize: 3,\n opacity: 1,\n };\n\n constructor(layer: OuterDotsLayer) {\n this.aes = {\n ...this.aes,\n ...layer.aes,\n };\n }\n}\n\nexport class CurveLayer {\n readonly type = 'curve';\n readonly smoothing: boolean;\n readonly aes: {\n lineColor: string | InheritAesScatterplot | ContinuousAesFromColumn<string>;\n lineWidth: number;\n lineShape: LineShape;\n opacity: number;\n } = {\n lineColor: BLACK,\n lineWidth: 1,\n lineShape: 'solid',\n opacity: 1,\n };\n\n constructor(layer: OuterCurveLayer) {\n this.smoothing = layer.smoothing ?? false;\n this.aes = {\n ...this.aes,\n ...layer.aes,\n };\n }\n}\n\nexport type ScatterplotLayer = DotsLayer | CurveLayer;\n\nexport type ScatterplotAxisSettings =\n AxisSettingsDiscrete & {title: string | ColumnName}\n | AxisSettingsContinuous & {title: string | ColumnName}\n\nexport class ScatterplotSettingsImpl implements SettingsInterface {\n readonly id: string;\n readonly type = 'scatterplot';\n readonly keyColumn: ColumnName;\n readonly facetSettings: {\n sharedX: boolean;\n sharedY: boolean;\n /** Ordered list of facet keys; only these facets are shown, in this order */\n order?: string[];\n nRows?: number;\n nCols?: number;\n titlePosition: 'left' | 'center' | 'right';\n };\n readonly x: ColumnName;\n readonly y: ColumnName;\n readonly facetBy: ColumnName[];\n readonly grouping: {\n columnName: ColumnName;\n order?: DataValue[];\n inheritedAes?: AesRecord;\n }[];\n readonly dotSize: {\n columnName: ColumnName;\n inheritedAes?: AesRecord;\n }[];\n readonly dotShape: {\n columnName: ColumnName;\n inheritedAes?: AesRecord;\n }[];\n readonly label: ColumnName | null;\n readonly highlight: ColumnName | null;\n readonly chartSettings: {\n readonly size: {width: number; height: number};\n readonly title: {name: string; show: boolean; position: TitlePosition};\n readonly yAxis: ScatterplotAxisSettings;\n readonly xAxis: ScatterplotAxisSettings;\n readonly frame: {type: FrameType};\n readonly legend: {show: boolean; position: LegendPosition};\n readonly tooltips: {show: boolean; content?: ColumnName[]};\n };\n\n readonly trend: {\n bounded: boolean;\n color: string | InheritAesScatterplot | ContinuousAesFromColumn<string>;\n lineWidth: number;\n } | null;\n\n readonly additionalCurves: {\n curves: (AdditionalCurveEntry & {\n lineShape: LineShape;\n lineWidth: number;\n lineColor: string | InheritAesScatterplot | ContinuousAesFromColumn<string>;\n opacity: number;\n showDots: boolean;\n })[];\n smoothing: boolean;\n } | null;\n\n readonly layers: ScatterplotLayer[];\n\n constructor(settings: ScatterplotSettings) {\n ScatterplotSettingsSchema.parse(settings);\n this.id = lodash.uniqueId('settings');\n this.keyColumn = settings.keyColumn;\n this.facetSettings = {sharedX: true, sharedY: true, titlePosition: 'left', ...settings.facetSettings};\n this.x = settings.x;\n this.y = settings.y;\n this.facetBy = settings.facetBy ?? [];\n this.grouping = settings.grouping ?? [];\n this.dotSize = settings.dotSize ?? [];\n this.dotShape = settings.dotShape ?? [];\n this.label = settings.label ?? null;\n this.highlight = settings.highlight ?? null;\n this.chartSettings = {\n size: {\n width: settings?.size?.width ?? (this.facetBy.length ? DEFAULT_WIDTH_SMALL : DEFAULT_WIDTH),\n height: settings?.size?.height ?? (this.facetBy.length ? DEFAULT_HEIGHT_SMALL : DEFAULT_HEIGHT),\n },\n title: {\n position: 'center',\n show: true,\n ...settings.title,\n name: settings.title?.name ?? 'Chart',\n },\n yAxis: {\n title: settings.y.label ?? settings.y.value,\n scale: 'linear',\n showGrid: true,\n showTicks: true,\n ...settings.yAxis,\n },\n xAxis: {\n title: settings.x.label ?? settings.x.value,\n scale: 'linear',\n showGrid: true,\n showTicks: true,\n ...settings.xAxis,\n },\n frame: {type: settings.frame?.type ?? 'full'},\n legend: {\n show: true,\n position: 'right',\n ...settings.legend,\n },\n tooltips: {\n ...settings.tooltips,\n show: !(settings.tooltips?.show === false) && (settings.tooltips?.content ?? []).length > 0,\n },\n };\n\n this.trend = settings?.trend && this.chartSettings.xAxis.scale !== 'discrete' && this.chartSettings.yAxis.scale !== 'discrete'\n ? {\n bounded: settings.trend.bounded ?? false,\n color: settings.trend.color ?? BLACK,\n lineWidth: settings.trend.lineWidth ?? 1,\n }\n : null;\n\n // `lineShape` defaults cycle through a list that defers `solid` to keep it visually associated\n // with the primary curve layer.\n const DEFAULT_LINE_SHAPES: LineShape[] = ['dashed', 'dotted', 'dotdash', 'longdash', 'twodash', 'solid'];\n this.additionalCurves = settings.additionalCurves && settings.additionalCurves.curves.length > 0\n ? {\n curves: settings.additionalCurves.curves.map((entry, idx) => ({\n ...entry,\n lineShape: entry.lineShape ?? DEFAULT_LINE_SHAPES[idx % DEFAULT_LINE_SHAPES.length],\n lineWidth: entry.lineWidth ?? 1,\n lineColor: entry.lineColor ?? BLACK,\n opacity: entry.opacity ?? 1,\n showDots: entry.showDots ?? false,\n })),\n smoothing: settings.additionalCurves.smoothing ?? false,\n }\n : null;\n\n this.layers = settings.layers\n .map(layer => {\n if (layer.type === 'dots') {\n return new DotsLayer(layer);\n }\n if (layer.type === 'curve') {\n return new CurveLayer(layer);\n }\n exhaustive(layer, 'Unknown layer type');\n })\n .filter(Boolean) as ScatterplotLayer[];\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChartTrendsData.d.ts","sourceRoot":"","sources":["../../../src/scatterplot/components/ChartTrendsData.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EACR,UAAU,EACV,WAAW,EACd,MAAM,SAAS,CAAC;AAGjB,UAAU,KAAK;IACX,UAAU,EAAE,UAAU,CAAC,MAAM,UAAU,CAAC,GAAG,IAAI,CAAC;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;CAC1B;AAED,eAAO,MAAM,eAAe,mFAKzB,KAAK,+DAmCN,CAAC"}
1
+ {"version":3,"file":"ChartTrendsData.d.ts","sourceRoot":"","sources":["../../../src/scatterplot/components/ChartTrendsData.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EACR,UAAU,EACV,WAAW,EACd,MAAM,SAAS,CAAC;AAGjB,UAAU,KAAK;IACX,UAAU,EAAE,UAAU,CAAC,MAAM,UAAU,CAAC,GAAG,IAAI,CAAC;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;CAC1B;AAED,eAAO,MAAM,eAAe,mFAKzB,KAAK,+DAoCN,CAAC"}
@@ -26,7 +26,8 @@ const s = r(({ width: e, scales: r, trendsData: i, aesGetters: s }) => i && i.ma
26
26
  x2: r.x(g),
27
27
  y1: r.y(v),
28
28
  y2: r.y(y),
29
- stroke: b
29
+ stroke: b,
30
+ strokeWidth: s.trendLineWidth
30
31
  })
31
32
  ] }, m);
32
33
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"ChartTrendsData.js","names":[],"sources":["../../../src/scatterplot/components/ChartTrendsData.tsx"],"sourcesContent":["import { range } from 'lodash';\nimport { memo, type ReactElement } from 'react';\nimport { numberFormat } from '../../utils/numberFormat';\nimport type { TrendsData } from '../linearRegression';\nimport type {\n AesGetters,\n ChartScales\n} from './types';\nimport { isNumericScale } from '../utils/isNumericScale';\n\ninterface Props {\n trendsData: TrendsData[keyof TrendsData] | null;\n width: number;\n scales: ChartScales;\n aesGetters: AesGetters;\n}\n\nexport const ChartTrendsData = memo(({\n width,\n scales,\n trendsData,\n aesGetters,\n}: Props) => {\n return (trendsData &&\n trendsData.map(({ idx, predict, getArea, bounded, xBounds, stats}, i) => {\n if (!isNumericScale(scales.x) || !isNumericScale(scales.y)) {\n return null;\n }\n const [minX, maxX] = bounded ? xBounds : scales.x.domain();\n const step = (maxX - minX) / 15;\n const p1 = predict(minX);\n const p2 = predict(maxX);\n if (isNaN(p1) || isNaN(p2)) {\n return null;\n }\n const fillColor = aesGetters.trendColor(idx);\n return (\n <g key={i}>\n <text y={i * 20 + 20} fill={fillColor} x={width - 8} textAnchor=\"end\">\n {formatStats(stats)}\n </text>\n <path\n d={getArea(scales.x, scales.y, range(minX, maxX + step / 2, step))}\n fill={fillColor}\n opacity={0.2}\n />\n <line\n x1={scales.x(minX)}\n x2={scales.x(maxX)}\n y1={scales.y(p1)}\n y2={scales.y(p2)}\n stroke={fillColor}\n />\n </g>\n );\n })\n );\n});\n\nfunction formatR2(stats: TrendsData[keyof TrendsData][number]['stats']) {\n if (typeof stats.r2 === 'undefined') {\n return null;\n }\n return (\n <>\n <tspan>R</tspan>\n <tspan fontSize=\"10px\" dy=\"-8\">\n 2\n </tspan>\n <tspan dy=\"8\">{` = ${numberFormat(stats.r2)}`}</tspan>\n </>\n );\n}\n\nfunction formatPValue(stats: TrendsData[keyof TrendsData][number]['stats']) {\n if (typeof stats.pValue === 'undefined') {\n return null;\n }\n return <tspan>{`p-value = ${numberFormat(stats.pValue)}`}</tspan>;\n}\n\nfunction formatCoefficients(stats: TrendsData[keyof TrendsData][number]['stats']) {\n if (typeof stats.coefficients === 'undefined') {\n return null;\n }\n const {slope, slopeError, intercept, interceptError} = stats.coefficients;\n return (\n <tspan>\n <tspan>\n {`slope = ${numberFormat(slope)} ± ${numberFormat(slopeError)}, intercept = ${numberFormat(intercept)} ± ${numberFormat(interceptError)}`}\n </tspan>\n </tspan>\n );\n}\n\nfunction formatStats(stats: TrendsData[keyof TrendsData][number]['stats']) {\n const items = [formatR2(stats), formatPValue(stats), formatCoefficients(stats)].filter(\n value => value !== null\n ) as unknown as ReactElement[];\n return (\n <>\n {items.map((item, idx) => (\n <tspan key={idx}>\n {item}\n <tspan>{idx < items.length - 1 && ', '}</tspan>\n </tspan>\n ))}\n </>\n );\n}\n\n"],"mappings":";;;;;AAiBA,MAAa,IAAkB,GAAM,EACjC,UACA,WACA,eACA,oBAEQ,KACJ,EAAW,KAAK,EAAE,QAAK,YAAS,YAAS,YAAS,YAAS,YAAQ,MAAM;AACrE,KAAI,CAAC,EAAe,EAAO,EAAE,IAAI,CAAC,EAAe,EAAO,EAAE,CACtD,QAAO;CAEX,IAAM,CAAC,GAAM,KAAQ,IAAU,IAAU,EAAO,EAAE,QAAQ,EACpD,KAAQ,IAAO,KAAQ,IACvB,IAAK,EAAQ,EAAK,EAClB,IAAK,EAAQ,EAAK;AACxB,KAAI,MAAM,EAAG,IAAI,MAAM,EAAG,CACtB,QAAO;CAEX,IAAM,IAAY,EAAW,WAAW,EAAI;AAC5C,QACI,kBAAC,KAAD,EAAA,UAAA;EACI,kBAAC,QAAD;GAAM,GAAG,IAAI,KAAK;GAAI,MAAM;GAAW,GAAG,IAAQ;GAAG,YAAW;aAC3D,EAAY,EAAM;GAChB,CAAA;EACP,kBAAC,QAAD;GACI,GAAG,EAAQ,EAAO,GAAG,EAAO,GAAG,EAAM,GAAM,IAAO,IAAO,GAAG,EAAK,CAAC;GAClE,MAAM;GACN,SAAS;GACX,CAAA;EACF,kBAAC,QAAD;GACI,IAAI,EAAO,EAAE,EAAK;GAClB,IAAI,EAAO,EAAE,EAAK;GAClB,IAAI,EAAO,EAAE,EAAG;GAChB,IAAI,EAAO,EAAE,EAAG;GAChB,QAAQ;GACV,CAAA;EACF,EAAA,EAhBI,EAgBJ;EAEV,CAER;AAEF,SAAS,EAAS,GAAsD;AAIpE,QAHW,EAAM,OAAO,SACb,OAGP,kBAAA,GAAA,EAAA,UAAA;EACI,kBAAC,SAAD,EAAA,UAAO,KAAS,CAAA;EAChB,kBAAC,SAAD;GAAO,UAAS;GAAO,IAAG;aAAK;GAEvB,CAAA;EACR,kBAAC,SAAD;GAAO,IAAG;aAAK,MAAM,EAAa,EAAM,GAAG;GAAW,CAAA;EACvD,EAAA,CAAA;;AAIX,SAAS,EAAa,GAAsD;AAIxE,QAHW,EAAM,WAAW,SACjB,OAEJ,kBAAC,SAAD,EAAA,UAAQ,aAAa,EAAa,EAAM,OAAO,IAAW,CAAA;;AAGrE,SAAS,EAAmB,GAAsD;AAC9E,KAAW,EAAM,iBAAiB,OAC9B,QAAO;CAEX,IAAM,EAAC,UAAO,eAAY,cAAW,sBAAkB,EAAM;AAC7D,QACI,kBAAC,SAAD,EAAA,UACI,kBAAC,SAAD,EAAA,UACK,WAAW,EAAa,EAAM,CAAC,KAAK,EAAa,EAAW,CAAC,gBAAgB,EAAa,EAAU,CAAC,KAAK,EAAa,EAAe,IACnI,CAAA,EACJ,CAAA;;AAIhB,SAAS,EAAY,GAAsD;CACvE,IAAM,IAAQ;EAAC,EAAS,EAAM;EAAE,EAAa,EAAM;EAAE,EAAmB,EAAM;EAAC,CAAC,QAC5E,MAAS,MAAU,KACtB;AACD,QACI,kBAAA,GAAA,EAAA,UACK,EAAM,KAAK,GAAM,MACd,kBAAC,SAAD,EAAA,UAAA,CACK,GACD,kBAAC,SAAD,EAAA,UAAQ,IAAM,EAAM,SAAS,KAAK,MAAa,CAAA,CAC3C,EAAA,EAHI,EAGJ,CACV,EACH,CAAA"}
1
+ {"version":3,"file":"ChartTrendsData.js","names":[],"sources":["../../../src/scatterplot/components/ChartTrendsData.tsx"],"sourcesContent":["import { range } from 'lodash';\nimport { memo, type ReactElement } from 'react';\nimport { numberFormat } from '../../utils/numberFormat';\nimport type { TrendsData } from '../linearRegression';\nimport type {\n AesGetters,\n ChartScales\n} from './types';\nimport { isNumericScale } from '../utils/isNumericScale';\n\ninterface Props {\n trendsData: TrendsData[keyof TrendsData] | null;\n width: number;\n scales: ChartScales;\n aesGetters: AesGetters;\n}\n\nexport const ChartTrendsData = memo(({\n width,\n scales,\n trendsData,\n aesGetters,\n}: Props) => {\n return (trendsData &&\n trendsData.map(({ idx, predict, getArea, bounded, xBounds, stats}, i) => {\n if (!isNumericScale(scales.x) || !isNumericScale(scales.y)) {\n return null;\n }\n const [minX, maxX] = bounded ? xBounds : scales.x.domain();\n const step = (maxX - minX) / 15;\n const p1 = predict(minX);\n const p2 = predict(maxX);\n if (isNaN(p1) || isNaN(p2)) {\n return null;\n }\n const fillColor = aesGetters.trendColor(idx);\n return (\n <g key={i}>\n <text y={i * 20 + 20} fill={fillColor} x={width - 8} textAnchor=\"end\">\n {formatStats(stats)}\n </text>\n <path\n d={getArea(scales.x, scales.y, range(minX, maxX + step / 2, step))}\n fill={fillColor}\n opacity={0.2}\n />\n <line\n x1={scales.x(minX)}\n x2={scales.x(maxX)}\n y1={scales.y(p1)}\n y2={scales.y(p2)}\n stroke={fillColor}\n strokeWidth={aesGetters.trendLineWidth}\n />\n </g>\n );\n })\n );\n});\n\nfunction formatR2(stats: TrendsData[keyof TrendsData][number]['stats']) {\n if (typeof stats.r2 === 'undefined') {\n return null;\n }\n return (\n <>\n <tspan>R</tspan>\n <tspan fontSize=\"10px\" dy=\"-8\">\n 2\n </tspan>\n <tspan dy=\"8\">{` = ${numberFormat(stats.r2)}`}</tspan>\n </>\n );\n}\n\nfunction formatPValue(stats: TrendsData[keyof TrendsData][number]['stats']) {\n if (typeof stats.pValue === 'undefined') {\n return null;\n }\n return <tspan>{`p-value = ${numberFormat(stats.pValue)}`}</tspan>;\n}\n\nfunction formatCoefficients(stats: TrendsData[keyof TrendsData][number]['stats']) {\n if (typeof stats.coefficients === 'undefined') {\n return null;\n }\n const {slope, slopeError, intercept, interceptError} = stats.coefficients;\n return (\n <tspan>\n <tspan>\n {`slope = ${numberFormat(slope)} ± ${numberFormat(slopeError)}, intercept = ${numberFormat(intercept)} ± ${numberFormat(interceptError)}`}\n </tspan>\n </tspan>\n );\n}\n\nfunction formatStats(stats: TrendsData[keyof TrendsData][number]['stats']) {\n const items = [formatR2(stats), formatPValue(stats), formatCoefficients(stats)].filter(\n value => value !== null\n ) as unknown as ReactElement[];\n return (\n <>\n {items.map((item, idx) => (\n <tspan key={idx}>\n {item}\n <tspan>{idx < items.length - 1 && ', '}</tspan>\n </tspan>\n ))}\n </>\n );\n}\n\n"],"mappings":";;;;;AAiBA,MAAa,IAAkB,GAAM,EACjC,UACA,WACA,eACA,oBAEQ,KACJ,EAAW,KAAK,EAAE,QAAK,YAAS,YAAS,YAAS,YAAS,YAAQ,MAAM;AACrE,KAAI,CAAC,EAAe,EAAO,EAAE,IAAI,CAAC,EAAe,EAAO,EAAE,CACtD,QAAO;CAEX,IAAM,CAAC,GAAM,KAAQ,IAAU,IAAU,EAAO,EAAE,QAAQ,EACpD,KAAQ,IAAO,KAAQ,IACvB,IAAK,EAAQ,EAAK,EAClB,IAAK,EAAQ,EAAK;AACxB,KAAI,MAAM,EAAG,IAAI,MAAM,EAAG,CACtB,QAAO;CAEX,IAAM,IAAY,EAAW,WAAW,EAAI;AAC5C,QACI,kBAAC,KAAD,EAAA,UAAA;EACI,kBAAC,QAAD;GAAM,GAAG,IAAI,KAAK;GAAI,MAAM;GAAW,GAAG,IAAQ;GAAG,YAAW;aAC3D,EAAY,EAAM;GAChB,CAAA;EACP,kBAAC,QAAD;GACI,GAAG,EAAQ,EAAO,GAAG,EAAO,GAAG,EAAM,GAAM,IAAO,IAAO,GAAG,EAAK,CAAC;GAClE,MAAM;GACN,SAAS;GACX,CAAA;EACF,kBAAC,QAAD;GACI,IAAI,EAAO,EAAE,EAAK;GAClB,IAAI,EAAO,EAAE,EAAK;GAClB,IAAI,EAAO,EAAE,EAAG;GAChB,IAAI,EAAO,EAAE,EAAG;GAChB,QAAQ;GACR,aAAa,EAAW;GAC1B,CAAA;EACF,EAAA,EAjBI,EAiBJ;EAEV,CAER;AAEF,SAAS,EAAS,GAAsD;AAIpE,QAHW,EAAM,OAAO,SACb,OAGP,kBAAA,GAAA,EAAA,UAAA;EACI,kBAAC,SAAD,EAAA,UAAO,KAAS,CAAA;EAChB,kBAAC,SAAD;GAAO,UAAS;GAAO,IAAG;aAAK;GAEvB,CAAA;EACR,kBAAC,SAAD;GAAO,IAAG;aAAK,MAAM,EAAa,EAAM,GAAG;GAAW,CAAA;EACvD,EAAA,CAAA;;AAIX,SAAS,EAAa,GAAsD;AAIxE,QAHW,EAAM,WAAW,SACjB,OAEJ,kBAAC,SAAD,EAAA,UAAQ,aAAa,EAAa,EAAM,OAAO,IAAW,CAAA;;AAGrE,SAAS,EAAmB,GAAsD;AAC9E,KAAW,EAAM,iBAAiB,OAC9B,QAAO;CAEX,IAAM,EAAC,UAAO,eAAY,cAAW,sBAAkB,EAAM;AAC7D,QACI,kBAAC,SAAD,EAAA,UACI,kBAAC,SAAD,EAAA,UACK,WAAW,EAAa,EAAM,CAAC,KAAK,EAAa,EAAW,CAAC,gBAAgB,EAAa,EAAU,CAAC,KAAK,EAAa,EAAe,IACnI,CAAA,EACJ,CAAA;;AAIhB,SAAS,EAAY,GAAsD;CACvE,IAAM,IAAQ;EAAC,EAAS,EAAM;EAAE,EAAa,EAAM;EAAE,EAAmB,EAAM;EAAC,CAAC,QAC5E,MAAS,MAAU,KACtB;AACD,QACI,kBAAA,GAAA,EAAA,UACK,EAAM,KAAK,GAAM,MACd,kBAAC,SAAD,EAAA,UAAA,CACK,GACD,kBAAC,SAAD,EAAA,UAAQ,IAAM,EAAM,SAAS,KAAK,MAAa,CAAA,CAC3C,EAAA,EAHI,EAGJ,CACV,EACH,CAAA"}
@@ -59,6 +59,7 @@ export type AesGetters = {
59
59
  lineShape: (rowIndex: number) => LineShape;
60
60
  lineColor: (rowIndex: number) => string;
61
61
  trendColor: (rowIndex: number) => string;
62
+ trendLineWidth: number;
62
63
  additionalCurveLineColor: ((rowIndex: number) => string)[];
63
64
  additionalCurveTrendColor: ((rowIndex: number) => string)[];
64
65
  };
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/scatterplot/components/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/scatterplot/components/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,WAAW,OAAO;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC1F,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;AACxD,MAAM,WAAW,WAAW;IACxB,CAAC,EAAE,YAAY,GAAG,aAAa,CAAC;IAChC,CAAC,EAAE,YAAY,GAAG,aAAa,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAEzB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAChE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE;QACH,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,KAAK,EAAE;QACH,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,OAAO,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,cAAc,EAAE,CAAC,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;CAC3D;AAED,MAAM,WAAW,aAAa;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,6BAA6B,EAAE,MAAM,EAAE,CAAC;IACxC,8BAA8B,EAAE,MAAM,EAAE,CAAC;IACzC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEnF,MAAM,MAAM,UAAU,GAAG;IACrB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,UAAU,CAAC;IAC3C,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,SAAS,CAAC;IAC3C,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,wBAAwB,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;IAC3D,yBAAyB,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;CAC/D,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAI;IAAC,IAAI,EAAC,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChartRenderer.d.ts","sourceRoot":"","sources":["../../src/scatterplot-umap/ChartRenderer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChartRenderer.d.ts","sourceRoot":"","sources":["../../src/scatterplot-umap/ChartRenderer.tsx"],"names":[],"mappings":"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"}
@@ -41,6 +41,7 @@ function B(e, t, r, i) {
41
41
  dotFill: m(e, t, a?.aes.dotFill ?? n.color, "dotFill"),
42
42
  dotSize: m(e, t, a?.aes.dotSize ?? n.size, "dotSize"),
43
43
  lineType: m(e, t, o?.aes.lineShape ?? "solid", "lineShape"),
44
+ lineColor: m(e, t, o?.aes.lineColor ?? "#110529", "lineColor"),
44
45
  additionalCurveLineColor: (i?.curves ?? []).map((n) => m(e, t, n.lineColor, "lineColor"))
45
46
  };
46
47
  }
@@ -55,6 +56,7 @@ var V = class {
55
56
  dotSize: () => 2,
56
57
  dotFill: () => t,
57
58
  lineType: () => "solid",
59
+ lineColor: () => t,
58
60
  additionalCurveLineColor: []
59
61
  };
60
62
  tools = null;
@@ -1 +1 @@
1
- {"version":3,"file":"ChartRenderer.js","names":[],"sources":["../../src/scatterplot-umap/ChartRenderer.tsx"],"sourcesContent":["import { chartCartesian } from '@d3fc/d3fc-chart';\nimport type { CartesianChart } from '@d3fc/d3fc-chart/src/cartesian';\nimport type { ScaleLinear } from 'd3-scale';\nimport { scaleLinear, scaleLog, scaleOrdinal, scaleSymlog } from 'd3-scale';\nimport { select } from 'd3-selection';\nimport type { D3ZoomEvent, ZoomBehavior, ZoomTransform } from 'd3-zoom';\nimport { zoom, zoomIdentity } from 'd3-zoom';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { DotAesItem, LegendData, LegendItem } from '../common/types';\nimport {\n BLACK,\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n MAX_LEGEND_GRADIENT_HEIGHT,\n MAX_SHOWN_UNIQUE_VALUES_IN_LABELS,\n MIN_LEGEND_GRADIENT_HEIGHT,\n TITLE_LINE_HEIGHT,\n TITLE_MARGIN\n} from '../constants';\nimport { splitTextByWidth } from '../discrete/utils';\nimport { DEFAULT_DOT_AES, MIN_MARGIN } from '../scatterplot/constants';\nimport { createAesGetter } from '../scatterplot/utils/createAesGetter';\nimport { getTicksAndFormat } from '../scatterplot/utils/getTicksAndFormat';\nimport type { Label } from '../scatterplot/utils/getVisibleLabels';\nimport { createLabelPositioner } from '../scatterplot/utils/getVisibleLabels';\nimport type { AesItem, ColumnName, ScatterplotEventHandlers } from '../types';\nimport { isContinuousAes } from '../types';\nimport type { ScatterplotUmapLegendInfo } from '../types/scatterplot-umap';\nimport { getContinuousColorScale } from '../utils/getContinuousColorScale';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { SVGLayer } from './components/SVGLayer';\nimport { LEGEND_OFFSET, PADDINGS, TITLE_LINE } from './constants';\nimport type { CurveLayer, DotsLayer, ScatterplotUmapLayer, ScatterplotUmapSettingsImpl } from './SettingsImpl';\nimport type {\n AdditionalCurveRenderData,\n AesGetters,\n CaptionsSizes,\n ChartScales, ChartSizes,\n Dot,\n DotsExtents,\n LassoControlsState,\n Margins,\n Polygon,\n SVGLayerProps,\n} from './types';\n// @ts-ignore\nimport { seriesSvgMulti, seriesWebglMulti, seriesWebglPoint } from '@d3fc/d3fc-series';\n// @ts-ignore\nimport { webglFillColor } from '@d3fc/d3fc-webgl';\n// @ts-ignore\nimport { pointer } from '@d3fc/d3fc-pointer';\nimport { polygonContains } from 'd3-polygon';\nimport KDBush from 'kdbush';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport { DataFrame } from '../DataFrame';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { GET_BLACK, getColorWithFakeOpacity, stringToNumberRgba } from './colors';\nimport { getSizeLegendItem } from '../utils/getSizeLegendItem';\n\nfunction convertDotRToSymbolSize(r:number) {\n return (r / 2.35) * (r / 2.35) * 64;\n}\n\nfunction isDotInsidePolygons(x:number, y:number, polygons: Polygon[]) {\n if (polygons.length === 0) {\n return true;\n }\n return polygons.some((p) => p.closed && p.points.length > 2 && polygonContains(p.points, [x, y]));\n}\n\nfunction getGettersFromLayers(\n dataFrame: DataFrame,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n additionalCurves: ScatterplotUmapSettingsImpl['additionalCurves'],\n): AesGetters {\n const dotLayer = layers.find(l => l.type === 'dots') as DotsLayer | undefined;\n const curveLayer = layers.find(l => l.type === 'curve') as CurveLayer | undefined;\n return {\n dotFill: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotFill ?? DEFAULT_DOT_AES.color, 'dotFill'),\n dotSize: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotSize ?? DEFAULT_DOT_AES.size, 'dotSize'),\n lineType: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineShape ?? 'solid', 'lineShape'),\n additionalCurveLineColor: (additionalCurves?.curves ?? []).map(\n (entry) => createAesGetter<string>(dataFrame, legendInfo, entry.lineColor, 'lineColor'),\n ),\n };\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n canvasNode: HTMLElement | null = null;\n\n svgLayerElement: SVGElement | null = null;\n svgLayerComponent: ReactElement = (<></>);\n\n aesGetters: AesGetters = {\n dotSize: () => 2,\n dotFill: () => BLACK,\n lineType: () => 'solid',\n additionalCurveLineColor: [],\n };\n\n tools: {\n webglChart: CartesianChart<unknown, unknown>;\n qt?: KDBush;\n fillColor: () => {\n value: (setter: (d: Dot) => [number, number, number, number]) => void;\n data: (setter: () => Dot[]) => void;\n };\n pointSeries: () => unknown;\n zoom: ZoomBehavior<Element, unknown>;\n } | null = null;\n\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n scales: ChartScales = {\n x: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n y: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n xOriginal: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n yOriginal: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n };\n\n polygons:Polygon[] = [];\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'] = () => undefined;\n onTooltipHintSwitch: ScatterplotEventHandlers['onTooltipHintSwitch'] = () => undefined;\n onLassoControlsStateUpdate: ScatterplotEventHandlers['onLassoControlsStateUpdate'] = () => undefined;\n\n zoomTransform: ZoomTransform | null = null;\n zoomStateKey = '';\n selectedDot: Dot | null = null;\n captionsSizes: CaptionsSizes = {\n xAxisCaptionsWidth: 30,\n yAxisCaptionsWidth: 100,\n };\n mainTitle: string[] = []; // can be multiline\n legend: LegendData = {width: 0, height: 0, items: []};\n\n notCalculatedProps: Partial<SVGLayerProps> = {};\n\n allDots: Dot[] = [];\n visibleLabels: Label[] = [];\n dataFrame: DataFrame = new DataFrame('', {});\n\n clear() {\n if (this.parentNode && this.rootNode && this.canvasNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode?.removeChild(this.canvasNode);\n this.parentNode = null;\n this.rootNode = null;\n this.canvasNode = null;\n this.svgLayerElement = null;\n this.tools = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.canvasNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.parentNode.appendChild(this.canvasNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSizes(size: ScatterplotUmapSettingsImpl['chartSettings']['size']) {\n if (size.width !== this.chartSizes.chartWidth || size.height !== this.chartSizes.chartHeight) {\n // NB: now chart sizes always change with one multiplier for width/height so qt stays without changes\n this.chartSizes.chartWidth = size.width;\n this.chartSizes.chartHeight = size.height;\n this.scales.x.range([0, this.chartSizes.chartWidth]);\n this.scales.y.range([this.chartSizes.chartHeight, 0]);\n }\n \n }\n\n updateViewport(\n xAxis: ScatterplotUmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotUmapSettingsImpl['chartSettings']['yAxis'],\n dotsExtents: DotsExtents,\n ) {\n const scaleX = xAxis.scale === 'log' ? scaleLog() : scaleLinear();\n\n let {minX, minY, maxX, maxY} = dotsExtents;\n if (xAxis.lowerValue !== undefined) {\n minX = Math.max(minX, xAxis.lowerValue);\n }\n if (xAxis.upperValue !== undefined) {\n maxX = Math.min(maxX, xAxis.upperValue);\n }\n if (yAxis.lowerValue !== undefined) {\n minY = Math.max(minY, yAxis.lowerValue);\n }\n if (yAxis.upperValue !== undefined) {\n maxY = Math.min(maxY, yAxis.upperValue);\n }\n if (xAxis.symmetricRange !== undefined) {\n const middle = xAxis.symmetricRange;\n if (middle >= minX && middle <= maxX) {\n const halfRange = Math.max(middle - minX, maxX - middle);\n minX = middle - halfRange;\n maxX = middle + halfRange;\n }\n }\n if (typeof yAxis.symmetricRange !== 'undefined') {\n const middle = yAxis.symmetricRange;\n if (middle >= minY && middle <= maxY) {\n const halfRange = Math.max(middle - minY, maxY - middle);\n minY = middle - halfRange;\n maxY = middle + halfRange;\n }\n }\n\n const rangeH = [0, this.chartSizes.chartWidth];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempX = scaleX\n .copy()\n .domain([minX, maxX])\n .range([PADDINGS.LEFT, this.chartSizes.chartWidth - PADDINGS.RIGHT]);\n scaleX\n .domain([tempX.invert(0), tempX.invert(this.chartSizes.chartWidth)])\n .range(rangeH)\n .nice();\n // this.scales.x = scaleX;\n // this.scales.xOriginal = scaleX.copy();\n this.scales.x.domain(scaleX.domain());\n this.scales.xOriginal.domain(scaleX.domain());\n\n const scaleY = yAxis.scale === 'log' ? scaleLog() : scaleLinear();\n const rangeV = [this.chartSizes.chartHeight, 0];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempY = scaleY\n .copy()\n .domain([minY, maxY])\n .range([this.chartSizes.chartHeight - PADDINGS.BOTTOM, PADDINGS.TOP]);\n scaleY\n .domain([tempY.invert(this.chartSizes.chartHeight), tempY.invert(0)])\n .range(rangeV)\n .nice();\n // this.scales.y = scaleY;\n // this.scales.yOriginal = scaleY.copy();\n this.scales.y.domain(scaleY.domain());\n this.scales.yOriginal.domain(scaleY.domain());\n }\n\n updateCaptionsSize() {\n const textMeasurer = new TextMeasurer('600 14px Arial');\n\n function getMaxTickWidth(ticks: string[]) {\n return Math.max(...ticks.map(key => textMeasurer.getTextWidth(key)));\n }\n\n const {ticks, format} = getTicksAndFormat(this.scales.y, false);\n const maxYTick = getMaxTickWidth(ticks.map(format));\n\n this.captionsSizes = {\n xAxisCaptionsWidth: 20,\n yAxisCaptionsWidth: maxYTick,\n };\n }\n\n createMainTitle(title: ScatterplotUmapSettingsImpl['chartSettings']['title']) {\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.totalWidth - this.margins.left - this.margins.right,\n 20\n );\n }\n\n updateMargins(xAxis: ScatterplotUmapSettingsImpl['chartSettings']['xAxis'], yAxis: ScatterplotUmapSettingsImpl['chartSettings']['yAxis']) {\n const titleTextHeight = TITLE_LINE_HEIGHT * this.mainTitle.length;\n const titleHeight = titleTextHeight > 0 ? titleTextHeight + TITLE_MARGIN * 2 : 0;\n this.margins = {\n top: Math.max(titleHeight, MIN_MARGIN),\n bottom: MIN_MARGIN + (xAxis.hiddenLabels ? 0 : this.captionsSizes.xAxisCaptionsWidth) + TITLE_LINE,\n left: MIN_MARGIN + (yAxis.hiddenLabels ? 0 : this.captionsSizes.yAxisCaptionsWidth) + TITLE_LINE,\n right: this.legend.width + MIN_MARGIN,\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartHeight, this.legend.height) + this.margins.bottom;\n\n select(this.canvasNode)\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateLegendSize(\n legend: ScatterplotUmapSettingsImpl['chartSettings']['legend'],\n legendLabels: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n layers: ScatterplotUmapLayer[],\n additionalCurves: ScatterplotUmapSettingsImpl['additionalCurves'],\n yColumn: ColumnName,\n ) {\n if (!legend.show) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const legendItems: LegendItem[] = [];\n const emptySizes = {width:0, height:0, left:0, top: 0};\n const continuousHeight = Math.min(\n Math.max(this.chartSizes.chartHeight, MIN_LEGEND_GRADIENT_HEIGHT),\n MAX_LEGEND_GRADIENT_HEIGHT\n );\n const legendHeight = Math.max(this.chartSizes.chartHeight, continuousHeight);\n grouping.forEach(column => {\n const info = legendLabels[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n if (info.values.length > MAX_SHOWN_UNIQUE_VALUES_IN_LABELS) {\n console.warn(`Too many values for discrete legend (${info.values.length})`);\n return;\n }\n const aesData: Record<string, DotAesItem> = {};\n info.values.forEach(category => {\n if (!aesData[category]) {\n aesData[category] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill') {\n aesData[category].color = (info.aesMap(category, key) ?? BLACK) as string;\n }\n if (key === 'dotSize') {\n aesData[category].size = Number(info.aesMap(category, key) ?? 3);\n }\n });\n });\n\n const title = column.label ?? column.value;\n const scale = scaleOrdinal<DotAesItem>()\n .domain(info.values)\n .range(info.values.map(value => aesData[value]));\n legendItems.push({...emptySizes, id: column.value, type: 'dots', title, scale, values:info.values, labels:info.labels});\n });\n\n layers.forEach(layer => {\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotFill)) {\n const {domain, range, columnName, type = 'linear'} = layer.aes.dotFill;\n const title = columnName.label ?? columnName.value;\n const colorScale = getContinuousColorScale(range, domain, 'linear') as ScaleLinear<string, string>; // always linear for legend - scale to render gradient, not for dots\n const tickPositionScale = (type === 'log' ? scaleSymlog<string, string>() : scaleLinear<string, string>())\n .domain(domain)\n // @ts-ignore\n .range([continuousHeight, 0]);\n const values = getContinuousLegendTicks(tickPositionScale, domain as [number, number]);\n legendItems.push({...emptySizes, id: 'dotFill', type: 'continuous', title, scale: colorScale, tickPositionScale, values});\n }\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotSize)) {\n legendItems.push(getSizeLegendItem(layer.aes.dotSize));\n }\n });\n\n // Dedicated curves legend section — parallel implementation to scatterplot's updateLegendSize.\n // UMAP has no per-entry trend.\n if (additionalCurves && additionalCurves.curves.length > 0) {\n // Legend sample color mirrors the curve's own `lineColor` when fixed; falls back to neutral\n // BLACK only when the color inherits from grouping (a single sample can't represent multiple\n // group colors — actual group colors appear in the grouping's own color legend, per R19).\n const neutralColor = BLACK;\n const curveLegendValues: string[] = [];\n const curveLegendLabels: Record<string, string> = {};\n const curveLegendAes: Record<string, AesItem> = {};\n const curveLayer = layers.find(l => l.type === 'curve') as CurveLayer | undefined;\n if (curveLayer) {\n const label = yColumn.label ?? yColumn.value;\n const resolvedColor = typeof curveLayer.aes.lineColor === 'string'\n ? curveLayer.aes.lineColor\n : neutralColor;\n curveLegendValues.push(label);\n curveLegendLabels[label] = label;\n curveLegendAes[label] = { lineShape: curveLayer.aes.lineShape, lineColor: resolvedColor };\n }\n for (const entry of additionalCurves.curves) {\n let key = entry.label;\n let dedupeCounter = 1;\n while (curveLegendValues.includes(key)) {\n key = `${entry.label} (${++dedupeCounter})`;\n }\n const resolvedColor = typeof entry.lineColor === 'string'\n ? entry.lineColor\n : neutralColor;\n curveLegendValues.push(key);\n curveLegendLabels[key] = key;\n curveLegendAes[key] = { lineShape: entry.lineShape, lineColor: resolvedColor };\n }\n if (curveLegendValues.length > 0) {\n const scale = scaleOrdinal<AesItem>()\n .domain(curveLegendValues)\n .range(curveLegendValues.map(v => curveLegendAes[v]))\n .unknown({});\n legendItems.push({\n ...emptySizes,\n id: 'additionalCurves',\n type: 'discreteMulti',\n title: 'Curves',\n scale,\n values: curveLegendValues,\n labels: curveLegendLabels,\n usedAes: { lineShape: true, lineColor: true, dotFill: false, dotShape: false, fillColor: false },\n });\n }\n }\n\n if (!legendItems.length) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const items = arrangeLegendParts(legendItems, legendHeight, continuousHeight);\n const maxRightEdge = items.reduce((max, item) => Math.max(max, item.left + item.width), 0);\n const legendWidth = maxRightEdge + LEGEND_OFFSET;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items,\n };\n }\n\n initSettings(\n dots: Dot[],\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n dotExtents: DotsExtents,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n grouping: ColumnName[],\n onZoomChange: (v:boolean) => void,\n additionalCurves: ScatterplotUmapSettingsImpl['additionalCurves'],\n yColumn: ColumnName,\n ) {\n const {xAxis, yAxis, size, title, legend} = chartSettings;\n this.updateChartSizes(size);\n this.updateViewport(xAxis, yAxis, dotExtents);\n this.updateCaptionsSize();\n this.updateLegendSize(legend, legendInfo, grouping, layers, additionalCurves, yColumn);\n this.createMainTitle(title);\n this.updateMargins(xAxis, yAxis);\n\n this.aesGetters = getGettersFromLayers(this.dataFrame, legendInfo, layers, additionalCurves);\n\n const fillColor = webglFillColor()\n .data(dots)\n .value((d: Dot) => {\n const rgba = stringToNumberRgba(this.aesGetters.dotFill(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n\n const pointSeries = seriesWebglPoint()\n .equals((a: Dot[], b: Dot[]) => a === b)\n .size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.idx)))\n .crossValue((d: Dot) => d.x)\n .mainValue((d: Dot) => d.y)\n .decorate((program: unknown) => fillColor(program));\n\n const z = zoom()\n .scaleExtent([0.1, 1000])\n .filter((e:MouseEvent) => {\n return e.type === 'wheel' || e.metaKey || e.ctrlKey;\n })\n .on('start', () => {\n this.selectedDot = null;\n })\n .on('zoom', (e: D3ZoomEvent<SVGElement, unknown>) => {\n const transform = e.transform;\n const x = transform.rescaleX(this.scales.xOriginal);\n const y = transform.rescaleY(this.scales.yOriginal);\n this.scales.x.domain(x.domain());\n this.scales.y.domain(y.domain());\n\n this.zoomTransform = transform;\n this.zoomStateKey = `${transform.x}_${transform.y}_${transform.k}`; // need it to update axes\n\n this.updateLabelsPosition(this.visibleLabels);\n this.renderSvgLayer();\n this.renderWebglLayer();\n }).on('end', () => {\n this.visibleLabels = this.computeLabels(this.allDots);\n this.renderSvgLayer();\n onZoomChange(true);\n });\n \n // @ts-ignore\n const p = pointer().on('point', ([coord]) => {\n let closestDatum;\n if (coord) {\n closestDatum = this.getClosestDot(coord.x, coord.y);\n }\n \n const needRedraw =\n (this.selectedDot && !closestDatum) ||\n (!this.selectedDot && closestDatum) ||\n this.selectedDot?.idx !== closestDatum?.idx;\n\n this.selectedDot = closestDatum ?? null;\n\n if (needRedraw) {\n this.renderSvgLayer();\n }\n });\n\n const webglChart = chartCartesian({\n xScale: this.scales.x,\n yScale: this.scales.y,\n })\n .xAxisHeight(() => '0') // removing build-in axes from chartCartesian\n .yAxisWidth(() => '0') // removing build-in axes from chartCartesian\n .svgPlotArea(seriesSvgMulti())\n .webglPlotArea(\n // only render the point series on the WebGL layer\n seriesWebglMulti()\n .series([pointSeries])\n .mapping((d: unknown) => d)\n )\n .decorate(selection => {\n const s = selection.enter();\n if (s && !this.svgLayerElement) {\n s.style('grid-template-columns', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n s.style('grid-template-rows', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n this.svgLayerElement = s.select('.svg-plot-area.plot-area svg').node() as SVGElement;\n }\n s.select('.svg-plot-area.plot-area').attr('class', 'svg-plot-area plot-area miplots-scatterplot-plot-area')\n \n // @ts-ignore\n .call(z)\n .call(p);\n });\n\n this.tools = {\n webglChart,\n zoom: z,\n fillColor,\n pointSeries,\n };\n\n select(this.canvasNode)\n .datum(dots)\n .style('position', 'absolute')\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n this.onPolygonUpdate(this.polygons);\n }\n\n resetZoom(\n xAxis: ScatterplotUmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotUmapSettingsImpl['chartSettings']['yAxis'],\n dotsExtents?: DotsExtents\n ) {\n if (!this.tools?.zoom || !dotsExtents) {\n return;\n }\n this.updateViewport(xAxis, yAxis, dotsExtents);\n select('.miplots-scatterplot-plot-area').call((this.tools.zoom.transform as (selection: unknown, transform: unknown) => void), zoomIdentity);\n }\n\n updateAes(\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n additionalCurves: ScatterplotUmapSettingsImpl['additionalCurves']\n ) {\n if (this.tools === null) {\n return;\n }\n this.aesGetters = getGettersFromLayers(this.dataFrame, legendInfo, layers, additionalCurves);\n \n // @ts-ignore\n this.tools.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n }\n\n updatePointSize(\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n additionalCurves: ScatterplotUmapSettingsImpl['additionalCurves']\n ) {\n if (this.tools === null) {\n return;\n }\n this.updateAes(legendInfo, layers, additionalCurves);\n // TODO: try remove array copy\n select(this.canvasNode).datum([...this.allDots]);\n // @ts-ignore\n this.tools.pointSeries.size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.idx)));\n }\n\n updateByLasso() {\n if (this.tools === null) {\n return;\n }\n \n // @ts-ignore\n this.tools?.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n this.renderWebglLayer();\n }\n\n createQuadtree(dots: Dot[]): KDBush {\n const tree = new KDBush(dots.length, 512);\n\n for (let i = 0; i < dots.length; i++) {\n tree.add(dots[i].x, dots[i].y);\n } \n\n return tree.finish();\n }\n\n getClosestDot(_x: number, _y: number): Dot | null {\n const tree = this.tools?.qt;\n if (!tree) return null;\n const dots = this.allDots;\n const x = this.scales.x.invert(_x);\n const y = this.scales.y.invert(_y);\n const radius = 1 / (this.zoomTransform?.k || 1);\n const minX = x - radius;\n const maxX = x + radius;\n const minY = y - radius;\n const maxY = y + radius;\n\n const indexes = tree.range(minX, minY, maxX, maxY);\n const closest = indexes.reduce((closest, idx: number) => {\n const dot = dots[idx];\n const dX = this.scales.x(dot.x) - _x;\n const dY = this.scales.y(dot.y) - _y;\n const distance = Math.hypot(dX, dY);\n if (closest === null || distance < closest.distance) {\n closest.index = idx;\n closest.distance = distance;\n }\n return closest;\n }, {\n index: -1,\n distance: Infinity\n });\n return indexes.length === 0 || closest.index === -1 ? null : dots[closest.index];\n }\n\n updateDots(dots: Dot[]) {\n if (this.tools === null) {\n return;\n }\n select(this.canvasNode).datum(dots);\n \n // @ts-ignore\n this.tools.fillColor.data(dots);\n this.tools.qt = this.createQuadtree(dots);\n this.allDots = dots;\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n keyColumn: ColumnName | null,\n dots: Dot[],\n dotExtents: DotsExtents,\n dotsByGrouping: Record<string, Dot[]>,\n layers: ScatterplotUmapSettingsImpl['layers'],\n legendInfo: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'],\n onTooltipHintSwitch: (v:boolean) => void,\n onLassoControlsStateUpdate: (v:LassoControlsState) => void,\n onZoomChange: (v:boolean) => void,\n additionalCurves: AdditionalCurveRenderData[] = [],\n additionalCurvesSettings: ScatterplotUmapSettingsImpl['additionalCurves'] = null,\n yColumn: ColumnName,\n ) {\n this.dataFrame = dataFrame;\n const sizesChanged = chartSettings.size.width !== this.chartSizes.chartWidth || chartSettings.size.height !== this.chartSizes.chartHeight;\n if (this.tools === null) {\n this.initSettings(\n dots,\n chartSettings,\n dotExtents,\n legendInfo,\n layers,\n grouping,\n onZoomChange,\n additionalCurvesSettings,\n yColumn,\n );\n } else {\n const {title, legend, size} = chartSettings;\n this.updateChartSizes(size);\n this.updateLegendSize(legend, legendInfo, grouping, layers, additionalCurvesSettings, yColumn);\n this.createMainTitle(title);\n this.updateMargins(chartSettings.xAxis, chartSettings.yAxis);\n this.updateAes(legendInfo, layers, additionalCurvesSettings);\n }\n\n this.onPolygonUpdateOutside = onPolygonUpdateOutside;\n this.onTooltipHintSwitch = onTooltipHintSwitch;\n this.onLassoControlsStateUpdate = onLassoControlsStateUpdate;\n\n if (this.allDots !== dots) {\n this.updateDots(dots);\n this.visibleLabels = this.computeLabels(dots);\n this.onPolygonUpdate(this.polygons);\n } else if (sizesChanged) {\n this.visibleLabels = this.computeLabels(dots);\n }\n\n this.notCalculatedProps = {\n settingsId,\n chartSettings,\n keyColumn,\n dotsByGrouping,\n layers,\n additionalCurves,\n };\n\n this.renderWebglLayer();\n this.renderSvgLayer();\n }\n\n renderWebglLayer() {\n if (this.tools?.webglChart) {\n select(this.canvasNode).call(this.tools?.webglChart);\n }\n }\n\n onPolygonUpdate = (p:Polygon[]) => {\n this.polygons = p;\n this.updateByLasso();\n const filteredDotsIndexes = this.allDots\n .filter(d => isDotInsidePolygons(d.x, d.y, this.polygons))\n .map(d => d.idx);\n this.onPolygonUpdateOutside(filteredDotsIndexes, p);\n };\n\n renderSvgLayer() {\n const props = {\n settingsId: this.notCalculatedProps.settingsId,\n chartSettings: this.notCalculatedProps.chartSettings,\n keyColumn: this.notCalculatedProps.keyColumn,\n dotsByGrouping: this.notCalculatedProps.dotsByGrouping,\n layers: this.notCalculatedProps.layers,\n additionalCurves: this.notCalculatedProps.additionalCurves ?? [],\n chartSizes: this.chartSizes,\n scales: this.scales,\n margins: this.margins,\n mainTitle: this.mainTitle,\n captionsSizes: this.captionsSizes,\n container: this.svgLayerElement,\n zoomStateKey: this.zoomStateKey,\n selectedDot: this.selectedDot,\n aesGetters: this.aesGetters,\n legendData: this.legend,\n labels: this.visibleLabels,\n defaultPolygons: this.polygons,\n onPolygonUpdate: this.onPolygonUpdate,\n onTooltipHintSwitch: this.onTooltipHintSwitch,\n onLassoControlsStateUpdate: this.onLassoControlsStateUpdate,\n } as SVGLayerProps;\n this.svgLayerComponent = (\n <DataFrameProvider dataFrame={this.dataFrame}>\n <SVGLayer {...props} />\n </DataFrameProvider>\n );\n this.reactRoot?.render(this.svgLayerComponent);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n\n private computeLabels(dots: Dot[]) {\n const textMeasurer = new TextMeasurer('16px Manrope');\n const getPosition = createLabelPositioner(this.chartSizes.chartWidth, this.chartSizes.chartHeight);\n const labels = [];\n\n for (let i = 0; i < dots.length; i++) {\n const dot = dots[i];\n if (dot.label == null) {\n continue;\n }\n const name = String(dot.label);\n const metrics = textMeasurer.getTextMetrics(name);\n const x = this.scales.x(dot.x);\n const y = this.scales.y(dot.y);\n const w = metrics.width;\n const h = (metrics.actualBoundingBoxAscent) + (metrics.actualBoundingBoxDescent);\n const p = 10;\n const position = getPosition(x, y, w, h, p);\n if (!position) {\n continue;\n }\n\n labels.push({\n x,\n y,\n dot,\n name,\n width: w,\n height: h,\n padding: p,\n xPosition: position[0],\n yPosition: position[1],\n } satisfies Label);\n }\n\n return labels;\n }\n\n private updateLabelsPosition(labels: Label[]) {\n for (let i = 0; i < labels.length; i++) {\n const label = labels[i];\n label.x = this.scales.x(label.dot.x as number);\n label.y = this.scales.y(label.dot.y as number);\n }\n }\n}\n\nexport default ChartRenderer;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ChartRenderer.js","names":[],"sources":["../../src/scatterplot-umap/ChartRenderer.tsx"],"sourcesContent":["import { chartCartesian } from '@d3fc/d3fc-chart';\nimport type { CartesianChart } from '@d3fc/d3fc-chart/src/cartesian';\nimport type { ScaleLinear } from 'd3-scale';\nimport { scaleLinear, scaleLog, scaleOrdinal, scaleSymlog } from 'd3-scale';\nimport { select } from 'd3-selection';\nimport type { D3ZoomEvent, ZoomBehavior, ZoomTransform } from 'd3-zoom';\nimport { zoom, zoomIdentity } from 'd3-zoom';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { DotAesItem, LegendData, LegendItem } from '../common/types';\nimport {\n BLACK,\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n MAX_LEGEND_GRADIENT_HEIGHT,\n MAX_SHOWN_UNIQUE_VALUES_IN_LABELS,\n MIN_LEGEND_GRADIENT_HEIGHT,\n TITLE_LINE_HEIGHT,\n TITLE_MARGIN\n} from '../constants';\nimport { splitTextByWidth } from '../discrete/utils';\nimport { DEFAULT_DOT_AES, MIN_MARGIN } from '../scatterplot/constants';\nimport { createAesGetter } from '../scatterplot/utils/createAesGetter';\nimport { getTicksAndFormat } from '../scatterplot/utils/getTicksAndFormat';\nimport type { Label } from '../scatterplot/utils/getVisibleLabels';\nimport { createLabelPositioner } from '../scatterplot/utils/getVisibleLabels';\nimport type { AesItem, ColumnName, ScatterplotEventHandlers } from '../types';\nimport { isContinuousAes } from '../types';\nimport type { ScatterplotUmapLegendInfo } from '../types/scatterplot-umap';\nimport { getContinuousColorScale } from '../utils/getContinuousColorScale';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { SVGLayer } from './components/SVGLayer';\nimport { LEGEND_OFFSET, PADDINGS, TITLE_LINE } from './constants';\nimport type { CurveLayer, DotsLayer, ScatterplotUmapLayer, ScatterplotUmapSettingsImpl } from './SettingsImpl';\nimport type {\n AdditionalCurveRenderData,\n AesGetters,\n CaptionsSizes,\n ChartScales, ChartSizes,\n Dot,\n DotsExtents,\n LassoControlsState,\n Margins,\n Polygon,\n SVGLayerProps,\n} from './types';\n// @ts-ignore\nimport { seriesSvgMulti, seriesWebglMulti, seriesWebglPoint } from '@d3fc/d3fc-series';\n// @ts-ignore\nimport { webglFillColor } from '@d3fc/d3fc-webgl';\n// @ts-ignore\nimport { pointer } from '@d3fc/d3fc-pointer';\nimport { polygonContains } from 'd3-polygon';\nimport KDBush from 'kdbush';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport { DataFrame } from '../DataFrame';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { GET_BLACK, getColorWithFakeOpacity, stringToNumberRgba } from './colors';\nimport { getSizeLegendItem } from '../utils/getSizeLegendItem';\n\nfunction convertDotRToSymbolSize(r:number) {\n return (r / 2.35) * (r / 2.35) * 64;\n}\n\nfunction isDotInsidePolygons(x:number, y:number, polygons: Polygon[]) {\n if (polygons.length === 0) {\n return true;\n }\n return polygons.some((p) => p.closed && p.points.length > 2 && polygonContains(p.points, [x, y]));\n}\n\nfunction getGettersFromLayers(\n dataFrame: DataFrame,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n additionalCurves: ScatterplotUmapSettingsImpl['additionalCurves'],\n): AesGetters {\n const dotLayer = layers.find(l => l.type === 'dots') as DotsLayer | undefined;\n const curveLayer = layers.find(l => l.type === 'curve') as CurveLayer | undefined;\n return {\n dotFill: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotFill ?? DEFAULT_DOT_AES.color, 'dotFill'),\n dotSize: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotSize ?? DEFAULT_DOT_AES.size, 'dotSize'),\n lineType: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineShape ?? 'solid', 'lineShape'),\n lineColor: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineColor ?? BLACK, 'lineColor'),\n additionalCurveLineColor: (additionalCurves?.curves ?? []).map(\n (entry) => createAesGetter<string>(dataFrame, legendInfo, entry.lineColor, 'lineColor'),\n ),\n };\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n canvasNode: HTMLElement | null = null;\n\n svgLayerElement: SVGElement | null = null;\n svgLayerComponent: ReactElement = (<></>);\n\n aesGetters: AesGetters = {\n dotSize: () => 2,\n dotFill: () => BLACK,\n lineType: () => 'solid',\n lineColor: () => BLACK,\n additionalCurveLineColor: [],\n };\n\n tools: {\n webglChart: CartesianChart<unknown, unknown>;\n qt?: KDBush;\n fillColor: () => {\n value: (setter: (d: Dot) => [number, number, number, number]) => void;\n data: (setter: () => Dot[]) => void;\n };\n pointSeries: () => unknown;\n zoom: ZoomBehavior<Element, unknown>;\n } | null = null;\n\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n scales: ChartScales = {\n x: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n y: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n xOriginal: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n yOriginal: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n };\n\n polygons:Polygon[] = [];\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'] = () => undefined;\n onTooltipHintSwitch: ScatterplotEventHandlers['onTooltipHintSwitch'] = () => undefined;\n onLassoControlsStateUpdate: ScatterplotEventHandlers['onLassoControlsStateUpdate'] = () => undefined;\n\n zoomTransform: ZoomTransform | null = null;\n zoomStateKey = '';\n selectedDot: Dot | null = null;\n captionsSizes: CaptionsSizes = {\n xAxisCaptionsWidth: 30,\n yAxisCaptionsWidth: 100,\n };\n mainTitle: string[] = []; // can be multiline\n legend: LegendData = {width: 0, height: 0, items: []};\n\n notCalculatedProps: Partial<SVGLayerProps> = {};\n\n allDots: Dot[] = [];\n visibleLabels: Label[] = [];\n dataFrame: DataFrame = new DataFrame('', {});\n\n clear() {\n if (this.parentNode && this.rootNode && this.canvasNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode?.removeChild(this.canvasNode);\n this.parentNode = null;\n this.rootNode = null;\n this.canvasNode = null;\n this.svgLayerElement = null;\n this.tools = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.canvasNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.parentNode.appendChild(this.canvasNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSizes(size: ScatterplotUmapSettingsImpl['chartSettings']['size']) {\n if (size.width !== this.chartSizes.chartWidth || size.height !== this.chartSizes.chartHeight) {\n // NB: now chart sizes always change with one multiplier for width/height so qt stays without changes\n this.chartSizes.chartWidth = size.width;\n this.chartSizes.chartHeight = size.height;\n this.scales.x.range([0, this.chartSizes.chartWidth]);\n this.scales.y.range([this.chartSizes.chartHeight, 0]);\n }\n \n }\n\n updateViewport(\n xAxis: ScatterplotUmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotUmapSettingsImpl['chartSettings']['yAxis'],\n dotsExtents: DotsExtents,\n ) {\n const scaleX = xAxis.scale === 'log' ? scaleLog() : scaleLinear();\n\n let {minX, minY, maxX, maxY} = dotsExtents;\n if (xAxis.lowerValue !== undefined) {\n minX = Math.max(minX, xAxis.lowerValue);\n }\n if (xAxis.upperValue !== undefined) {\n maxX = Math.min(maxX, xAxis.upperValue);\n }\n if (yAxis.lowerValue !== undefined) {\n minY = Math.max(minY, yAxis.lowerValue);\n }\n if (yAxis.upperValue !== undefined) {\n maxY = Math.min(maxY, yAxis.upperValue);\n }\n if (xAxis.symmetricRange !== undefined) {\n const middle = xAxis.symmetricRange;\n if (middle >= minX && middle <= maxX) {\n const halfRange = Math.max(middle - minX, maxX - middle);\n minX = middle - halfRange;\n maxX = middle + halfRange;\n }\n }\n if (typeof yAxis.symmetricRange !== 'undefined') {\n const middle = yAxis.symmetricRange;\n if (middle >= minY && middle <= maxY) {\n const halfRange = Math.max(middle - minY, maxY - middle);\n minY = middle - halfRange;\n maxY = middle + halfRange;\n }\n }\n\n const rangeH = [0, this.chartSizes.chartWidth];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempX = scaleX\n .copy()\n .domain([minX, maxX])\n .range([PADDINGS.LEFT, this.chartSizes.chartWidth - PADDINGS.RIGHT]);\n scaleX\n .domain([tempX.invert(0), tempX.invert(this.chartSizes.chartWidth)])\n .range(rangeH)\n .nice();\n // this.scales.x = scaleX;\n // this.scales.xOriginal = scaleX.copy();\n this.scales.x.domain(scaleX.domain());\n this.scales.xOriginal.domain(scaleX.domain());\n\n const scaleY = yAxis.scale === 'log' ? scaleLog() : scaleLinear();\n const rangeV = [this.chartSizes.chartHeight, 0];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempY = scaleY\n .copy()\n .domain([minY, maxY])\n .range([this.chartSizes.chartHeight - PADDINGS.BOTTOM, PADDINGS.TOP]);\n scaleY\n .domain([tempY.invert(this.chartSizes.chartHeight), tempY.invert(0)])\n .range(rangeV)\n .nice();\n // this.scales.y = scaleY;\n // this.scales.yOriginal = scaleY.copy();\n this.scales.y.domain(scaleY.domain());\n this.scales.yOriginal.domain(scaleY.domain());\n }\n\n updateCaptionsSize() {\n const textMeasurer = new TextMeasurer('600 14px Arial');\n\n function getMaxTickWidth(ticks: string[]) {\n return Math.max(...ticks.map(key => textMeasurer.getTextWidth(key)));\n }\n\n const {ticks, format} = getTicksAndFormat(this.scales.y, false);\n const maxYTick = getMaxTickWidth(ticks.map(format));\n\n this.captionsSizes = {\n xAxisCaptionsWidth: 20,\n yAxisCaptionsWidth: maxYTick,\n };\n }\n\n createMainTitle(title: ScatterplotUmapSettingsImpl['chartSettings']['title']) {\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.totalWidth - this.margins.left - this.margins.right,\n 20\n );\n }\n\n updateMargins(xAxis: ScatterplotUmapSettingsImpl['chartSettings']['xAxis'], yAxis: ScatterplotUmapSettingsImpl['chartSettings']['yAxis']) {\n const titleTextHeight = TITLE_LINE_HEIGHT * this.mainTitle.length;\n const titleHeight = titleTextHeight > 0 ? titleTextHeight + TITLE_MARGIN * 2 : 0;\n this.margins = {\n top: Math.max(titleHeight, MIN_MARGIN),\n bottom: MIN_MARGIN + (xAxis.hiddenLabels ? 0 : this.captionsSizes.xAxisCaptionsWidth) + TITLE_LINE,\n left: MIN_MARGIN + (yAxis.hiddenLabels ? 0 : this.captionsSizes.yAxisCaptionsWidth) + TITLE_LINE,\n right: this.legend.width + MIN_MARGIN,\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartHeight, this.legend.height) + this.margins.bottom;\n\n select(this.canvasNode)\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateLegendSize(\n legend: ScatterplotUmapSettingsImpl['chartSettings']['legend'],\n legendLabels: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n layers: ScatterplotUmapLayer[],\n additionalCurves: ScatterplotUmapSettingsImpl['additionalCurves'],\n yColumn: ColumnName,\n ) {\n if (!legend.show) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const legendItems: LegendItem[] = [];\n const emptySizes = {width:0, height:0, left:0, top: 0};\n const continuousHeight = Math.min(\n Math.max(this.chartSizes.chartHeight, MIN_LEGEND_GRADIENT_HEIGHT),\n MAX_LEGEND_GRADIENT_HEIGHT\n );\n const legendHeight = Math.max(this.chartSizes.chartHeight, continuousHeight);\n grouping.forEach(column => {\n const info = legendLabels[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n if (info.values.length > MAX_SHOWN_UNIQUE_VALUES_IN_LABELS) {\n console.warn(`Too many values for discrete legend (${info.values.length})`);\n return;\n }\n const aesData: Record<string, DotAesItem> = {};\n info.values.forEach(category => {\n if (!aesData[category]) {\n aesData[category] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill') {\n aesData[category].color = (info.aesMap(category, key) ?? BLACK) as string;\n }\n if (key === 'dotSize') {\n aesData[category].size = Number(info.aesMap(category, key) ?? 3);\n }\n });\n });\n\n const title = column.label ?? column.value;\n const scale = scaleOrdinal<DotAesItem>()\n .domain(info.values)\n .range(info.values.map(value => aesData[value]));\n legendItems.push({...emptySizes, id: column.value, type: 'dots', title, scale, values:info.values, labels:info.labels});\n });\n\n layers.forEach(layer => {\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotFill)) {\n const {domain, range, columnName, type = 'linear'} = layer.aes.dotFill;\n const title = columnName.label ?? columnName.value;\n const colorScale = getContinuousColorScale(range, domain, 'linear') as ScaleLinear<string, string>; // always linear for legend - scale to render gradient, not for dots\n const tickPositionScale = (type === 'log' ? scaleSymlog<string, string>() : scaleLinear<string, string>())\n .domain(domain)\n // @ts-ignore\n .range([continuousHeight, 0]);\n const values = getContinuousLegendTicks(tickPositionScale, domain as [number, number]);\n legendItems.push({...emptySizes, id: 'dotFill', type: 'continuous', title, scale: colorScale, tickPositionScale, values});\n }\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotSize)) {\n legendItems.push(getSizeLegendItem(layer.aes.dotSize));\n }\n });\n\n // Dedicated curves legend section — parallel implementation to scatterplot's updateLegendSize.\n // UMAP has no per-entry trend.\n if (additionalCurves && additionalCurves.curves.length > 0) {\n // Legend sample color mirrors the curve's own `lineColor` when fixed; falls back to neutral\n // BLACK only when the color inherits from grouping (a single sample can't represent multiple\n // group colors — actual group colors appear in the grouping's own color legend, per R19).\n const neutralColor = BLACK;\n const curveLegendValues: string[] = [];\n const curveLegendLabels: Record<string, string> = {};\n const curveLegendAes: Record<string, AesItem> = {};\n const curveLayer = layers.find(l => l.type === 'curve') as CurveLayer | undefined;\n if (curveLayer) {\n const label = yColumn.label ?? yColumn.value;\n const resolvedColor = typeof curveLayer.aes.lineColor === 'string'\n ? curveLayer.aes.lineColor\n : neutralColor;\n curveLegendValues.push(label);\n curveLegendLabels[label] = label;\n curveLegendAes[label] = { lineShape: curveLayer.aes.lineShape, lineColor: resolvedColor };\n }\n for (const entry of additionalCurves.curves) {\n let key = entry.label;\n let dedupeCounter = 1;\n while (curveLegendValues.includes(key)) {\n key = `${entry.label} (${++dedupeCounter})`;\n }\n const resolvedColor = typeof entry.lineColor === 'string'\n ? entry.lineColor\n : neutralColor;\n curveLegendValues.push(key);\n curveLegendLabels[key] = key;\n curveLegendAes[key] = { lineShape: entry.lineShape, lineColor: resolvedColor };\n }\n if (curveLegendValues.length > 0) {\n const scale = scaleOrdinal<AesItem>()\n .domain(curveLegendValues)\n .range(curveLegendValues.map(v => curveLegendAes[v]))\n .unknown({});\n legendItems.push({\n ...emptySizes,\n id: 'additionalCurves',\n type: 'discreteMulti',\n title: 'Curves',\n scale,\n values: curveLegendValues,\n labels: curveLegendLabels,\n usedAes: { lineShape: true, lineColor: true, dotFill: false, dotShape: false, fillColor: false },\n });\n }\n }\n\n if (!legendItems.length) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const items = arrangeLegendParts(legendItems, legendHeight, continuousHeight);\n const maxRightEdge = items.reduce((max, item) => Math.max(max, item.left + item.width), 0);\n const legendWidth = maxRightEdge + LEGEND_OFFSET;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items,\n };\n }\n\n initSettings(\n dots: Dot[],\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n dotExtents: DotsExtents,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n grouping: ColumnName[],\n onZoomChange: (v:boolean) => void,\n additionalCurves: ScatterplotUmapSettingsImpl['additionalCurves'],\n yColumn: ColumnName,\n ) {\n const {xAxis, yAxis, size, title, legend} = chartSettings;\n this.updateChartSizes(size);\n this.updateViewport(xAxis, yAxis, dotExtents);\n this.updateCaptionsSize();\n this.updateLegendSize(legend, legendInfo, grouping, layers, additionalCurves, yColumn);\n this.createMainTitle(title);\n this.updateMargins(xAxis, yAxis);\n\n this.aesGetters = getGettersFromLayers(this.dataFrame, legendInfo, layers, additionalCurves);\n\n const fillColor = webglFillColor()\n .data(dots)\n .value((d: Dot) => {\n const rgba = stringToNumberRgba(this.aesGetters.dotFill(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n\n const pointSeries = seriesWebglPoint()\n .equals((a: Dot[], b: Dot[]) => a === b)\n .size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.idx)))\n .crossValue((d: Dot) => d.x)\n .mainValue((d: Dot) => d.y)\n .decorate((program: unknown) => fillColor(program));\n\n const z = zoom()\n .scaleExtent([0.1, 1000])\n .filter((e:MouseEvent) => {\n return e.type === 'wheel' || e.metaKey || e.ctrlKey;\n })\n .on('start', () => {\n this.selectedDot = null;\n })\n .on('zoom', (e: D3ZoomEvent<SVGElement, unknown>) => {\n const transform = e.transform;\n const x = transform.rescaleX(this.scales.xOriginal);\n const y = transform.rescaleY(this.scales.yOriginal);\n this.scales.x.domain(x.domain());\n this.scales.y.domain(y.domain());\n\n this.zoomTransform = transform;\n this.zoomStateKey = `${transform.x}_${transform.y}_${transform.k}`; // need it to update axes\n\n this.updateLabelsPosition(this.visibleLabels);\n this.renderSvgLayer();\n this.renderWebglLayer();\n }).on('end', () => {\n this.visibleLabels = this.computeLabels(this.allDots);\n this.renderSvgLayer();\n onZoomChange(true);\n });\n \n // @ts-ignore\n const p = pointer().on('point', ([coord]) => {\n let closestDatum;\n if (coord) {\n closestDatum = this.getClosestDot(coord.x, coord.y);\n }\n \n const needRedraw =\n (this.selectedDot && !closestDatum) ||\n (!this.selectedDot && closestDatum) ||\n this.selectedDot?.idx !== closestDatum?.idx;\n\n this.selectedDot = closestDatum ?? null;\n\n if (needRedraw) {\n this.renderSvgLayer();\n }\n });\n\n const webglChart = chartCartesian({\n xScale: this.scales.x,\n yScale: this.scales.y,\n })\n .xAxisHeight(() => '0') // removing build-in axes from chartCartesian\n .yAxisWidth(() => '0') // removing build-in axes from chartCartesian\n .svgPlotArea(seriesSvgMulti())\n .webglPlotArea(\n // only render the point series on the WebGL layer\n seriesWebglMulti()\n .series([pointSeries])\n .mapping((d: unknown) => d)\n )\n .decorate(selection => {\n const s = selection.enter();\n if (s && !this.svgLayerElement) {\n s.style('grid-template-columns', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n s.style('grid-template-rows', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n this.svgLayerElement = s.select('.svg-plot-area.plot-area svg').node() as SVGElement;\n }\n s.select('.svg-plot-area.plot-area').attr('class', 'svg-plot-area plot-area miplots-scatterplot-plot-area')\n \n // @ts-ignore\n .call(z)\n .call(p);\n });\n\n this.tools = {\n webglChart,\n zoom: z,\n fillColor,\n pointSeries,\n };\n\n select(this.canvasNode)\n .datum(dots)\n .style('position', 'absolute')\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n this.onPolygonUpdate(this.polygons);\n }\n\n resetZoom(\n xAxis: ScatterplotUmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotUmapSettingsImpl['chartSettings']['yAxis'],\n dotsExtents?: DotsExtents\n ) {\n if (!this.tools?.zoom || !dotsExtents) {\n return;\n }\n this.updateViewport(xAxis, yAxis, dotsExtents);\n select('.miplots-scatterplot-plot-area').call((this.tools.zoom.transform as (selection: unknown, transform: unknown) => void), zoomIdentity);\n }\n\n updateAes(\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n additionalCurves: ScatterplotUmapSettingsImpl['additionalCurves']\n ) {\n if (this.tools === null) {\n return;\n }\n this.aesGetters = getGettersFromLayers(this.dataFrame, legendInfo, layers, additionalCurves);\n \n // @ts-ignore\n this.tools.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n }\n\n updatePointSize(\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n additionalCurves: ScatterplotUmapSettingsImpl['additionalCurves']\n ) {\n if (this.tools === null) {\n return;\n }\n this.updateAes(legendInfo, layers, additionalCurves);\n // TODO: try remove array copy\n select(this.canvasNode).datum([...this.allDots]);\n // @ts-ignore\n this.tools.pointSeries.size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.idx)));\n }\n\n updateByLasso() {\n if (this.tools === null) {\n return;\n }\n \n // @ts-ignore\n this.tools?.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n this.renderWebglLayer();\n }\n\n createQuadtree(dots: Dot[]): KDBush {\n const tree = new KDBush(dots.length, 512);\n\n for (let i = 0; i < dots.length; i++) {\n tree.add(dots[i].x, dots[i].y);\n } \n\n return tree.finish();\n }\n\n getClosestDot(_x: number, _y: number): Dot | null {\n const tree = this.tools?.qt;\n if (!tree) return null;\n const dots = this.allDots;\n const x = this.scales.x.invert(_x);\n const y = this.scales.y.invert(_y);\n const radius = 1 / (this.zoomTransform?.k || 1);\n const minX = x - radius;\n const maxX = x + radius;\n const minY = y - radius;\n const maxY = y + radius;\n\n const indexes = tree.range(minX, minY, maxX, maxY);\n const closest = indexes.reduce((closest, idx: number) => {\n const dot = dots[idx];\n const dX = this.scales.x(dot.x) - _x;\n const dY = this.scales.y(dot.y) - _y;\n const distance = Math.hypot(dX, dY);\n if (closest === null || distance < closest.distance) {\n closest.index = idx;\n closest.distance = distance;\n }\n return closest;\n }, {\n index: -1,\n distance: Infinity\n });\n return indexes.length === 0 || closest.index === -1 ? null : dots[closest.index];\n }\n\n updateDots(dots: Dot[]) {\n if (this.tools === null) {\n return;\n }\n select(this.canvasNode).datum(dots);\n \n // @ts-ignore\n this.tools.fillColor.data(dots);\n this.tools.qt = this.createQuadtree(dots);\n this.allDots = dots;\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n keyColumn: ColumnName | null,\n dots: Dot[],\n dotExtents: DotsExtents,\n dotsByGrouping: Record<string, Dot[]>,\n layers: ScatterplotUmapSettingsImpl['layers'],\n legendInfo: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'],\n onTooltipHintSwitch: (v:boolean) => void,\n onLassoControlsStateUpdate: (v:LassoControlsState) => void,\n onZoomChange: (v:boolean) => void,\n additionalCurves: AdditionalCurveRenderData[] = [],\n additionalCurvesSettings: ScatterplotUmapSettingsImpl['additionalCurves'] = null,\n yColumn: ColumnName,\n ) {\n this.dataFrame = dataFrame;\n const sizesChanged = chartSettings.size.width !== this.chartSizes.chartWidth || chartSettings.size.height !== this.chartSizes.chartHeight;\n if (this.tools === null) {\n this.initSettings(\n dots,\n chartSettings,\n dotExtents,\n legendInfo,\n layers,\n grouping,\n onZoomChange,\n additionalCurvesSettings,\n yColumn,\n );\n } else {\n const {title, legend, size} = chartSettings;\n this.updateChartSizes(size);\n this.updateLegendSize(legend, legendInfo, grouping, layers, additionalCurvesSettings, yColumn);\n this.createMainTitle(title);\n this.updateMargins(chartSettings.xAxis, chartSettings.yAxis);\n this.updateAes(legendInfo, layers, additionalCurvesSettings);\n }\n\n this.onPolygonUpdateOutside = onPolygonUpdateOutside;\n this.onTooltipHintSwitch = onTooltipHintSwitch;\n this.onLassoControlsStateUpdate = onLassoControlsStateUpdate;\n\n if (this.allDots !== dots) {\n this.updateDots(dots);\n this.visibleLabels = this.computeLabels(dots);\n this.onPolygonUpdate(this.polygons);\n } else if (sizesChanged) {\n this.visibleLabels = this.computeLabels(dots);\n }\n\n this.notCalculatedProps = {\n settingsId,\n chartSettings,\n keyColumn,\n dotsByGrouping,\n layers,\n additionalCurves,\n };\n\n this.renderWebglLayer();\n this.renderSvgLayer();\n }\n\n renderWebglLayer() {\n if (this.tools?.webglChart) {\n select(this.canvasNode).call(this.tools?.webglChart);\n }\n }\n\n onPolygonUpdate = (p:Polygon[]) => {\n this.polygons = p;\n this.updateByLasso();\n const filteredDotsIndexes = this.allDots\n .filter(d => isDotInsidePolygons(d.x, d.y, this.polygons))\n .map(d => d.idx);\n this.onPolygonUpdateOutside(filteredDotsIndexes, p);\n };\n\n renderSvgLayer() {\n const props = {\n settingsId: this.notCalculatedProps.settingsId,\n chartSettings: this.notCalculatedProps.chartSettings,\n keyColumn: this.notCalculatedProps.keyColumn,\n dotsByGrouping: this.notCalculatedProps.dotsByGrouping,\n layers: this.notCalculatedProps.layers,\n additionalCurves: this.notCalculatedProps.additionalCurves ?? [],\n chartSizes: this.chartSizes,\n scales: this.scales,\n margins: this.margins,\n mainTitle: this.mainTitle,\n captionsSizes: this.captionsSizes,\n container: this.svgLayerElement,\n zoomStateKey: this.zoomStateKey,\n selectedDot: this.selectedDot,\n aesGetters: this.aesGetters,\n legendData: this.legend,\n labels: this.visibleLabels,\n defaultPolygons: this.polygons,\n onPolygonUpdate: this.onPolygonUpdate,\n onTooltipHintSwitch: this.onTooltipHintSwitch,\n onLassoControlsStateUpdate: this.onLassoControlsStateUpdate,\n } as SVGLayerProps;\n this.svgLayerComponent = (\n <DataFrameProvider dataFrame={this.dataFrame}>\n <SVGLayer {...props} />\n </DataFrameProvider>\n );\n this.reactRoot?.render(this.svgLayerComponent);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n\n private computeLabels(dots: Dot[]) {\n const textMeasurer = new TextMeasurer('16px Manrope');\n const getPosition = createLabelPositioner(this.chartSizes.chartWidth, this.chartSizes.chartHeight);\n const labels = [];\n\n for (let i = 0; i < dots.length; i++) {\n const dot = dots[i];\n if (dot.label == null) {\n continue;\n }\n const name = String(dot.label);\n const metrics = textMeasurer.getTextMetrics(name);\n const x = this.scales.x(dot.x);\n const y = this.scales.y(dot.y);\n const w = metrics.width;\n const h = (metrics.actualBoundingBoxAscent) + (metrics.actualBoundingBoxDescent);\n const p = 10;\n const position = getPosition(x, y, w, h, p);\n if (!position) {\n continue;\n }\n\n labels.push({\n x,\n y,\n dot,\n name,\n width: w,\n height: h,\n padding: p,\n xPosition: position[0],\n yPosition: position[1],\n } satisfies Label);\n }\n\n return labels;\n }\n\n private updateLabelsPosition(labels: Label[]) {\n for (let i = 0; i < labels.length; i++) {\n const label = labels[i];\n label.x = this.scales.x(label.dot.x as number);\n label.y = this.scales.y(label.dot.y as number);\n }\n }\n}\n\nexport default ChartRenderer;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DA,SAAS,EAAwB,GAAU;AACvC,QAAQ,IAAI,QAAS,IAAI,QAAQ;;AAGrC,SAAS,EAAoB,GAAU,GAAU,GAAqB;AAIlE,QAHI,EAAS,WAAW,IACb,KAEJ,EAAS,MAAM,MAAM,EAAE,UAAU,EAAE,OAAO,SAAS,KAAK,EAAgB,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;;AAGrG,SAAS,EACL,GACA,GACA,GACA,GACU;CACV,IAAM,IAAW,EAAO,MAAK,MAAK,EAAE,SAAS,OAAO,EAC9C,IAAa,EAAO,MAAK,MAAK,EAAE,SAAS,QAAQ;AACvD,QAAO;EACH,SAAS,EAAgB,GAAW,GAAY,GAAU,IAAI,WAAW,EAAgB,OAAO,UAAU;EAC1G,SAAS,EAAgB,GAAW,GAAY,GAAU,IAAI,WAAW,EAAgB,MAAM,UAAU;EACzG,UAAU,EAAgB,GAAW,GAAY,GAAY,IAAI,aAAa,SAAS,YAAY;EACnG,WAAW,EAAgB,GAAW,GAAY,GAAY,IAAI,aAAA,WAAoB,YAAY;EAClG,2BAA2B,GAAkB,UAAU,EAAE,EAAE,KACtD,MAAU,EAAwB,GAAW,GAAY,EAAM,WAAW,YAAY,CAC1F;EACJ;;AAGL,IAAM,IAAN,MAAoB;CAChB,YAAyB;CACzB,aAAiC;CACjC,WAA+B;CAC/B,aAAiC;CAEjC,kBAAqC;CACrC,oBAAmC,kBAAA,GAAA,EAAK,CAAA;CAExC,aAAyB;EACrB,eAAe;EACf,eAAe;EACf,gBAAgB;EAChB,iBAAiB;EACjB,0BAA0B,EAAE;EAC/B;CAED,QASW;CAEX,UAAmB;EACf,KAAA;EACA,QAAA;EACA,MAAA;EACA,OAAA;EACH;CACD,aAAyB;EACrB,YAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;EACH;CACD,SAAsB;EAClB,GAAG,GAAa,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,GAAA,IAAiB,CAAC;EAC1D,GAAG,GAAa,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAA,KAAiB,EAAE,CAAC;EAC3D,WAAW,GAAa,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,GAAA,IAAiB,CAAC;EAClE,WAAW,GAAa,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAA,KAAiB,EAAE,CAAC;EACtE;CAED,WAAqB,EAAE;CACvB,+BAA4E,KAAA;CAC5E,4BAA6E,KAAA;CAC7E,mCAA2F,KAAA;CAE3F,gBAAuC;CACvC,eAAe;CACf,cAA0B;CAC1B,gBAA+B;EAC3B,oBAAoB;EACpB,oBAAoB;EACvB;CACD,YAAsB,EAAE;CACxB,SAAqB;EAAC,OAAO;EAAG,QAAQ;EAAG,OAAO,EAAE;EAAC;CAErD,qBAA6C,EAAE;CAE/C,UAAiB,EAAE;CACnB,gBAAyB,EAAE;CAC3B,YAAuB,IAAI,EAAU,IAAI,EAAE,CAAC;CAE5C,QAAQ;AAWJ,EAVI,KAAK,cAAc,KAAK,YAAY,KAAK,eACzC,KAAK,YAAY,YAAY,KAAK,SAAS,EAC3C,KAAK,YAAY,YAAY,KAAK,WAAW,EAC7C,KAAK,aAAa,MAClB,KAAK,WAAW,MAChB,KAAK,aAAa,MAClB,KAAK,kBAAkB,MACvB,KAAK,QAAQ,OAGjB,iBAAiB;AAEb,GADA,KAAK,WAAW,SAAS,EACzB,KAAK,YAAY;IACnB;;CAGN,KAAK,GAAmB;AACpB,EAAI,KAAK,eAAe,SACpB,KAAK,aAAa,GAClB,KAAK,WAAW,SAAS,cAAc,MAAM,EAC7C,KAAK,aAAa,SAAS,cAAc,MAAM,EAC/C,KAAK,WAAW,YAAY,KAAK,SAAS,EAC1C,KAAK,WAAW,YAAY,KAAK,WAAW,EAC5C,KAAK,YAAY,EAAW,KAAK,SAAS;;CAIlD,iBAAiB,GAA4D;AACzE,GAAI,EAAK,UAAU,KAAK,WAAW,cAAc,EAAK,WAAW,KAAK,WAAW,iBAE7E,KAAK,WAAW,aAAa,EAAK,OAClC,KAAK,WAAW,cAAc,EAAK,QACnC,KAAK,OAAO,EAAE,MAAM,CAAC,GAAG,KAAK,WAAW,WAAW,CAAC,EACpD,KAAK,OAAO,EAAE,MAAM,CAAC,KAAK,WAAW,aAAa,EAAE,CAAC;;CAK7D,eACI,GACA,GACA,GACF;EACE,IAAM,IAAS,EAAM,UAAU,QAAQ,GAAU,GAAG,GAAa,EAE7D,EAAC,SAAM,SAAM,SAAM,YAAQ;AAa/B,MAZI,EAAM,eAAe,KAAA,MACrB,IAAO,KAAK,IAAI,GAAM,EAAM,WAAW,GAEvC,EAAM,eAAe,KAAA,MACrB,IAAO,KAAK,IAAI,GAAM,EAAM,WAAW,GAEvC,EAAM,eAAe,KAAA,MACrB,IAAO,KAAK,IAAI,GAAM,EAAM,WAAW,GAEvC,EAAM,eAAe,KAAA,MACrB,IAAO,KAAK,IAAI,GAAM,EAAM,WAAW,GAEvC,EAAM,mBAAmB,KAAA,GAAW;GACpC,IAAM,IAAS,EAAM;AACrB,OAAI,KAAU,KAAQ,KAAU,GAAM;IAClC,IAAM,IAAY,KAAK,IAAI,IAAS,GAAM,IAAO,EAAO;AAExD,IADA,IAAO,IAAS,GAChB,IAAO,IAAS;;;AAGxB,MAAW,EAAM,mBAAmB,QAAa;GAC7C,IAAM,IAAS,EAAM;AACrB,OAAI,KAAU,KAAQ,KAAU,GAAM;IAClC,IAAM,IAAY,KAAK,IAAI,IAAS,GAAM,IAAO,EAAO;AAExD,IADA,IAAO,IAAS,GAChB,IAAO,IAAS;;;EAIxB,IAAM,IAAS,CAAC,GAAG,KAAK,WAAW,WAAW,EAExC,IAAQ,EACT,MAAM,CACN,OAAO,CAAC,GAAM,EAAK,CAAC,CACpB,MAAM,CAAC,EAAS,MAAM,KAAK,WAAW,aAAa,EAAS,MAAM,CAAC;AAQxE,EAPA,EACK,OAAO,CAAC,EAAM,OAAO,EAAE,EAAE,EAAM,OAAO,KAAK,WAAW,WAAW,CAAC,CAAC,CACnE,MAAM,EAAO,CACb,MAAM,EAGX,KAAK,OAAO,EAAE,OAAO,EAAO,QAAQ,CAAC,EACrC,KAAK,OAAO,UAAU,OAAO,EAAO,QAAQ,CAAC;EAE7C,IAAM,IAAS,EAAM,UAAU,QAAQ,GAAU,GAAG,GAAa,EAC3D,IAAS,CAAC,KAAK,WAAW,aAAa,EAAE,EAEzC,IAAQ,EACT,MAAM,CACN,OAAO,CAAC,GAAM,EAAK,CAAC,CACpB,MAAM,CAAC,KAAK,WAAW,cAAc,EAAS,QAAQ,EAAS,IAAI,CAAC;AAQzE,EAPA,EACK,OAAO,CAAC,EAAM,OAAO,KAAK,WAAW,YAAY,EAAE,EAAM,OAAO,EAAE,CAAC,CAAC,CACpE,MAAM,EAAO,CACb,MAAM,EAGX,KAAK,OAAO,EAAE,OAAO,EAAO,QAAQ,CAAC,EACrC,KAAK,OAAO,UAAU,OAAO,EAAO,QAAQ,CAAC;;CAGjD,qBAAqB;EACjB,IAAM,IAAe,IAAI,EAAa,iBAAiB;EAEvD,SAAS,EAAgB,GAAiB;AACtC,UAAO,KAAK,IAAI,GAAG,EAAM,KAAI,MAAO,EAAa,aAAa,EAAI,CAAC,CAAC;;EAGxE,IAAM,EAAC,UAAO,cAAU,EAAkB,KAAK,OAAO,GAAG,GAAM;AAG/D,OAAK,gBAAgB;GACjB,oBAAoB;GACpB,oBAJa,EAAgB,EAAM,IAAI,EAAO,CAAC;GAKlD;;CAGL,gBAAgB,GAA8D;AAC1E,OAAK,YAAY,EACb,EAAM,MACN,KAAK,WAAW,aAAa,KAAK,QAAQ,OAAO,KAAK,QAAQ,OAC9D,GACH;;CAGL,cAAc,GAA8D,GAA8D;EACtI,IAAM,IAAA,KAAsC,KAAK,UAAU,QACrD,IAAc,IAAkB,IAAI,IAAA,KAAqC;AAW/E,EAVA,KAAK,UAAU;GACX,KAAK,KAAK,IAAI,GAAA,GAAwB;GACtC,QAAA,MAAsB,EAAM,eAAe,IAAI,KAAK,cAAc,sBAAA;GAClE,MAAA,MAAoB,EAAM,eAAe,IAAI,KAAK,cAAc,sBAAA;GAChE,OAAO,KAAK,OAAO,QAAA;GACtB,EACD,KAAK,WAAW,aAAa,KAAK,QAAQ,OAAO,KAAK,WAAW,aAAa,KAAK,QAAQ,OAC3F,KAAK,WAAW,cACZ,KAAK,QAAQ,MAAM,KAAK,IAAI,KAAK,WAAW,aAAa,KAAK,OAAO,OAAO,GAAG,KAAK,QAAQ,QAEhG,EAAO,KAAK,WAAW,CAClB,MAAM,SAAS,KAAK,WAAW,aAAa,KAAK,CACjD,MAAM,UAAU,KAAK,WAAW,cAAc,KAAK,CACnD,MAAM,OAAO,KAAK,QAAQ,MAAM,KAAK,CACrC,MAAM,QAAQ,KAAK,QAAQ,OAAO,KAAK;;CAGhD,iBACI,GACA,GACA,GACA,GACA,GACA,GACF;AACE,MAAI,CAAC,EAAO,MAAM;AACd,QAAK,SAAS;IAAC,OAAO;IAAG,QAAQ;IAAG,OAAO,EAAE;IAAC;AAC9C;;EAGJ,IAAM,IAA4B,EAAE,EAC9B,IAAa;GAAC,OAAM;GAAG,QAAO;GAAG,MAAK;GAAG,KAAK;GAAE,EAChD,IAAmB,KAAK,IAC1B,KAAK,IAAI,KAAK,WAAW,aAAA,IAAwC,EAAA,IAEpE,EACK,IAAe,KAAK,IAAI,KAAK,WAAW,aAAa,EAAiB;AAmD5E,MAlDA,EAAS,SAAQ,MAAU;GACvB,IAAM,IAAO,EAAa,EAAO;AACjC,OAAI,EAAK,QAAQ,WAAW,KAAK,CAAC,EAAK,OACnC;AAEJ,OAAI,EAAK,OAAO,SAAA,KAA4C;AACxD,YAAQ,KAAK,wCAAwC,EAAK,OAAO,OAAO,GAAG;AAC3E;;GAEJ,IAAM,IAAsC,EAAE;AAC9C,KAAK,OAAO,SAAQ,MAAY;AAI5B,IAHK,EAAQ,OACT,EAAQ,KAAY,EAAC,GAAG,GAAgB,GAE5C,EAAK,QAAQ,SAAQ,MAAO;AAIxB,KAHI,MAAQ,cACR,EAAQ,GAAU,QAAS,EAAK,OAAO,GAAU,EAAI,IAAA,YAErD,MAAQ,cACR,EAAQ,GAAU,OAAO,OAAO,EAAK,OAAO,GAAU,EAAI,IAAI,EAAE;MAEtE;KACJ;GAEF,IAAM,IAAQ,EAAO,SAAS,EAAO,OAC/B,IAAQ,GAA0B,CACnC,OAAO,EAAK,OAAO,CACnB,MAAM,EAAK,OAAO,KAAI,MAAS,EAAQ,GAAO,CAAC;AACpD,KAAY,KAAK;IAAC,GAAG;IAAY,IAAI,EAAO;IAAO,MAAM;IAAQ;IAAO;IAAO,QAAO,EAAK;IAAQ,QAAO,EAAK;IAAO,CAAC;IACzH,EAEF,EAAO,SAAQ,MAAS;AACpB,OAAI,EAAM,SAAS,UAAU,EAAgB,EAAM,IAAI,QAAQ,EAAE;IAC7D,IAAM,EAAC,WAAQ,UAAO,eAAY,UAAO,aAAY,EAAM,IAAI,SACzD,IAAQ,EAAW,SAAS,EAAW,OACvC,IAAa,EAAwB,GAAO,GAAQ,SAAS,EAC7D,KAAqB,MAAS,QAAQ,GAA6B,GAAG,GAA6B,EACpG,OAAO,EAAO,CAEd,MAAM,CAAC,GAAkB,EAAE,CAAC,EAC3B,IAAS,EAAyB,GAAmB,EAA2B;AACtF,MAAY,KAAK;KAAC,GAAG;KAAY,IAAI;KAAW,MAAM;KAAc;KAAO,OAAO;KAAY;KAAmB;KAAO,CAAC;;AAE7H,GAAI,EAAM,SAAS,UAAU,EAAgB,EAAM,IAAI,QAAQ,IAC3D,EAAY,KAAK,EAAkB,EAAM,IAAI,QAAQ,CAAC;IAE5D,EAIE,KAAoB,EAAiB,OAAO,SAAS,GAAG;GAIxD,IAAM,IAAe,GACf,IAA8B,EAAE,EAChC,IAA4C,EAAE,EAC9C,IAA0C,EAAE,EAC5C,IAAa,EAAO,MAAK,MAAK,EAAE,SAAS,QAAQ;AACvD,OAAI,GAAY;IACZ,IAAM,IAAQ,EAAQ,SAAS,EAAQ,OACjC,IAAgB,OAAO,EAAW,IAAI,aAAc,WACpD,EAAW,IAAI,YACf;AAGN,IAFA,EAAkB,KAAK,EAAM,EAC7B,EAAkB,KAAS,GAC3B,EAAe,KAAS;KAAE,WAAW,EAAW,IAAI;KAAW,WAAW;KAAe;;AAE7F,QAAK,IAAM,KAAS,EAAiB,QAAQ;IACzC,IAAI,IAAM,EAAM,OACZ,IAAgB;AACpB,WAAO,EAAkB,SAAS,EAAI,EAClC,KAAM,GAAG,EAAM,MAAM,IAAI,EAAE,EAAc;IAE7C,IAAM,IAAgB,OAAO,EAAM,aAAc,WAC3C,EAAM,YACN;AAGN,IAFA,EAAkB,KAAK,EAAI,EAC3B,EAAkB,KAAO,GACzB,EAAe,KAAO;KAAE,WAAW,EAAM;KAAW,WAAW;KAAe;;AAElF,OAAI,EAAkB,SAAS,GAAG;IAC9B,IAAM,IAAQ,GAAuB,CAChC,OAAO,EAAkB,CACzB,MAAM,EAAkB,KAAI,MAAK,EAAe,GAAG,CAAC,CACpD,QAAQ,EAAE,CAAC;AAChB,MAAY,KAAK;KACb,GAAG;KACH,IAAI;KACJ,MAAM;KACN,OAAO;KACP;KACA,QAAQ;KACR,QAAQ;KACR,SAAS;MAAE,WAAW;MAAM,WAAW;MAAM,SAAS;MAAO,UAAU;MAAO,WAAW;MAAO;KACnG,CAAC;;;AAIV,MAAI,CAAC,EAAY,QAAQ;AACrB,QAAK,SAAS;IAAC,OAAO;IAAG,QAAQ;IAAG,OAAO,EAAE;IAAC;AAC9C;;EAGJ,IAAM,IAAQ,EAAmB,GAAa,GAAc,EAAiB;AAI7E,OAAK,SAAS;GACV,OAJiB,EAAM,QAAQ,GAAK,MAAS,KAAK,IAAI,GAAK,EAAK,OAAO,EAAK,MAAM,EAAE,EAAE,GAAA;GAKtF,QAAQ;GACR;GACH;;CAGL,aACI,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACF;EACE,IAAM,EAAC,UAAO,UAAO,SAAM,UAAO,cAAU;AAQ5C,EAPA,KAAK,iBAAiB,EAAK,EAC3B,KAAK,eAAe,GAAO,GAAO,EAAW,EAC7C,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,GAAQ,GAAY,GAAU,GAAQ,GAAkB,EAAQ,EACtF,KAAK,gBAAgB,EAAM,EAC3B,KAAK,cAAc,GAAO,EAAM,EAEhC,KAAK,aAAa,EAAqB,KAAK,WAAW,GAAY,GAAQ,EAAiB;EAE5F,IAAM,IAAY,GAAgB,CAC7B,KAAK,EAAK,CACV,OAAO,MAAW;GACf,IAAM,IAAO,EAAmB,KAAK,WAAW,QAAQ,EAAE,IAAI,CAAC;AAE/D,UADA,EAAK,KAAK,CAAC,EAAE,UAAU,EAAoB,EAAE,GAAG,EAAE,GAAG,KAAK,SAAS,GAAG,IAAI,IACnE,EAAwB,GAAM,EAAK;IAC5C,EAEA,IAAc,GAAkB,CACjC,QAAQ,GAAU,MAAa,MAAM,EAAE,CACvC,MAAM,MAAW,EAAwB,KAAK,WAAW,QAAQ,EAAE,IAAI,CAAC,CAAC,CACzE,YAAY,MAAW,EAAE,EAAE,CAC3B,WAAW,MAAW,EAAE,EAAE,CAC1B,UAAU,MAAqB,EAAU,EAAQ,CAAC,EAEjD,IAAI,GAAM,CACX,YAAY,CAAC,IAAK,IAAK,CAAC,CACxB,QAAQ,MACE,EAAE,SAAS,WAAW,EAAE,WAAW,EAAE,QAC9C,CACD,GAAG,eAAe;AACf,QAAK,cAAc;IACrB,CACD,GAAG,SAAS,MAAwC;GACjD,IAAM,IAAY,EAAE,WACd,IAAI,EAAU,SAAS,KAAK,OAAO,UAAU,EAC7C,IAAI,EAAU,SAAS,KAAK,OAAO,UAAU;AASnD,GARA,KAAK,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAChC,KAAK,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAEhC,KAAK,gBAAgB,GACrB,KAAK,eAAe,GAAG,EAAU,EAAE,GAAG,EAAU,EAAE,GAAG,EAAU,KAE/D,KAAK,qBAAqB,KAAK,cAAc,EAC7C,KAAK,gBAAgB,EACrB,KAAK,kBAAkB;IACzB,CAAC,GAAG,aAAa;AAGf,GAFA,KAAK,gBAAgB,KAAK,cAAc,KAAK,QAAQ,EACrD,KAAK,gBAAgB,EACrB,EAAa,GAAK;IACpB,EAGA,IAAI,GAAS,CAAC,GAAG,UAAU,CAAC,OAAW;GACzC,IAAI;AACJ,GAAI,MACA,IAAe,KAAK,cAAc,EAAM,GAAG,EAAM,EAAE;GAGvD,IAAM,IACD,KAAK,eAAe,CAAC,KACrB,CAAC,KAAK,eAAe,KACtB,KAAK,aAAa,QAAQ,GAAc;AAI5C,GAFA,KAAK,cAAc,KAAgB,MAE/B,KACA,KAAK,gBAAgB;IAE3B;AA2CF,EAdA,KAAK,QAAQ;GACT,YA5Be,EAAe;IAC9B,QAAQ,KAAK,OAAO;IACpB,QAAQ,KAAK,OAAO;IACvB,CAAC,CACG,kBAAkB,IAAI,CACtB,iBAAiB,IAAI,CACrB,YAAY,GAAgB,CAAC,CAC7B,cAEG,GAAkB,CACb,OAAO,CAAC,EAAY,CAAC,CACrB,SAAS,MAAe,EAAE,CAClC,CACA,UAAS,MAAa;IACnB,IAAM,IAAI,EAAU,OAAO;AAM3B,IALI,KAAK,CAAC,KAAK,oBACX,EAAE,MAAM,yBAAyB,oBAAoB,EACrD,EAAE,MAAM,sBAAsB,oBAAoB,EAClD,KAAK,kBAAkB,EAAE,OAAO,+BAA+B,CAAC,MAAM,GAE1E,EAAE,OAAO,2BAA2B,CAAC,KAAK,SAAS,wDAAwD,CAGtG,KAAK,EAAE,CACP,KAAK,EAAE;KACd;GAIF,MAAM;GACN;GACA;GACH,EAED,EAAO,KAAK,WAAW,CAClB,MAAM,EAAK,CACX,MAAM,YAAY,WAAW,CAC7B,MAAM,SAAS,KAAK,WAAW,aAAa,KAAK,CACjD,MAAM,UAAU,KAAK,WAAW,cAAc,KAAK,CACnD,MAAM,OAAO,KAAK,QAAQ,MAAM,KAAK,CACrC,MAAM,QAAQ,KAAK,QAAQ,OAAO,KAAK,EAC5C,KAAK,gBAAgB,KAAK,SAAS;;CAGvC,UACI,GACA,GACA,GACF;AACM,GAAC,KAAK,OAAO,QAAQ,CAAC,MAG1B,KAAK,eAAe,GAAO,GAAO,EAAY,EAC9C,EAAO,iCAAiC,CAAC,KAAM,KAAK,MAAM,KAAK,WAAgE,EAAa;;CAGhJ,UACI,GACA,GACA,GACF;AACM,OAAK,UAAU,SAGnB,KAAK,aAAa,EAAqB,KAAK,WAAW,GAAY,GAAQ,EAAiB,EAG5F,KAAK,MAAM,UAAU,OAAO,MAAW;GAEnC,IAAM,IAAO,GADO,KAAK,WAAW,WAAW,GACH,EAAE,IAAI,CAAC;AAEnD,UADA,EAAK,KAAK,CAAC,EAAE,UAAU,EAAoB,EAAE,GAAG,EAAE,GAAG,KAAK,SAAS,GAAG,IAAI,IACnE,EAAwB,GAAM,EAAK;IAC5C;;CAGN,gBACI,GACA,GACA,GACF;AACM,OAAK,UAAU,SAGnB,KAAK,UAAU,GAAY,GAAQ,EAAiB,EAEpD,EAAO,KAAK,WAAW,CAAC,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,EAEhD,KAAK,MAAM,YAAY,MAAM,MAAW,EAAwB,KAAK,WAAW,QAAQ,EAAE,IAAI,CAAC,CAAC;;CAGpG,gBAAgB;AACR,OAAK,UAAU,SAKnB,KAAK,OAAO,UAAU,OAAO,MAAW;GAEpC,IAAM,IAAO,GADO,KAAK,WAAW,WAAW,GACH,EAAE,IAAI,CAAC;AAEnD,UADA,EAAK,KAAK,CAAC,EAAE,UAAU,EAAoB,EAAE,GAAG,EAAE,GAAG,KAAK,SAAS,GAAG,IAAI,IACnE,EAAwB,GAAM,EAAK;IAC5C,EACF,KAAK,kBAAkB;;CAG3B,eAAe,GAAqB;EAChC,IAAM,IAAO,IAAI,EAAO,EAAK,QAAQ,IAAI;AAEzC,OAAK,IAAI,IAAI,GAAG,IAAI,EAAK,QAAQ,IAC7B,GAAK,IAAI,EAAK,GAAG,GAAG,EAAK,GAAG,EAAE;AAGlC,SAAO,EAAK,QAAQ;;CAGxB,cAAc,GAAY,GAAwB;EAC9C,IAAM,IAAO,KAAK,OAAO;AACzB,MAAI,CAAC,EAAM,QAAO;EAClB,IAAM,IAAO,KAAK,SACZ,IAAI,KAAK,OAAO,EAAE,OAAO,EAAG,EAC5B,IAAI,KAAK,OAAO,EAAE,OAAO,EAAG,EAC5B,IAAS,KAAK,KAAK,eAAe,KAAK,IACvC,IAAO,IAAI,GACX,IAAO,IAAI,GACX,IAAO,IAAI,GACX,IAAO,IAAI,GAEX,IAAU,EAAK,MAAM,GAAM,GAAM,GAAM,EAAK,EAC5C,IAAU,EAAQ,QAAQ,GAAS,MAAgB;GACrD,IAAM,IAAM,EAAK,IACX,IAAK,KAAK,OAAO,EAAE,EAAI,EAAE,GAAG,GAC5B,IAAK,KAAK,OAAO,EAAE,EAAI,EAAE,GAAG,GAC5B,IAAW,KAAK,MAAM,GAAI,EAAG;AAKnC,WAJI,MAAY,QAAQ,IAAW,EAAQ,cACvC,EAAQ,QAAQ,GAChB,EAAQ,WAAW,IAEhB;KACR;GACC,OAAO;GACP,UAAU;GACb,CAAC;AACF,SAAO,EAAQ,WAAW,KAAK,EAAQ,UAAU,KAAK,OAAO,EAAK,EAAQ;;CAG9E,WAAW,GAAa;AAChB,OAAK,UAAU,SAGnB,EAAO,KAAK,WAAW,CAAC,MAAM,EAAK,EAGnC,KAAK,MAAM,UAAU,KAAK,EAAK,EAC/B,KAAK,MAAM,KAAK,KAAK,eAAe,EAAK,EACzC,KAAK,UAAU;;CAGnB,OACI,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IAAgD,EAAE,EAClD,IAA4E,MAC5E,GACF;AACE,OAAK,YAAY;EACjB,IAAM,IAAe,EAAc,KAAK,UAAU,KAAK,WAAW,cAAc,EAAc,KAAK,WAAW,KAAK,WAAW;AAC9H,MAAI,KAAK,UAAU,KACf,MAAK,aACD,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACH;OACE;GACH,IAAM,EAAC,UAAO,WAAQ,YAAQ;AAK9B,GAJA,KAAK,iBAAiB,EAAK,EAC3B,KAAK,iBAAiB,GAAQ,GAAY,GAAU,GAAQ,GAA0B,EAAQ,EAC9F,KAAK,gBAAgB,EAAM,EAC3B,KAAK,cAAc,EAAc,OAAO,EAAc,MAAM,EAC5D,KAAK,UAAU,GAAY,GAAQ,EAAyB;;AAyBhE,EAtBA,KAAK,yBAAyB,GAC9B,KAAK,sBAAsB,GAC3B,KAAK,6BAA6B,GAE9B,KAAK,YAAY,IAIV,MACP,KAAK,gBAAgB,KAAK,cAAc,EAAK,KAJ7C,KAAK,WAAW,EAAK,EACrB,KAAK,gBAAgB,KAAK,cAAc,EAAK,EAC7C,KAAK,gBAAgB,KAAK,SAAS,GAKvC,KAAK,qBAAqB;GACtB;GACA;GACA;GACA;GACA;GACA;GACH,EAED,KAAK,kBAAkB,EACvB,KAAK,gBAAgB;;CAGzB,mBAAmB;AACf,EAAI,KAAK,OAAO,cACZ,EAAO,KAAK,WAAW,CAAC,KAAK,KAAK,OAAO,WAAW;;CAI5D,mBAAmB,MAAgB;AAE/B,EADA,KAAK,WAAW,GAChB,KAAK,eAAe;EACpB,IAAM,IAAsB,KAAK,QAC5B,QAAO,MAAK,EAAoB,EAAE,GAAG,EAAE,GAAG,KAAK,SAAS,CAAC,CACzD,KAAI,MAAK,EAAE,IAAI;AACpB,OAAK,uBAAuB,GAAqB,EAAE;;CAGvD,iBAAiB;EACb,IAAM,IAAQ;GACV,YAAY,KAAK,mBAAmB;GACpC,eAAe,KAAK,mBAAmB;GACvC,WAAW,KAAK,mBAAmB;GACnC,gBAAgB,KAAK,mBAAmB;GACxC,QAAQ,KAAK,mBAAmB;GAChC,kBAAkB,KAAK,mBAAmB,oBAAoB,EAAE;GAChE,YAAY,KAAK;GACjB,QAAQ,KAAK;GACb,SAAS,KAAK;GACd,WAAW,KAAK;GAChB,eAAe,KAAK;GACpB,WAAW,KAAK;GAChB,cAAc,KAAK;GACnB,aAAa,KAAK;GAClB,YAAY,KAAK;GACjB,YAAY,KAAK;GACjB,QAAQ,KAAK;GACb,iBAAiB,KAAK;GACtB,iBAAiB,KAAK;GACtB,qBAAqB,KAAK;GAC1B,4BAA4B,KAAK;GACpC;AAMD,EALA,KAAK,oBACD,kBAAC,GAAD;GAAmB,WAAW,KAAK;aAC/B,kBAAC,GAAD,EAAU,GAAI,GAAS,CAAA;GACP,CAAA,EAExB,KAAK,WAAW,OAAO,KAAK,kBAAkB;;CAGlD,YAAY,GAAiB;AACzB,OAAK,WAAW,OAAO,kBAAC,GAAD,EAAgB,YAAW,CAAA,CAAC;;CAGvD,cAAsB,GAAa;EAC/B,IAAM,IAAe,IAAI,EAAa,eAAe,EAC/C,IAAc,EAAsB,KAAK,WAAW,YAAY,KAAK,WAAW,YAAY,EAC5F,IAAS,EAAE;AAEjB,OAAK,IAAI,IAAI,GAAG,IAAI,EAAK,QAAQ,KAAK;GAClC,IAAM,IAAM,EAAK;AACjB,OAAI,EAAI,SAAS,KACb;GAEJ,IAAM,IAAO,OAAO,EAAI,MAAM,EACxB,IAAU,EAAa,eAAe,EAAK,EAC3C,IAAI,KAAK,OAAO,EAAE,EAAI,EAAE,EACxB,IAAI,KAAK,OAAO,EAAE,EAAI,EAAE,EACxB,IAAI,EAAQ,OACZ,IAAK,EAAQ,0BAA4B,EAAQ,0BAEjD,IAAW,EAAY,GAAG,GAAG,GAAG,GAAG,GAAE;AACtC,QAIL,EAAO,KAAK;IACR;IACA;IACA;IACA;IACA,OAAO;IACP,QAAQ;IACR,SAAS;IACT,WAAW,EAAS;IACpB,WAAW,EAAS;IACvB,CAAiB;;AAGtB,SAAO;;CAGX,qBAA6B,GAAiB;AAC1C,OAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,KAAK;GACpC,IAAM,IAAQ,EAAO;AAErB,GADA,EAAM,IAAI,KAAK,OAAO,EAAE,EAAM,IAAI,EAAY,EAC9C,EAAM,IAAI,KAAK,OAAO,EAAE,EAAM,IAAI,EAAY"}
@@ -168,7 +168,7 @@ function O({ scales: r, chartSettings: a, mainTitle: u, keyColumn: d, margins: m
168
168
  children: H.map(({ key: e, d: t, dot: n }) => {
169
169
  let r = {
170
170
  fill: "none",
171
- stroke: O.dotFill(n.idx),
171
+ stroke: O.lineColor(n.idx),
172
172
  strokeWidth: V.aes?.lineWidth,
173
173
  strokeDasharray: O.lineType(n.idx)
174
174
  };
@@ -1 +1 @@
1
- {"version":3,"file":"LowerSVG.js","names":[],"sources":["../../../src/scatterplot-umap/components/LowerSVG.tsx"],"sourcesContent":["import {format} from 'd3-format';\nimport { curveBasis, line } from 'd3-shape';\nimport React, { useEffect, useState } from 'react';\nimport { ChartsTitle } from '../../common/ChartsTitle';\nimport { ContinuousGrid } from '../../common/ContinuousGrid';\nimport fonts from '../../common/fonts';\nimport { Legend } from '../../common/Legend';\nimport type { TooltipsData } from '../../common/Tooltip';\nimport { Tooltip } from '../../common/Tooltip';\nimport type { LegendData } from '../../common/types';\nimport { useDataFrame } from '../../common/useDataFrame';\nimport { BLACK } from '../../constants';\nimport type { DataFrame } from '../../DataFrame';\nimport { ContinuousAxis } from '../../common/ContinuousAxis';\nimport {formatColumnValue} from '../../scatterplot/utils/formatColumnValue';\nimport type { ColumnName } from '../../types';\nimport type { CurveUmapLayer } from '../../types/scatterplot-umap';\nimport { getLineShape } from '../../utils/getLineShape';\nimport { getPointShape } from '../../utils/getPointShape';\nimport { DEFAULT_TICKS_SIZE, LEGEND_OFFSET, TITLE_LINE } from '../constants';\nimport type { ScatterplotUmapSettingsImpl } from '../SettingsImpl';\nimport type { AdditionalCurveRenderData, CaptionsSizes, ChartScales, ChartSizes, Dot, DotInfo, Margins, SVGLayerProps } from '../types';\n\nconst ADDITIONAL_CURVE_DOT_SHAPE = '21';\nconst ADDITIONAL_CURVE_DOT_SIZE = 3;\n\nfunction UmapAdditionalCurveLine({\n dots, scales, stroke, strokeWidth, dash, smoothing,\n}: {\n dots: Dot[];\n scales: ChartScales;\n stroke: string;\n strokeWidth: number | undefined;\n dash: string | undefined;\n smoothing: boolean;\n}) {\n if (smoothing) {\n const gen = line<Dot>().curve(curveBasis).x((d) => scales.x(d.x)).y((d) => scales.y(d.y));\n return <path d={gen(dots) ?? ''} fill=\"none\" stroke={stroke} strokeWidth={strokeWidth} strokeDasharray={dash} />;\n }\n const points = dots.map(d => `${scales.x(d.x)},${scales.y(d.y)}`).join(' ');\n return <polyline points={points} fill=\"none\" stroke={stroke} strokeWidth={strokeWidth} strokeDasharray={dash} />;\n}\n\nfunction UmapAdditionalCurveDots({ dots, scales, stroke, keyPrefix }: {\n dots: Dot[];\n scales: ChartScales;\n stroke: string;\n keyPrefix: string;\n}) {\n return <>\n {dots.map((dot, i) => (\n <g key={`${keyPrefix}-dot-${i}`} transform={`translate(${scales.x(dot.x)},${scales.y(dot.y)})`}>\n {getPointShape(ADDITIONAL_CURVE_DOT_SHAPE, ADDITIONAL_CURVE_DOT_SIZE, stroke)}\n </g>\n ))}\n </>;\n}\n\nfunction UmapAdditionalCurveEntry({\n curveData, entryIdx, scales, aesGetters,\n}: {\n curveData: AdditionalCurveRenderData;\n entryIdx: number;\n scales: ChartScales;\n aesGetters: SVGLayerProps['aesGetters'];\n}) {\n const { entry, dotsByGrouping, smoothing } = curveData;\n const lineColorGetter = aesGetters.additionalCurveLineColor[entryIdx] ?? (() => BLACK);\n const dash = getLineShape(entry.lineShape);\n return (\n <g clipPath=\"url(#viewportClipPath)\" opacity={entry.opacity}>\n {Object.entries(dotsByGrouping).map(([groupKey, dots]) => {\n const stroke = dots.length > 0 ? lineColorGetter(dots[0].idx) : BLACK;\n return <React.Fragment key={groupKey}>\n <UmapAdditionalCurveLine\n dots={dots}\n scales={scales}\n stroke={stroke}\n strokeWidth={entry.lineWidth}\n dash={dash}\n smoothing={smoothing}\n />\n {entry.showDots && <UmapAdditionalCurveDots\n dots={dots}\n scales={scales}\n stroke={stroke}\n keyPrefix={groupKey}\n />}\n </React.Fragment>;\n })}\n </g>\n );\n}\n\nfunction getTooltipContent(dataFrame: DataFrame, dot: DotInfo, columnsList: ColumnName[] = []) {\n const lines: string[] = [];\n for (const column of columnsList) {\n const columnFormatter = column?.format ? format(column.format) : undefined;\n lines.push(`${column.label}: ${formatColumnValue(dataFrame, dot.idx, column, columnFormatter)}`);\n }\n return lines;\n}\n\nfunction getTitle(title: string | ColumnName): string {\n if (typeof title === 'string') {\n return title;\n }\n return title.label ?? title.value;\n}\n\nconst lineGenerator = line<Dot>().curve(curveBasis);\n\nfunction LowerSvg({\n scales,\n chartSettings,\n mainTitle,\n keyColumn: _,\n margins,\n chartSizes,\n container,\n zoomStateKey,\n legendData,\n dotsByGrouping,\n layers,\n additionalCurves,\n aesGetters,\n tooltipData\n}: {\n aesGetters: SVGLayerProps['aesGetters'];\n scales: ChartScales;\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'];\n mainTitle: string[];\n keyColumn: ColumnName | null;\n margins: Margins;\n chartSizes: ChartSizes;\n captionsSizes: CaptionsSizes;\n selectedDot?: DotInfo | null;\n container: SVGElement | null;\n zoomStateKey: string;\n legendData: LegendData;\n dotsByGrouping: Record<string, Dot[]>;\n layers: ScatterplotUmapSettingsImpl['layers'];\n additionalCurves: AdditionalCurveRenderData[];\n tooltipData: TooltipsData<DotInfo>;\n}) {\n const dataFrame = useDataFrame();\n const {title, xAxis, yAxis, frame, legend} = chartSettings;\n const tickSizeX = xAxis.showTicks ? DEFAULT_TICKS_SIZE : 0;\n const tickSizeY = yAxis.showTicks ? DEFAULT_TICKS_SIZE : 0;\n const xTitle = xAxis.title;\n const yTitle = yAxis.title;\n const needLeftAxis = true;\n const needBottomAxis = true;\n\n const sideDistances = {\n left: 0,\n right: chartSizes.chartWidth,\n top: 0,\n bottom: chartSizes.chartHeight,\n };\n\n if (!container) {\n return null;\n }\n\n const curveLayer = layers.find(layer => layer.type === 'curve') as CurveUmapLayer | undefined;\n const [lines, setLines] = useState<{key: string, d:string, dot: Dot}[]>([]);\n\n function updateLines() {\n const data = Object.entries(dotsByGrouping);\n const nextLines = data.map(([key, dots]) => ({\n key,\n d: curveLayer?.smoothing ? lineGenerator(dots) ?? '' : dots.map(d => `${scales.x(d.x)},${scales.y(d.y)}`).join(' '),\n dot: dots[0]\n }));\n setLines(nextLines);\n }\n useEffect(() => {\n if (!curveLayer) {\n return;\n }\n lineGenerator\n .x((d: Dot) => scales.x(d.x))\n .y((d: Dot) => scales.y(d.y));\n updateLines();\n }, [zoomStateKey, chartSizes.chartWidth, chartSizes.chartHeight]);\n\n useEffect(() => {\n if (!curveLayer) {\n return;\n }\n updateLines();\n }, [curveLayer?.smoothing]);\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${chartSizes.totalWidth} ${chartSizes.totalHeight}`}\n width={chartSizes.totalWidth}\n height={chartSizes.totalHeight}\n style={{pointerEvents: 'none'}}\n >\n <defs>{fonts}</defs>\n <g transform={`translate(${margins.left},${margins.top})`} fontFamily=\"Manrope\">\n <clipPath id=\"viewportClipPath\">\n <rect x=\"0\" y=\"0\" width={chartSizes.chartWidth} height={chartSizes.chartHeight}/>\n </clipPath>\n <ChartsTitle\n title={mainTitle}\n show={title.show}\n position={title.position}\n leftPadding={-margins.left}\n rightPadding={margins.right}\n chartsWidth={chartSizes.totalWidth}\n />\n <g dominantBaseline=\"central\" textAnchor=\"middle\" fontWeight=\"500\" fontSize=\"14px\" fill={BLACK}>\n {xTitle && (\n <text\n x={chartSizes.chartWidth / 2}\n y={chartSizes.chartHeight + margins.bottom - TITLE_LINE / 2}\n >\n {getTitle(xTitle)}\n </text>\n )}\n {yTitle && (\n <text\n x={-margins.left + TITLE_LINE / 2}\n y={chartSizes.chartHeight / 2}\n transform={`rotate(-90,${-margins.left + TITLE_LINE / 2},${\n chartSizes.chartHeight / 2\n })`}\n >\n {getTitle(yTitle)}\n </text>\n )}\n </g>\n <ContinuousGrid\n width={chartSizes.chartWidth}\n height={chartSizes.chartHeight}\n scaleX={scales.x}\n scaleY={scales.y}\n axisX={xAxis}\n axisY={yAxis}\n updatingKey={zoomStateKey}\n frameType={frame.type}\n />\n {needBottomAxis && (\n <g transform={`translate(0,${chartSizes.chartHeight})`}>\n <ContinuousAxis scale={scales.x} orient=\"bottom\" tickSize={tickSizeX} hiddenLabels={xAxis.hiddenLabels} />\n </g>\n )}\n {needLeftAxis && (\n <g>\n <ContinuousAxis scale={scales.y} orient=\"left\" tickSize={tickSizeY} hiddenLabels={yAxis.hiddenLabels} />\n </g>\n )}\n {curveLayer && (\n <g clipPath=\"url(#viewportClipPath)\">\n {lines.map(({key, d, dot}) => {\n const shared = {\n fill: 'none',\n stroke: aesGetters.dotFill(dot.idx),\n strokeWidth: curveLayer.aes?.lineWidth,\n strokeDasharray: aesGetters.lineType(dot.idx),\n };\n return curveLayer.smoothing\n ? <path key={key} d={d} {...shared} />\n : <polyline key={key} points={d} {...shared} />;\n })}\n </g>\n )}\n {additionalCurves.map((curveData, entryIdx) => (\n <UmapAdditionalCurveEntry\n key={`additional-${entryIdx}`}\n curveData={curveData}\n entryIdx={entryIdx}\n scales={scales}\n aesGetters={aesGetters}\n />\n ))}\n {chartSettings.tooltips.show && tooltipData.selectedData && (\n <Tooltip\n content={getTooltipContent(dataFrame, tooltipData.selectedData, chartSettings.tooltips?.content)}\n x={scales.x(tooltipData.selectedData.x)}\n y={scales.y(tooltipData.selectedData.y)}\n active={true}\n fixed={tooltipData.fixed}\n sideDistances={sideDistances}\n container={container}\n onClose={tooltipData.onClose}\n />\n )}\n {legend.show && (\n <g transform={`translate(${chartSizes.chartWidth + LEGEND_OFFSET},0)`}>\n <Legend legendData={legendData} />\n </g>\n )}\n </g>\n </svg>\n );\n}\n\nexport default React.memo(LowerSvg);\n"],"mappings":"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"}
1
+ {"version":3,"file":"LowerSVG.js","names":[],"sources":["../../../src/scatterplot-umap/components/LowerSVG.tsx"],"sourcesContent":["import {format} from 'd3-format';\nimport { curveBasis, line } from 'd3-shape';\nimport React, { useEffect, useState } from 'react';\nimport { ChartsTitle } from '../../common/ChartsTitle';\nimport { ContinuousGrid } from '../../common/ContinuousGrid';\nimport fonts from '../../common/fonts';\nimport { Legend } from '../../common/Legend';\nimport type { TooltipsData } from '../../common/Tooltip';\nimport { Tooltip } from '../../common/Tooltip';\nimport type { LegendData } from '../../common/types';\nimport { useDataFrame } from '../../common/useDataFrame';\nimport { BLACK } from '../../constants';\nimport type { DataFrame } from '../../DataFrame';\nimport { ContinuousAxis } from '../../common/ContinuousAxis';\nimport {formatColumnValue} from '../../scatterplot/utils/formatColumnValue';\nimport type { ColumnName } from '../../types';\nimport type { CurveUmapLayer } from '../../types/scatterplot-umap';\nimport { getLineShape } from '../../utils/getLineShape';\nimport { getPointShape } from '../../utils/getPointShape';\nimport { DEFAULT_TICKS_SIZE, LEGEND_OFFSET, TITLE_LINE } from '../constants';\nimport type { ScatterplotUmapSettingsImpl } from '../SettingsImpl';\nimport type { AdditionalCurveRenderData, CaptionsSizes, ChartScales, ChartSizes, Dot, DotInfo, Margins, SVGLayerProps } from '../types';\n\nconst ADDITIONAL_CURVE_DOT_SHAPE = '21';\nconst ADDITIONAL_CURVE_DOT_SIZE = 3;\n\nfunction UmapAdditionalCurveLine({\n dots, scales, stroke, strokeWidth, dash, smoothing,\n}: {\n dots: Dot[];\n scales: ChartScales;\n stroke: string;\n strokeWidth: number | undefined;\n dash: string | undefined;\n smoothing: boolean;\n}) {\n if (smoothing) {\n const gen = line<Dot>().curve(curveBasis).x((d) => scales.x(d.x)).y((d) => scales.y(d.y));\n return <path d={gen(dots) ?? ''} fill=\"none\" stroke={stroke} strokeWidth={strokeWidth} strokeDasharray={dash} />;\n }\n const points = dots.map(d => `${scales.x(d.x)},${scales.y(d.y)}`).join(' ');\n return <polyline points={points} fill=\"none\" stroke={stroke} strokeWidth={strokeWidth} strokeDasharray={dash} />;\n}\n\nfunction UmapAdditionalCurveDots({ dots, scales, stroke, keyPrefix }: {\n dots: Dot[];\n scales: ChartScales;\n stroke: string;\n keyPrefix: string;\n}) {\n return <>\n {dots.map((dot, i) => (\n <g key={`${keyPrefix}-dot-${i}`} transform={`translate(${scales.x(dot.x)},${scales.y(dot.y)})`}>\n {getPointShape(ADDITIONAL_CURVE_DOT_SHAPE, ADDITIONAL_CURVE_DOT_SIZE, stroke)}\n </g>\n ))}\n </>;\n}\n\nfunction UmapAdditionalCurveEntry({\n curveData, entryIdx, scales, aesGetters,\n}: {\n curveData: AdditionalCurveRenderData;\n entryIdx: number;\n scales: ChartScales;\n aesGetters: SVGLayerProps['aesGetters'];\n}) {\n const { entry, dotsByGrouping, smoothing } = curveData;\n const lineColorGetter = aesGetters.additionalCurveLineColor[entryIdx] ?? (() => BLACK);\n const dash = getLineShape(entry.lineShape);\n return (\n <g clipPath=\"url(#viewportClipPath)\" opacity={entry.opacity}>\n {Object.entries(dotsByGrouping).map(([groupKey, dots]) => {\n const stroke = dots.length > 0 ? lineColorGetter(dots[0].idx) : BLACK;\n return <React.Fragment key={groupKey}>\n <UmapAdditionalCurveLine\n dots={dots}\n scales={scales}\n stroke={stroke}\n strokeWidth={entry.lineWidth}\n dash={dash}\n smoothing={smoothing}\n />\n {entry.showDots && <UmapAdditionalCurveDots\n dots={dots}\n scales={scales}\n stroke={stroke}\n keyPrefix={groupKey}\n />}\n </React.Fragment>;\n })}\n </g>\n );\n}\n\nfunction getTooltipContent(dataFrame: DataFrame, dot: DotInfo, columnsList: ColumnName[] = []) {\n const lines: string[] = [];\n for (const column of columnsList) {\n const columnFormatter = column?.format ? format(column.format) : undefined;\n lines.push(`${column.label}: ${formatColumnValue(dataFrame, dot.idx, column, columnFormatter)}`);\n }\n return lines;\n}\n\nfunction getTitle(title: string | ColumnName): string {\n if (typeof title === 'string') {\n return title;\n }\n return title.label ?? title.value;\n}\n\nconst lineGenerator = line<Dot>().curve(curveBasis);\n\nfunction LowerSvg({\n scales,\n chartSettings,\n mainTitle,\n keyColumn: _,\n margins,\n chartSizes,\n container,\n zoomStateKey,\n legendData,\n dotsByGrouping,\n layers,\n additionalCurves,\n aesGetters,\n tooltipData\n}: {\n aesGetters: SVGLayerProps['aesGetters'];\n scales: ChartScales;\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'];\n mainTitle: string[];\n keyColumn: ColumnName | null;\n margins: Margins;\n chartSizes: ChartSizes;\n captionsSizes: CaptionsSizes;\n selectedDot?: DotInfo | null;\n container: SVGElement | null;\n zoomStateKey: string;\n legendData: LegendData;\n dotsByGrouping: Record<string, Dot[]>;\n layers: ScatterplotUmapSettingsImpl['layers'];\n additionalCurves: AdditionalCurveRenderData[];\n tooltipData: TooltipsData<DotInfo>;\n}) {\n const dataFrame = useDataFrame();\n const {title, xAxis, yAxis, frame, legend} = chartSettings;\n const tickSizeX = xAxis.showTicks ? DEFAULT_TICKS_SIZE : 0;\n const tickSizeY = yAxis.showTicks ? DEFAULT_TICKS_SIZE : 0;\n const xTitle = xAxis.title;\n const yTitle = yAxis.title;\n const needLeftAxis = true;\n const needBottomAxis = true;\n\n const sideDistances = {\n left: 0,\n right: chartSizes.chartWidth,\n top: 0,\n bottom: chartSizes.chartHeight,\n };\n\n if (!container) {\n return null;\n }\n\n const curveLayer = layers.find(layer => layer.type === 'curve') as CurveUmapLayer | undefined;\n const [lines, setLines] = useState<{key: string, d:string, dot: Dot}[]>([]);\n\n function updateLines() {\n const data = Object.entries(dotsByGrouping);\n const nextLines = data.map(([key, dots]) => ({\n key,\n d: curveLayer?.smoothing ? lineGenerator(dots) ?? '' : dots.map(d => `${scales.x(d.x)},${scales.y(d.y)}`).join(' '),\n dot: dots[0]\n }));\n setLines(nextLines);\n }\n useEffect(() => {\n if (!curveLayer) {\n return;\n }\n lineGenerator\n .x((d: Dot) => scales.x(d.x))\n .y((d: Dot) => scales.y(d.y));\n updateLines();\n }, [zoomStateKey, chartSizes.chartWidth, chartSizes.chartHeight]);\n\n useEffect(() => {\n if (!curveLayer) {\n return;\n }\n updateLines();\n }, [curveLayer?.smoothing]);\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={`0 0 ${chartSizes.totalWidth} ${chartSizes.totalHeight}`}\n width={chartSizes.totalWidth}\n height={chartSizes.totalHeight}\n style={{pointerEvents: 'none'}}\n >\n <defs>{fonts}</defs>\n <g transform={`translate(${margins.left},${margins.top})`} fontFamily=\"Manrope\">\n <clipPath id=\"viewportClipPath\">\n <rect x=\"0\" y=\"0\" width={chartSizes.chartWidth} height={chartSizes.chartHeight}/>\n </clipPath>\n <ChartsTitle\n title={mainTitle}\n show={title.show}\n position={title.position}\n leftPadding={-margins.left}\n rightPadding={margins.right}\n chartsWidth={chartSizes.totalWidth}\n />\n <g dominantBaseline=\"central\" textAnchor=\"middle\" fontWeight=\"500\" fontSize=\"14px\" fill={BLACK}>\n {xTitle && (\n <text\n x={chartSizes.chartWidth / 2}\n y={chartSizes.chartHeight + margins.bottom - TITLE_LINE / 2}\n >\n {getTitle(xTitle)}\n </text>\n )}\n {yTitle && (\n <text\n x={-margins.left + TITLE_LINE / 2}\n y={chartSizes.chartHeight / 2}\n transform={`rotate(-90,${-margins.left + TITLE_LINE / 2},${\n chartSizes.chartHeight / 2\n })`}\n >\n {getTitle(yTitle)}\n </text>\n )}\n </g>\n <ContinuousGrid\n width={chartSizes.chartWidth}\n height={chartSizes.chartHeight}\n scaleX={scales.x}\n scaleY={scales.y}\n axisX={xAxis}\n axisY={yAxis}\n updatingKey={zoomStateKey}\n frameType={frame.type}\n />\n {needBottomAxis && (\n <g transform={`translate(0,${chartSizes.chartHeight})`}>\n <ContinuousAxis scale={scales.x} orient=\"bottom\" tickSize={tickSizeX} hiddenLabels={xAxis.hiddenLabels} />\n </g>\n )}\n {needLeftAxis && (\n <g>\n <ContinuousAxis scale={scales.y} orient=\"left\" tickSize={tickSizeY} hiddenLabels={yAxis.hiddenLabels} />\n </g>\n )}\n {curveLayer && (\n <g clipPath=\"url(#viewportClipPath)\">\n {lines.map(({key, d, dot}) => {\n const shared = {\n fill: 'none',\n stroke: aesGetters.lineColor(dot.idx),\n strokeWidth: curveLayer.aes?.lineWidth,\n strokeDasharray: aesGetters.lineType(dot.idx),\n };\n return curveLayer.smoothing\n ? <path key={key} d={d} {...shared} />\n : <polyline key={key} points={d} {...shared} />;\n })}\n </g>\n )}\n {additionalCurves.map((curveData, entryIdx) => (\n <UmapAdditionalCurveEntry\n key={`additional-${entryIdx}`}\n curveData={curveData}\n entryIdx={entryIdx}\n scales={scales}\n aesGetters={aesGetters}\n />\n ))}\n {chartSettings.tooltips.show && tooltipData.selectedData && (\n <Tooltip\n content={getTooltipContent(dataFrame, tooltipData.selectedData, chartSettings.tooltips?.content)}\n x={scales.x(tooltipData.selectedData.x)}\n y={scales.y(tooltipData.selectedData.y)}\n active={true}\n fixed={tooltipData.fixed}\n sideDistances={sideDistances}\n container={container}\n onClose={tooltipData.onClose}\n />\n )}\n {legend.show && (\n <g transform={`translate(${chartSizes.chartWidth + LEGEND_OFFSET},0)`}>\n <Legend legendData={legendData} />\n </g>\n )}\n </g>\n </svg>\n );\n}\n\nexport default React.memo(LowerSvg);\n"],"mappings":"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"}
@@ -82,6 +82,7 @@ export type AesGetters = {
82
82
  dotFill: (idx: number) => string;
83
83
  dotSize: (idx: number) => number;
84
84
  lineType: (idx: number) => LineShape;
85
+ lineColor: (idx: number) => string;
85
86
  additionalCurveLineColor: ((idx: number) => string)[];
86
87
  };
87
88
  export type LassoControlsState = {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scatterplot-umap/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scatterplot-umap/types.ts"],"names":[],"mappings":"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"}
@@ -2731,7 +2731,9 @@ export declare const ScatterplotSettingsSchema: z.ZodObject<{
2731
2731
  type?: "linear" | "log" | undefined;
2732
2732
  }>]>>>;
2733
2733
  bounded: z.ZodOptional<z.ZodBoolean>;
2734
+ lineWidth: z.ZodOptional<z.ZodNumber>;
2734
2735
  }, "strip", z.ZodTypeAny, {
2736
+ lineWidth?: number | undefined;
2735
2737
  color?: string | {
2736
2738
  type: "grouping";
2737
2739
  value: string;
@@ -2752,6 +2754,7 @@ export declare const ScatterplotSettingsSchema: z.ZodObject<{
2752
2754
  } | undefined;
2753
2755
  bounded?: boolean | undefined;
2754
2756
  }, {
2757
+ lineWidth?: number | undefined;
2755
2758
  color?: string | {
2756
2759
  type: "grouping";
2757
2760
  value: string;
@@ -3978,6 +3981,7 @@ export declare const ScatterplotSettingsSchema: z.ZodObject<{
3978
3981
  nullValueLabel?: string | undefined;
3979
3982
  } | undefined;
3980
3983
  trend?: {
3984
+ lineWidth?: number | undefined;
3981
3985
  color?: string | {
3982
3986
  type: "grouping";
3983
3987
  value: string;
@@ -4354,6 +4358,7 @@ export declare const ScatterplotSettingsSchema: z.ZodObject<{
4354
4358
  nullValueLabel?: string | undefined;
4355
4359
  } | undefined;
4356
4360
  trend?: {
4361
+ lineWidth?: number | undefined;
4357
4362
  color?: string | {
4358
4363
  type: "grouping";
4359
4364
  value: string;
@@ -1 +1 @@
1
- {"version":3,"file":"scatterplot.d.ts","sourceRoot":"","sources":["../../src/types/scatterplot.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CvF,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,MAAM,MAAM,qBAAqB,GAAG,MAAM,CACtC,MAAM,EACN;IACI,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,EAAE,CAAC,MAAM,OAAO,CAAC,EAAE,CAAC;IAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,OAAO,KAAK,SAAS,GAAG,SAAS,CAAC;IACzE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;CACpC,CACJ,CAAC"}
1
+ {"version":3,"file":"scatterplot.d.ts","sourceRoot":"","sources":["../../src/types/scatterplot.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2CvF,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,MAAM,MAAM,qBAAqB,GAAG,MAAM,CACtC,MAAM,EACN;IACI,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,EAAE,CAAC,MAAM,OAAO,CAAC,EAAE,CAAC;IAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,OAAO,KAAK,SAAS,GAAG,SAAS,CAAC;IACzE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;CACpC,CACJ,CAAC"}
@@ -102,7 +102,8 @@ const y = d.object({
102
102
  f,
103
103
  u(d.string())
104
104
  ]))),
105
- bounded: d.optional(d.boolean())
105
+ bounded: d.optional(d.boolean()),
106
+ lineWidth: d.optional(d.number())
106
107
  })),
107
108
  additionalCurves: d.optional(v),
108
109
  layers: d.array(h)
@@ -1 +1 @@
1
- {"version":3,"file":"scatterplot.js","names":[],"sources":["../../src/types/scatterplot.ts"],"sourcesContent":["import { z } from 'zod';\nimport type { AesItem, categoricalAesMappingFromValueSchema, Category, DataValue } from './common';\nimport {\n AesRecordSchema, AxisSettingsSchema,\n ColumnNameSchema,\n continuousAesMappingFromValueSchema, DataValueSchema,\n FrameTypeSchema,\n LegendPositionSchema,\n LineShapeSchema,\n PointShapeSchema,\n TitlePositionSchema,\n TooltipSettingsSchema,\n} from './common';\n\ntype catAesFromColumn<ValueType extends z.ZodType> = ReturnType<typeof categoricalAesMappingFromValueSchema<ValueType>>;\ntype contAesFromColumn<ValueType extends z.ZodType> = ReturnType<typeof continuousAesMappingFromValueSchema<ValueType>>;\n\nexport type CategoricalAesFromColumn<ValueType> = z.infer<catAesFromColumn<z.ZodType<ValueType>>>;\nexport type ContinuousAesFromColumn<ValueType> = z.infer<contAesFromColumn<z.ZodType<ValueType>>>;\n\nconst InheritAesSchema = z.object({\n type: z.literal('grouping'),\n value: z.string(), // link to aes mapped to column\n palette: z.optional(z.array(z.string())) // if defined we use palette to create mapping without inheritedAes field\n});\nexport type InheritAesScatterplot = z.infer<typeof InheritAesSchema>;\n\nconst DotsLayerSchema = z.object({\n type: z.literal('dots'),\n aes: z.optional(\n z.object({\n dotFill: z.optional(z.union([z.string(), InheritAesSchema, continuousAesMappingFromValueSchema(z.string())])),\n dotShape: z.optional(z.union([PointShapeSchema, InheritAesSchema])),\n dotSize: z.optional(z.union([z.number(), continuousAesMappingFromValueSchema(z.number())])),\n })\n ),\n});\nconst CurveLayerSchema = z.object({\n type: z.literal('curve'),\n smoothing: z.optional(z.boolean()),\n aes: z.optional(\n z.object({\n lineWidth: z.optional(z.number()),\n lineShape: z.optional(LineShapeSchema),\n lineColor: z.optional(z.union([z.string(), InheritAesSchema, continuousAesMappingFromValueSchema(z.string())])),\n opacity: z.optional(z.number()),\n })\n ),\n});\nconst ScatterplotLayerSchema = z.union([DotsLayerSchema, CurveLayerSchema]);\n\nexport type DotsLayer = z.infer<typeof DotsLayerSchema>;\nexport type CurveLayer = z.infer<typeof CurveLayerSchema>;\nexport type ScatterplotLayer = z.infer<typeof ScatterplotLayerSchema>;\n\nconst AdditionalCurveTrendSchema = z.object({\n color: z.optional(z.union([z.string(), InheritAesSchema, continuousAesMappingFromValueSchema(z.string())])),\n bounded: z.optional(z.boolean()),\n});\n\nconst AdditionalCurveEntrySchema = z.object({\n columnName: ColumnNameSchema,\n label: z.string(),\n lineShape: z.optional(LineShapeSchema),\n lineWidth: z.optional(z.number()),\n lineColor: z.optional(z.union([z.string(), InheritAesSchema, continuousAesMappingFromValueSchema(z.string())])),\n opacity: z.optional(z.number()),\n showDots: z.optional(z.boolean()),\n // When present, suppresses the curve polyline and renders a linear trend instead. Dots (showDots) are unaffected.\n trend: z.optional(AdditionalCurveTrendSchema),\n});\n\nconst AdditionalCurvesSchema = z.object({\n curves: z.array(AdditionalCurveEntrySchema),\n smoothing: z.optional(z.boolean()),\n});\n\nexport type AdditionalCurveTrend = z.infer<typeof AdditionalCurveTrendSchema>;\nexport type AdditionalCurveEntry = z.infer<typeof AdditionalCurveEntrySchema>;\nexport type AdditionalCurves = z.infer<typeof AdditionalCurvesSchema>;\n\nexport const ScatterplotSettingsSchema = z.object({\n type: z.literal('scatterplot'),\n title: z.object({\n name: z.string(),\n show: z.optional(z.boolean()),\n position: z.optional(TitlePositionSchema),\n }),\n size: z.optional(\n z.object({\n width: z.optional(z.number()),\n height: z.optional(z.number()),\n })\n ),\n legend: z.optional(\n z.object({\n show: z.optional(z.boolean()),\n position: z.optional(LegendPositionSchema),\n })\n ),\n tooltips: z.optional(TooltipSettingsSchema),\n frame: z.optional(z.object({type: z.optional(FrameTypeSchema)})),\n facetSettings: z.optional(\n z.object({\n sharedX: z.optional(z.boolean()),\n sharedY: z.optional(z.boolean()),\n /** Ordered list of facet keys; only these facets are shown, in this order */\n order: z.optional(z.array(z.string())),\n nRows: z.optional(z.number()),\n nCols: z.optional(z.number()),\n })\n ),\n keyColumn: ColumnNameSchema,\n x: ColumnNameSchema,\n y: ColumnNameSchema,\n xAxis: z.optional(AxisSettingsSchema),\n yAxis: z.optional(AxisSettingsSchema),\n grouping: z.optional(z.array(\n z.object({\n columnName: ColumnNameSchema,\n order: z.optional(z.array(DataValueSchema)),\n inheritedAes: z.optional(AesRecordSchema),\n allowNullGroup: z.optional(z.boolean())\n })\n )),\n dotSize: z.optional(z.array(\n z.object({\n columnName: ColumnNameSchema,\n })\n )),\n dotShape: z.optional(z.array(\n z.object({\n columnName: ColumnNameSchema,\n order: z.optional(z.array(DataValueSchema)),\n inheritedAes: z.optional(AesRecordSchema),\n })\n )),\n facetBy: z.optional(z.array(ColumnNameSchema)),\n label: z.optional(ColumnNameSchema),\n highlight: z.optional(ColumnNameSchema),\n trend: z.optional(\n z.object({\n color: z.optional(z.optional(z.union([z.string(), InheritAesSchema, continuousAesMappingFromValueSchema(z.string())]))),\n bounded: z.optional(z.boolean()), // if true: line and area bounded with min and max X value; else line bounded by chart bounds\n })\n ),\n additionalCurves: z.optional(AdditionalCurvesSchema),\n layers: z.array(ScatterplotLayerSchema),\n});\n\nexport type ScatterplotSettings = z.infer<typeof ScatterplotSettingsSchema>;\n\nexport type ScatterplotLegendInfo = Record<\n string,\n {\n values: Category[];\n usedAes: (keyof AesItem)[];\n aesMap: (value: Category, field: keyof AesItem) => undefined | DataValue;\n labels: Record<Category, string>;\n }\n>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"scatterplot.js","names":[],"sources":["../../src/types/scatterplot.ts"],"sourcesContent":["import { z } from 'zod';\nimport type { AesItem, categoricalAesMappingFromValueSchema, Category, DataValue } from './common';\nimport {\n AesRecordSchema, AxisSettingsSchema,\n ColumnNameSchema,\n continuousAesMappingFromValueSchema, DataValueSchema,\n FrameTypeSchema,\n LegendPositionSchema,\n LineShapeSchema,\n PointShapeSchema,\n TitlePositionSchema,\n TooltipSettingsSchema,\n} from './common';\n\ntype catAesFromColumn<ValueType extends z.ZodType> = ReturnType<typeof categoricalAesMappingFromValueSchema<ValueType>>;\ntype contAesFromColumn<ValueType extends z.ZodType> = ReturnType<typeof continuousAesMappingFromValueSchema<ValueType>>;\n\nexport type CategoricalAesFromColumn<ValueType> = z.infer<catAesFromColumn<z.ZodType<ValueType>>>;\nexport type ContinuousAesFromColumn<ValueType> = z.infer<contAesFromColumn<z.ZodType<ValueType>>>;\n\nconst InheritAesSchema = z.object({\n type: z.literal('grouping'),\n value: z.string(), // link to aes mapped to column\n palette: z.optional(z.array(z.string())) // if defined we use palette to create mapping without inheritedAes field\n});\nexport type InheritAesScatterplot = z.infer<typeof InheritAesSchema>;\n\nconst DotsLayerSchema = z.object({\n type: z.literal('dots'),\n aes: z.optional(\n z.object({\n dotFill: z.optional(z.union([z.string(), InheritAesSchema, continuousAesMappingFromValueSchema(z.string())])),\n dotShape: z.optional(z.union([PointShapeSchema, InheritAesSchema])),\n dotSize: z.optional(z.union([z.number(), continuousAesMappingFromValueSchema(z.number())])),\n })\n ),\n});\nconst CurveLayerSchema = z.object({\n type: z.literal('curve'),\n smoothing: z.optional(z.boolean()),\n aes: z.optional(\n z.object({\n lineWidth: z.optional(z.number()),\n lineShape: z.optional(LineShapeSchema),\n lineColor: z.optional(z.union([z.string(), InheritAesSchema, continuousAesMappingFromValueSchema(z.string())])),\n opacity: z.optional(z.number()),\n })\n ),\n});\nconst ScatterplotLayerSchema = z.union([DotsLayerSchema, CurveLayerSchema]);\n\nexport type DotsLayer = z.infer<typeof DotsLayerSchema>;\nexport type CurveLayer = z.infer<typeof CurveLayerSchema>;\nexport type ScatterplotLayer = z.infer<typeof ScatterplotLayerSchema>;\n\nconst AdditionalCurveTrendSchema = z.object({\n color: z.optional(z.union([z.string(), InheritAesSchema, continuousAesMappingFromValueSchema(z.string())])),\n bounded: z.optional(z.boolean()),\n});\n\nconst AdditionalCurveEntrySchema = z.object({\n columnName: ColumnNameSchema,\n label: z.string(),\n lineShape: z.optional(LineShapeSchema),\n lineWidth: z.optional(z.number()),\n lineColor: z.optional(z.union([z.string(), InheritAesSchema, continuousAesMappingFromValueSchema(z.string())])),\n opacity: z.optional(z.number()),\n showDots: z.optional(z.boolean()),\n // When present, suppresses the curve polyline and renders a linear trend instead. Dots (showDots) are unaffected.\n trend: z.optional(AdditionalCurveTrendSchema),\n});\n\nconst AdditionalCurvesSchema = z.object({\n curves: z.array(AdditionalCurveEntrySchema),\n smoothing: z.optional(z.boolean()),\n});\n\nexport type AdditionalCurveTrend = z.infer<typeof AdditionalCurveTrendSchema>;\nexport type AdditionalCurveEntry = z.infer<typeof AdditionalCurveEntrySchema>;\nexport type AdditionalCurves = z.infer<typeof AdditionalCurvesSchema>;\n\nexport const ScatterplotSettingsSchema = z.object({\n type: z.literal('scatterplot'),\n title: z.object({\n name: z.string(),\n show: z.optional(z.boolean()),\n position: z.optional(TitlePositionSchema),\n }),\n size: z.optional(\n z.object({\n width: z.optional(z.number()),\n height: z.optional(z.number()),\n })\n ),\n legend: z.optional(\n z.object({\n show: z.optional(z.boolean()),\n position: z.optional(LegendPositionSchema),\n })\n ),\n tooltips: z.optional(TooltipSettingsSchema),\n frame: z.optional(z.object({type: z.optional(FrameTypeSchema)})),\n facetSettings: z.optional(\n z.object({\n sharedX: z.optional(z.boolean()),\n sharedY: z.optional(z.boolean()),\n /** Ordered list of facet keys; only these facets are shown, in this order */\n order: z.optional(z.array(z.string())),\n nRows: z.optional(z.number()),\n nCols: z.optional(z.number()),\n })\n ),\n keyColumn: ColumnNameSchema,\n x: ColumnNameSchema,\n y: ColumnNameSchema,\n xAxis: z.optional(AxisSettingsSchema),\n yAxis: z.optional(AxisSettingsSchema),\n grouping: z.optional(z.array(\n z.object({\n columnName: ColumnNameSchema,\n order: z.optional(z.array(DataValueSchema)),\n inheritedAes: z.optional(AesRecordSchema),\n allowNullGroup: z.optional(z.boolean())\n })\n )),\n dotSize: z.optional(z.array(\n z.object({\n columnName: ColumnNameSchema,\n })\n )),\n dotShape: z.optional(z.array(\n z.object({\n columnName: ColumnNameSchema,\n order: z.optional(z.array(DataValueSchema)),\n inheritedAes: z.optional(AesRecordSchema),\n })\n )),\n facetBy: z.optional(z.array(ColumnNameSchema)),\n label: z.optional(ColumnNameSchema),\n highlight: z.optional(ColumnNameSchema),\n trend: z.optional(\n z.object({\n color: z.optional(z.optional(z.union([z.string(), InheritAesSchema, continuousAesMappingFromValueSchema(z.string())]))),\n bounded: z.optional(z.boolean()), // if true: line and area bounded with min and max X value; else line bounded by chart bounds\n lineWidth: z.optional(z.number()),\n })\n ),\n additionalCurves: z.optional(AdditionalCurvesSchema),\n layers: z.array(ScatterplotLayerSchema),\n});\n\nexport type ScatterplotSettings = z.infer<typeof ScatterplotSettingsSchema>;\n\nexport type ScatterplotLegendInfo = Record<\n string,\n {\n values: Category[];\n usedAes: (keyof AesItem)[];\n aesMap: (value: Category, field: keyof AesItem) => undefined | DataValue;\n labels: Record<Category, string>;\n }\n>;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milaboratories/miplots4",
3
- "version": "1.2.4",
3
+ "version": "1.3.0",
4
4
  "description": "Data visualization library",
5
5
  "author": "erohinaelena",
6
6
  "license": "ISC",