@milaboratories/miplots4 1.0.160 → 1.0.161

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.
@@ -9,7 +9,7 @@ export declare const NO_GROUPED: unique symbol;
9
9
  export type GroupKey = string | typeof NO_GROUPED;
10
10
  export type RowIndex = number;
11
11
  type RowsGroup = Record<GroupKey, {
12
- rowIndexes: Uint16Array;
12
+ rowIndexes: Uint32Array;
13
13
  grouped: RowsGroup;
14
14
  }>;
15
15
  type ColumnName = string;
@@ -19,7 +19,7 @@ export declare class DataFrame {
19
19
  readonly data: Record<string, DataValue[]>;
20
20
  readonly rowsCount: number;
21
21
  readonly columnNames: ColumnName[];
22
- readonly rowIndexes: Uint16Array;
22
+ readonly rowIndexes: Uint32Array;
23
23
  readonly mapColumnCategories: Map<ColumnName, Category[]>;
24
24
  readonly mapColumnCategoriesRowIndexes: Map<ColumnName, Map<Category, number>>;
25
25
  rowsGrouped?: RowsGroup;
@@ -33,6 +33,6 @@ export declare class DataFrame {
33
33
  private computeColumnCategories;
34
34
  setGrouping(groupingColumnIds: (string | null)[]): void;
35
35
  getColumnByGrouping(groupingKeys: GroupKey[], keyYColumn: string): number[];
36
- getRowsByGrouping(groupingKeys: GroupKey[]): Uint16Array;
36
+ getRowsByGrouping(groupingKeys: GroupKey[]): Uint32Array;
37
37
  }
38
38
  export {};
package/dist/DataFrame.js CHANGED
@@ -7,7 +7,7 @@ const d = Symbol("noGrouped");
7
7
  function I(u) {
8
8
  return "type" in u && u.type === "columns";
9
9
  }
10
- const p = new Uint16Array(0), g = class g {
10
+ const p = new Uint32Array(0), g = class g {
11
11
  constructor(e, t) {
12
12
  s(this, "id");
13
13
  // input data grouped by columns
@@ -18,7 +18,7 @@ const p = new Uint16Array(0), g = class g {
18
18
  s(this, "mapColumnCategories", /* @__PURE__ */ new Map());
19
19
  s(this, "mapColumnCategoriesRowIndexes", /* @__PURE__ */ new Map());
20
20
  s(this, "rowsGrouped");
21
- this.id = e, this.data = t, this.columnNames = Object.keys(t), this.rowsCount = this.columnNames.length ? t[this.columnNames[0]].length : 0, this.rowIndexes = new Uint16Array(Array.from({ length: this.rowsCount }, (o, r) => r));
21
+ this.id = e, this.data = t, this.columnNames = Object.keys(t), this.rowsCount = this.columnNames.length ? t[this.columnNames[0]].length : 0, this.rowIndexes = new Uint32Array(Array.from({ length: this.rowsCount }, (o, r) => r));
22
22
  }
23
23
  static from(e) {
24
24
  if (e instanceof g)
@@ -83,7 +83,7 @@ const p = new Uint16Array(0), g = class g {
83
83
  else {
84
84
  const h = f.groupBy(n.rowIndexes, (l) => this.getColumnValueCategory(r, l));
85
85
  n.grouped = i.reduce((l, m) => (l[m] = {
86
- rowIndexes: new Uint16Array(h[m] ?? []),
86
+ rowIndexes: new Uint32Array(h[m] ?? []),
87
87
  grouped: {}
88
88
  }, a.push(l[m]), l), {});
89
89
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DataFrame.js","sources":["../src/DataFrame.ts"],"sourcesContent":["import { groupBy } from 'lodash';\nimport type { Category, DataValue } from './types';\nimport { exhaustive } from './utils';\n\nexport type DataByColumns = {\n type: 'columns',\n values: Record<string, DataValue[]>,\n id: string\n}\nexport type DataSet = DataFrame | DataByColumns;\nexport const NO_GROUPED = Symbol('noGrouped');\nexport type GroupKey = string | typeof NO_GROUPED;\nexport type RowIndex = number;\ntype RowsGroup = Record<\n GroupKey,\n {\n rowIndexes: Uint16Array;\n grouped: RowsGroup;\n }\n>;\n\nfunction isDataByColumns (data:DataSet): data is DataByColumns {\n return 'type' in data && data.type === 'columns';\n}\n\ntype ColumnName = string;\n\nconst EMPTY_INDEXES = new Uint16Array(0);\n\nexport class DataFrame {\n static toCategory = (value: DataValue): string => String(value);\n\n readonly id: string;\n // input data grouped by columns\n readonly data: Record<string, DataValue[]>;\n readonly rowsCount: number;\n readonly columnNames: ColumnName[];\n readonly rowIndexes: Uint16Array;\n\n readonly mapColumnCategories: Map<ColumnName, Category[]> = new Map();\n readonly mapColumnCategoriesRowIndexes: Map<ColumnName, Map<Category, number>> = new Map();\n\n rowsGrouped?: RowsGroup;\n\n static from (data: DataSet):DataFrame {\n if (data instanceof DataFrame) {\n return data;\n } else if (isDataByColumns(data)) {\n return new DataFrame(data.id, data.values);\n } else {\n exhaustive(data, 'Unknown input data format');\n }\n }\n\n constructor(id: string, data: Record<string, DataValue[]>) {\n this.id = id;\n this.data = data;\n this.columnNames = Object.keys(data);\n this.rowsCount = this.columnNames.length ? data[this.columnNames[0]].length : 0;\n this.rowIndexes = new Uint16Array(Array.from({length: this.rowsCount}, (_, i) => i));\n }\n\n getColumn(key: string): DataValue[] {\n return this.data[key];\n }\n\n getColumnValue(key: string, index: number): DataValue {\n return this.data[key]?.[index];\n }\n\n getColumnValueCategory(key: string, index: number): Category {\n return DataFrame.toCategory(this.getColumnValue(key, index));\n }\n\n getColumnCategories(key: string, ignoreNull = true): Category[] {\n if (!this.mapColumnCategories.has(key)) {\n this.computeColumnCategories(key);\n }\n\n const categories = this.mapColumnCategories.get(key) ?? [];\n return ignoreNull && categories && categories.length > 0 && categories[categories.length - 1] === 'null'\n ? categories.slice(0, -1) // full copy without null to heavy for large datasets\n : categories; \n }\n\n getColumnCategoryRowIndex(key: string, value: Category): RowIndex {\n const rowIndex = this.mapColumnCategoriesRowIndexes.get(key)?.get(value);\n \n if (rowIndex === undefined) {\n throw new Error(`Category ${value} not found in column ${key}`);\n }\n\n return rowIndex;\n }\n\n private computeColumnCategories(key: ColumnName) {\n if (!this.columnNames.includes(key)) {\n throw new Error(`Column ${key} does not exist`);\n }\n \n const columnData = this.getColumn(key);\n const uniqValues = new Set<DataValue>();\n const categories: string[] = [];\n const categoriesIndexes = new Map<string, number>();\n let nullIdx = -1;\n for (let i = 0; i < columnData.length; i++) {\n const value = columnData[i];\n if (uniqValues.has(value)) {\n continue;\n }\n uniqValues.add(value);\n if (value === null) {\n nullIdx = i;\n continue;\n }\n const category = DataFrame.toCategory(value);\n categories.push(category);\n categoriesIndexes.set(category, i);\n }\n if (nullIdx !== -1) {\n categories.push('null');\n categoriesIndexes.set('null', nullIdx);\n }\n\n this.mapColumnCategories.set(key, categories);\n this.mapColumnCategoriesRowIndexes.set(key, categoriesIndexes);\n }\n\n setGrouping(groupingColumnIds: (string | null)[]) {\n const root = {grouped: {} as RowsGroup, rowIndexes: this.rowIndexes};\n let groups: RowsGroup[keyof RowsGroup][] = [root];\n groupingColumnIds.forEach(column => {\n const keys: GroupKey[] = column === null ? [NO_GROUPED] : this.getColumnCategories(column, false);\n const nextGroups: RowsGroup[keyof RowsGroup][] = [];\n groups.forEach(group => {\n if (column === null) {\n group.grouped = {\n [NO_GROUPED]: {\n rowIndexes: group.rowIndexes,\n grouped: {} as RowsGroup,\n },\n };\n nextGroups.push(group.grouped[NO_GROUPED]);\n } else {\n const groupedBy = groupBy(group.rowIndexes, idx => this.getColumnValueCategory(column, idx));\n group.grouped = keys.reduce((res, key) => {\n res[key] = {\n rowIndexes: new Uint16Array(groupedBy[key as string] ?? []),\n grouped: {} as RowsGroup,\n };\n nextGroups.push(res[key]);\n return res;\n }, {} as RowsGroup);\n }\n });\n groups = nextGroups;\n });\n this.rowsGrouped = root.grouped;\n }\n\n // TODO: fix all places where this method is used\n getColumnByGrouping(groupingKeys: GroupKey[], keyYColumn: string): number[] {\n if (!this.rowsGrouped) {\n return [];\n }\n if (!groupingKeys.length) {\n return Array.from(this.rowIndexes).map(idx => Number(this.getColumnValue(keyYColumn, idx)));\n }\n let result: {grouped: RowsGroup; rowIndexes: Uint16Array} = {grouped: this.rowsGrouped, rowIndexes: this.rowIndexes};\n groupingKeys.forEach(key => {\n const nextGroup = result.grouped[key ?? 'null'];\n if (!nextGroup) {\n return [];\n }\n result = nextGroup;\n });\n return Array.from(result.rowIndexes).map(idx => Number(this.getColumnValue(keyYColumn, idx)));\n }\n\n // TODO: fix all places where this method is used\n getRowsByGrouping(groupingKeys: GroupKey[]): Uint16Array {\n if (!this.rowsGrouped) {\n return EMPTY_INDEXES;\n }\n if (!groupingKeys.length) {\n return this.rowIndexes;\n }\n let result: {grouped: RowsGroup; rowIndexes: Uint16Array} = {grouped: this.rowsGrouped, rowIndexes: this.rowIndexes};\n groupingKeys.forEach(key => {\n const nextGroup = result.grouped[key];\n if (!nextGroup) {\n return EMPTY_INDEXES;\n }\n result = nextGroup;\n });\n return result.rowIndexes;\n }\n}\n"],"names":["NO_GROUPED","isDataByColumns","data","EMPTY_INDEXES","_DataFrame","id","__publicField","_","i","exhaustive","key","index","_a","ignoreNull","categories","value","rowIndex","columnData","uniqValues","categoriesIndexes","nullIdx","category","groupingColumnIds","root","groups","column","keys","nextGroups","group","groupedBy","groupBy","idx","res","groupingKeys","keyYColumn","result","nextGroup","DataFrame"],"mappings":"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"}
1
+ {"version":3,"file":"DataFrame.js","sources":["../src/DataFrame.ts"],"sourcesContent":["import { groupBy } from 'lodash';\nimport type { Category, DataValue } from './types';\nimport { exhaustive } from './utils';\n\nexport type DataByColumns = {\n type: 'columns',\n values: Record<string, DataValue[]>,\n id: string\n}\nexport type DataSet = DataFrame | DataByColumns;\nexport const NO_GROUPED = Symbol('noGrouped');\nexport type GroupKey = string | typeof NO_GROUPED;\nexport type RowIndex = number;\ntype RowsGroup = Record<\n GroupKey,\n {\n rowIndexes: Uint32Array;\n grouped: RowsGroup;\n }\n>;\n\nfunction isDataByColumns (data:DataSet): data is DataByColumns {\n return 'type' in data && data.type === 'columns';\n}\n\ntype ColumnName = string;\n\nconst EMPTY_INDEXES = new Uint32Array(0);\n\nexport class DataFrame {\n static toCategory = (value: DataValue): string => String(value);\n\n readonly id: string;\n // input data grouped by columns\n readonly data: Record<string, DataValue[]>;\n readonly rowsCount: number;\n readonly columnNames: ColumnName[];\n readonly rowIndexes: Uint32Array;\n\n readonly mapColumnCategories: Map<ColumnName, Category[]> = new Map();\n readonly mapColumnCategoriesRowIndexes: Map<ColumnName, Map<Category, number>> = new Map();\n\n rowsGrouped?: RowsGroup;\n\n static from (data: DataSet):DataFrame {\n if (data instanceof DataFrame) {\n return data;\n } else if (isDataByColumns(data)) {\n return new DataFrame(data.id, data.values);\n } else {\n exhaustive(data, 'Unknown input data format');\n }\n }\n\n constructor(id: string, data: Record<string, DataValue[]>) {\n this.id = id;\n this.data = data;\n this.columnNames = Object.keys(data);\n this.rowsCount = this.columnNames.length ? data[this.columnNames[0]].length : 0;\n this.rowIndexes = new Uint32Array(Array.from({length: this.rowsCount}, (_, i) => i));\n }\n\n getColumn(key: string): DataValue[] {\n return this.data[key];\n }\n\n getColumnValue(key: string, index: number): DataValue {\n return this.data[key]?.[index];\n }\n\n getColumnValueCategory(key: string, index: number): Category {\n return DataFrame.toCategory(this.getColumnValue(key, index));\n }\n\n getColumnCategories(key: string, ignoreNull = true): Category[] {\n if (!this.mapColumnCategories.has(key)) {\n this.computeColumnCategories(key);\n }\n\n const categories = this.mapColumnCategories.get(key) ?? [];\n return ignoreNull && categories && categories.length > 0 && categories[categories.length - 1] === 'null'\n ? categories.slice(0, -1) // full copy without null to heavy for large datasets\n : categories; \n }\n\n getColumnCategoryRowIndex(key: string, value: Category): RowIndex {\n const rowIndex = this.mapColumnCategoriesRowIndexes.get(key)?.get(value);\n \n if (rowIndex === undefined) {\n throw new Error(`Category ${value} not found in column ${key}`);\n }\n\n return rowIndex;\n }\n\n private computeColumnCategories(key: ColumnName) {\n if (!this.columnNames.includes(key)) {\n throw new Error(`Column ${key} does not exist`);\n }\n \n const columnData = this.getColumn(key);\n const uniqValues = new Set<DataValue>();\n const categories: string[] = [];\n const categoriesIndexes = new Map<string, number>();\n let nullIdx = -1;\n for (let i = 0; i < columnData.length; i++) {\n const value = columnData[i];\n if (uniqValues.has(value)) {\n continue;\n }\n uniqValues.add(value);\n if (value === null) {\n nullIdx = i;\n continue;\n }\n const category = DataFrame.toCategory(value);\n categories.push(category);\n categoriesIndexes.set(category, i);\n }\n if (nullIdx !== -1) {\n categories.push('null');\n categoriesIndexes.set('null', nullIdx);\n }\n\n this.mapColumnCategories.set(key, categories);\n this.mapColumnCategoriesRowIndexes.set(key, categoriesIndexes);\n }\n\n setGrouping(groupingColumnIds: (string | null)[]) {\n const root = {grouped: {} as RowsGroup, rowIndexes: this.rowIndexes};\n let groups: RowsGroup[keyof RowsGroup][] = [root];\n groupingColumnIds.forEach(column => {\n const keys: GroupKey[] = column === null ? [NO_GROUPED] : this.getColumnCategories(column, false);\n const nextGroups: RowsGroup[keyof RowsGroup][] = [];\n groups.forEach(group => {\n if (column === null) {\n group.grouped = {\n [NO_GROUPED]: {\n rowIndexes: group.rowIndexes,\n grouped: {} as RowsGroup,\n },\n };\n nextGroups.push(group.grouped[NO_GROUPED]);\n } else {\n const groupedBy = groupBy(group.rowIndexes, idx => this.getColumnValueCategory(column, idx));\n group.grouped = keys.reduce((res, key) => {\n res[key] = {\n rowIndexes: new Uint32Array(groupedBy[key as string] ?? []),\n grouped: {} as RowsGroup,\n };\n nextGroups.push(res[key]);\n return res;\n }, {} as RowsGroup);\n }\n });\n groups = nextGroups;\n });\n this.rowsGrouped = root.grouped;\n }\n\n // TODO: fix all places where this method is used\n getColumnByGrouping(groupingKeys: GroupKey[], keyYColumn: string): number[] {\n if (!this.rowsGrouped) {\n return [];\n }\n if (!groupingKeys.length) {\n return Array.from(this.rowIndexes).map(idx => Number(this.getColumnValue(keyYColumn, idx)));\n }\n let result: {grouped: RowsGroup; rowIndexes: Uint32Array} = {grouped: this.rowsGrouped, rowIndexes: this.rowIndexes};\n groupingKeys.forEach(key => {\n const nextGroup = result.grouped[key ?? 'null'];\n if (!nextGroup) {\n return [];\n }\n result = nextGroup;\n });\n return Array.from(result.rowIndexes).map(idx => Number(this.getColumnValue(keyYColumn, idx)));\n }\n\n // TODO: fix all places where this method is used\n getRowsByGrouping(groupingKeys: GroupKey[]): Uint32Array {\n if (!this.rowsGrouped) {\n return EMPTY_INDEXES;\n }\n if (!groupingKeys.length) {\n return this.rowIndexes;\n }\n let result: {grouped: RowsGroup; rowIndexes: Uint32Array} = {grouped: this.rowsGrouped, rowIndexes: this.rowIndexes};\n groupingKeys.forEach(key => {\n const nextGroup = result.grouped[key];\n if (!nextGroup) {\n return EMPTY_INDEXES;\n }\n result = nextGroup;\n });\n return result.rowIndexes;\n }\n}\n"],"names":["NO_GROUPED","isDataByColumns","data","EMPTY_INDEXES","_DataFrame","id","__publicField","_","i","exhaustive","key","index","_a","ignoreNull","categories","value","rowIndex","columnData","uniqValues","categoriesIndexes","nullIdx","category","groupingColumnIds","root","groups","column","keys","nextGroups","group","groupedBy","groupBy","idx","res","groupingKeys","keyYColumn","result","nextGroup","DataFrame"],"mappings":"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"}
@@ -1,24 +1,24 @@
1
1
  var W = Object.defineProperty;
2
2
  var K = (l, t, e) => t in l ? W(l, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : l[t] = e;
3
3
  var u = (l, t, e) => K(l, typeof t != "symbol" ? t + "" : t, e);
4
- import { j as M } from "../_virtual/jsx-runtime.js";
4
+ import { j as N } from "../_virtual/jsx-runtime.js";
5
5
  import { c as P } from "../_virtual/client.js";
6
6
  import { Error as v } from "../common/Error.js";
7
7
  import { DataFrameProvider as F } from "../common/useDataFrame.js";
8
- import { DEFAULT_HEIGHT as N, DEFAULT_WIDTH as w, TITLE_LINE_HEIGHT as j, TITLE_MARGIN as k, DEFAULT_HEIGHT_SMALL as B } from "../constants.js";
9
- import { arrangeLegendParts as V } from "../utils/arrangeLegendParts.js";
8
+ import { DEFAULT_HEIGHT as H, DEFAULT_WIDTH as b, TITLE_LINE_HEIGHT as j, TITLE_MARGIN as k, MIN_LEGEND_GRADIENT_HEIGHT as B, MAX_LEGEND_GRADIENT_HEIGHT as V } from "../constants.js";
9
+ import { arrangeLegendParts as X } from "../utils/arrangeLegendParts.js";
10
10
  import { getChartEdgeSides as U } from "../utils/getChartEdgeSides.js";
11
- import { getContinuousLegendTicks as X } from "../utils/getContinuousLegendTicks.js";
12
- import { TextMeasurer as Y } from "../utils/TextMeasurer/TextMeasurer.js";
13
- import { ChartsGroup as q } from "./components/ChartsGroup.js";
14
- import { MIN_MARGIN as E, LEGEND_OFFSET as J, TITLE_LINE as I, CHART_SIDE_ELEMENTS as O, MIN_PADDING as Q } from "./constants.js";
15
- import { calculateChartSideElementSizes as Z } from "./utils/calculateChartSideElementSizes.js";
16
- import { calculateSideElementsBBoxes as $ } from "./utils/calculateSideElementsBBoxes.js";
17
- import { calculateCaptionTails as tt } from "./utils/calculateCaptionTails.js";
18
- import b from "../node_modules/.pnpm/d3-scale@4.0.2/node_modules/d3-scale/src/ordinal.js";
19
- import H from "../node_modules/.pnpm/d3-scale@4.0.2/node_modules/d3-scale/src/linear.js";
20
- import { sqrt as G } from "../node_modules/.pnpm/d3-scale@4.0.2/node_modules/d3-scale/src/pow.js";
21
- const et = (l, t) => {
11
+ import { getContinuousLegendTicks as Y } from "../utils/getContinuousLegendTicks.js";
12
+ import { TextMeasurer as q } from "../utils/TextMeasurer/TextMeasurer.js";
13
+ import { ChartsGroup as J } from "./components/ChartsGroup.js";
14
+ import { MIN_MARGIN as L, LEGEND_OFFSET as O, TITLE_LINE as I, CHART_SIDE_ELEMENTS as Q, MIN_PADDING as Z } from "./constants.js";
15
+ import { calculateChartSideElementSizes as $ } from "./utils/calculateChartSideElementSizes.js";
16
+ import { calculateSideElementsBBoxes as tt } from "./utils/calculateSideElementsBBoxes.js";
17
+ import { calculateCaptionTails as et } from "./utils/calculateCaptionTails.js";
18
+ import M from "../node_modules/.pnpm/d3-scale@4.0.2/node_modules/d3-scale/src/ordinal.js";
19
+ import w from "../node_modules/.pnpm/d3-scale@4.0.2/node_modules/d3-scale/src/linear.js";
20
+ import { sqrt as R } from "../node_modules/.pnpm/d3-scale@4.0.2/node_modules/d3-scale/src/pow.js";
21
+ const st = (l, t) => {
22
22
  const e = Math.min(...t), s = Math.max(...t);
23
23
  if (e === s) {
24
24
  const a = l % 2 === 0 ? [] : [e];
@@ -33,36 +33,36 @@ const et = (l, t) => {
33
33
  i.push(e + r * a);
34
34
  return i.push(s), i;
35
35
  };
36
- function st(l, t, e) {
36
+ function it(l, t, e) {
37
37
  let s = e;
38
- return l && (l.colorRange && (s = l.colorRange), l.method === "standardScaling" && (s = [-2, 2]), l.method === "meanNormalization" && (s = [-0.75, 0.75])), et(t, s);
38
+ return l && (l.colorRange && (s = l.colorRange), l.method === "standardScaling" && (s = [-2, 2]), l.method === "meanNormalization" && (s = [-0.75, 0.75])), st(t, s);
39
39
  }
40
- class Ct {
40
+ class At {
41
41
  constructor() {
42
42
  u(this, "reactRoot", null);
43
43
  u(this, "parentNode", null);
44
44
  u(this, "rootNode", null);
45
- u(this, "component", /* @__PURE__ */ M.jsx(M.Fragment, {}));
45
+ u(this, "component", /* @__PURE__ */ N.jsx(N.Fragment, {}));
46
46
  u(this, "chartsDimensions", {});
47
47
  u(this, "chartSizes", {
48
- chartWidth: w,
48
+ chartWidth: b,
49
49
  // width of single chart
50
- chartHeight: N,
50
+ chartHeight: H,
51
51
  // height of single chart
52
- chartsWidth: w,
52
+ chartsWidth: b,
53
53
  // width of all charts in charts row
54
- chartsHeight: N,
54
+ chartsHeight: H,
55
55
  // width of all charts in charts column, without axes
56
- totalWidth: w,
56
+ totalWidth: b,
57
57
  // width of all charts in charts row, plus left axis, plus legend
58
- totalHeight: N
58
+ totalHeight: H
59
59
  // width of all charts in charts height, plus bottom axis, plus top title
60
60
  });
61
61
  u(this, "margins", {
62
- top: E,
63
- bottom: E,
64
- left: E,
65
- right: E
62
+ top: L,
63
+ bottom: L,
64
+ left: L,
65
+ right: L
66
66
  });
67
67
  u(this, "captionsSizes", {
68
68
  xAxisCaptions: 100,
@@ -77,12 +77,12 @@ class Ct {
77
77
  u(this, "columnsCount", 1);
78
78
  u(this, "rowsCount", 1);
79
79
  u(this, "scales", {
80
- x: b().domain(["null"]).range([1]),
81
- y: b().domain(["null"]).range([1])
80
+ x: M().domain(["null"]).range([1]),
81
+ y: M().domain(["null"]).range([1])
82
82
  });
83
83
  u(this, "step", { x: 10, y: 10 });
84
- u(this, "colorScale", H().domain([0, 1]).range(["white", "black"]));
85
- u(this, "sizeScale", G().domain([0, 1]).range([3, 20]));
84
+ u(this, "colorScale", w().domain([0, 1]).range(["white", "black"]));
85
+ u(this, "sizeScale", R().domain([0, 1]).range([3, 20]));
86
86
  u(this, "legend", {
87
87
  width: 0,
88
88
  height: 0,
@@ -101,9 +101,9 @@ class Ct {
101
101
  }
102
102
  updateMargins(t) {
103
103
  this.margins = {
104
- top: t.show ? j + k * 2 : E,
105
- bottom: E,
106
- left: E,
104
+ top: t.show ? j + k * 2 : L,
105
+ bottom: L,
106
+ left: L,
107
107
  right: this.legend.width
108
108
  }, this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartsWidth + this.margins.right, this.chartSizes.totalHeight = this.margins.top + Math.max(this.chartSizes.chartsHeight, this.legend.height) + this.margins.bottom;
109
109
  }
@@ -114,11 +114,11 @@ class Ct {
114
114
  }
115
115
  const i = [], a = Math.min(
116
116
  Math.max(this.chartSizes.chartHeight, B),
117
- N
118
- ), d = Math.max(this.chartSizes.chartHeight, a), x = { width: 0, height: 0, left: 0, top: 0 }, h = this.colorScale.domain(), g = X(this.colorScale, [
117
+ V
118
+ ), d = Math.max(this.chartSizes.chartHeight, a), x = { width: 0, height: 0, left: 0, top: 0 }, h = this.colorScale.domain(), g = Y(this.colorScale, [
119
119
  h[0],
120
120
  h[h.length - 1]
121
- ]), C = e.label ?? e.value, S = H([g[0], g[g.length - 1]], [a, 0]);
121
+ ]), C = e.label ?? e.value, S = w([g[0], g[g.length - 1]], [a, 0]);
122
122
  i.push({
123
123
  id: "colorValue",
124
124
  type: "continuous",
@@ -141,7 +141,7 @@ class Ct {
141
141
  this.legend = { width: 0, height: 0, items: [] };
142
142
  return;
143
143
  }
144
- const y = V(i, d, a), L = y[y.length - 1], T = L.left + L.width + 2 * J, o = this.chartsDimensions[r[0]].padding;
144
+ const y = X(i, d, a), E = y[y.length - 1], T = E.left + E.width + 2 * O, o = this.chartsDimensions[r[0]].padding;
145
145
  this.legend = {
146
146
  width: T,
147
147
  height: d + o.top,
@@ -149,7 +149,7 @@ class Ct {
149
149
  };
150
150
  }
151
151
  updateCaptionsSize(t, e, s) {
152
- const r = new Y("bold 14px Arial"), { xKeys: i, yKeys: a, xLabels: d, yLabels: x } = t.meta;
152
+ const r = new q("bold 14px Arial"), { xKeys: i, yKeys: a, xLabels: d, yLabels: x } = t.meta;
153
153
  this.labelAngles = {
154
154
  xAxisLabels: e.axisLabelsAngle,
155
155
  yAxisLabels: s.axisLabelsAngle
@@ -163,7 +163,7 @@ class Ct {
163
163
  const c = r.getTextWidth(x[f]);
164
164
  c > g && (g = c);
165
165
  }
166
- const { xCaptionTail: C, yCaptionTail: S } = tt(
166
+ const { xCaptionTail: C, yCaptionTail: S } = et(
167
167
  this.labelAngles,
168
168
  this.step,
169
169
  t,
@@ -181,7 +181,7 @@ class Ct {
181
181
  this.columnsCount = e.nRows ? Math.ceil(i / a) : d, this.rowsCount = Math.ceil(i / this.columnsCount), this.chartsDimensions = {};
182
182
  let x = 0, h = 0;
183
183
  t.forEach((S, p) => {
184
- const A = p % this.columnsCount + 1, f = U(p, t.length, this.columnsCount, this.rowsCount), c = this.chartSizes.chartWidth, y = this.chartSizes.chartHeight, L = Z(
184
+ const A = p % this.columnsCount + 1, f = U(p, t.length, this.columnsCount, this.rowsCount), c = this.chartSizes.chartWidth, y = this.chartSizes.chartHeight, E = $(
185
185
  s,
186
186
  r,
187
187
  this.captionsSizes,
@@ -190,10 +190,10 @@ class Ct {
190
190
  this.step.x,
191
191
  this.step.y
192
192
  );
193
- function T(R) {
193
+ function T(G) {
194
194
  return Math.max(
195
- O[R].reduce((D, _) => D + L[R][_], 0),
196
- Q
195
+ Q[G].reduce((_, D) => _ + E[G][D], 0),
196
+ Z
197
197
  );
198
198
  }
199
199
  const o = {
@@ -203,7 +203,7 @@ class Ct {
203
203
  bottom: T("bottom")
204
204
  };
205
205
  o.left < this.captionsSizes.xCaptionTail && (o.left = this.captionsSizes.xCaptionTail), o.bottom < this.captionsSizes.yCaptionTail && (o.bottom = this.captionsSizes.yCaptionTail);
206
- const n = $(L, c, y), m = c + o.left + o.right, z = y + o.top + o.bottom;
206
+ const n = tt(E, c, y), m = c + o.left + o.right, z = y + o.top + o.bottom;
207
207
  this.chartsDimensions[S] = {
208
208
  left: x,
209
209
  top: h,
@@ -229,18 +229,18 @@ class Ct {
229
229
  (m, z) => r.sorting === "asc" ? (n[m] ?? m).localeCompare(n[z] ?? z, "en", { numeric: !0 }) : (n[z] ?? z).localeCompare(n[m] ?? m, "en", { numeric: !0 })
230
230
  ), S = i.xGroup ? h.xGroupKeys : g(h.xGroupKeys), p = i.yGroup ? h.yGroupKeys : C(h.yGroupKeys), { xKeysByGroups: A, yKeysByGroups: f } = h, c = S.reduce((o, n) => (o = o.concat(g(A[n], h.xLabels)), o), []), y = p.reduce((o, n) => (o = o.concat(C(f[n], h.yLabels)), o), []);
231
231
  x ? (this.step.x = x, this.step.y = x) : a && d && (this.step.x = a / c.length, this.step.y = d / y.length);
232
- const L = new Array(c.length).fill(null).map((o, n) => n * this.step.x), T = new Array(y.length).fill(null).map((o, n) => n * this.step.y);
233
- this.scales.x = b().domain(c).range(L), this.scales.y = b().domain(y).range(T);
232
+ const E = new Array(c.length).fill(null).map((o, n) => n * this.step.x), T = new Array(y.length).fill(null).map((o, n) => n * this.step.y);
233
+ this.scales.x = M().domain(c).range(E), this.scales.y = M().domain(y).range(T);
234
234
  }
235
235
  updateAesScale(t, e, s, r) {
236
- this.colorScale = H().domain(st(r, t.colorsList.length, s)).range(t.colorsList), this.sizeScale = G(e, [t.minRadius, t.maxRadius]);
236
+ this.colorScale = w().domain(it(r, t.colorsList.length, s)).range(t.colorsList), this.sizeScale = R(e, [t.minRadius, t.maxRadius]);
237
237
  }
238
238
  render(t, e, s, r, i, a, d, x, h, g, C, S) {
239
239
  var m;
240
- const { meta: p, facets: A, meta: { facetKeys: f } } = i, { valueExtent: c } = p, { xAxis: y, yAxis: L, title: T, size: o } = s;
241
- this.updateChartsSizes(i, o), this.updateAesScale(h, c.sizeValue, c.colorValue, x), this.updateScales(i, o, s.xAxis, s.yAxis, S), this.updateCaptionsSize(i, y, L), this.updateChartDimensions(f, r, y, L), this.updateLegendSize(s.legend, a, d, f), this.updateMargins(T);
242
- const n = /* @__PURE__ */ M.jsx(F, { dataFrame: t, children: /* @__PURE__ */ M.jsx(
243
- q,
240
+ const { meta: p, facets: A, meta: { facetKeys: f } } = i, { valueExtent: c } = p, { xAxis: y, yAxis: E, title: T, size: o } = s;
241
+ this.updateChartsSizes(i, o), this.updateAesScale(h, c.sizeValue, c.colorValue, x), this.updateScales(i, o, s.xAxis, s.yAxis, S), this.updateCaptionsSize(i, y, E), this.updateChartDimensions(f, r, y, E), this.updateLegendSize(s.legend, a, d, f), this.updateMargins(T);
242
+ const n = /* @__PURE__ */ N.jsx(F, { dataFrame: t, children: /* @__PURE__ */ N.jsx(
243
+ J,
244
244
  {
245
245
  aes: h,
246
246
  captionsSizes: this.captionsSizes,
@@ -268,10 +268,10 @@ class Ct {
268
268
  }
269
269
  renderError(t) {
270
270
  var e;
271
- (e = this.reactRoot) == null || e.render(/* @__PURE__ */ M.jsx(v, { message: t }));
271
+ (e = this.reactRoot) == null || e.render(/* @__PURE__ */ N.jsx(v, { message: t }));
272
272
  }
273
273
  }
274
274
  export {
275
- Ct as default
275
+ At as default
276
276
  };
277
277
  //# sourceMappingURL=ChartRenderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChartRenderer.js","sources":["../../src/bubble/ChartRenderer.tsx"],"sourcesContent":["import type { ScaleLinear, ScalePower } from 'd3-scale';\nimport { scaleLinear, scaleOrdinal, scaleSqrt } 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 { LegendData, LegendItem } from '../common/types';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport { DEFAULT_HEIGHT, DEFAULT_HEIGHT_SMALL, DEFAULT_WIDTH, TITLE_LINE_HEIGHT, TITLE_MARGIN } from '../constants';\nimport type { DataFrame } from '../DataFrame';\nimport type { ColumnName, DataValue } from '../types';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { getChartEdgeSides } from '../utils/getChartEdgeSides';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport type { BubbleSettingsImpl } from './BubbleSettingsImpl';\nimport { ChartsGroup } from './components/ChartsGroup';\nimport type {\n CaptionsSizes,\n ChartDimensionsData, ChartScales, ChartSizes,\n LabelAngles,\n Margins\n} from './components/types';\nimport { CHART_SIDE_ELEMENTS, LEGEND_OFFSET, MIN_MARGIN, MIN_PADDING, TITLE_LINE } from './constants';\nimport type { CellBubble, GroupedCellsBubble } from './getGroupedCellsData';\nimport { calculateChartSideElementSizes, calculateSideElementsBBoxes } from './utils';\nimport { calculateCaptionTails } from './utils/calculateCaptionTails';\n\nconst getSteps = (count: number, valueExtent: number[]) => {\n const min = Math.min(...valueExtent);\n const max = Math.max(...valueExtent);\n if (min === max) {\n const steps = count % 2 === 0 ? [] : [min];\n for (let i = 1; i < count / 2 + 1; i++) {\n steps.push(min + i);\n steps.unshift(min - i);\n }\n return steps;\n }\n if (count < 2) {\n return [min, max];\n }\n const step = (max - min) / (count - 1);\n const steps = [];\n for (let i = 0; i < count - 1; i++) {\n steps.push(min + step * i);\n }\n steps.push(max);\n return steps;\n};\n\nfunction getContinuousColorRange(\n normalization: BubbleSettingsImpl['normalization'],\n colorsCount: number,\n valueExtent: number[]\n) {\n let extent = valueExtent;\n if (normalization) {\n if (normalization.colorRange) {\n extent = normalization.colorRange;\n }\n if (normalization.method === 'standardScaling') {\n extent = [-2, 2];\n }\n if (normalization.method === 'meanNormalization') {\n extent = [-0.75, 0.75];\n }\n }\n return getSteps(colorsCount, extent);\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n component: ReactElement = (<></>);\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 margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n captionsSizes: CaptionsSizes = {\n xAxisCaptions: 100,\n yAxisCaptions: 100,\n xCaptionTail: 0,\n yCaptionTail: 0,\n };\n labelAngles: LabelAngles = {\n xAxisLabels: 0,\n yAxisLabels: 0,\n };\n columnsCount = 1;\n rowsCount = 1;\n scales: ChartScales = {\n x: scaleOrdinal<string, number>().domain(['null']).range([1]),\n y: scaleOrdinal<string, number>().domain(['null']).range([1]),\n };\n step: {x: number; y: number} = {x: 10, y: 10};\n colorScale: ScaleLinear<string, string> = scaleLinear<string, string>().domain([0, 1]).range(['white', 'black']);\n sizeScale: ScalePower<number, number> = scaleSqrt().domain([0, 1]).range([3, 20]);\n legend: LegendData = {\n width: 0,\n height: 0,\n items: [],\n };\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 updateMargins(title: BubbleSettingsImpl['chartSettings']['title']) {\n this.margins = {\n top: title.show ? TITLE_LINE_HEIGHT + TITLE_MARGIN * 2 : MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: this.legend.width,\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: BubbleSettingsImpl['chartSettings']['legend'],\n columnValueColor: ColumnName,\n columnValueSize: ColumnName,\n facetKeys: string[]\n ) {\n if (!legend.show) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const legendItems: LegendItem[] = [];\n const continuousHeight = Math.min(\n Math.max(this.chartSizes.chartHeight, DEFAULT_HEIGHT_SMALL),\n DEFAULT_HEIGHT\n );\n const legendHeight = Math.max(this.chartSizes.chartHeight, continuousHeight);\n const emptySizes = {width:0, height:0, left:0, top: 0};\n\n const colorDomain = this.colorScale.domain();\n const colorValues = getContinuousLegendTicks(this.colorScale, [\n colorDomain[0],\n colorDomain[colorDomain.length - 1],\n ]);\n const colorTitle = columnValueColor.label ?? columnValueColor.value;\n const tickPositionScale = scaleLinear([colorValues[0], colorValues[colorValues.length - 1]], [continuousHeight, 0]); //TODO: update during adding log scale for heatmap\n \n legendItems.push({\n id: 'colorValue',\n type: 'continuous',\n scale: this.colorScale,\n tickPositionScale,\n values: colorValues,\n title: colorTitle,\n ...emptySizes\n });\n\n const sizeTitle = columnValueSize.label ?? columnValueSize.value;\n const sizeValues = this.sizeScale.ticks(3);\n const format = this.sizeScale.tickFormat(3);\n const labels = sizeValues.reduce((res: Record<string, string>, v) => {\n res[String(v)] = format(v);\n return res;\n }, {});\n legendItems.push({\n id: 'sizeValue',\n type: 'size',\n title: sizeTitle,\n scale: this.sizeScale,\n values: sizeValues,\n labels,\n ...emptySizes\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 lastItem = items[items.length - 1];\n const legendWidth = lastItem.left + lastItem.width + 2 * LEGEND_OFFSET;\n\n const leftTopChartPadding = this.chartsDimensions[facetKeys[0]].padding; // additional offset of legend for alignment with chart\n\n this.legend = {\n width: legendWidth,\n height: legendHeight + leftTopChartPadding.top,\n items: items,\n };\n }\n\n updateCaptionsSize(\n groupedCells: GroupedCellsBubble,\n xAxis: BubbleSettingsImpl['chartSettings']['xAxis'],\n yAxis: BubbleSettingsImpl['chartSettings']['yAxis']\n ) {\n const textMeasurer = new TextMeasurer('bold 14px Arial');\n const {xKeys, yKeys, xLabels, yLabels} = groupedCells.meta;\n this.labelAngles = {\n xAxisLabels: xAxis.axisLabelsAngle,\n yAxisLabels: yAxis.axisLabelsAngle,\n };\n let maxXLabelSize = 0;\n let maxYLabelSize = 0;\n for (const xKey of xKeys) {\n const l = textMeasurer.getTextWidth(xLabels[xKey]);\n if (l > maxXLabelSize) {\n maxXLabelSize = l;\n }\n }\n for (const yKey of yKeys) {\n const l = textMeasurer.getTextWidth(yLabels[yKey]);\n if (l > maxYLabelSize) {\n maxYLabelSize = l;\n }\n }\n const {xCaptionTail, yCaptionTail} = calculateCaptionTails(\n this.labelAngles,\n this.step,\n groupedCells,\n textMeasurer\n );\n const xLabelAngle = (this.labelAngles.xAxisLabels / 180) * Math.PI;\n const yLabelAngle = (this.labelAngles.yAxisLabels / 180) * Math.PI;\n this.captionsSizes = {\n xCaptionTail,\n yCaptionTail,\n xAxisCaptions: maxXLabelSize * Math.sin(xLabelAngle) || TITLE_LINE,\n yAxisCaptions: maxYLabelSize * Math.sin(yLabelAngle) || TITLE_LINE,\n };\n }\n\n updateChartDimensions(\n facetKeys: string[],\n facetSettings: BubbleSettingsImpl['facetSettings'],\n xAxis: BubbleSettingsImpl['chartSettings']['xAxis'],\n yAxis: BubbleSettingsImpl['chartSettings']['yAxis']\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 this.chartsDimensions = {};\n\n let currentLeft = 0;\n let currentTop = 0;\n facetKeys.forEach((key, index) => {\n const currentColumn = (index % this.columnsCount) + 1;\n const chartSides = getChartEdgeSides(index, facetKeys.length, this.columnsCount, this.rowsCount);\n const width = this.chartSizes.chartWidth;\n const height = this.chartSizes.chartHeight;\n const sideElementSizes = calculateChartSideElementSizes(\n xAxis,\n yAxis,\n this.captionsSizes,\n chartSides,\n facetKeys,\n this.step.x,\n this.step.y\n );\n\n function getPadding(side: 'left' | 'right' | 'top' | 'bottom') {\n return Math.max(\n CHART_SIDE_ELEMENTS[side].reduce((res, el) => res + sideElementSizes[side][el], 0),\n MIN_PADDING\n );\n }\n\n const padding = {\n left: getPadding('left'),\n right: getPadding('right'),\n top: getPadding('top'),\n bottom: getPadding('bottom'),\n };\n if (padding.left < this.captionsSizes.xCaptionTail) {\n padding.left = this.captionsSizes.xCaptionTail;\n }\n if (padding.bottom < this.captionsSizes.yCaptionTail) {\n padding.bottom = this.captionsSizes.yCaptionTail;\n }\n const sideElementBBoxes = calculateSideElementsBBoxes(sideElementSizes, width, height);\n const outerWidth = width + padding.left + padding.right;\n const outerHeight = height + padding.top + padding.bottom;\n this.chartsDimensions[key] = {\n left: currentLeft,\n top: currentTop,\n inner: {width, height},\n outer: {width: outerWidth, height: outerHeight},\n padding,\n sideElementBBoxes,\n chartEdgeSides: chartSides,\n };\n currentLeft += outerWidth;\n if (currentColumn === this.columnsCount) {\n currentLeft = 0;\n currentTop += outerHeight;\n }\n });\n\n // sum of widths of first row\n const chartsWidth = facetKeys\n .slice(0, this.columnsCount)\n .reduce((sum, key) => sum + this.chartsDimensions[key].outer.width, 0);\n // sum of heights of first column\n const chartsHeight = facetKeys\n .filter((_key, index) => index % this.columnsCount === 0)\n .reduce((sum, key) => sum + this.chartsDimensions[key].outer.height, 0);\n this.chartSizes.chartsWidth = chartsWidth;\n this.chartSizes.chartsHeight = chartsHeight;\n }\n\n updateChartsSizes(groupedCellsData: GroupedCellsBubble, size: BubbleSettingsImpl['chartSettings']['size']) {\n const {width, height, cellSize} = size;\n if (cellSize) {\n this.chartSizes.chartWidth = groupedCellsData.meta.xKeys.length * cellSize;\n this.chartSizes.chartHeight = groupedCellsData.meta.yKeys.length * cellSize;\n }\n if (width && height) {\n this.chartSizes.chartWidth = width;\n this.chartSizes.chartHeight = height;\n }\n }\n\n // update scales for cell positions, x and y for each facet\n updateScales(\n groupedCells: GroupedCellsBubble,\n size: BubbleSettingsImpl['chartSettings']['size'],\n xAxis: BubbleSettingsImpl['chartSettings']['xAxis'],\n yAxis: BubbleSettingsImpl['chartSettings']['yAxis'],\n customOrder: {x: boolean, y: boolean, xGroup: boolean, yGroup: boolean},\n ) {\n const {width, height, cellSize} = size;\n const {meta} = groupedCells;\n const sortX = (arr: string[], labels: Record<string, string> = {}) => {\n return [...arr].sort((a, b) => xAxis.sorting === 'asc'\n ? (labels[a] ?? a).localeCompare((labels[b] ?? b), 'en', {numeric: true})\n : (labels[b] ?? b).localeCompare((labels[a] ?? a), 'en', {numeric: true})\n );\n };\n const sortY = (arr: string[], labels: Record<string, string> = {}) => {\n return [...arr].sort((a, b) => yAxis.sorting === 'asc'\n ? (labels[a] ?? a).localeCompare((labels[b] ?? b), 'en', {numeric: true})\n : (labels[b] ?? b).localeCompare((labels[a] ?? a), 'en', {numeric: true})\n );\n };\n const xGroupKeys = customOrder.xGroup ? meta.xGroupKeys : sortX(meta.xGroupKeys);\n const yGroupKeys = customOrder.yGroup ? meta.yGroupKeys : sortY(meta.yGroupKeys);\n const { xKeysByGroups, yKeysByGroups } = meta;\n\n const xKeys = xGroupKeys.reduce((res: string[], xGroupKey: string) => {\n res = res.concat(sortX(xKeysByGroups[xGroupKey], meta.xLabels));\n return res;\n }, []);\n const yKeys = yGroupKeys.reduce((res: string[], yGroupKey: string) => {\n res = res.concat(sortY(yKeysByGroups[yGroupKey], meta.yLabels));\n return res;\n }, []);\n if (cellSize) {\n this.step.x = cellSize;\n this.step.y = cellSize;\n } else if (width && height) {\n this.step.x = width / xKeys.length;\n this.step.y = height / yKeys.length;\n }\n const xPositions: number[] = new Array(xKeys.length).fill(null).map((_v, idx) => idx * this.step.x);\n const yPositions: number[] = new Array(yKeys.length).fill(null).map((_v, idx) => idx * this.step.y);\n this.scales.x = scaleOrdinal<string, number>().domain(xKeys).range(xPositions);\n this.scales.y = scaleOrdinal<string, number>().domain(yKeys).range(yPositions);\n }\n\n updateAesScale(\n aes: BubbleSettingsImpl['aes'],\n valueExtentSize: [number, number],\n valueExtentColor: [number, number],\n normalization: BubbleSettingsImpl['normalization']\n ) {\n this.colorScale = scaleLinear<string, string>()\n .domain(getContinuousColorRange(normalization, aes.colorsList.length, valueExtentColor))\n .range(aes.colorsList);\n this.sizeScale = scaleSqrt(valueExtentSize, [aes.minRadius, aes.maxRadius]);\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: BubbleSettingsImpl['chartSettings'],\n facetSettings: BubbleSettingsImpl['facetSettings'],\n groupedCellsData: GroupedCellsBubble,\n valueColumnColor: ColumnName,\n valueColumnSize: ColumnName,\n normalization: BubbleSettingsImpl['normalization'],\n aes: BubbleSettingsImpl['aes'],\n getCellTooltip: (cell: CellBubble) => string[],\n onTooltipHintSwitch: (v:boolean) => void,\n customOrder: {x: boolean, y: boolean, xGroup: boolean, yGroup: boolean},\n ) {\n const {meta, facets, meta: { facetKeys }} = groupedCellsData;\n const {valueExtent} = meta;\n const {xAxis, yAxis, title, size} = chartSettings;\n this.updateChartsSizes(groupedCellsData, size);\n this.updateAesScale(aes, valueExtent.sizeValue, valueExtent.colorValue, normalization);\n this.updateScales(groupedCellsData, size, chartSettings.xAxis, chartSettings.yAxis, customOrder);\n // caption sizes are needed for chart paddings in chart dimensions\n this.updateCaptionsSize(groupedCellsData, xAxis, yAxis);\n this.updateChartDimensions(facetKeys, facetSettings, xAxis, yAxis);\n this.updateLegendSize(chartSettings.legend, valueColumnColor, valueColumnSize, facetKeys);\n this.updateMargins(title);\n const component = (\n <DataFrameProvider dataFrame={dataFrame}>\n <ChartsGroup\n aes={aes}\n captionsSizes={this.captionsSizes}\n cellsMeta={meta}\n columnsCount={this.columnsCount}\n chartsDimensions={this.chartsDimensions}\n chartSettings={chartSettings}\n chartSizes={this.chartSizes}\n sizeScale={this.sizeScale as (v: DataValue) => number}\n colorScale={this.colorScale as (v: DataValue) => string}\n facetKeys={facetKeys}\n facetSettings={facetSettings}\n groupedCells={facets}\n labelAngles={this.labelAngles}\n legend={this.legend}\n margins={this.margins}\n scales={this.scales}\n settingsId={settingsId}\n step={this.step}\n getCellTooltip={getCellTooltip}\n onTooltipHintSwitch={onTooltipHintSwitch}\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"],"names":["getSteps","count","valueExtent","min","max","steps","i","step","getContinuousColorRange","normalization","colorsCount","extent","ChartRenderer","__publicField","jsx","Fragment","DEFAULT_WIDTH","DEFAULT_HEIGHT","MIN_MARGIN","scaleOrdinal","scaleLinear","scaleSqrt","_a","node","createRoot","title","TITLE_LINE_HEIGHT","TITLE_MARGIN","legend","columnValueColor","columnValueSize","facetKeys","legendItems","continuousHeight","DEFAULT_HEIGHT_SMALL","legendHeight","emptySizes","colorDomain","colorValues","getContinuousLegendTicks","colorTitle","tickPositionScale","sizeTitle","sizeValues","format","labels","res","v","items","arrangeLegendParts","lastItem","legendWidth","LEGEND_OFFSET","leftTopChartPadding","groupedCells","xAxis","yAxis","textMeasurer","TextMeasurer","xKeys","yKeys","xLabels","yLabels","maxXLabelSize","maxYLabelSize","xKey","l","yKey","xCaptionTail","yCaptionTail","calculateCaptionTails","xLabelAngle","yLabelAngle","TITLE_LINE","facetSettings","facetCount","maxNRows","maxNCols","currentLeft","currentTop","key","index","currentColumn","chartSides","getChartEdgeSides","width","height","sideElementSizes","calculateChartSideElementSizes","getPadding","side","CHART_SIDE_ELEMENTS","el","MIN_PADDING","padding","sideElementBBoxes","calculateSideElementsBBoxes","outerWidth","outerHeight","chartsWidth","sum","chartsHeight","_key","groupedCellsData","size","cellSize","customOrder","meta","sortX","arr","a","b","sortY","xGroupKeys","yGroupKeys","xKeysByGroups","yKeysByGroups","xGroupKey","yGroupKey","xPositions","_v","idx","yPositions","aes","valueExtentSize","valueExtentColor","dataFrame","settingsId","chartSettings","valueColumnColor","valueColumnSize","getCellTooltip","onTooltipHintSwitch","facets","component","DataFrameProvider","ChartsGroup","message","Error"],"mappings":"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"}
1
+ {"version":3,"file":"ChartRenderer.js","sources":["../../src/bubble/ChartRenderer.tsx"],"sourcesContent":["import type { ScaleLinear, ScalePower } from 'd3-scale';\nimport { scaleLinear, scaleOrdinal, scaleSqrt } 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 { LegendData, LegendItem } from '../common/types';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH, MAX_LEGEND_GRADIENT_HEIGHT, MIN_LEGEND_GRADIENT_HEIGHT, TITLE_LINE_HEIGHT, TITLE_MARGIN } from '../constants';\nimport type { DataFrame } from '../DataFrame';\nimport type { ColumnName, DataValue } from '../types';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { getChartEdgeSides } from '../utils/getChartEdgeSides';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport type { BubbleSettingsImpl } from './BubbleSettingsImpl';\nimport { ChartsGroup } from './components/ChartsGroup';\nimport type {\n CaptionsSizes,\n ChartDimensionsData, ChartScales, ChartSizes,\n LabelAngles,\n Margins\n} from './components/types';\nimport { CHART_SIDE_ELEMENTS, LEGEND_OFFSET, MIN_MARGIN, MIN_PADDING, TITLE_LINE } from './constants';\nimport type { CellBubble, GroupedCellsBubble } from './getGroupedCellsData';\nimport { calculateChartSideElementSizes, calculateSideElementsBBoxes } from './utils';\nimport { calculateCaptionTails } from './utils/calculateCaptionTails';\n\nconst getSteps = (count: number, valueExtent: number[]) => {\n const min = Math.min(...valueExtent);\n const max = Math.max(...valueExtent);\n if (min === max) {\n const steps = count % 2 === 0 ? [] : [min];\n for (let i = 1; i < count / 2 + 1; i++) {\n steps.push(min + i);\n steps.unshift(min - i);\n }\n return steps;\n }\n if (count < 2) {\n return [min, max];\n }\n const step = (max - min) / (count - 1);\n const steps = [];\n for (let i = 0; i < count - 1; i++) {\n steps.push(min + step * i);\n }\n steps.push(max);\n return steps;\n};\n\nfunction getContinuousColorRange(\n normalization: BubbleSettingsImpl['normalization'],\n colorsCount: number,\n valueExtent: number[]\n) {\n let extent = valueExtent;\n if (normalization) {\n if (normalization.colorRange) {\n extent = normalization.colorRange;\n }\n if (normalization.method === 'standardScaling') {\n extent = [-2, 2];\n }\n if (normalization.method === 'meanNormalization') {\n extent = [-0.75, 0.75];\n }\n }\n return getSteps(colorsCount, extent);\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n component: ReactElement = (<></>);\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 margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n captionsSizes: CaptionsSizes = {\n xAxisCaptions: 100,\n yAxisCaptions: 100,\n xCaptionTail: 0,\n yCaptionTail: 0,\n };\n labelAngles: LabelAngles = {\n xAxisLabels: 0,\n yAxisLabels: 0,\n };\n columnsCount = 1;\n rowsCount = 1;\n scales: ChartScales = {\n x: scaleOrdinal<string, number>().domain(['null']).range([1]),\n y: scaleOrdinal<string, number>().domain(['null']).range([1]),\n };\n step: {x: number; y: number} = {x: 10, y: 10};\n colorScale: ScaleLinear<string, string> = scaleLinear<string, string>().domain([0, 1]).range(['white', 'black']);\n sizeScale: ScalePower<number, number> = scaleSqrt().domain([0, 1]).range([3, 20]);\n legend: LegendData = {\n width: 0,\n height: 0,\n items: [],\n };\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 updateMargins(title: BubbleSettingsImpl['chartSettings']['title']) {\n this.margins = {\n top: title.show ? TITLE_LINE_HEIGHT + TITLE_MARGIN * 2 : MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: this.legend.width,\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: BubbleSettingsImpl['chartSettings']['legend'],\n columnValueColor: ColumnName,\n columnValueSize: ColumnName,\n facetKeys: string[]\n ) {\n if (!legend.show) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const legendItems: LegendItem[] = [];\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 const emptySizes = {width:0, height:0, left:0, top: 0};\n\n const colorDomain = this.colorScale.domain();\n const colorValues = getContinuousLegendTicks(this.colorScale, [\n colorDomain[0],\n colorDomain[colorDomain.length - 1],\n ]);\n const colorTitle = columnValueColor.label ?? columnValueColor.value;\n const tickPositionScale = scaleLinear([colorValues[0], colorValues[colorValues.length - 1]], [continuousHeight, 0]); //TODO: update during adding log scale for heatmap\n \n legendItems.push({\n id: 'colorValue',\n type: 'continuous',\n scale: this.colorScale,\n tickPositionScale,\n values: colorValues,\n title: colorTitle,\n ...emptySizes\n });\n\n const sizeTitle = columnValueSize.label ?? columnValueSize.value;\n const sizeValues = this.sizeScale.ticks(3);\n const format = this.sizeScale.tickFormat(3);\n const labels = sizeValues.reduce((res: Record<string, string>, v) => {\n res[String(v)] = format(v);\n return res;\n }, {});\n legendItems.push({\n id: 'sizeValue',\n type: 'size',\n title: sizeTitle,\n scale: this.sizeScale,\n values: sizeValues,\n labels,\n ...emptySizes\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 lastItem = items[items.length - 1];\n const legendWidth = lastItem.left + lastItem.width + 2 * LEGEND_OFFSET;\n\n const leftTopChartPadding = this.chartsDimensions[facetKeys[0]].padding; // additional offset of legend for alignment with chart\n\n this.legend = {\n width: legendWidth,\n height: legendHeight + leftTopChartPadding.top,\n items: items,\n };\n }\n\n updateCaptionsSize(\n groupedCells: GroupedCellsBubble,\n xAxis: BubbleSettingsImpl['chartSettings']['xAxis'],\n yAxis: BubbleSettingsImpl['chartSettings']['yAxis']\n ) {\n const textMeasurer = new TextMeasurer('bold 14px Arial');\n const {xKeys, yKeys, xLabels, yLabels} = groupedCells.meta;\n this.labelAngles = {\n xAxisLabels: xAxis.axisLabelsAngle,\n yAxisLabels: yAxis.axisLabelsAngle,\n };\n let maxXLabelSize = 0;\n let maxYLabelSize = 0;\n for (const xKey of xKeys) {\n const l = textMeasurer.getTextWidth(xLabels[xKey]);\n if (l > maxXLabelSize) {\n maxXLabelSize = l;\n }\n }\n for (const yKey of yKeys) {\n const l = textMeasurer.getTextWidth(yLabels[yKey]);\n if (l > maxYLabelSize) {\n maxYLabelSize = l;\n }\n }\n const {xCaptionTail, yCaptionTail} = calculateCaptionTails(\n this.labelAngles,\n this.step,\n groupedCells,\n textMeasurer\n );\n const xLabelAngle = (this.labelAngles.xAxisLabels / 180) * Math.PI;\n const yLabelAngle = (this.labelAngles.yAxisLabels / 180) * Math.PI;\n this.captionsSizes = {\n xCaptionTail,\n yCaptionTail,\n xAxisCaptions: maxXLabelSize * Math.sin(xLabelAngle) || TITLE_LINE,\n yAxisCaptions: maxYLabelSize * Math.sin(yLabelAngle) || TITLE_LINE,\n };\n }\n\n updateChartDimensions(\n facetKeys: string[],\n facetSettings: BubbleSettingsImpl['facetSettings'],\n xAxis: BubbleSettingsImpl['chartSettings']['xAxis'],\n yAxis: BubbleSettingsImpl['chartSettings']['yAxis']\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 this.chartsDimensions = {};\n\n let currentLeft = 0;\n let currentTop = 0;\n facetKeys.forEach((key, index) => {\n const currentColumn = (index % this.columnsCount) + 1;\n const chartSides = getChartEdgeSides(index, facetKeys.length, this.columnsCount, this.rowsCount);\n const width = this.chartSizes.chartWidth;\n const height = this.chartSizes.chartHeight;\n const sideElementSizes = calculateChartSideElementSizes(\n xAxis,\n yAxis,\n this.captionsSizes,\n chartSides,\n facetKeys,\n this.step.x,\n this.step.y\n );\n\n function getPadding(side: 'left' | 'right' | 'top' | 'bottom') {\n return Math.max(\n CHART_SIDE_ELEMENTS[side].reduce((res, el) => res + sideElementSizes[side][el], 0),\n MIN_PADDING\n );\n }\n\n const padding = {\n left: getPadding('left'),\n right: getPadding('right'),\n top: getPadding('top'),\n bottom: getPadding('bottom'),\n };\n if (padding.left < this.captionsSizes.xCaptionTail) {\n padding.left = this.captionsSizes.xCaptionTail;\n }\n if (padding.bottom < this.captionsSizes.yCaptionTail) {\n padding.bottom = this.captionsSizes.yCaptionTail;\n }\n const sideElementBBoxes = calculateSideElementsBBoxes(sideElementSizes, width, height);\n const outerWidth = width + padding.left + padding.right;\n const outerHeight = height + padding.top + padding.bottom;\n this.chartsDimensions[key] = {\n left: currentLeft,\n top: currentTop,\n inner: {width, height},\n outer: {width: outerWidth, height: outerHeight},\n padding,\n sideElementBBoxes,\n chartEdgeSides: chartSides,\n };\n currentLeft += outerWidth;\n if (currentColumn === this.columnsCount) {\n currentLeft = 0;\n currentTop += outerHeight;\n }\n });\n\n // sum of widths of first row\n const chartsWidth = facetKeys\n .slice(0, this.columnsCount)\n .reduce((sum, key) => sum + this.chartsDimensions[key].outer.width, 0);\n // sum of heights of first column\n const chartsHeight = facetKeys\n .filter((_key, index) => index % this.columnsCount === 0)\n .reduce((sum, key) => sum + this.chartsDimensions[key].outer.height, 0);\n this.chartSizes.chartsWidth = chartsWidth;\n this.chartSizes.chartsHeight = chartsHeight;\n }\n\n updateChartsSizes(groupedCellsData: GroupedCellsBubble, size: BubbleSettingsImpl['chartSettings']['size']) {\n const {width, height, cellSize} = size;\n if (cellSize) {\n this.chartSizes.chartWidth = groupedCellsData.meta.xKeys.length * cellSize;\n this.chartSizes.chartHeight = groupedCellsData.meta.yKeys.length * cellSize;\n }\n if (width && height) {\n this.chartSizes.chartWidth = width;\n this.chartSizes.chartHeight = height;\n }\n }\n\n // update scales for cell positions, x and y for each facet\n updateScales(\n groupedCells: GroupedCellsBubble,\n size: BubbleSettingsImpl['chartSettings']['size'],\n xAxis: BubbleSettingsImpl['chartSettings']['xAxis'],\n yAxis: BubbleSettingsImpl['chartSettings']['yAxis'],\n customOrder: {x: boolean, y: boolean, xGroup: boolean, yGroup: boolean},\n ) {\n const {width, height, cellSize} = size;\n const {meta} = groupedCells;\n const sortX = (arr: string[], labels: Record<string, string> = {}) => {\n return [...arr].sort((a, b) => xAxis.sorting === 'asc'\n ? (labels[a] ?? a).localeCompare((labels[b] ?? b), 'en', {numeric: true})\n : (labels[b] ?? b).localeCompare((labels[a] ?? a), 'en', {numeric: true})\n );\n };\n const sortY = (arr: string[], labels: Record<string, string> = {}) => {\n return [...arr].sort((a, b) => yAxis.sorting === 'asc'\n ? (labels[a] ?? a).localeCompare((labels[b] ?? b), 'en', {numeric: true})\n : (labels[b] ?? b).localeCompare((labels[a] ?? a), 'en', {numeric: true})\n );\n };\n const xGroupKeys = customOrder.xGroup ? meta.xGroupKeys : sortX(meta.xGroupKeys);\n const yGroupKeys = customOrder.yGroup ? meta.yGroupKeys : sortY(meta.yGroupKeys);\n const { xKeysByGroups, yKeysByGroups } = meta;\n\n const xKeys = xGroupKeys.reduce((res: string[], xGroupKey: string) => {\n res = res.concat(sortX(xKeysByGroups[xGroupKey], meta.xLabels));\n return res;\n }, []);\n const yKeys = yGroupKeys.reduce((res: string[], yGroupKey: string) => {\n res = res.concat(sortY(yKeysByGroups[yGroupKey], meta.yLabels));\n return res;\n }, []);\n if (cellSize) {\n this.step.x = cellSize;\n this.step.y = cellSize;\n } else if (width && height) {\n this.step.x = width / xKeys.length;\n this.step.y = height / yKeys.length;\n }\n const xPositions: number[] = new Array(xKeys.length).fill(null).map((_v, idx) => idx * this.step.x);\n const yPositions: number[] = new Array(yKeys.length).fill(null).map((_v, idx) => idx * this.step.y);\n this.scales.x = scaleOrdinal<string, number>().domain(xKeys).range(xPositions);\n this.scales.y = scaleOrdinal<string, number>().domain(yKeys).range(yPositions);\n }\n\n updateAesScale(\n aes: BubbleSettingsImpl['aes'],\n valueExtentSize: [number, number],\n valueExtentColor: [number, number],\n normalization: BubbleSettingsImpl['normalization']\n ) {\n this.colorScale = scaleLinear<string, string>()\n .domain(getContinuousColorRange(normalization, aes.colorsList.length, valueExtentColor))\n .range(aes.colorsList);\n this.sizeScale = scaleSqrt(valueExtentSize, [aes.minRadius, aes.maxRadius]);\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: BubbleSettingsImpl['chartSettings'],\n facetSettings: BubbleSettingsImpl['facetSettings'],\n groupedCellsData: GroupedCellsBubble,\n valueColumnColor: ColumnName,\n valueColumnSize: ColumnName,\n normalization: BubbleSettingsImpl['normalization'],\n aes: BubbleSettingsImpl['aes'],\n getCellTooltip: (cell: CellBubble) => string[],\n onTooltipHintSwitch: (v:boolean) => void,\n customOrder: {x: boolean, y: boolean, xGroup: boolean, yGroup: boolean},\n ) {\n const {meta, facets, meta: { facetKeys }} = groupedCellsData;\n const {valueExtent} = meta;\n const {xAxis, yAxis, title, size} = chartSettings;\n this.updateChartsSizes(groupedCellsData, size);\n this.updateAesScale(aes, valueExtent.sizeValue, valueExtent.colorValue, normalization);\n this.updateScales(groupedCellsData, size, chartSettings.xAxis, chartSettings.yAxis, customOrder);\n // caption sizes are needed for chart paddings in chart dimensions\n this.updateCaptionsSize(groupedCellsData, xAxis, yAxis);\n this.updateChartDimensions(facetKeys, facetSettings, xAxis, yAxis);\n this.updateLegendSize(chartSettings.legend, valueColumnColor, valueColumnSize, facetKeys);\n this.updateMargins(title);\n const component = (\n <DataFrameProvider dataFrame={dataFrame}>\n <ChartsGroup\n aes={aes}\n captionsSizes={this.captionsSizes}\n cellsMeta={meta}\n columnsCount={this.columnsCount}\n chartsDimensions={this.chartsDimensions}\n chartSettings={chartSettings}\n chartSizes={this.chartSizes}\n sizeScale={this.sizeScale as (v: DataValue) => number}\n colorScale={this.colorScale as (v: DataValue) => string}\n facetKeys={facetKeys}\n facetSettings={facetSettings}\n groupedCells={facets}\n labelAngles={this.labelAngles}\n legend={this.legend}\n margins={this.margins}\n scales={this.scales}\n settingsId={settingsId}\n step={this.step}\n getCellTooltip={getCellTooltip}\n onTooltipHintSwitch={onTooltipHintSwitch}\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"],"names":["getSteps","count","valueExtent","min","max","steps","i","step","getContinuousColorRange","normalization","colorsCount","extent","ChartRenderer","__publicField","jsx","Fragment","DEFAULT_WIDTH","DEFAULT_HEIGHT","MIN_MARGIN","scaleOrdinal","scaleLinear","scaleSqrt","_a","node","createRoot","title","TITLE_LINE_HEIGHT","TITLE_MARGIN","legend","columnValueColor","columnValueSize","facetKeys","legendItems","continuousHeight","MIN_LEGEND_GRADIENT_HEIGHT","MAX_LEGEND_GRADIENT_HEIGHT","legendHeight","emptySizes","colorDomain","colorValues","getContinuousLegendTicks","colorTitle","tickPositionScale","sizeTitle","sizeValues","format","labels","res","v","items","arrangeLegendParts","lastItem","legendWidth","LEGEND_OFFSET","leftTopChartPadding","groupedCells","xAxis","yAxis","textMeasurer","TextMeasurer","xKeys","yKeys","xLabels","yLabels","maxXLabelSize","maxYLabelSize","xKey","l","yKey","xCaptionTail","yCaptionTail","calculateCaptionTails","xLabelAngle","yLabelAngle","TITLE_LINE","facetSettings","facetCount","maxNRows","maxNCols","currentLeft","currentTop","key","index","currentColumn","chartSides","getChartEdgeSides","width","height","sideElementSizes","calculateChartSideElementSizes","getPadding","side","CHART_SIDE_ELEMENTS","el","MIN_PADDING","padding","sideElementBBoxes","calculateSideElementsBBoxes","outerWidth","outerHeight","chartsWidth","sum","chartsHeight","_key","groupedCellsData","size","cellSize","customOrder","meta","sortX","arr","a","b","sortY","xGroupKeys","yGroupKeys","xKeysByGroups","yKeysByGroups","xGroupKey","yGroupKey","xPositions","_v","idx","yPositions","aes","valueExtentSize","valueExtentColor","dataFrame","settingsId","chartSettings","valueColumnColor","valueColumnSize","getCellTooltip","onTooltipHintSwitch","facets","component","DataFrameProvider","ChartsGroup","message","Error"],"mappings":"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"}
@@ -9,3 +9,5 @@ export declare const TITLE_LINE_HEIGHT = 24;
9
9
  export declare const MAX_SHOWN_UNIQUE_VALUES_IN_LABELS = 100;
10
10
  export declare const MAX_FACETS_COUNT = 50;
11
11
  export declare const MAX_GROUPS_COUNT = 100;
12
+ export declare const MIN_LEGEND_GRADIENT_HEIGHT = 250;
13
+ export declare const MAX_LEGEND_GRADIENT_HEIGHT = 400;
package/dist/constants.js CHANGED
@@ -1,15 +1,17 @@
1
- const _ = "#110529", E = "#E1E3EB", T = 600, A = 350, L = 400, o = 250, t = 24, I = 24, c = 100, n = 50, s = 100;
1
+ const E = "#110529", _ = "#E1E3EB", T = 600, A = 350, I = 400, L = 250, o = 24, t = 24, c = 100, n = 50, s = 100, G = 250, H = 400;
2
2
  export {
3
- _ as BLACK,
3
+ E as BLACK,
4
4
  A as DEFAULT_HEIGHT,
5
- o as DEFAULT_HEIGHT_SMALL,
5
+ L as DEFAULT_HEIGHT_SMALL,
6
6
  T as DEFAULT_WIDTH,
7
- L as DEFAULT_WIDTH_SMALL,
8
- E as GRID_GRAY,
7
+ I as DEFAULT_WIDTH_SMALL,
8
+ _ as GRID_GRAY,
9
9
  n as MAX_FACETS_COUNT,
10
10
  s as MAX_GROUPS_COUNT,
11
+ H as MAX_LEGEND_GRADIENT_HEIGHT,
11
12
  c as MAX_SHOWN_UNIQUE_VALUES_IN_LABELS,
12
- I as TITLE_LINE_HEIGHT,
13
- t as TITLE_MARGIN
13
+ G as MIN_LEGEND_GRADIENT_HEIGHT,
14
+ t as TITLE_LINE_HEIGHT,
15
+ o as TITLE_MARGIN
14
16
  };
15
17
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sources":["../src/constants.ts"],"sourcesContent":["export const BLACK = '#110529';\nexport const GRID_GRAY = '#E1E3EB';\n\nexport const DEFAULT_WIDTH = 600;\nexport const DEFAULT_HEIGHT = 350;\nexport const DEFAULT_WIDTH_SMALL = 400;\nexport const DEFAULT_HEIGHT_SMALL = 250;\n\nexport const TITLE_MARGIN = 24;\nexport const TITLE_LINE_HEIGHT = 24;\n\nexport const MAX_SHOWN_UNIQUE_VALUES_IN_LABELS = 100;\nexport const MAX_FACETS_COUNT = 50;\nexport const MAX_GROUPS_COUNT = 100;"],"names":["BLACK","GRID_GRAY","DEFAULT_WIDTH","DEFAULT_HEIGHT","DEFAULT_WIDTH_SMALL","DEFAULT_HEIGHT_SMALL","TITLE_MARGIN","TITLE_LINE_HEIGHT","MAX_SHOWN_UNIQUE_VALUES_IN_LABELS","MAX_FACETS_COUNT","MAX_GROUPS_COUNT"],"mappings":"AAAO,MAAMA,IAAQ,WACRC,IAAY,WAEZC,IAAgB,KAChBC,IAAiB,KACjBC,IAAsB,KACtBC,IAAuB,KAEvBC,IAAe,IACfC,IAAoB,IAEpBC,IAAoC,KACpCC,IAAmB,IACnBC,IAAmB;"}
1
+ {"version":3,"file":"constants.js","sources":["../src/constants.ts"],"sourcesContent":["export const BLACK = '#110529';\nexport const GRID_GRAY = '#E1E3EB';\n\nexport const DEFAULT_WIDTH = 600;\nexport const DEFAULT_HEIGHT = 350;\nexport const DEFAULT_WIDTH_SMALL = 400;\nexport const DEFAULT_HEIGHT_SMALL = 250;\n\nexport const TITLE_MARGIN = 24;\nexport const TITLE_LINE_HEIGHT = 24;\n\nexport const MAX_SHOWN_UNIQUE_VALUES_IN_LABELS = 100;\nexport const MAX_FACETS_COUNT = 50;\nexport const MAX_GROUPS_COUNT = 100;\n\nexport const MIN_LEGEND_GRADIENT_HEIGHT = 250;\nexport const MAX_LEGEND_GRADIENT_HEIGHT = 400;"],"names":["BLACK","GRID_GRAY","DEFAULT_WIDTH","DEFAULT_HEIGHT","DEFAULT_WIDTH_SMALL","DEFAULT_HEIGHT_SMALL","TITLE_MARGIN","TITLE_LINE_HEIGHT","MAX_SHOWN_UNIQUE_VALUES_IN_LABELS","MAX_FACETS_COUNT","MAX_GROUPS_COUNT","MIN_LEGEND_GRADIENT_HEIGHT","MAX_LEGEND_GRADIENT_HEIGHT"],"mappings":"AAAO,MAAMA,IAAQ,WACRC,IAAY,WAEZC,IAAgB,KAChBC,IAAiB,KACjBC,IAAsB,KACtBC,IAAuB,KAEvBC,IAAe,IACfC,IAAoB,IAEpBC,IAAoC,KACpCC,IAAmB,IACnBC,IAAmB,KAEnBC,IAA6B,KAC7BC,IAA6B;"}
@@ -1 +1 @@
1
- {"version":3,"file":"stackedBar.js","sources":["../../../src/discrete/layers/stackedBar.ts"],"sourcesContent":["import { max as d3Max, min as d3Min, mean, quantileSorted, sum } from 'd3-array';\nimport type { DataFrame, GroupKey } from '../../DataFrame';\nimport { NO_GROUPED } from '../../DataFrame';\nimport type { ColumnName } from '../../types';\nimport type { StackedBarLayer } from '../DiscreteSettingsImpl';\nimport { getFacetStringKey } from '../utils/getFacetStringKey';\nimport type { StackedBarsData } from './types';\nimport { exhaustive } from '../../utils';\n\ntype BarPart = {\n height: number;\n key: string;\n};\n\nexport type StackedBar = {\n key: string;\n valuesMap: Record<string, BarPart>;\n primaryGrouping: string;\n boundsY: {\n min: number;\n max: number;\n };\n};\n\nfunction calculateHeight(\n indexes: Uint16Array,\n getter: (idx: number) => number,\n heightFunc: 'sum' | 'min' | 'max' | 'median' | 'mean',\n):number {\n if (indexes.length === 0) {\n throw Error('Unable to create bar on empty data');\n }\n\n switch (heightFunc) {\n case 'sum':\n return sum(indexes, getter);\n case 'max':\n return d3Max(indexes, getter) ?? getter(0);\n case 'min':\n return d3Min(indexes, getter) ?? getter(0);\n case 'median': {\n const valuesSorted = [...indexes].map(getter).sort((a, b) => a - b);\n return quantileSorted(valuesSorted, 0.5) ?? getter(0);\n }\n case 'mean': {\n return mean(indexes, getter) ?? getter(0);\n }\n default: exhaustive(heightFunc, `Unknown bar height function ${heightFunc}`);\n }\n}\n\nexport function getStackedBarsData(\n layer: StackedBarLayer,\n groupingKeys: {\n facet: GroupKey[][],\n primary: GroupKey[],\n secondary: GroupKey[]\n },\n data: DataFrame,\n y: ColumnName,\n): StackedBarsData {\n let maxY = -Infinity;\n let minY = Infinity;\n\n return {\n type: 'stackedBar',\n geoms: groupingKeys.facet.reduce((res: Record<string, StackedBar[]>, facetKey) => {\n const strFacetKey = getFacetStringKey(facetKey);\n res[strFacetKey] = [];\n groupingKeys.primary.forEach(primaryKey => {\n let currentHeight = 0;\n const barParts:Record<string, BarPart> = {};\n groupingKeys.secondary.forEach(secondaryKey => {\n const secondaryKeyStr = secondaryKey === NO_GROUPED ? 'null' : secondaryKey;\n const indexes = data.getRowsByGrouping([...facetKey, primaryKey, secondaryKey]);\n if (!indexes.length) {\n return;\n }\n const height = calculateHeight(indexes, (i) => Number(data.getColumnValue(y.value, i)), layer.height);\n barParts[secondaryKeyStr] = {\n height,\n key: String(secondaryKeyStr),\n };\n currentHeight += height;\n });\n const maxStackHeight = currentHeight;\n if (layer.normalize) { // show in percents of every stack\n groupingKeys.secondary.forEach(secondaryKey => {\n const secondaryKeyStr = secondaryKey === NO_GROUPED ? 'null' : secondaryKey;\n if (!barParts[secondaryKeyStr]) {\n return;\n }\n barParts[secondaryKeyStr].height = barParts[secondaryKeyStr].height / maxStackHeight * 100;\n });\n }\n maxY = Math.max(maxY, 0, currentHeight);\n minY = Math.min(minY, 0, currentHeight);\n const bound = layer.normalize ? 100 : maxStackHeight;\n res[strFacetKey].push({\n key: `stackedBar_${String(primaryKey)}`,\n valuesMap: barParts,\n primaryGrouping: primaryKey,\n boundsY: {min: Math.min(bound, 0), max: Math.max(bound, 0)},\n } as StackedBar);\n });\n return res;\n }, {}),\n meta: {minY: layer.normalize ? 0 : minY, maxY: layer.normalize ? 100 : maxY, normalize: layer.normalize},\n aes: layer.aes,\n };\n}\n"],"names":["calculateHeight","indexes","getter","heightFunc","sum","d3Max","d3Min","valuesSorted","a","b","quantileSorted","mean","exhaustive","getStackedBarsData","layer","groupingKeys","data","y","maxY","minY","res","facetKey","strFacetKey","getFacetStringKey","primaryKey","currentHeight","barParts","secondaryKey","secondaryKeyStr","NO_GROUPED","height","i","maxStackHeight","bound"],"mappings":";;;;;;;;AAwBA,SAASA,EACLC,GACAC,GACAC,GACK;AACL,MAAIF,EAAQ,WAAW;AACnB,UAAM,MAAM,oCAAoC;AAGpD,UAAQE,GAAA;AAAA,IACJ,KAAK;AACD,aAAOC,EAAIH,GAASC,CAAM;AAAA,IAC9B,KAAK;AACD,aAAOG,EAAMJ,GAASC,CAAM,KAAKA,EAAO,CAAC;AAAA,IAC7C,KAAK;AACD,aAAOI,EAAML,GAASC,CAAM,KAAKA,EAAO,CAAC;AAAA,IAC7C,KAAK,UAAU;AACX,YAAMK,IAAe,CAAC,GAAGN,CAAO,EAAE,IAAIC,CAAM,EAAE,KAAK,CAACM,GAAGC,MAAMD,IAAIC,CAAC;AAClE,aAAOC,EAAeH,GAAc,GAAG,KAAKL,EAAO,CAAC;AAAA,IACxD;AAAA,IACA,KAAK;AACD,aAAOS,EAAKV,GAASC,CAAM,KAAKA,EAAO,CAAC;AAAA,IAE5C;AAAS,MAAAU,EAAWT,GAAY,+BAA+BA,CAAU,EAAE;AAAA,EAAA;AAEnF;AAEO,SAASU,EACZC,GACAC,GAKAC,GACAC,GACe;AACf,MAAIC,IAAO,QACPC,IAAO;AAEX,SAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAOJ,EAAa,MAAM,OAAO,CAACK,GAAmCC,MAAa;AAC9E,YAAMC,IAAcC,EAAkBF,CAAQ;AAC9C,aAAAD,EAAIE,CAAW,IAAI,CAAA,GACnBP,EAAa,QAAQ,QAAQ,CAAAS,MAAc;AACvC,YAAIC,IAAgB;AACpB,cAAMC,IAAmC,CAAA;AACzC,QAAAX,EAAa,UAAU,QAAQ,CAAAY,MAAgB;AAC3C,gBAAMC,IAAkBD,MAAiBE,IAAa,SAASF,GACzD1B,IAAUe,EAAK,kBAAkB,CAAC,GAAGK,GAAUG,GAAYG,CAAY,CAAC;AAC9E,cAAI,CAAC1B,EAAQ;AACT;AAEJ,gBAAM6B,IAAS9B,EAAgBC,GAAS,CAAC8B,MAAM,OAAOf,EAAK,eAAeC,EAAE,OAAOc,CAAC,CAAC,GAAGjB,EAAM,MAAM;AACpG,UAAAY,EAASE,CAAe,IAAI;AAAA,YACxB,QAAAE;AAAA,YACA,KAAK,OAAOF,CAAe;AAAA,UAAA,GAE/BH,KAAiBK;AAAA,QACrB,CAAC;AACD,cAAME,IAAiBP;AACvB,QAAIX,EAAM,aACNC,EAAa,UAAU,QAAQ,CAAAY,MAAgB;AAC3C,gBAAMC,IAAkBD,MAAiBE,IAAa,SAASF;AAC/D,UAAKD,EAASE,CAAe,MAG7BF,EAASE,CAAe,EAAE,SAASF,EAASE,CAAe,EAAE,SAAUI,IAAiB;AAAA,QAC5F,CAAC,GAELd,IAAO,KAAK,IAAIA,GAAM,GAAGO,CAAa,GACtCN,IAAO,KAAK,IAAIA,GAAM,GAAGM,CAAa;AACtC,cAAMQ,IAAQnB,EAAM,YAAY,MAAMkB;AACtC,QAAAZ,EAAIE,CAAW,EAAE,KAAK;AAAA,UAClB,KAAK,cAAc,OAAOE,CAAU,CAAC;AAAA,UACrC,WAAWE;AAAA,UACX,iBAAiBF;AAAA,UACjB,SAAS,EAAC,KAAK,KAAK,IAAIS,GAAO,CAAC,GAAG,KAAK,KAAK,IAAIA,GAAO,CAAC,EAAA;AAAA,QAAC,CAC/C;AAAA,MACnB,CAAC,GACMb;AAAA,IACX,GAAG,CAAA,CAAE;AAAA,IACL,MAAM,EAAC,MAAMN,EAAM,YAAY,IAAIK,GAAM,MAAML,EAAM,YAAY,MAAMI,GAAM,WAAWJ,EAAM,UAAA;AAAA,IAC9F,KAAKA,EAAM;AAAA,EAAA;AAEnB;"}
1
+ {"version":3,"file":"stackedBar.js","sources":["../../../src/discrete/layers/stackedBar.ts"],"sourcesContent":["import { max as d3Max, min as d3Min, mean, quantileSorted, sum } from 'd3-array';\nimport type { DataFrame, GroupKey } from '../../DataFrame';\nimport { NO_GROUPED } from '../../DataFrame';\nimport type { ColumnName } from '../../types';\nimport type { StackedBarLayer } from '../DiscreteSettingsImpl';\nimport { getFacetStringKey } from '../utils/getFacetStringKey';\nimport type { StackedBarsData } from './types';\nimport { exhaustive } from '../../utils';\n\ntype BarPart = {\n height: number;\n key: string;\n};\n\nexport type StackedBar = {\n key: string;\n valuesMap: Record<string, BarPart>;\n primaryGrouping: string;\n boundsY: {\n min: number;\n max: number;\n };\n};\n\nfunction calculateHeight(\n indexes: Uint32Array,\n getter: (idx: number) => number,\n heightFunc: 'sum' | 'min' | 'max' | 'median' | 'mean',\n):number {\n if (indexes.length === 0) {\n throw Error('Unable to create bar on empty data');\n }\n\n switch (heightFunc) {\n case 'sum':\n return sum(indexes, getter);\n case 'max':\n return d3Max(indexes, getter) ?? getter(0);\n case 'min':\n return d3Min(indexes, getter) ?? getter(0);\n case 'median': {\n const valuesSorted = [...indexes].map(getter).sort((a, b) => a - b);\n return quantileSorted(valuesSorted, 0.5) ?? getter(0);\n }\n case 'mean': {\n return mean(indexes, getter) ?? getter(0);\n }\n default: exhaustive(heightFunc, `Unknown bar height function ${heightFunc}`);\n }\n}\n\nexport function getStackedBarsData(\n layer: StackedBarLayer,\n groupingKeys: {\n facet: GroupKey[][],\n primary: GroupKey[],\n secondary: GroupKey[]\n },\n data: DataFrame,\n y: ColumnName,\n): StackedBarsData {\n let maxY = -Infinity;\n let minY = Infinity;\n\n return {\n type: 'stackedBar',\n geoms: groupingKeys.facet.reduce((res: Record<string, StackedBar[]>, facetKey) => {\n const strFacetKey = getFacetStringKey(facetKey);\n res[strFacetKey] = [];\n groupingKeys.primary.forEach(primaryKey => {\n let currentHeight = 0;\n const barParts:Record<string, BarPart> = {};\n groupingKeys.secondary.forEach(secondaryKey => {\n const secondaryKeyStr = secondaryKey === NO_GROUPED ? 'null' : secondaryKey;\n const indexes = data.getRowsByGrouping([...facetKey, primaryKey, secondaryKey]);\n if (!indexes.length) {\n return;\n }\n const height = calculateHeight(indexes, (i) => Number(data.getColumnValue(y.value, i)), layer.height);\n barParts[secondaryKeyStr] = {\n height,\n key: String(secondaryKeyStr),\n };\n currentHeight += height;\n });\n const maxStackHeight = currentHeight;\n if (layer.normalize) { // show in percents of every stack\n groupingKeys.secondary.forEach(secondaryKey => {\n const secondaryKeyStr = secondaryKey === NO_GROUPED ? 'null' : secondaryKey;\n if (!barParts[secondaryKeyStr]) {\n return;\n }\n barParts[secondaryKeyStr].height = barParts[secondaryKeyStr].height / maxStackHeight * 100;\n });\n }\n maxY = Math.max(maxY, 0, currentHeight);\n minY = Math.min(minY, 0, currentHeight);\n const bound = layer.normalize ? 100 : maxStackHeight;\n res[strFacetKey].push({\n key: `stackedBar_${String(primaryKey)}`,\n valuesMap: barParts,\n primaryGrouping: primaryKey,\n boundsY: {min: Math.min(bound, 0), max: Math.max(bound, 0)},\n } as StackedBar);\n });\n return res;\n }, {}),\n meta: {minY: layer.normalize ? 0 : minY, maxY: layer.normalize ? 100 : maxY, normalize: layer.normalize},\n aes: layer.aes,\n };\n}\n"],"names":["calculateHeight","indexes","getter","heightFunc","sum","d3Max","d3Min","valuesSorted","a","b","quantileSorted","mean","exhaustive","getStackedBarsData","layer","groupingKeys","data","y","maxY","minY","res","facetKey","strFacetKey","getFacetStringKey","primaryKey","currentHeight","barParts","secondaryKey","secondaryKeyStr","NO_GROUPED","height","i","maxStackHeight","bound"],"mappings":";;;;;;;;AAwBA,SAASA,EACLC,GACAC,GACAC,GACK;AACL,MAAIF,EAAQ,WAAW;AACnB,UAAM,MAAM,oCAAoC;AAGpD,UAAQE,GAAA;AAAA,IACJ,KAAK;AACD,aAAOC,EAAIH,GAASC,CAAM;AAAA,IAC9B,KAAK;AACD,aAAOG,EAAMJ,GAASC,CAAM,KAAKA,EAAO,CAAC;AAAA,IAC7C,KAAK;AACD,aAAOI,EAAML,GAASC,CAAM,KAAKA,EAAO,CAAC;AAAA,IAC7C,KAAK,UAAU;AACX,YAAMK,IAAe,CAAC,GAAGN,CAAO,EAAE,IAAIC,CAAM,EAAE,KAAK,CAACM,GAAGC,MAAMD,IAAIC,CAAC;AAClE,aAAOC,EAAeH,GAAc,GAAG,KAAKL,EAAO,CAAC;AAAA,IACxD;AAAA,IACA,KAAK;AACD,aAAOS,EAAKV,GAASC,CAAM,KAAKA,EAAO,CAAC;AAAA,IAE5C;AAAS,MAAAU,EAAWT,GAAY,+BAA+BA,CAAU,EAAE;AAAA,EAAA;AAEnF;AAEO,SAASU,EACZC,GACAC,GAKAC,GACAC,GACe;AACf,MAAIC,IAAO,QACPC,IAAO;AAEX,SAAO;AAAA,IACH,MAAM;AAAA,IACN,OAAOJ,EAAa,MAAM,OAAO,CAACK,GAAmCC,MAAa;AAC9E,YAAMC,IAAcC,EAAkBF,CAAQ;AAC9C,aAAAD,EAAIE,CAAW,IAAI,CAAA,GACnBP,EAAa,QAAQ,QAAQ,CAAAS,MAAc;AACvC,YAAIC,IAAgB;AACpB,cAAMC,IAAmC,CAAA;AACzC,QAAAX,EAAa,UAAU,QAAQ,CAAAY,MAAgB;AAC3C,gBAAMC,IAAkBD,MAAiBE,IAAa,SAASF,GACzD1B,IAAUe,EAAK,kBAAkB,CAAC,GAAGK,GAAUG,GAAYG,CAAY,CAAC;AAC9E,cAAI,CAAC1B,EAAQ;AACT;AAEJ,gBAAM6B,IAAS9B,EAAgBC,GAAS,CAAC8B,MAAM,OAAOf,EAAK,eAAeC,EAAE,OAAOc,CAAC,CAAC,GAAGjB,EAAM,MAAM;AACpG,UAAAY,EAASE,CAAe,IAAI;AAAA,YACxB,QAAAE;AAAA,YACA,KAAK,OAAOF,CAAe;AAAA,UAAA,GAE/BH,KAAiBK;AAAA,QACrB,CAAC;AACD,cAAME,IAAiBP;AACvB,QAAIX,EAAM,aACNC,EAAa,UAAU,QAAQ,CAAAY,MAAgB;AAC3C,gBAAMC,IAAkBD,MAAiBE,IAAa,SAASF;AAC/D,UAAKD,EAASE,CAAe,MAG7BF,EAASE,CAAe,EAAE,SAASF,EAASE,CAAe,EAAE,SAAUI,IAAiB;AAAA,QAC5F,CAAC,GAELd,IAAO,KAAK,IAAIA,GAAM,GAAGO,CAAa,GACtCN,IAAO,KAAK,IAAIA,GAAM,GAAGM,CAAa;AACtC,cAAMQ,IAAQnB,EAAM,YAAY,MAAMkB;AACtC,QAAAZ,EAAIE,CAAW,EAAE,KAAK;AAAA,UAClB,KAAK,cAAc,OAAOE,CAAU,CAAC;AAAA,UACrC,WAAWE;AAAA,UACX,iBAAiBF;AAAA,UACjB,SAAS,EAAC,KAAK,KAAK,IAAIS,GAAO,CAAC,GAAG,KAAK,KAAK,IAAIA,GAAO,CAAC,EAAA;AAAA,QAAC,CAC/C;AAAA,MACnB,CAAC,GACMb;AAAA,IACX,GAAG,CAAA,CAAE;AAAA,IACL,MAAM,EAAC,MAAMN,EAAM,YAAY,IAAIK,GAAM,MAAML,EAAM,YAAY,MAAMI,GAAM,WAAWJ,EAAM,UAAA;AAAA,IAC9F,KAAKA,EAAM;AAAA,EAAA;AAEnB;"}