@unovis/ts 1.6.0-pre.2 → 1.6.1-pre.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 (167) hide show
  1. package/components/area/index.js +2 -1
  2. package/components/area/index.js.map +1 -1
  3. package/components/axis/config.d.ts +4 -0
  4. package/components/axis/config.js +2 -2
  5. package/components/axis/config.js.map +1 -1
  6. package/components/axis/index.d.ts +0 -1
  7. package/components/axis/index.js +58 -19
  8. package/components/axis/index.js.map +1 -1
  9. package/components/axis/style.d.ts +40 -1
  10. package/components/axis/style.js +34 -35
  11. package/components/axis/style.js.map +1 -1
  12. package/components/brush/config.d.ts +1 -1
  13. package/components/brush/config.js.map +1 -1
  14. package/components/bullet-legend/config.d.ts +2 -0
  15. package/components/bullet-legend/config.js +1 -0
  16. package/components/bullet-legend/config.js.map +1 -1
  17. package/components/bullet-legend/index.js +10 -2
  18. package/components/bullet-legend/index.js.map +1 -1
  19. package/components/bullet-legend/modules/shape.d.ts +1 -0
  20. package/components/bullet-legend/modules/shape.js +61 -41
  21. package/components/bullet-legend/modules/shape.js.map +1 -1
  22. package/components/bullet-legend/types.d.ts +1 -1
  23. package/components/bullet-legend/types.js.map +1 -1
  24. package/components/crosshair/config.d.ts +20 -7
  25. package/components/crosshair/config.js +1 -1
  26. package/components/crosshair/config.js.map +1 -1
  27. package/components/crosshair/index.d.ts +8 -7
  28. package/components/crosshair/index.js +144 -72
  29. package/components/crosshair/index.js.map +1 -1
  30. package/components/graph/config.d.ts +8 -0
  31. package/components/graph/config.js +1 -1
  32. package/components/graph/config.js.map +1 -1
  33. package/components/graph/index.d.ts +1 -0
  34. package/components/graph/index.js +14 -9
  35. package/components/graph/index.js.map +1 -1
  36. package/components/graph/modules/layout.js +33 -31
  37. package/components/graph/modules/layout.js.map +1 -1
  38. package/components/graph/modules/link/index.js +1 -1
  39. package/components/graph/modules/link/index.js.map +1 -1
  40. package/components/graph/types.d.ts +2 -1
  41. package/components/graph/types.js.map +1 -1
  42. package/components/nested-donut/config.d.ts +1 -1
  43. package/components/nested-donut/config.js.map +1 -1
  44. package/components/plotband/config.d.ts +59 -0
  45. package/components/plotband/config.js +9 -0
  46. package/components/plotband/config.js.map +1 -0
  47. package/components/plotband/constants.d.ts +5 -0
  48. package/components/plotband/constants.js +413 -0
  49. package/components/plotband/constants.js.map +1 -0
  50. package/components/plotband/index.d.ts +15 -0
  51. package/components/plotband/index.js +92 -0
  52. package/components/plotband/index.js.map +1 -0
  53. package/components/plotband/style.d.ts +4 -0
  54. package/components/plotband/style.js +38 -0
  55. package/components/plotband/style.js.map +1 -0
  56. package/components/plotband/types.d.ts +51 -0
  57. package/components/plotband/types.js +27 -0
  58. package/components/plotband/types.js.map +1 -0
  59. package/components/plotline/config.d.ts +91 -0
  60. package/components/plotline/config.js +9 -0
  61. package/components/plotline/config.js.map +1 -0
  62. package/components/plotline/constants.d.ts +6 -0
  63. package/components/plotline/constants.js +58 -0
  64. package/components/plotline/constants.js.map +1 -0
  65. package/components/plotline/index.d.ts +14 -0
  66. package/components/plotline/index.js +102 -0
  67. package/components/plotline/index.js.map +1 -0
  68. package/components/plotline/style.d.ts +4 -0
  69. package/components/plotline/style.js +42 -0
  70. package/components/plotline/style.js.map +1 -0
  71. package/components/plotline/types.d.ts +53 -0
  72. package/components/plotline/types.js +33 -0
  73. package/components/plotline/types.js.map +1 -0
  74. package/components/rolling-pin-legend/config.d.ts +19 -0
  75. package/components/rolling-pin-legend/config.js +11 -0
  76. package/components/rolling-pin-legend/config.js.map +1 -0
  77. package/components/rolling-pin-legend/index.d.ts +16 -0
  78. package/components/rolling-pin-legend/index.js +69 -0
  79. package/components/rolling-pin-legend/index.js.map +1 -0
  80. package/components/rolling-pin-legend/style.d.ts +22 -0
  81. package/components/rolling-pin-legend/style.js +39 -0
  82. package/components/rolling-pin-legend/style.js.map +1 -0
  83. package/components/rolling-pin-legend/types.d.ts +1 -0
  84. package/components/rolling-pin-legend/types.js +2 -0
  85. package/components/rolling-pin-legend/types.js.map +1 -0
  86. package/components/scatter/index.d.ts +1 -0
  87. package/components/scatter/index.js +11 -1
  88. package/components/scatter/index.js.map +1 -1
  89. package/components/timeline/config.d.ts +65 -14
  90. package/components/timeline/config.js +15 -1
  91. package/components/timeline/config.js.map +1 -1
  92. package/components/timeline/constants.d.ts +3 -0
  93. package/components/timeline/constants.js +6 -0
  94. package/components/timeline/constants.js.map +1 -0
  95. package/components/timeline/index.d.ts +21 -10
  96. package/components/timeline/index.js +380 -95
  97. package/components/timeline/index.js.map +1 -1
  98. package/components/timeline/style.d.ts +7 -0
  99. package/components/timeline/style.js +40 -1
  100. package/components/timeline/style.js.map +1 -1
  101. package/components/timeline/types.d.ts +62 -0
  102. package/components/timeline/types.js +2 -0
  103. package/components/timeline/types.js.map +1 -0
  104. package/components/timeline/utils.d.ts +2 -0
  105. package/components/timeline/utils.js +16 -0
  106. package/components/timeline/utils.js.map +1 -0
  107. package/components/tooltip/index.js +4 -3
  108. package/components/tooltip/index.js.map +1 -1
  109. package/components/treemap/config.d.ts +52 -0
  110. package/components/treemap/config.js +6 -0
  111. package/components/treemap/config.js.map +1 -0
  112. package/components/treemap/index.d.ts +18 -0
  113. package/components/treemap/index.js +274 -0
  114. package/components/treemap/index.js.map +1 -0
  115. package/components/treemap/style.d.ts +25 -0
  116. package/components/treemap/style.js +69 -0
  117. package/components/treemap/style.js.map +1 -0
  118. package/components/treemap/types.d.ts +11 -0
  119. package/components/treemap/types.js +2 -0
  120. package/components/treemap/types.js.map +1 -0
  121. package/components/xy-labels/index.js +1 -1
  122. package/components/xy-labels/index.js.map +1 -1
  123. package/components.d.ts +10 -2
  124. package/components.js +4 -0
  125. package/components.js.map +1 -1
  126. package/containers/single-container/index.js +3 -1
  127. package/containers/single-container/index.js.map +1 -1
  128. package/containers/xy-container/config.d.ts +2 -0
  129. package/containers/xy-container/config.js +1 -1
  130. package/containers/xy-container/config.js.map +1 -1
  131. package/containers/xy-container/index.js +17 -7
  132. package/containers/xy-container/index.js.map +1 -1
  133. package/core/component/index.d.ts +4 -0
  134. package/core/component/index.js +6 -0
  135. package/core/component/index.js.map +1 -1
  136. package/core/xy-component/index.d.ts +1 -0
  137. package/core/xy-component/index.js +3 -1
  138. package/core/xy-component/index.js.map +1 -1
  139. package/index.js +10 -3
  140. package/index.js.map +1 -1
  141. package/package.json +2 -2
  142. package/styles/index.js +1 -0
  143. package/styles/index.js.map +1 -1
  144. package/types/data.d.ts +5 -0
  145. package/types/data.js +7 -0
  146. package/types/data.js.map +1 -1
  147. package/types/position.d.ts +2 -1
  148. package/types/position.js +1 -0
  149. package/types/position.js.map +1 -1
  150. package/types/text.d.ts +1 -1
  151. package/types/text.js.map +1 -1
  152. package/types.d.ts +5 -0
  153. package/types.js +6 -1
  154. package/types.js.map +1 -1
  155. package/utils/color.d.ts +7 -0
  156. package/utils/color.js +14 -2
  157. package/utils/color.js.map +1 -1
  158. package/utils/data.d.ts +4 -4
  159. package/utils/data.js +41 -10
  160. package/utils/data.js.map +1 -1
  161. package/utils/index.js +3 -3
  162. package/utils/path.d.ts +8 -0
  163. package/utils/path.js +109 -1
  164. package/utils/path.js.map +1 -1
  165. package/utils/text.d.ts +3 -2
  166. package/utils/text.js +22 -10
  167. package/utils/text.js.map +1 -1
@@ -0,0 +1,16 @@
1
+ import { Selection } from 'd3-selection';
2
+ import { RollingPinLegendConfigInterface } from './config';
3
+ import * as s from './style';
4
+ export declare class RollingPinLegend {
5
+ static selectors: typeof s;
6
+ protected _defaultConfig: RollingPinLegendConfigInterface;
7
+ config: RollingPinLegendConfigInterface;
8
+ div: Selection<HTMLElement, unknown, null, undefined>;
9
+ element: HTMLElement;
10
+ prevConfig: RollingPinLegendConfigInterface;
11
+ protected _container: HTMLElement;
12
+ constructor(element: HTMLElement, config?: RollingPinLegendConfigInterface);
13
+ setConfig(config: RollingPinLegendConfigInterface): void;
14
+ render(): void;
15
+ destroy(): void;
16
+ }
@@ -0,0 +1,69 @@
1
+ import { select } from 'd3-selection';
2
+ import { merge } from '../../utils/data.js';
3
+ import { RollingPinLegendDefaultConfig } from './config.js';
4
+ import * as style from './style.js';
5
+ import { root, label, rectsContainer, leftLabel, rightLabel, rect } from './style.js';
6
+
7
+ class RollingPinLegend {
8
+ constructor(element, config) {
9
+ this._defaultConfig = RollingPinLegendDefaultConfig;
10
+ this.config = this._defaultConfig;
11
+ this._container = element;
12
+ this.div = (config === null || config === void 0 ? void 0 : config.renderIntoProvidedDomNode) ? select(this._container) : select(this._container).append('div');
13
+ this.div.classed(root, true);
14
+ this.element = this.div.node();
15
+ if (config)
16
+ this.setConfig(config);
17
+ }
18
+ setConfig(config) {
19
+ this.prevConfig = this.config;
20
+ this.config = merge(this._defaultConfig, config);
21
+ this.render();
22
+ }
23
+ render() {
24
+ const { config } = this;
25
+ const newRoot = this.div
26
+ .selectAll(`.${root}`)
27
+ .data([0])
28
+ .enter()
29
+ .append('div')
30
+ .attr('class', root);
31
+ newRoot
32
+ .append('span')
33
+ .attr('class', label)
34
+ .classed(config.labelClassName, true)
35
+ .style('font-size', config.labelFontSize);
36
+ newRoot
37
+ .append('div')
38
+ .attr('class', rectsContainer);
39
+ newRoot
40
+ .append('span')
41
+ .attr('class', label)
42
+ .classed(config.labelClassName, true)
43
+ .style('font-size', config.labelFontSize);
44
+ const root$1 = this.div
45
+ .select(`.${root}`);
46
+ root$1.selectAll(`.${label}`)
47
+ .data([config.leftLabelText, config.rightLabelText])
48
+ .text(d => d)
49
+ .classed(leftLabel, (d, i) => i === 0 && typeof d === 'string' && d.length > 0)
50
+ .classed(rightLabel, (d, i) => i === 1 && typeof d === 'string' && d.length > 0);
51
+ const rectsContainer$1 = root$1.select(`.${rectsContainer}`);
52
+ const rects = rectsContainer$1.selectAll(`.${rect}`).data(config.rects);
53
+ const rectsEnter = rects.enter()
54
+ .append('div')
55
+ .attr('class', rect);
56
+ const rectsMerged = rectsEnter.merge(rects);
57
+ rectsMerged
58
+ .style('background-color', d => d);
59
+ rects.exit().remove();
60
+ }
61
+ destroy() {
62
+ if (this.element !== this._container)
63
+ this.div.remove();
64
+ }
65
+ }
66
+ RollingPinLegend.selectors = style;
67
+
68
+ export { RollingPinLegend };
69
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/rolling-pin-legend/index.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\n\n// Utils\nimport { merge } from 'utils/data'\n\n// Config\nimport { RollingPinLegendConfigInterface, RollingPinLegendDefaultConfig } from './config'\n\n// Styles\nimport * as s from './style'\n\nexport class RollingPinLegend {\n static selectors = s\n protected _defaultConfig = RollingPinLegendDefaultConfig as RollingPinLegendConfigInterface\n public config: RollingPinLegendConfigInterface = this._defaultConfig\n\n div: Selection<HTMLElement, unknown, null, undefined>\n element: HTMLElement\n prevConfig: RollingPinLegendConfigInterface\n protected _container: HTMLElement\n\n constructor (element: HTMLElement, config?: RollingPinLegendConfigInterface) {\n this._container = element\n\n this.div = config?.renderIntoProvidedDomNode ? select(this._container) : select(this._container).append<HTMLElement>('div')\n this.div.classed(s.root, true)\n\n this.element = this.div.node()\n\n if (config) this.setConfig(config)\n }\n\n setConfig (config: RollingPinLegendConfigInterface): void {\n this.prevConfig = this.config\n this.config = merge(this._defaultConfig, config)\n this.render()\n }\n\n render (): void {\n const { config } = this\n\n const newRoot = this.div\n .selectAll<HTMLDivElement, unknown>(`.${s.root}`)\n .data([0])\n .enter()\n .append('div')\n .attr('class', s.root)\n\n newRoot\n .append('span')\n .attr('class', s.label)\n .classed(config.labelClassName, true)\n .style('font-size', config.labelFontSize)\n\n newRoot\n .append('div')\n .attr('class', s.rectsContainer)\n\n newRoot\n .append('span')\n .attr('class', s.label)\n .classed(config.labelClassName, true)\n .style('font-size', config.labelFontSize)\n\n const root = this.div\n .select<HTMLDivElement>(`.${s.root}`)\n\n root.selectAll<HTMLDivElement, unknown>(`.${s.label}`)\n .data([config.leftLabelText, config.rightLabelText])\n .text(d => d)\n .classed(s.leftLabel, (d, i) => i === 0 && typeof d === 'string' && d.length > 0)\n .classed(s.rightLabel, (d, i) => i === 1 && typeof d === 'string' && d.length > 0)\n\n const rectsContainer = root.select<HTMLDivElement>(`.${s.rectsContainer}`)\n\n const rects = rectsContainer.selectAll<HTMLDivElement, unknown>(`.${s.rect}`).data(config.rects)\n\n const rectsEnter = rects.enter()\n .append('div')\n .attr('class', s.rect)\n\n const rectsMerged = rectsEnter.merge(rects)\n rectsMerged\n .style('background-color', d => d)\n\n rects.exit().remove()\n }\n\n public destroy (): void {\n if (this.element !== this._container) this.div.remove()\n }\n}\n"],"names":["s.root","s.label","s.rectsContainer","root","s.leftLabel","s.rightLabel","rectsContainer","s.rect","s"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export declare const root: string;
2
+ export declare const cssVarDefaults: {
3
+ '--vis-rolling-pin-legend-label-color': string;
4
+ '--vis-rolling-pin-legend-label-max-width': string;
5
+ '--vis-rolling-pin-legend-label-font-size': string;
6
+ '--vis-rolling-pin-legend-spacing': string;
7
+ '--vis-rolling-pin-legend-item-width': string;
8
+ '--vis-dark-rolling-pin-legend-label-color': string;
9
+ };
10
+ export declare const variables: {
11
+ rollingPinLegendLabelColor: "--vis-rolling-pin-legend-label-color";
12
+ rollingPinLegendLabelMaxWidth: "--vis-rolling-pin-legend-label-max-width";
13
+ rollingPinLegendLabelFontSize: "--vis-rolling-pin-legend-label-font-size";
14
+ rollingPinLegendSpacing: "--vis-rolling-pin-legend-spacing";
15
+ rollingPinLegendItemWidth: "--vis-rolling-pin-legend-item-width";
16
+ darkRollingPinLegendLabelColor: "--vis-dark-rolling-pin-legend-label-color";
17
+ };
18
+ export declare const rectsContainer: string;
19
+ export declare const label: string;
20
+ export declare const leftLabel: string;
21
+ export declare const rightLabel: string;
22
+ export declare const rect: string;
@@ -0,0 +1,39 @@
1
+ import { css } from '@emotion/css';
2
+ import { getCssVarNames, injectGlobalCssVariables } from '../../utils/style.js';
3
+
4
+ const root = css `
5
+ display: flex;
6
+ `;
7
+ const cssVarDefaults = {
8
+ '--vis-rolling-pin-legend-label-color': '#6c778c',
9
+ '--vis-rolling-pin-legend-label-max-width': '300px',
10
+ '--vis-rolling-pin-legend-label-font-size': '12px',
11
+ '--vis-rolling-pin-legend-spacing': '4px',
12
+ '--vis-rolling-pin-legend-item-width': '8px',
13
+ '--vis-dark-rolling-pin-legend-label-color': '#eee',
14
+ };
15
+ const variables = getCssVarNames(cssVarDefaults);
16
+ injectGlobalCssVariables(cssVarDefaults, root);
17
+ const rectsContainer = css `
18
+ display: flex;
19
+ `;
20
+ const label = css `
21
+ font-family: var(--vis-rolling-pin-legend-font-family, var(--vis-font-family));
22
+ font-size: var(${variables.rollingPinLegendLabelFontSize});
23
+ max-width: var(${variables.rollingPinLegendLabelMaxWidth});
24
+ color: var(${variables.rollingPinLegendLabelColor});
25
+ `;
26
+ const leftLabel = css `
27
+ margin-right: var(${variables.rollingPinLegendSpacing});
28
+ `;
29
+ const rightLabel = css `
30
+ margin-left: var(${variables.rollingPinLegendSpacing});
31
+ `;
32
+ const rect = css `
33
+ display: inline-block;
34
+ flex: 1;
35
+ width: var(${variables.rollingPinLegendItemWidth});
36
+ `;
37
+
38
+ export { cssVarDefaults, label, leftLabel, rect, rectsContainer, rightLabel, root, variables };
39
+ //# sourceMappingURL=style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.js","sources":["../../../src/components/rolling-pin-legend/style.ts"],"sourcesContent":["import { css } from '@emotion/css'\nimport { getCssVarNames, injectGlobalCssVariables } from 'utils/style'\n\nexport const root = css`\n display: flex;\n`\n\nexport const cssVarDefaults = {\n '--vis-rolling-pin-legend-label-color': '#6c778c',\n '--vis-rolling-pin-legend-label-max-width': '300px',\n '--vis-rolling-pin-legend-label-font-size': '12px',\n '--vis-rolling-pin-legend-spacing': '4px',\n '--vis-rolling-pin-legend-item-width': '8px',\n '--vis-dark-rolling-pin-legend-label-color': '#eee',\n}\n\nexport const variables = getCssVarNames(cssVarDefaults)\ninjectGlobalCssVariables(cssVarDefaults, root)\n\nexport const rectsContainer = css`\n display: flex;\n`\n\nexport const label = css`\n font-family: var(--vis-rolling-pin-legend-font-family, var(--vis-font-family));\n font-size: var(${variables.rollingPinLegendLabelFontSize});\n max-width: var(${variables.rollingPinLegendLabelMaxWidth});\n color: var(${variables.rollingPinLegendLabelColor});\n`\n\nexport const leftLabel = css`\n margin-right: var(${variables.rollingPinLegendSpacing});\n`\n\nexport const rightLabel = css`\n margin-left: var(${variables.rollingPinLegendSpacing});\n`\n\nexport const rect = css`\n display: inline-block;\n flex: 1;\n width: var(${variables.rollingPinLegendItemWidth});\n`\n"],"names":[],"mappings":";;;AAGO,MAAM,IAAI,GAAG,GAAG,CAAA,CAAA;;EAEtB;AAEY,MAAA,cAAc,GAAG;AAC5B,IAAA,sCAAsC,EAAE,SAAS;AACjD,IAAA,0CAA0C,EAAE,OAAO;AACnD,IAAA,0CAA0C,EAAE,MAAM;AAClD,IAAA,kCAAkC,EAAE,KAAK;AACzC,IAAA,qCAAqC,EAAE,KAAK;AAC5C,IAAA,2CAA2C,EAAE,MAAM;EACpD;MAEY,SAAS,GAAG,cAAc,CAAC,cAAc,EAAC;AACvD,wBAAwB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;AAEvC,MAAM,cAAc,GAAG,GAAG,CAAA,CAAA;;EAEhC;AAEM,MAAM,KAAK,GAAG,GAAG,CAAA,CAAA;;AAEL,iBAAA,EAAA,SAAS,CAAC,6BAA6B,CAAA;AACvC,iBAAA,EAAA,SAAS,CAAC,6BAA6B,CAAA;AAC3C,aAAA,EAAA,SAAS,CAAC,0BAA0B,CAAA;EAClD;AAEM,MAAM,SAAS,GAAG,GAAG,CAAA,CAAA;AACN,oBAAA,EAAA,SAAS,CAAC,uBAAuB,CAAA;EACtD;AAEM,MAAM,UAAU,GAAG,GAAG,CAAA,CAAA;AACR,mBAAA,EAAA,SAAS,CAAC,uBAAuB,CAAA;EACrD;AAEM,MAAM,IAAI,GAAG,GAAG,CAAA,CAAA;;;AAGR,aAAA,EAAA,SAAS,CAAC,yBAAyB,CAAA;;;;;"}
@@ -0,0 +1 @@
1
+ export declare type RollingPinLegendItem = string;
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -22,6 +22,7 @@ export declare class Scatter<Datum> extends XYComponentCore<Datum, ScatterConfig
22
22
  setData(data: Datum[]): void;
23
23
  get bleed(): Spacing;
24
24
  _render(customDuration?: number): void;
25
+ private _hasLabels;
25
26
  private _resolveLabelOverlap;
26
27
  private _updateSizeScale;
27
28
  private _getOnScreenData;
@@ -98,7 +98,17 @@ class Scatter extends XYComponentCore {
98
98
  updatePoints(this._points, config, this.xScale, this.yScale, duration);
99
99
  removePoints(points.exit(), this.xScale, this.yScale, duration);
100
100
  // Take care of overlapping labels
101
- this._resolveLabelOverlap();
101
+ if (this._hasLabels()) {
102
+ this._resolveLabelOverlap();
103
+ }
104
+ }
105
+ _hasLabels() {
106
+ // If label config is not defined, no labels will be shown
107
+ if (!this.config.label)
108
+ return false;
109
+ // Check if any point in the flattened data has a label
110
+ const pointDataFlat = flatten(this._pointData);
111
+ return pointDataFlat.some(d => d._point.label);
102
112
  }
103
113
  _resolveLabelOverlap() {
104
114
  if (!this.config.labelHideOverlapping) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/scatter/index.ts"],"sourcesContent":["import { Selection, select } from 'd3-selection'\nimport { max, min } from 'd3-array'\n\n// Core\nimport { XYComponentCore } from 'core/xy-component'\n\n// Utils\nimport { isNumber, getExtent, getNumber, getString, isArray, flatten, getValue } from 'utils/data'\nimport { getColor } from 'utils/color'\nimport { smartTransition } from 'utils/d3'\nimport { getCSSVariableValueInPixels } from 'utils/misc'\n\n// Types\nimport { Spacing } from 'types/spacing'\nimport { SymbolType } from 'types/symbol'\nimport { NumericAccessor } from 'types/accessor'\nimport { Position } from 'types/position'\nimport { ContinuousScale } from 'types/scale'\n\n// Local Types\nimport { ScatterPointGroupNode, ScatterPoint } from './types'\n\n// Config\nimport { ScatterDefaultConfig, ScatterConfigInterface } from './config'\n\n// Modules\nimport { createPoints, updatePoints, removePoints } from './modules/point'\nimport { collideLabels, getEstimatedLabelBBox } from './modules/utils'\n\n// Styles\nimport * as s from './style'\n\n\nexport class Scatter<Datum> extends XYComponentCore<Datum, ScatterConfigInterface<Datum>> {\n static selectors = s\n protected _defaultConfig = ScatterDefaultConfig as ScatterConfigInterface<Datum>\n public config: ScatterConfigInterface<Datum> = this._defaultConfig\n\n events = {\n [Scatter.selectors.point]: {\n mouseenter: this._onPointMouseOver.bind(this),\n mouseleave: this._onPointMouseOut.bind(this),\n },\n }\n\n private _pointData: ScatterPoint<Datum>[][] = []\n private _points: Selection<SVGGElement, ScatterPoint<Datum>, SVGGElement, ScatterPoint<Datum>[]>\n private _sizeScale: ContinuousScale\n private _collideLabelsAnimFrameId: ReturnType<typeof requestAnimationFrame>\n\n constructor (config?: ScatterConfigInterface<Datum>) {\n super()\n if (config) this.setConfig(config)\n }\n\n setConfig (config: ScatterConfigInterface<Datum>): void {\n super.setConfig(config)\n this._updateSizeScale()\n }\n\n setData (data: Datum[]): void {\n super.setData(data)\n this._updateSizeScale()\n }\n\n get bleed (): Spacing {\n this._pointData = this._getOnScreenData()\n const pointDataFlat: ScatterPoint<Datum>[] = flatten(this._pointData)\n\n const yRangeStart = min(this.yScale.range())\n const yRangeEnd = max(this.yScale.range())\n const xRangeStart = this.xScale.range()[0]\n const xRangeEnd = this.xScale.range()[1]\n\n const fontSizePx = getCSSVariableValueInPixels('var(--vis-scatter-point-label-text-font-size)', this.element)\n\n const extent = pointDataFlat.reduce((ext, d) => {\n const x = this.xScale(d._point.xValue)\n const y = this.yScale(d._point.yValue)\n const r = d._point.sizePx / 2\n\n ext.minX = Math.min(ext.minX, x - r)\n ext.maxX = Math.max(ext.maxX, x + r)\n ext.minY = Math.min(ext.minY, y - r)\n ext.maxY = Math.max(ext.maxY, y + r)\n\n if (d._point.label) {\n const labelBBox = getEstimatedLabelBBox(d, d._point.labelPosition, this.xScale, this.yScale, fontSizePx)\n ext.minX = Math.min(ext.minX, labelBBox.x)\n ext.maxX = Math.max(ext.maxX, labelBBox.x + labelBBox.width)\n ext.minY = Math.min(ext.minY, labelBBox.y)\n ext.maxY = Math.max(ext.maxY, labelBBox.y + labelBBox.height)\n }\n return ext\n }, {\n minX: Number.POSITIVE_INFINITY,\n maxX: Number.NEGATIVE_INFINITY,\n minY: Number.POSITIVE_INFINITY,\n maxY: Number.NEGATIVE_INFINITY,\n })\n\n const coeff = 1.2 // Multiplier to take into account subsequent scale range changes and shape irregularities\n const top = extent.minY < yRangeStart ? coeff * (yRangeStart - extent.minY) : 0\n const bottom = extent.maxY > yRangeEnd ? coeff * (extent.maxY - yRangeEnd) : 0\n const left = extent.minX < xRangeStart ? coeff * (xRangeStart - extent.minX) : 0\n const right = extent.maxX > xRangeEnd ? coeff * (extent.maxX - xRangeEnd) : 0\n\n return { top, bottom, left, right }\n }\n\n _render (customDuration?: number): void {\n const { config } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n // Groups\n const pointGroups = this.g\n .selectAll<SVGGElement, ScatterPoint<Datum>[]>(`.${s.pointGroup}`)\n .data(this._pointData)\n\n const pointGroupsEnter = pointGroups\n .enter()\n .append('g')\n .attr('class', s.pointGroup)\n\n const pointGroupsMerged = pointGroupsEnter.merge(pointGroups)\n smartTransition(pointGroupsMerged, duration)\n .style('opacity', 1)\n\n const pointGroupExit = pointGroups.exit().attr('class', s.pointGroupExit)\n smartTransition(pointGroupExit, duration).style('opacity', 0).remove()\n\n // Points\n const points = pointGroupsMerged\n .selectAll<SVGGElement, ScatterPoint<Datum>>(`.${s.point}`)\n .data(\n d => d,\n d => `${getString(d, config.id, d._point.pointIndex) ?? d._point.pointIndex}`\n )\n\n const pointsEnter = points.enter().append('g')\n .attr('class', s.point)\n createPoints(pointsEnter, this.xScale, this.yScale)\n\n this._points = pointsEnter.merge(points)\n updatePoints(this._points, config, this.xScale, this.yScale, duration)\n\n removePoints(points.exit<ScatterPoint<Datum>>(), this.xScale, this.yScale, duration)\n\n // Take care of overlapping labels\n this._resolveLabelOverlap()\n }\n\n private _resolveLabelOverlap (): void {\n if (!this.config.labelHideOverlapping) {\n const label = this._points.selectAll<SVGTextElement, ScatterPoint<Datum>>('text')\n label.attr('opacity', null)\n return\n }\n\n cancelAnimationFrame(this._collideLabelsAnimFrameId)\n this._collideLabelsAnimFrameId = requestAnimationFrame(() => {\n collideLabels(this._points, this.config, this.xScale, this.yScale)\n })\n }\n\n private _updateSizeScale (): void {\n const { config, datamodel } = this\n\n this._sizeScale = config.sizeScale.copy()\n this._sizeScale.domain(getExtent(datamodel.data, config.size))\n this._sizeScale.range(config.sizeRange ?? [0, 0])\n }\n\n private _getOnScreenData (): ScatterPoint<Datum>[][] {\n const { config, datamodel: { data } } = this\n\n const xDomain = this.xScale.domain().map((d: number | Date) => +d) // Convert Date to number\n const yDomain = this.yScale.domain().map((d: number | Date) => +d) // Convert Date to number\n const yAccessors = (isArray(config.y) ? config.y : [config.y]) as NumericAccessor<Datum>[]\n\n const maxSizeValue = max<number>(flatten(yAccessors.map((y, j) => data?.map(d => getNumber(d, config.size, j)))))\n const maxSizePx = config.sizeRange ? this._sizeScale(maxSizeValue) : maxSizeValue\n\n const maxSizeXDomain = (this.xScale.invert(maxSizePx) as number) - (this.xScale.invert(0) as number)\n const maxSizeYDomain = Math.abs((this.yScale.invert(maxSizePx) as number) - (this.yScale.invert(0) as number))\n\n return yAccessors.map((y, j) => {\n return data?.reduce<ScatterPoint<Datum>[]>((acc, d, i) => {\n const xValue = getNumber(d, config.x, i)\n const yValue = getNumber(d, y, j)\n const pointSize = getNumber(d, config.size, i)\n const pointSizeScaled = config.sizeRange ? this._sizeScale(pointSize) : pointSize\n const pointSizeXDomain = (this.xScale.invert(pointSizeScaled) as number) - (this.xScale.invert(0) as number)\n const pointSizeYDomain = Math.abs((this.yScale.invert(pointSizeScaled) as number) - (this.yScale.invert(0) as number))\n\n if (\n ((xValue - pointSizeXDomain / 2) >= (xDomain[0] - maxSizeXDomain / 2)) &&\n ((xValue + pointSizeXDomain / 2) <= (xDomain[1] + maxSizeXDomain / 2)) &&\n ((yValue - pointSizeYDomain / 2) >= (yDomain[0] - maxSizeYDomain / 2)) &&\n ((yValue + pointSizeYDomain / 2) <= (yDomain[1] + maxSizeYDomain / 2))\n ) {\n acc.push({\n ...d,\n _point: {\n xValue: xValue,\n yValue: yValue,\n sizePx: pointSizeScaled,\n color: getColor(d, config.color, j),\n strokeColor: getColor(d, config.strokeColor, j, true),\n strokeWidthPx: getNumber(d, config.strokeWidth, j),\n shape: getString(d, config.shape, j) as SymbolType,\n label: getString(d, config.label, j),\n labelColor: getColor(d, config.labelColor, j, true),\n labelPosition: getValue(d, config.labelPosition, i) as Position,\n cursor: getString(d, config.cursor, j),\n groupIndex: j,\n pointIndex: i,\n },\n })\n }\n\n return acc\n }, []) ?? []\n })\n }\n\n private _onPointMouseOver (d: ScatterPoint<Datum>, event: MouseEvent): void {\n const point = select(event.target as SVGGElement)\n const pointNode = point.node() as ScatterPointGroupNode | null\n if (pointNode) pointNode._forceShowLabel = true\n\n point.raise()\n this._resolveLabelOverlap()\n }\n\n private _onPointMouseOut (d: ScatterPoint<Datum>, event: MouseEvent): void {\n const pointNode = select(event.target as SVGGElement).node() as ScatterPointGroupNode | null\n if (pointNode) delete pointNode._forceShowLabel\n\n this._resolveLabelOverlap()\n }\n}\n"],"names":["s.pointGroup","pointGroupExit","s.pointGroupExit","s.point","s"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/scatter/index.ts"],"sourcesContent":["import { Selection, select } from 'd3-selection'\nimport { max, min } from 'd3-array'\n\n// Core\nimport { XYComponentCore } from 'core/xy-component'\n\n// Utils\nimport { isNumber, getExtent, getNumber, getString, isArray, flatten, getValue } from 'utils/data'\nimport { getColor } from 'utils/color'\nimport { smartTransition } from 'utils/d3'\nimport { getCSSVariableValueInPixels } from 'utils/misc'\n\n// Types\nimport { Spacing } from 'types/spacing'\nimport { SymbolType } from 'types/symbol'\nimport { NumericAccessor } from 'types/accessor'\nimport { Position } from 'types/position'\nimport { ContinuousScale } from 'types/scale'\n\n// Local Types\nimport { ScatterPointGroupNode, ScatterPoint } from './types'\n\n// Config\nimport { ScatterDefaultConfig, ScatterConfigInterface } from './config'\n\n// Modules\nimport { createPoints, updatePoints, removePoints } from './modules/point'\nimport { collideLabels, getEstimatedLabelBBox } from './modules/utils'\n\n// Styles\nimport * as s from './style'\n\n\nexport class Scatter<Datum> extends XYComponentCore<Datum, ScatterConfigInterface<Datum>> {\n static selectors = s\n protected _defaultConfig = ScatterDefaultConfig as ScatterConfigInterface<Datum>\n public config: ScatterConfigInterface<Datum> = this._defaultConfig\n\n events = {\n [Scatter.selectors.point]: {\n mouseenter: this._onPointMouseOver.bind(this),\n mouseleave: this._onPointMouseOut.bind(this),\n },\n }\n\n private _pointData: ScatterPoint<Datum>[][] = []\n private _points: Selection<SVGGElement, ScatterPoint<Datum>, SVGGElement, ScatterPoint<Datum>[]>\n private _sizeScale: ContinuousScale\n private _collideLabelsAnimFrameId: ReturnType<typeof requestAnimationFrame>\n\n constructor (config?: ScatterConfigInterface<Datum>) {\n super()\n if (config) this.setConfig(config)\n }\n\n setConfig (config: ScatterConfigInterface<Datum>): void {\n super.setConfig(config)\n this._updateSizeScale()\n }\n\n setData (data: Datum[]): void {\n super.setData(data)\n this._updateSizeScale()\n }\n\n get bleed (): Spacing {\n this._pointData = this._getOnScreenData()\n const pointDataFlat: ScatterPoint<Datum>[] = flatten(this._pointData)\n\n const yRangeStart = min(this.yScale.range())\n const yRangeEnd = max(this.yScale.range())\n const xRangeStart = this.xScale.range()[0]\n const xRangeEnd = this.xScale.range()[1]\n\n const fontSizePx = getCSSVariableValueInPixels('var(--vis-scatter-point-label-text-font-size)', this.element)\n\n const extent = pointDataFlat.reduce((ext, d) => {\n const x = this.xScale(d._point.xValue)\n const y = this.yScale(d._point.yValue)\n const r = d._point.sizePx / 2\n\n ext.minX = Math.min(ext.minX, x - r)\n ext.maxX = Math.max(ext.maxX, x + r)\n ext.minY = Math.min(ext.minY, y - r)\n ext.maxY = Math.max(ext.maxY, y + r)\n\n if (d._point.label) {\n const labelBBox = getEstimatedLabelBBox(d, d._point.labelPosition, this.xScale, this.yScale, fontSizePx)\n ext.minX = Math.min(ext.minX, labelBBox.x)\n ext.maxX = Math.max(ext.maxX, labelBBox.x + labelBBox.width)\n ext.minY = Math.min(ext.minY, labelBBox.y)\n ext.maxY = Math.max(ext.maxY, labelBBox.y + labelBBox.height)\n }\n return ext\n }, {\n minX: Number.POSITIVE_INFINITY,\n maxX: Number.NEGATIVE_INFINITY,\n minY: Number.POSITIVE_INFINITY,\n maxY: Number.NEGATIVE_INFINITY,\n })\n\n const coeff = 1.2 // Multiplier to take into account subsequent scale range changes and shape irregularities\n const top = extent.minY < yRangeStart ? coeff * (yRangeStart - extent.minY) : 0\n const bottom = extent.maxY > yRangeEnd ? coeff * (extent.maxY - yRangeEnd) : 0\n const left = extent.minX < xRangeStart ? coeff * (xRangeStart - extent.minX) : 0\n const right = extent.maxX > xRangeEnd ? coeff * (extent.maxX - xRangeEnd) : 0\n\n return { top, bottom, left, right }\n }\n\n _render (customDuration?: number): void {\n const { config } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n // Groups\n const pointGroups = this.g\n .selectAll<SVGGElement, ScatterPoint<Datum>[]>(`.${s.pointGroup}`)\n .data(this._pointData)\n\n const pointGroupsEnter = pointGroups\n .enter()\n .append('g')\n .attr('class', s.pointGroup)\n\n const pointGroupsMerged = pointGroupsEnter.merge(pointGroups)\n smartTransition(pointGroupsMerged, duration)\n .style('opacity', 1)\n\n const pointGroupExit = pointGroups.exit().attr('class', s.pointGroupExit)\n smartTransition(pointGroupExit, duration).style('opacity', 0).remove()\n\n // Points\n const points = pointGroupsMerged\n .selectAll<SVGGElement, ScatterPoint<Datum>>(`.${s.point}`)\n .data(\n d => d,\n d => `${getString(d, config.id, d._point.pointIndex) ?? d._point.pointIndex}`\n )\n\n const pointsEnter = points.enter().append('g')\n .attr('class', s.point)\n createPoints(pointsEnter, this.xScale, this.yScale)\n\n this._points = pointsEnter.merge(points)\n updatePoints(this._points, config, this.xScale, this.yScale, duration)\n\n removePoints(points.exit<ScatterPoint<Datum>>(), this.xScale, this.yScale, duration)\n\n // Take care of overlapping labels\n if (this._hasLabels()) {\n this._resolveLabelOverlap()\n }\n }\n\n private _hasLabels (): boolean {\n // If label config is not defined, no labels will be shown\n if (!this.config.label) return false\n\n // Check if any point in the flattened data has a label\n const pointDataFlat: ScatterPoint<Datum>[] = flatten(this._pointData)\n return pointDataFlat.some(d => d._point.label)\n }\n\n private _resolveLabelOverlap (): void {\n if (!this.config.labelHideOverlapping) {\n const label = this._points.selectAll<SVGTextElement, ScatterPoint<Datum>>('text')\n label.attr('opacity', null)\n return\n }\n\n cancelAnimationFrame(this._collideLabelsAnimFrameId)\n this._collideLabelsAnimFrameId = requestAnimationFrame(() => {\n collideLabels(this._points, this.config, this.xScale, this.yScale)\n })\n }\n\n private _updateSizeScale (): void {\n const { config, datamodel } = this\n\n this._sizeScale = config.sizeScale.copy()\n this._sizeScale.domain(getExtent(datamodel.data, config.size))\n this._sizeScale.range(config.sizeRange ?? [0, 0])\n }\n\n private _getOnScreenData (): ScatterPoint<Datum>[][] {\n const { config, datamodel: { data } } = this\n\n const xDomain = this.xScale.domain().map((d: number | Date) => +d) // Convert Date to number\n const yDomain = this.yScale.domain().map((d: number | Date) => +d) // Convert Date to number\n const yAccessors = (isArray(config.y) ? config.y : [config.y]) as NumericAccessor<Datum>[]\n\n const maxSizeValue = max<number>(flatten(yAccessors.map((y, j) => data?.map(d => getNumber(d, config.size, j)))))\n const maxSizePx = config.sizeRange ? this._sizeScale(maxSizeValue) : maxSizeValue\n\n const maxSizeXDomain = (this.xScale.invert(maxSizePx) as number) - (this.xScale.invert(0) as number)\n const maxSizeYDomain = Math.abs((this.yScale.invert(maxSizePx) as number) - (this.yScale.invert(0) as number))\n\n return yAccessors.map((y, j) => {\n return data?.reduce<ScatterPoint<Datum>[]>((acc, d, i) => {\n const xValue = getNumber(d, config.x, i)\n const yValue = getNumber(d, y, j)\n const pointSize = getNumber(d, config.size, i)\n const pointSizeScaled = config.sizeRange ? this._sizeScale(pointSize) : pointSize\n const pointSizeXDomain = (this.xScale.invert(pointSizeScaled) as number) - (this.xScale.invert(0) as number)\n const pointSizeYDomain = Math.abs((this.yScale.invert(pointSizeScaled) as number) - (this.yScale.invert(0) as number))\n\n if (\n ((xValue - pointSizeXDomain / 2) >= (xDomain[0] - maxSizeXDomain / 2)) &&\n ((xValue + pointSizeXDomain / 2) <= (xDomain[1] + maxSizeXDomain / 2)) &&\n ((yValue - pointSizeYDomain / 2) >= (yDomain[0] - maxSizeYDomain / 2)) &&\n ((yValue + pointSizeYDomain / 2) <= (yDomain[1] + maxSizeYDomain / 2))\n ) {\n acc.push({\n ...d,\n _point: {\n xValue: xValue,\n yValue: yValue,\n sizePx: pointSizeScaled,\n color: getColor(d, config.color, j),\n strokeColor: getColor(d, config.strokeColor, j, true),\n strokeWidthPx: getNumber(d, config.strokeWidth, j),\n shape: getString(d, config.shape, j) as SymbolType,\n label: getString(d, config.label, j),\n labelColor: getColor(d, config.labelColor, j, true),\n labelPosition: getValue(d, config.labelPosition, i) as Position,\n cursor: getString(d, config.cursor, j),\n groupIndex: j,\n pointIndex: i,\n },\n })\n }\n\n return acc\n }, []) ?? []\n })\n }\n\n private _onPointMouseOver (d: ScatterPoint<Datum>, event: MouseEvent): void {\n const point = select(event.target as SVGGElement)\n const pointNode = point.node() as ScatterPointGroupNode | null\n if (pointNode) pointNode._forceShowLabel = true\n\n point.raise()\n this._resolveLabelOverlap()\n }\n\n private _onPointMouseOut (d: ScatterPoint<Datum>, event: MouseEvent): void {\n const pointNode = select(event.target as SVGGElement).node() as ScatterPointGroupNode | null\n if (pointNode) delete pointNode._forceShowLabel\n\n this._resolveLabelOverlap()\n }\n}\n"],"names":["s.pointGroup","pointGroupExit","s.pointGroupExit","s.point","s"],"mappings":"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"}
@@ -1,32 +1,83 @@
1
1
  import { XYComponentConfigInterface } from "../../core/xy-component/config";
2
2
  import { WithOptional } from "../../types/misc";
3
- import { ColorAccessor, NumericAccessor, StringAccessor } from "../../types/accessor";
3
+ import { ColorAccessor, NumericAccessor, StringAccessor, GenericAccessor } from "../../types/accessor";
4
+ import { TextAlign } from "../../types/text";
5
+ import { Arrangement } from "../../types/position";
6
+ import type { TimelineArrow, TimelineLineRenderState, TimelineRowIcon, TimelineRowLabel } from './types';
4
7
  export interface TimelineConfigInterface<Datum> extends WithOptional<XYComponentConfigInterface<Datum>, 'y'> {
8
+ /** @deprecated This property has been renamed to `key` */
9
+ type?: StringAccessor<Datum>;
10
+ /** @deprecated This property has been renamed to `lineDuration` */
11
+ length?: NumericAccessor<Datum>;
12
+ /** @deprecated This property has been renamed to `lineCursor` */
13
+ cursor?: StringAccessor<Datum>;
14
+ /** Timeline item row accessor function. Records with the `lineRow` will be plotted in one row. Default: `undefined` */
15
+ lineRow?: StringAccessor<Datum>;
16
+ /** Timeline item duration accessor function. Default: `undefined`. Falls back to the deprecated `length` property */
17
+ lineDuration?: NumericAccessor<Datum>;
5
18
  /** Timeline item color accessor function. Default: `d => d.color` */
6
19
  color?: ColorAccessor<Datum>;
7
20
  /** Width of the timeline items. Default: `8` */
8
21
  lineWidth?: NumericAccessor<Datum>;
9
22
  /** Display rounded ends for timeline items. Default: `true` */
10
23
  lineCap?: boolean;
24
+ /** Provide a href to an SVG defined in container's `svgDefs` to display an icon at the start of the line. Default: undefined */
25
+ lineStartIcon?: StringAccessor<Datum>;
26
+ /** Line start icon color accessor function. Default: `undefined` */
27
+ lineStartIconColor?: StringAccessor<Datum>;
28
+ /** Line start icon size accessor function. Default: `undefined` */
29
+ lineStartIconSize?: NumericAccessor<Datum>;
30
+ /** Line start icon arrangement configuration. Controls how the icon is positioned relative to the line.
31
+ * Accepts values from the Arrangement enum: `Arrangement.Start`, `Arrangement.Middle`, `Arrangement.End` or a string equivalent.
32
+ * Default: `Arrangement.Inside` */
33
+ lineStartIconArrangement?: GenericAccessor<Arrangement | `${Arrangement}`, Datum>;
34
+ /** Provide a href to an SVG defined in container's `svgDefs` to display an icon at the end of the line. Default: undefined */
35
+ lineEndIcon?: StringAccessor<Datum>;
36
+ /** Line end icon color accessor function. Default: `undefined` */
37
+ lineEndIconColor?: StringAccessor<Datum>;
38
+ /** Line end icon size accessor function. Default: `undefined` */
39
+ lineEndIconSize?: NumericAccessor<Datum>;
40
+ /** Line end icon arrangement configuration. Controls how the icon is positioned relative to the line.
41
+ * Accepts values from the Arrangement enum: `Arrangement.Start`, `Arrangement.Middle`, `Arrangement.End` or a string equivalent.
42
+ * Default: `Arrangement.Inside` */
43
+ lineEndIconArrangement?: GenericAccessor<Arrangement | `${Arrangement}`, Datum>;
44
+ /** Configurable Timeline item cursor when hovering over. Default: `undefined` */
45
+ lineCursor?: StringAccessor<Datum>;
46
+ /** Sets the minimum line length to 1 pixel for better visibility of small values. Default: `false` */
47
+ showEmptySegments?: boolean;
11
48
  /** Timeline row height. Default: `22` */
12
49
  rowHeight?: number;
13
- /** Timeline item length accessor function. Default: `d => d.length` */
14
- length?: NumericAccessor<Datum>;
15
- /** Timeline item type accessor function. Records of one type will be plotted in one row. Default: `d => d.type` */
16
- type?: StringAccessor<Datum>;
17
- /** Configurable Timeline item cursor when hovering over. Default: `null` */
18
- cursor?: StringAccessor<Datum>;
19
- /** Show item type labels when set to `true`. Default: `false` */
50
+ /** Alternating row colors. Default: `true` */
51
+ alternatingRowColors?: boolean;
52
+ /** @deprecated This property has been renamed to `showRowLabels */
20
53
  showLabels?: boolean;
21
- /** Fixed label width in pixels. Labels longer than the specified value will be trimmed. Default: `undefined` */
54
+ /** @deprecated This property has been renamed to `rowLabelWidth */
22
55
  labelWidth?: number;
23
- /** Maximum label width in pixels. Labels longer than the specified value will be trimmed. Default: `120` */
56
+ /** @deprecated This property has been renamed to `rowMaxLabelWidth */
24
57
  maxLabelWidth?: number;
25
- /** Alternating row colors. Default: `true` */
26
- alternatingRowColors?: boolean;
58
+ /** Show row labels when set to `true`. Default: `false`. Falls back to deprecated `showLabels` */
59
+ showRowLabels?: boolean;
60
+ /** Row label style as an object with the `{ [property-name]: value }` format. Default: `undefined` */
61
+ rowLabelStyle?: GenericAccessor<Record<string, string>, TimelineRowLabel<Datum>>;
62
+ /** Row label formatter function. Default: `undefined` */
63
+ rowLabelFormatter?: (key: string, items: Datum[], i: number) => string;
64
+ /** Provide an icon href to be displayed before the row label. Default: `undefined` */
65
+ rowIcon?: (key: string, items: Datum[], i: number) => TimelineRowIcon | undefined;
66
+ /** Fixed label width in pixels. Labels longer than the specified value will be trimmed. Default: `undefined`. Falls back to deprecated `labelWidth`. */
67
+ rowLabelWidth?: number;
68
+ /** Maximum label width in pixels. Labels longer than the specified value will be trimmed. Default: `undefined`. Falls back to deprecated `maxLabelWidth`. */
69
+ rowMaxLabelWidth?: number;
70
+ /** Text alignment for labels: `TextAlign.Left`, `TextAlign.Center` or `TextAlign.Right`. Default: `TextAlign.Right` */
71
+ rowLabelTextAlign?: TextAlign | `${TextAlign}`;
72
+ arrows?: TimelineArrow[];
73
+ /** Control the animation by specify the initial position for new lines as [x, y]. Default: `undefined` */
74
+ animationLineEnterPosition?: [
75
+ number | undefined | null,
76
+ number | undefined | null
77
+ ] | ((d: Datum & TimelineLineRenderState, i: number, data: (Datum & TimelineLineRenderState)[]) => [number | undefined, number | undefined]) | undefined;
78
+ /** Control the animation by specify the destination position for exiting lines as [x, y]. Default: `undefined` */
79
+ animationLineExitPosition?: [number | undefined | null, number | undefined | null] | ((d: Datum & TimelineLineRenderState, i: number, data: (Datum & TimelineLineRenderState)[]) => [number | undefined, number | undefined]) | undefined;
27
80
  /** Scrolling callback function: `(scrollTop: number) => void`. Default: `undefined` */
28
81
  onScroll?: (scrollTop: number) => void;
29
- /** Sets the minimum line length to 1 pixel for better visibility of small values. Default: `false` */
30
- showEmptySegments?: boolean;
31
82
  }
32
83
  export declare const TimelineDefaultConfig: TimelineConfigInterface<unknown>;
@@ -1,6 +1,20 @@
1
1
  import { XYComponentDefaultConfig } from '../../core/xy-component/config.js';
2
+ import { TextAlign } from '../../types/text.js';
3
+ import { Arrangement } from '../../types/position.js';
2
4
 
3
- const TimelineDefaultConfig = Object.assign(Object.assign({}, XYComponentDefaultConfig), { id: undefined, color: (d) => d.color, lineWidth: 8, lineCap: false, rowHeight: 22, length: (d) => d.length, type: (d) => d.type, cursor: null, labelWidth: undefined, showLabels: false, maxLabelWidth: 120, alternatingRowColors: true, onScroll: undefined, showEmptySegments: false });
5
+ const TimelineDefaultConfig = Object.assign(Object.assign({}, XYComponentDefaultConfig), { id: undefined,
6
+ // Items (Lines)
7
+ cursor: undefined, type: (d) => d.type, length: (d) => d.length, color: (d) => d.color, lineRow: undefined, lineDuration: undefined, lineWidth: 8, lineCap: false, lineCursor: undefined, showEmptySegments: false, lineStartIcon: undefined, lineStartIconColor: undefined, lineStartIconSize: undefined, lineStartIconArrangement: Arrangement.Inside, lineEndIcon: undefined, lineEndIconColor: undefined, lineEndIconSize: undefined, lineEndIconArrangement: Arrangement.Inside,
8
+ // Rows
9
+ rowHeight: 22, alternatingRowColors: true,
10
+ // Row Labels
11
+ showLabels: false, labelWidth: undefined, maxLabelWidth: 120, showRowLabels: undefined, rowLabelFormatter: undefined, rowIcon: undefined, rowLabelStyle: undefined, rowLabelWidth: undefined, rowMaxLabelWidth: undefined, rowLabelTextAlign: TextAlign.Right,
12
+ // Arrows
13
+ arrows: undefined,
14
+ // Animation
15
+ animationLineEnterPosition: undefined,
16
+ // Callbacks
17
+ onScroll: undefined });
4
18
 
5
19
  export { TimelineDefaultConfig };
6
20
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sources":["../../../src/components/timeline/config.ts"],"sourcesContent":["import { XYComponentConfigInterface, XYComponentDefaultConfig } from 'core/xy-component/config'\n\n// Types\nimport { WithOptional } from 'types/misc'\nimport { ColorAccessor, NumericAccessor, StringAccessor } from 'types/accessor'\n\nexport interface TimelineConfigInterface<Datum> extends WithOptional<XYComponentConfigInterface<Datum>, 'y'> {\n /** Timeline item color accessor function. Default: `d => d.color` */\n color?: ColorAccessor<Datum>;\n /** Width of the timeline items. Default: `8` */\n lineWidth?: NumericAccessor<Datum>;\n /** Display rounded ends for timeline items. Default: `true` */\n lineCap?: boolean;\n /** Timeline row height. Default: `22` */\n rowHeight?: number;\n /** Timeline item length accessor function. Default: `d => d.length` */\n length?: NumericAccessor<Datum>;\n /** Timeline item type accessor function. Records of one type will be plotted in one row. Default: `d => d.type` */\n type?: StringAccessor<Datum>;\n /** Configurable Timeline item cursor when hovering over. Default: `null` */\n cursor?: StringAccessor<Datum>;\n /** Show item type labels when set to `true`. Default: `false` */\n showLabels?: boolean;\n /** Fixed label width in pixels. Labels longer than the specified value will be trimmed. Default: `undefined` */\n labelWidth?: number;\n /** Maximum label width in pixels. Labels longer than the specified value will be trimmed. Default: `120` */\n maxLabelWidth?: number;\n /** Alternating row colors. Default: `true` */\n alternatingRowColors?: boolean;\n /** Scrolling callback function: `(scrollTop: number) => void`. Default: `undefined` */\n onScroll?: (scrollTop: number) => void;\n /** Sets the minimum line length to 1 pixel for better visibility of small values. Default: `false` */\n showEmptySegments?: boolean;\n}\n\nexport const TimelineDefaultConfig: TimelineConfigInterface<unknown> = {\n ...XYComponentDefaultConfig,\n id: undefined,\n color: (d: unknown): string => (d as { color: string }).color,\n lineWidth: 8,\n lineCap: false,\n rowHeight: 22,\n length: (d: unknown): number => (d as { length: number }).length,\n type: (d: unknown): string => (d as { type: string }).type,\n cursor: null,\n labelWidth: undefined,\n showLabels: false,\n maxLabelWidth: 120,\n alternatingRowColors: true,\n onScroll: undefined,\n showEmptySegments: false,\n}\n"],"names":[],"mappings":";;AAmCa,MAAA,qBAAqB,GAC7B,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,wBAAwB,KAC3B,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,CAAC,CAAU,KAAc,CAAuB,CAAC,KAAK,EAC7D,SAAS,EAAE,CAAC,EACZ,OAAO,EAAE,KAAK,EACd,SAAS,EAAE,EAAE,EACb,MAAM,EAAE,CAAC,CAAU,KAAc,CAAwB,CAAC,MAAM,EAChE,IAAI,EAAE,CAAC,CAAU,KAAc,CAAsB,CAAC,IAAI,EAC1D,MAAM,EAAE,IAAI,EACZ,UAAU,EAAE,SAAS,EACrB,UAAU,EAAE,KAAK,EACjB,aAAa,EAAE,GAAG,EAClB,oBAAoB,EAAE,IAAI,EAC1B,QAAQ,EAAE,SAAS,EACnB,iBAAiB,EAAE,KAAK;;;;"}
1
+ {"version":3,"file":"config.js","sources":["../../../src/components/timeline/config.ts"],"sourcesContent":["import { XYComponentConfigInterface, XYComponentDefaultConfig } from 'core/xy-component/config'\n\n// Types\nimport { WithOptional } from 'types/misc'\nimport { ColorAccessor, NumericAccessor, StringAccessor, GenericAccessor } from 'types/accessor'\nimport { TextAlign } from 'types/text'\nimport { Arrangement } from 'types/position'\n\n// Local Types\nimport type { TimelineArrow, TimelineLineRenderState, TimelineRowIcon, TimelineRowLabel } from './types'\n\nexport interface TimelineConfigInterface<Datum> extends WithOptional<XYComponentConfigInterface<Datum>, 'y'> {\n // Items (Lines)\n /** @deprecated This property has been renamed to `key` */\n type?: StringAccessor<Datum>;\n /** @deprecated This property has been renamed to `lineDuration` */\n length?: NumericAccessor<Datum>;\n /** @deprecated This property has been renamed to `lineCursor` */\n cursor?: StringAccessor<Datum>;\n /** Timeline item row accessor function. Records with the `lineRow` will be plotted in one row. Default: `undefined` */\n lineRow?: StringAccessor<Datum>;\n /** Timeline item duration accessor function. Default: `undefined`. Falls back to the deprecated `length` property */\n lineDuration?: NumericAccessor<Datum>;\n /** Timeline item color accessor function. Default: `d => d.color` */\n color?: ColorAccessor<Datum>;\n /** Width of the timeline items. Default: `8` */\n lineWidth?: NumericAccessor<Datum>;\n /** Display rounded ends for timeline items. Default: `true` */\n lineCap?: boolean;\n /** Provide a href to an SVG defined in container's `svgDefs` to display an icon at the start of the line. Default: undefined */\n lineStartIcon?: StringAccessor<Datum>;\n /** Line start icon color accessor function. Default: `undefined` */\n lineStartIconColor?: StringAccessor<Datum>;\n /** Line start icon size accessor function. Default: `undefined` */\n lineStartIconSize?: NumericAccessor<Datum>;\n /** Line start icon arrangement configuration. Controls how the icon is positioned relative to the line.\n * Accepts values from the Arrangement enum: `Arrangement.Start`, `Arrangement.Middle`, `Arrangement.End` or a string equivalent.\n * Default: `Arrangement.Inside` */\n lineStartIconArrangement?: GenericAccessor<Arrangement | `${Arrangement}`, Datum>;\n /** Provide a href to an SVG defined in container's `svgDefs` to display an icon at the end of the line. Default: undefined */\n lineEndIcon?: StringAccessor<Datum>;\n /** Line end icon color accessor function. Default: `undefined` */\n lineEndIconColor?: StringAccessor<Datum>;\n /** Line end icon size accessor function. Default: `undefined` */\n lineEndIconSize?: NumericAccessor<Datum>;\n /** Line end icon arrangement configuration. Controls how the icon is positioned relative to the line.\n * Accepts values from the Arrangement enum: `Arrangement.Start`, `Arrangement.Middle`, `Arrangement.End` or a string equivalent.\n * Default: `Arrangement.Inside` */\n lineEndIconArrangement?: GenericAccessor<Arrangement | `${Arrangement}`, Datum>;\n /** Configurable Timeline item cursor when hovering over. Default: `undefined` */\n lineCursor?: StringAccessor<Datum>;\n /** Sets the minimum line length to 1 pixel for better visibility of small values. Default: `false` */\n showEmptySegments?: boolean;\n\n /** Timeline row height. Default: `22` */\n rowHeight?: number;\n /** Alternating row colors. Default: `true` */\n alternatingRowColors?: boolean;\n\n // Row Labels\n /** @deprecated This property has been renamed to `showRowLabels */\n showLabels?: boolean;\n /** @deprecated This property has been renamed to `rowLabelWidth */\n labelWidth?: number;\n /** @deprecated This property has been renamed to `rowMaxLabelWidth */\n maxLabelWidth?: number;\n\n /** Show row labels when set to `true`. Default: `false`. Falls back to deprecated `showLabels` */\n showRowLabels?: boolean;\n /** Row label style as an object with the `{ [property-name]: value }` format. Default: `undefined` */\n rowLabelStyle?: GenericAccessor<Record<string, string>, TimelineRowLabel<Datum>>;\n /** Row label formatter function. Default: `undefined` */\n rowLabelFormatter?: (key: string, items: Datum[], i: number) => string;\n /** Provide an icon href to be displayed before the row label. Default: `undefined` */\n rowIcon?: (key: string, items: Datum[], i: number) => TimelineRowIcon | undefined;\n /** Fixed label width in pixels. Labels longer than the specified value will be trimmed. Default: `undefined`. Falls back to deprecated `labelWidth`. */\n rowLabelWidth?: number;\n /** Maximum label width in pixels. Labels longer than the specified value will be trimmed. Default: `undefined`. Falls back to deprecated `maxLabelWidth`. */\n rowMaxLabelWidth?: number;\n /** Text alignment for labels: `TextAlign.Left`, `TextAlign.Center` or `TextAlign.Right`. Default: `TextAlign.Right` */\n rowLabelTextAlign?: TextAlign | `${TextAlign}`;\n\n // Arrows\n arrows?: TimelineArrow[];\n\n // Animation\n /** Control the animation by specify the initial position for new lines as [x, y]. Default: `undefined` */\n animationLineEnterPosition?:\n [number | undefined | null, number | undefined | null] |\n ((d: Datum & TimelineLineRenderState, i: number, data: (Datum & TimelineLineRenderState)[]) => [number | undefined, number | undefined]) |\n undefined;\n /** Control the animation by specify the destination position for exiting lines as [x, y]. Default: `undefined` */\n animationLineExitPosition?: [number | undefined | null, number | undefined | null] |\n ((d: Datum & TimelineLineRenderState, i: number, data: (Datum & TimelineLineRenderState)[]) => [number | undefined, number | undefined]) |\n undefined;\n\n // Callbacks\n /** Scrolling callback function: `(scrollTop: number) => void`. Default: `undefined` */\n onScroll?: (scrollTop: number) => void;\n}\n\nexport const TimelineDefaultConfig: TimelineConfigInterface<unknown> = {\n ...XYComponentDefaultConfig,\n id: undefined,\n\n // Items (Lines)\n cursor: undefined, // Deprecated (see above)\n type: (d: unknown): string => (d as { type: string }).type, // Deprecated (see above)\n length: (d: unknown): number => (d as { length: number }).length, // Deprecated (see above)\n color: (d: unknown): string => (d as { color: string }).color,\n lineRow: undefined,\n lineDuration: undefined,\n lineWidth: 8,\n lineCap: false,\n lineCursor: undefined,\n showEmptySegments: false,\n lineStartIcon: undefined,\n lineStartIconColor: undefined,\n lineStartIconSize: undefined,\n lineStartIconArrangement: Arrangement.Inside,\n lineEndIcon: undefined,\n lineEndIconColor: undefined,\n lineEndIconSize: undefined,\n lineEndIconArrangement: Arrangement.Inside,\n\n // Rows\n rowHeight: 22,\n alternatingRowColors: true,\n\n // Row Labels\n showLabels: false, // Deprecated (see above)\n labelWidth: undefined, // Deprecated (see above)\n maxLabelWidth: 120, // Deprecated (see above)\n\n showRowLabels: undefined,\n rowLabelFormatter: undefined,\n rowIcon: undefined,\n rowLabelStyle: undefined,\n rowLabelWidth: undefined,\n rowMaxLabelWidth: undefined,\n rowLabelTextAlign: TextAlign.Right,\n\n // Arrows\n arrows: undefined,\n\n // Animation\n animationLineEnterPosition: undefined,\n\n // Callbacks\n onScroll: undefined,\n}\n"],"names":[],"mappings":";;;;MAqGa,qBAAqB,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAC7B,wBAAwB,CAC3B,EAAA,EAAA,EAAE,EAAE,SAAS;;IAGb,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,CAAC,CAAU,KAAc,CAAsB,CAAC,IAAI,EAC1D,MAAM,EAAE,CAAC,CAAU,KAAc,CAAwB,CAAC,MAAM,EAChE,KAAK,EAAE,CAAC,CAAU,KAAc,CAAuB,CAAC,KAAK,EAC7D,OAAO,EAAE,SAAS,EAClB,YAAY,EAAE,SAAS,EACvB,SAAS,EAAE,CAAC,EACZ,OAAO,EAAE,KAAK,EACd,UAAU,EAAE,SAAS,EACrB,iBAAiB,EAAE,KAAK,EACxB,aAAa,EAAE,SAAS,EACxB,kBAAkB,EAAE,SAAS,EAC7B,iBAAiB,EAAE,SAAS,EAC5B,wBAAwB,EAAE,WAAW,CAAC,MAAM,EAC5C,WAAW,EAAE,SAAS,EACtB,gBAAgB,EAAE,SAAS,EAC3B,eAAe,EAAE,SAAS,EAC1B,sBAAsB,EAAE,WAAW,CAAC,MAAM;;AAG1C,IAAA,SAAS,EAAE,EAAE,EACb,oBAAoB,EAAE,IAAI;;AAG1B,IAAA,UAAU,EAAE,KAAK,EACjB,UAAU,EAAE,SAAS,EACrB,aAAa,EAAE,GAAG,EAElB,aAAa,EAAE,SAAS,EACxB,iBAAiB,EAAE,SAAS,EAC5B,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,SAAS,EACxB,aAAa,EAAE,SAAS,EACxB,gBAAgB,EAAE,SAAS,EAC3B,iBAAiB,EAAE,SAAS,CAAC,KAAK;;AAGlC,IAAA,MAAM,EAAE,SAAS;;AAGjB,IAAA,0BAA0B,EAAE,SAAS;;IAGrC,QAAQ,EAAE,SAAS,EAAA;;;;"}
@@ -0,0 +1,3 @@
1
+ export declare const TIMELINE_DEFAULT_ARROW_HEAD_LENGTH = 8;
2
+ export declare const TIMELINE_DEFAULT_ARROW_HEAD_WIDTH = 6;
3
+ export declare const TIMELINE_DEFAULT_ARROW_MARGIN = 3;
@@ -0,0 +1,6 @@
1
+ const TIMELINE_DEFAULT_ARROW_HEAD_LENGTH = 8;
2
+ const TIMELINE_DEFAULT_ARROW_HEAD_WIDTH = 6;
3
+ const TIMELINE_DEFAULT_ARROW_MARGIN = 3;
4
+
5
+ export { TIMELINE_DEFAULT_ARROW_HEAD_LENGTH, TIMELINE_DEFAULT_ARROW_HEAD_WIDTH, TIMELINE_DEFAULT_ARROW_MARGIN };
6
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sources":["../../../src/components/timeline/constants.ts"],"sourcesContent":["export const TIMELINE_DEFAULT_ARROW_HEAD_LENGTH = 8\nexport const TIMELINE_DEFAULT_ARROW_HEAD_WIDTH = 6\nexport const TIMELINE_DEFAULT_ARROW_MARGIN = 3\n"],"names":[],"mappings":"AAAO,MAAM,kCAAkC,GAAG,EAAC;AAC5C,MAAM,iCAAiC,GAAG,EAAC;AAC3C,MAAM,6BAA6B,GAAG;;;;"}
@@ -1,4 +1,5 @@
1
1
  import { XYComponentCore } from "../../core/xy-component";
2
+ import { Spacing } from "../../types";
2
3
  import { TimelineConfigInterface } from './config';
3
4
  import * as s from './style';
4
5
  export declare class Timeline<Datum> extends XYComponentCore<Datum, TimelineConfigInterface<Datum>> {
@@ -12,8 +13,10 @@ export declare class Timeline<Datum> extends XYComponentCore<Datum, TimelineConf
12
13
  };
13
14
  private _background;
14
15
  private _rowsGroup;
16
+ private _arrowsGroup;
15
17
  private _linesGroup;
16
18
  private _labelsGroup;
19
+ private _rowIconsGroup;
17
20
  private _scrollBarGroup;
18
21
  private _scrollBarBackground;
19
22
  private _scrollBarHandle;
@@ -23,20 +26,28 @@ export declare class Timeline<Datum> extends XYComponentCore<Datum, TimelineConf
23
26
  private _maxScroll;
24
27
  private _scrollbarHeight;
25
28
  private _labelMargin;
29
+ private _labelWidth;
30
+ private _rowIconBleed;
31
+ private _lineBleed;
32
+ /** We define a dedicated clipping path for this component because it needs to behave
33
+ * differently than the regular XYContainer's clipPath */
34
+ private _clipPathId;
35
+ private _clipPath;
26
36
  constructor(config?: TimelineConfigInterface<Datum>);
27
- get bleed(): {
28
- top: number;
29
- bottom: number;
30
- left: number;
31
- right: number;
32
- };
37
+ setConfig(config: TimelineConfigInterface<Datum>): void;
38
+ setData(data: Datum[]): void;
39
+ get bleed(): Spacing;
33
40
  _render(customDuration?: number): void;
34
- private _positionLines;
41
+ private _getLineLength;
42
+ private _getLineWidth;
43
+ private _getLineDuration;
44
+ private _prepareLinesData;
45
+ private _prepareArrowsData;
46
+ private _renderLines;
35
47
  private _onScrollbarDrag;
36
48
  private _onMouseWheel;
37
49
  private _updateScrollPosition;
38
- private _getMaxLineWidth;
39
- private _getRecordType;
40
- private _getRecordLabels;
50
+ private _getRecordKey;
51
+ private _getRowLabels;
41
52
  getXDataExtent(): number[];
42
53
  }