@unovis/ts 1.1.1-beta.2 → 1.1.1-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/axis/config.d.ts +0 -3
- package/components/axis/config.js +0 -1
- package/components/axis/config.js.map +1 -1
- package/components/axis/index.d.ts +1 -8
- package/components/axis/index.js +29 -25
- package/components/axis/index.js.map +1 -1
- package/components/chord-diagram/modules/label.js +4 -2
- package/components/chord-diagram/modules/label.js.map +1 -1
- package/components/donut/index.js +1 -2
- package/components/donut/index.js.map +1 -1
- package/components/flow-legend/style.js +2 -2
- package/components/flow-legend/style.js.map +1 -1
- package/components/graph/modules/node/index.js +3 -3
- package/components/graph/modules/node/index.js.map +1 -1
- package/components/graph/modules/panel/index.js +3 -3
- package/components/graph/modules/panel/index.js.map +1 -1
- package/components/graph/style.js +2 -2
- package/components/graph/style.js.map +1 -1
- package/components/leaflet-map/index.d.ts +33 -0
- package/components/leaflet-map/index.js +8 -5
- package/components/leaflet-map/index.js.map +1 -1
- package/components/leaflet-map/modules/node.js +8 -7
- package/components/leaflet-map/modules/node.js.map +1 -1
- package/components/leaflet-map/modules/utils.js +4 -5
- package/components/leaflet-map/modules/utils.js.map +1 -1
- package/components/leaflet-map/style.d.ts +33 -1
- package/components/leaflet-map/style.js +54 -86
- package/components/leaflet-map/style.js.map +1 -1
- package/components/nested-donut/config.d.ts +59 -0
- package/components/nested-donut/config.js +19 -0
- package/components/nested-donut/config.js.map +1 -0
- package/components/nested-donut/index.d.ts +38 -0
- package/components/nested-donut/index.js +133 -0
- package/components/nested-donut/index.js.map +1 -0
- package/components/nested-donut/modules/arc.d.ts +17 -0
- package/components/nested-donut/modules/arc.js +50 -0
- package/components/nested-donut/modules/arc.js.map +1 -0
- package/components/nested-donut/modules/label.d.ts +7 -0
- package/components/nested-donut/modules/label.js +34 -0
- package/components/nested-donut/modules/label.js.map +1 -0
- package/components/nested-donut/style.d.ts +26 -0
- package/components/nested-donut/style.js +70 -0
- package/components/nested-donut/style.js.map +1 -0
- package/components/nested-donut/types.d.ts +24 -0
- package/components/nested-donut/types.js +11 -0
- package/components/nested-donut/types.js.map +1 -0
- package/components/sankey/modules/label.js +2 -2
- package/components/sankey/modules/label.js.map +1 -1
- package/components/sankey/style.js +2 -2
- package/components/sankey/style.js.map +1 -1
- package/components/vis-controls/style.js +2 -2
- package/components/vis-controls/style.js.map +1 -1
- package/components/xy-labels/config.d.ts +2 -2
- package/components/xy-labels/config.js.map +1 -1
- package/components.d.ts +2 -0
- package/components.js +1 -0
- package/components.js.map +1 -1
- package/containers/single-container/index.js +1 -1
- package/containers/single-container/index.js.map +1 -1
- package/containers/xy-container/index.js +1 -1
- package/containers/xy-container/index.js.map +1 -1
- package/core/component/index.d.ts +5 -1
- package/core/component/index.js +9 -1
- package/core/component/index.js.map +1 -1
- package/index.d.ts +1 -0
- package/index.js +4 -1
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/styles/index.d.ts +6 -1
- package/styles/index.js +18 -3
- package/styles/index.js.map +1 -1
- package/types/svg.d.ts +18 -0
- package/types/svg.js +22 -0
- package/types/svg.js.map +1 -0
- package/types/text.d.ts +26 -18
- package/types/text.js +1 -6
- package/types/text.js.map +1 -1
- package/types.d.ts +1 -0
- package/types.js +2 -1
- package/types.js.map +1 -1
- package/utils/data.js +1 -1
- package/utils/data.js.map +1 -1
- package/utils/style.d.ts +6 -0
- package/utils/style.js +24 -0
- package/utils/style.js.map +1 -0
- package/utils/svg.d.ts +3 -0
- package/utils/text.d.ts +134 -13
- package/utils/text.js +335 -126
- package/utils/text.js.map +1 -1
- package/utils/type.d.ts +5 -0
- package/components/axis/modules/tick.d.ts +0 -5
- package/components/axis/modules/tick.js +0 -48
- package/components/axis/modules/tick.js.map +0 -1
|
@@ -31,8 +31,6 @@ export interface AxisConfigInterface<Datum> extends Partial<XYComponentConfigInt
|
|
|
31
31
|
numTicks?: number;
|
|
32
32
|
/** Tick text fit mode: `FitMode.Wrap` or `FitMode.Trim`. Default: `FitMode.Wrap`. */
|
|
33
33
|
tickTextFitMode?: FitMode | string;
|
|
34
|
-
/** Maximum number of characters for tick text wrapping. Default: `undefined` */
|
|
35
|
-
tickTextLength?: number;
|
|
36
34
|
/** Maximum width in pixels for the tick text to be wrapped or trimmed. Default: `undefined` */
|
|
37
35
|
tickTextWidth?: number;
|
|
38
36
|
/** Tick text wrapping separator. String or array of strings. Default: `' '` */
|
|
@@ -58,7 +56,6 @@ export declare class AxisConfig<Datum> extends XYComponentConfig<Datum> implemen
|
|
|
58
56
|
domainLine: boolean;
|
|
59
57
|
numTicks: any;
|
|
60
58
|
minMaxTicksOnly: boolean;
|
|
61
|
-
tickTextLength: any;
|
|
62
59
|
tickTextWidth: any;
|
|
63
60
|
tickTextSeparator: string;
|
|
64
61
|
tickTextForceWordBreak: boolean;
|
|
@@ -13,7 +13,6 @@ class AxisConfig extends XYComponentConfig {
|
|
|
13
13
|
this.domainLine = true;
|
|
14
14
|
this.numTicks = undefined;
|
|
15
15
|
this.minMaxTicksOnly = false;
|
|
16
|
-
this.tickTextLength = undefined;
|
|
17
16
|
this.tickTextWidth = undefined;
|
|
18
17
|
this.tickTextSeparator = ' ';
|
|
19
18
|
this.tickTextForceWordBreak = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sources":["../../../src/components/axis/config.ts"],"sourcesContent":["import { XYComponentConfigInterface, XYComponentConfig } from 'core/xy-component/config'\n\n// Types\nimport { AxisType } from 'components/axis/types'\nimport { Position } from 'types/position'\nimport { FitMode, TrimMode, TextAlign } from 'types/text'\n\n// We extend partial XY config interface because x and y properties are optional for Axis\nexport interface AxisConfigInterface<Datum> extends Partial<XYComponentConfigInterface<Datum>> {\n /** Axis position: `Position.Top`, `Position.Bottom`, `Position.Right` or `Position.Left`. Default: `undefined` */\n position?: Position | string;\n /** Axis type: `AxisType.X` or `AxisType.Y` */\n type?: AxisType | string;\n /** Extend the axis domain line to be full width or full height. Default: `true` */\n fullSize?: boolean;\n /** Axis label. Default: `undefined` */\n label?: string;\n /** Font size of the axis label as CSS string. Default: `null` */\n labelFontSize?: string | null;\n /** Distance between the axis and the label in pixels. Default: `8` */\n labelMargin?: number;\n /** Sets whether to draw the grid lines or not. Default: `true` */\n gridLine?: boolean;\n /** Sets whether to draw the tick lines or not. Default: `true` */\n tickLine?: boolean;\n /** Sets whether to draw the domain line or not. Default: `true` */\n domainLine?: boolean;\n /** Draw the min and max axis ticks only. Default: `false` */\n minMaxTicksOnly?: boolean;\n /** Tick label formatter function. Default: `undefined` */\n tickFormat?: ((tick: number, i: number, ticks: number[]) => string) | ((tick: Date, i: number, ticks: Date[]) => string);\n /** Explicitly set tick values. Default: `undefined` */\n tickValues?: number[];\n /** Set the approximate number of axis ticks (will be passed to D3's axis constructor). Default: `undefined` */\n numTicks?: number;\n /** Tick text fit mode: `FitMode.Wrap` or `FitMode.Trim`. Default: `FitMode.Wrap`. */\n tickTextFitMode?: FitMode | string;\n /** Maximum
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../../src/components/axis/config.ts"],"sourcesContent":["import { XYComponentConfigInterface, XYComponentConfig } from 'core/xy-component/config'\n\n// Types\nimport { AxisType } from 'components/axis/types'\nimport { Position } from 'types/position'\nimport { FitMode, TrimMode, TextAlign } from 'types/text'\n\n// We extend partial XY config interface because x and y properties are optional for Axis\nexport interface AxisConfigInterface<Datum> extends Partial<XYComponentConfigInterface<Datum>> {\n /** Axis position: `Position.Top`, `Position.Bottom`, `Position.Right` or `Position.Left`. Default: `undefined` */\n position?: Position | string;\n /** Axis type: `AxisType.X` or `AxisType.Y` */\n type?: AxisType | string;\n /** Extend the axis domain line to be full width or full height. Default: `true` */\n fullSize?: boolean;\n /** Axis label. Default: `undefined` */\n label?: string;\n /** Font size of the axis label as CSS string. Default: `null` */\n labelFontSize?: string | null;\n /** Distance between the axis and the label in pixels. Default: `8` */\n labelMargin?: number;\n /** Sets whether to draw the grid lines or not. Default: `true` */\n gridLine?: boolean;\n /** Sets whether to draw the tick lines or not. Default: `true` */\n tickLine?: boolean;\n /** Sets whether to draw the domain line or not. Default: `true` */\n domainLine?: boolean;\n /** Draw the min and max axis ticks only. Default: `false` */\n minMaxTicksOnly?: boolean;\n /** Tick label formatter function. Default: `undefined` */\n tickFormat?: ((tick: number, i: number, ticks: number[]) => string) | ((tick: Date, i: number, ticks: Date[]) => string);\n /** Explicitly set tick values. Default: `undefined` */\n tickValues?: number[];\n /** Set the approximate number of axis ticks (will be passed to D3's axis constructor). Default: `undefined` */\n numTicks?: number;\n /** Tick text fit mode: `FitMode.Wrap` or `FitMode.Trim`. Default: `FitMode.Wrap`. */\n tickTextFitMode?: FitMode | string;\n /** Maximum width in pixels for the tick text to be wrapped or trimmed. Default: `undefined` */\n tickTextWidth?: number;\n /** Tick text wrapping separator. String or array of strings. Default: `' '` */\n tickTextSeparator?: string | string[];\n /** Force word break for ticks when they don't fit. Default: `false` */\n tickTextForceWordBreak?: boolean;\n /** Tick text trim mode: `TrimMode.Start`, `TrimMode.Middle` or `TrimMode.End`. Default: `TrimMode.Middle` */\n tickTextTrimType?: TrimMode | string;\n /** Font size of the tick text as CSS string. Default: `null` */\n tickTextFontSize?: string | null;\n /** Text alignment for ticks: `TextAlign.Left`, `TextAlign.Center` or `TextAlign.Right`. Default: `undefined` */\n tickTextAlign?: TextAlign | string;\n /** The spacing in pixels between the tick and it's label. Default: `8` */\n tickPadding?: number;\n}\n\nexport class AxisConfig<Datum> extends XYComponentConfig<Datum> implements AxisConfigInterface<Datum> {\n position = undefined\n type = undefined\n label = undefined\n labelFontSize = null\n gridLine = true\n tickLine = true\n domainLine = true\n numTicks = undefined\n minMaxTicksOnly = false\n tickTextWidth = undefined\n tickTextSeparator = ' '\n tickTextForceWordBreak = false\n tickTextTrimType = TrimMode.Middle\n tickTextFitMode = FitMode.Wrap\n tickTextFontSize = null\n tickTextAlign = undefined\n labelMargin = 8\n tickFormat = undefined\n tickValues = undefined\n fullSize = true\n tickPadding = 8\n}\n"],"names":[],"mappings":";;;AAqDM,MAAO,UAAkB,SAAQ,iBAAwB,CAAA;AAA/D,IAAA,WAAA,GAAA;;QACE,IAAQ,CAAA,QAAA,GAAG,SAAS,CAAA;QACpB,IAAI,CAAA,IAAA,GAAG,SAAS,CAAA;QAChB,IAAK,CAAA,KAAA,GAAG,SAAS,CAAA;QACjB,IAAa,CAAA,aAAA,GAAG,IAAI,CAAA;QACpB,IAAQ,CAAA,QAAA,GAAG,IAAI,CAAA;QACf,IAAQ,CAAA,QAAA,GAAG,IAAI,CAAA;QACf,IAAU,CAAA,UAAA,GAAG,IAAI,CAAA;QACjB,IAAQ,CAAA,QAAA,GAAG,SAAS,CAAA;QACpB,IAAe,CAAA,eAAA,GAAG,KAAK,CAAA;QACvB,IAAa,CAAA,aAAA,GAAG,SAAS,CAAA;QACzB,IAAiB,CAAA,iBAAA,GAAG,GAAG,CAAA;QACvB,IAAsB,CAAA,sBAAA,GAAG,KAAK,CAAA;AAC9B,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAA;AAClC,QAAA,IAAA,CAAA,eAAe,GAAG,OAAO,CAAC,IAAI,CAAA;QAC9B,IAAgB,CAAA,gBAAA,GAAG,IAAI,CAAA;QACvB,IAAa,CAAA,aAAA,GAAG,SAAS,CAAA;QACzB,IAAW,CAAA,WAAA,GAAG,CAAC,CAAA;QACf,IAAU,CAAA,UAAA,GAAG,SAAS,CAAA;QACtB,IAAU,CAAA,UAAA,GAAG,SAAS,CAAA;QACtB,IAAQ,CAAA,QAAA,GAAG,IAAI,CAAA;QACf,IAAW,CAAA,WAAA,GAAG,CAAC,CAAA;KAChB;AAAA;;;;"}
|
|
@@ -16,12 +16,7 @@ export declare class Axis<Datum> extends XYComponentCore<Datum, AxisConfig<Datum
|
|
|
16
16
|
private _requiredMargin;
|
|
17
17
|
private _defaultNumTicks;
|
|
18
18
|
private _minMaxTicksOnlyEnforceWidth;
|
|
19
|
-
events: {
|
|
20
|
-
[x: string]: {
|
|
21
|
-
mouseover: (d: any, event: MouseEvent) => void;
|
|
22
|
-
mouseout: (d: any, event: MouseEvent) => void;
|
|
23
|
-
};
|
|
24
|
-
};
|
|
19
|
+
events: {};
|
|
25
20
|
constructor(config?: AxisConfigInterface<Datum>);
|
|
26
21
|
/** Renders axis to an invisible grouped to calculate automatic chart margins */
|
|
27
22
|
preRender(): void;
|
|
@@ -46,6 +41,4 @@ export declare class Axis<Datum> extends XYComponentCore<Datum, AxisConfig<Datum
|
|
|
46
41
|
_alignTickLabels(): void;
|
|
47
42
|
_getTickTextAnchor(textAlign: TextAlign): string;
|
|
48
43
|
_getYTickTextTranslate(textAlign: TextAlign, axisPosition?: Position): number;
|
|
49
|
-
_onTickMouseOver(d: any, event: MouseEvent): void;
|
|
50
|
-
_onTickMouseOut(d: any, event: MouseEvent): void;
|
|
51
44
|
}
|
package/components/axis/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
+
import { select } from 'd3-selection';
|
|
1
2
|
import { interrupt } from 'd3-transition';
|
|
2
3
|
import { axisLeft, axisRight, axisBottom, axisTop } from 'd3-axis';
|
|
3
4
|
import { XYComponentCore } from '../../core/xy-component/index.js';
|
|
4
5
|
import { Position } from '../../types/position.js';
|
|
5
|
-
import { TextAlign } from '../../types/text.js';
|
|
6
|
+
import { FitMode, VerticalAlign, TextAlign } from '../../types/text.js';
|
|
6
7
|
import { smartTransition } from '../../utils/d3.js';
|
|
7
|
-
import {
|
|
8
|
+
import { trimSVGText, renderTextToSvgTextElement } from '../../utils/text.js';
|
|
8
9
|
import { AxisType } from './types.js';
|
|
9
10
|
import { AxisConfig } from './config.js';
|
|
10
|
-
import { wrapTickText, getWrapOptions } from './modules/tick.js';
|
|
11
11
|
import * as style from './style.js';
|
|
12
12
|
import { grid, tick, axis, hideTickLine, hideDomain, label } from './style.js';
|
|
13
13
|
|
|
@@ -17,12 +17,7 @@ class Axis extends XYComponentCore {
|
|
|
17
17
|
this.config = new AxisConfig();
|
|
18
18
|
this._defaultNumTicks = 3;
|
|
19
19
|
this._minMaxTicksOnlyEnforceWidth = 250;
|
|
20
|
-
this.events = {
|
|
21
|
-
[Axis.selectors.tick]: {
|
|
22
|
-
mouseover: this._onTickMouseOver.bind(this),
|
|
23
|
-
mouseout: this._onTickMouseOut.bind(this),
|
|
24
|
-
},
|
|
25
|
-
};
|
|
20
|
+
this.events = {};
|
|
26
21
|
if (config)
|
|
27
22
|
this.config.init(config);
|
|
28
23
|
this.axisGroup = this.g.append('g');
|
|
@@ -108,7 +103,7 @@ class Axis extends XYComponentCore {
|
|
|
108
103
|
const gridGen = this._buildGrid().tickFormat(() => '');
|
|
109
104
|
gridGen.tickValues(this._getConfiguredTickValues());
|
|
110
105
|
// Interrupting all active transitions first to prevent them from being stuck.
|
|
111
|
-
// Somehow we see it happening in
|
|
106
|
+
// Somehow we see it happening in Angular apps.
|
|
112
107
|
this.gridGroup.selectAll('*').interrupt();
|
|
113
108
|
smartTransition(this.gridGroup, duration).call(gridGen).style('opacity', 1);
|
|
114
109
|
}
|
|
@@ -163,19 +158,34 @@ class Axis extends XYComponentCore {
|
|
|
163
158
|
selection.selectAll('*').interrupt();
|
|
164
159
|
smartTransition(selection, duration).call(axisGen);
|
|
165
160
|
const ticks = selection.selectAll('g.tick');
|
|
161
|
+
const tickValues = ticks.data();
|
|
166
162
|
ticks
|
|
167
163
|
.classed(tick, true)
|
|
168
164
|
.style('font-size', config.tickTextFontSize);
|
|
169
|
-
//
|
|
170
|
-
|
|
171
|
-
const tickValues = axisGen.scale().ticks(this._getNumTicks());
|
|
172
|
-
const tickText = selection.selectAll('g.tick > text')
|
|
173
|
-
.filter(tickValue => tickValues.some(t => isEqual(tickValue, t))); // We use isEqual to compare Dates
|
|
174
|
-
// We interrupt the transition on tick's <text> to make it 'wrappable'
|
|
165
|
+
// We interrupt transition on tick Text to make it 'wrappable'
|
|
166
|
+
const tickText = selection.selectAll('g.tick > text');
|
|
175
167
|
tickText.nodes().forEach(node => interrupt(node));
|
|
176
|
-
tickText.
|
|
177
|
-
|
|
178
|
-
.call(
|
|
168
|
+
tickText.each((value, i, elements) => {
|
|
169
|
+
var _a, _b;
|
|
170
|
+
const text = (_b = (_a = config.tickFormat) === null || _a === void 0 ? void 0 : _a.call(config, value, i, tickValues)) !== null && _b !== void 0 ? _b : `${value}`;
|
|
171
|
+
const textElement = elements[i];
|
|
172
|
+
const textMaxWidth = config.tickTextWidth || (config.type === AxisType.X ? this._containerWidth / (ticks.size() + 1) : this._containerWidth / 5);
|
|
173
|
+
const styleDeclaration = getComputedStyle(textElement);
|
|
174
|
+
const fontSize = Number.parseFloat(styleDeclaration.fontSize);
|
|
175
|
+
const fontFamily = styleDeclaration.fontFamily;
|
|
176
|
+
if (config.tickTextFitMode === FitMode.Trim) {
|
|
177
|
+
const textElementSelection = select(textElement).text(text);
|
|
178
|
+
trimSVGText(textElementSelection, textMaxWidth, config.tickTextTrimType, true, fontSize, 0.58);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
const textBlock = { text, fontFamily, fontSize };
|
|
182
|
+
const textOptions = {
|
|
183
|
+
verticalAlign: config.type === AxisType.X ? VerticalAlign.Top : VerticalAlign.Middle,
|
|
184
|
+
width: textMaxWidth,
|
|
185
|
+
};
|
|
186
|
+
renderTextToSvgTextElement(textElement, textBlock, textOptions);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
179
189
|
selection
|
|
180
190
|
.classed(axis, true)
|
|
181
191
|
.classed(hideTickLine, !config.tickLine)
|
|
@@ -288,12 +298,6 @@ class Axis extends XYComponentCore {
|
|
|
288
298
|
default: return 0;
|
|
289
299
|
}
|
|
290
300
|
}
|
|
291
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
292
|
-
_onTickMouseOver(d, event) {
|
|
293
|
-
}
|
|
294
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
295
|
-
_onTickMouseOut(d, event) {
|
|
296
|
-
}
|
|
297
301
|
}
|
|
298
302
|
Axis.selectors = style;
|
|
299
303
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/axis/index.ts"],"sourcesContent":["import { Selection } from 'd3-selection'\nimport { interrupt } from 'd3-transition'\nimport { axisLeft, axisTop, axisRight, axisBottom, Axis as D3Axis } from 'd3-axis'\n\n// Core\nimport { XYComponentCore } from 'core/xy-component'\n\n// Types\nimport { Position } from 'types/position'\nimport { Spacing } from 'types/spacing'\nimport { TextAlign } from 'types/text'\nimport { ContinuousScale } from 'types/scale'\n\n// Utils\nimport { smartTransition } from 'utils/d3'\nimport { isEqual } from 'utils/data'\n\n// Local Types\nimport { AxisType } from './types'\n\n// Config\nimport { AxisConfig, AxisConfigInterface } from './config'\n\n// Modules\nimport { wrapTickText, getWrapOptions } from './modules/tick'\n\n// Styles\nimport * as s from './style'\n\nexport class Axis<Datum> extends XYComponentCore<Datum, AxisConfig<Datum>, AxisConfigInterface<Datum>> {\n static selectors = s\n config: AxisConfig<Datum> = new AxisConfig<Datum>()\n axisGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n gridGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n\n private _axisRawBBox: DOMRect\n private _axisSizeBBox: SVGRect\n private _requiredMargin: Spacing\n private _defaultNumTicks = 3\n private _minMaxTicksOnlyEnforceWidth = 250\n\n events = {\n [Axis.selectors.tick]: {\n mouseover: this._onTickMouseOver.bind(this),\n mouseout: this._onTickMouseOut.bind(this),\n },\n }\n\n constructor (config?: AxisConfigInterface<Datum>) {\n super()\n if (config) this.config.init(config)\n\n this.axisGroup = this.g.append('g')\n this.gridGroup = this.g.append('g')\n .attr('class', s.grid)\n }\n\n /** Renders axis to an invisible grouped to calculate automatic chart margins */\n preRender (): void {\n const { config } = this\n const axisRenderHelperGroup = this.g.append('g').attr('opacity', 0)\n\n this._renderAxis(axisRenderHelperGroup, 0)\n\n // Store axis raw BBox (without the label) for further label positioning (see _renderAxisLabel)\n this._axisRawBBox = axisRenderHelperGroup.node().getBBox()\n\n // Align tick text\n if (config.tickTextAlign) this._alignTickLabels()\n\n // Render label and store total axis size and required margins\n this._renderAxisLabel(axisRenderHelperGroup)\n this._axisSizeBBox = this._getAxisSize(axisRenderHelperGroup)\n this._requiredMargin = this._getRequiredMargin(this._axisSizeBBox)\n\n axisRenderHelperGroup.remove()\n }\n\n getPosition (): Position {\n const { config: { type, position } } = this\n return (position ?? ((type === AxisType.X) ? Position.Bottom : Position.Left)) as Position\n }\n\n _getAxisSize (selection: Selection<SVGGElement, unknown, SVGGElement, undefined>): SVGRect {\n const bBox = selection.node().getBBox()\n return bBox\n }\n\n _getRequiredMargin (axisSize = this._axisSizeBBox): Spacing {\n const { config: { type, position } } = this\n\n switch (type) {\n case AxisType.X: {\n const tolerancePx = 1\n const xEnd = this._axisSizeBBox.x + this._axisSizeBBox.width\n\n const left = this._axisSizeBBox.x < 0 ? Math.abs(this._axisSizeBBox.x) : 0\n const right = (xEnd - this._width) > tolerancePx ? xEnd - this._width : 0\n\n switch (position) {\n case Position.Top: return { top: axisSize.height, left, right }\n case Position.Bottom: default: return { bottom: axisSize.height, left, right }\n }\n }\n case AxisType.Y: {\n const bleedY = axisSize.height > this._height ? (axisSize.height - this._height) / 2 : 0\n const top = bleedY\n const bottom = bleedY\n\n switch (position) {\n case Position.Right: return { right: axisSize.width, top, bottom }\n case Position.Left: default: return { left: axisSize.width, top, bottom }\n }\n }\n }\n }\n\n getRequiredMargin (): Spacing {\n return this._requiredMargin\n }\n\n /** Calculates axis transform:translate offset based on passed container margins */\n getOffset (containerMargin: Spacing): {left: number; top: number} {\n const { config: { type, position } } = this\n\n switch (type) {\n case AxisType.X:\n switch (position) {\n case Position.Top: return { top: containerMargin.top, left: containerMargin.left }\n case Position.Bottom: default: return { top: containerMargin.top + this._height, left: containerMargin.left }\n }\n case AxisType.Y:\n switch (position) {\n case Position.Right: return { top: containerMargin.top, left: containerMargin.left + this._width }\n case Position.Left: default: return { top: containerMargin.top, left: containerMargin.left }\n }\n }\n }\n\n _render (duration = this.config.duration, selection = this.axisGroup): void {\n const { config } = this\n\n this._renderAxis(selection, duration)\n this._renderAxisLabel(selection)\n\n if (config.gridLine) {\n const gridGen = this._buildGrid().tickFormat(() => '')\n gridGen.tickValues(this._getConfiguredTickValues())\n // Interrupting all active transitions first to prevent them from being stuck.\n // Somehow we see it happening in in Angular apps.\n this.gridGroup.selectAll('*').interrupt()\n smartTransition(this.gridGroup, duration).call(gridGen).style('opacity', 1)\n } else {\n smartTransition(this.gridGroup, duration).style('opacity', 0)\n }\n\n if (config.tickTextAlign) this._alignTickLabels()\n }\n\n _buildAxis (): D3Axis<any> {\n const { config: { type, position, tickPadding } } = this\n\n const ticks = this._getNumTicks()\n switch (type) {\n case AxisType.X:\n switch (position) {\n case Position.Top: return axisTop(this.xScale).ticks(ticks).tickPadding(tickPadding)\n case Position.Bottom: default: return axisBottom(this.xScale).ticks(ticks).tickPadding(tickPadding)\n }\n case AxisType.Y:\n switch (position) {\n case Position.Right: return axisRight(this.yScale).ticks(ticks).tickPadding(tickPadding)\n case Position.Left: default: return axisLeft(this.yScale).ticks(ticks).tickPadding(tickPadding)\n }\n }\n }\n\n _buildGrid (): D3Axis<any> {\n const { config: { type, position } } = this\n\n const ticks = this._getNumTicks()\n switch (type) {\n case AxisType.X:\n switch (position) {\n case Position.Top: return axisTop(this.xScale).ticks(ticks * 2).tickSize(-this._height).tickSizeOuter(0)\n case Position.Bottom: default: return axisBottom(this.xScale).ticks(ticks * 2).tickSize(-this._height).tickSizeOuter(0)\n }\n case AxisType.Y:\n switch (position) {\n case Position.Right: return axisRight(this.yScale).ticks(ticks * 2).tickSize(-this._width).tickSizeOuter(0)\n case Position.Left: default: return axisLeft(this.yScale).ticks(ticks * 2).tickSize(-this._width).tickSizeOuter(0)\n }\n }\n }\n\n _renderAxis (selection = this.axisGroup, duration = this.config.duration): void {\n const { config } = this\n\n const axisGen = this._buildAxis()\n axisGen.tickValues(this._getConfiguredTickValues())\n\n // Interrupting all active transitions first to prevent them from being stuck.\n // Somehow we see it happening in Angular apps.\n selection.selectAll('*').interrupt()\n smartTransition(selection, duration).call(axisGen)\n\n\n const ticks = selection.selectAll<SVGGElement, number | Date>('g.tick')\n\n ticks\n .classed(s.tick, true)\n .style('font-size', config.tickTextFontSize)\n\n // Selecting the <text> elements of the ticks to apply formatting. By default, this selection\n // will include exiting elements, so we're filtering them out.\n const tickValues: (number | Date)[] = axisGen.scale<ContinuousScale>().ticks(this._getNumTicks())\n const tickText = selection.selectAll<SVGTextElement, number | Date>('g.tick > text')\n .filter(tickValue => tickValues.some(t => isEqual(tickValue, t))) // We use isEqual to compare Dates\n\n // We interrupt the transition on tick's <text> to make it 'wrappable'\n tickText.nodes().forEach(node => interrupt(node))\n tickText.text((value, i) => config.tickFormat?.(value, i, tickValues) ?? value)\n tickText\n .call(wrapTickText, getWrapOptions(ticks, config, this._width))\n\n selection\n .classed(s.axis, true)\n .classed(s.hideTickLine, !config.tickLine)\n .classed(s.hideDomain, !config.domainLine)\n\n if (config.fullSize) {\n const path = this._getFullDomainPath(0)\n smartTransition(selection.select('.domain'), duration).attr('d', path)\n }\n }\n\n _getNumTicks (): number {\n const { config: { type, numTicks } } = this\n\n if (numTicks) return numTicks\n\n if (type === AxisType.X) {\n const xRange = this.xScale.range() as [number, number]\n const width = xRange[1] - xRange[0]\n return Math.floor(width / 175)\n }\n\n if (type === AxisType.Y) {\n const yRange = this.yScale.range() as [number, number]\n const height = Math.abs(yRange[0] - yRange[1])\n return Math.pow(height, 0.85) / 25\n }\n\n return this._defaultNumTicks\n }\n\n _getConfiguredTickValues (): number[] | null {\n const { config: { tickValues, type, minMaxTicksOnly } } = this\n const scale = type === AxisType.X ? this.xScale : this.yScale\n const scaleDomain = scale?.domain()\n\n if (tickValues) {\n return tickValues.filter(v => (v >= scaleDomain[0]) && (v <= scaleDomain[1]))\n }\n\n if (minMaxTicksOnly || (type === AxisType.X && this._width < this._minMaxTicksOnlyEnforceWidth)) {\n return scaleDomain as number[]\n }\n\n return null\n }\n\n _getFullDomainPath (tickSize = 0): string {\n const { config: { type } } = this\n switch (type) {\n case AxisType.X: return `M0.5, ${tickSize} V0.5 H${this._width + 0.5} V${tickSize}`\n case AxisType.Y: return `M${-tickSize}, ${this._height + 0.5} H0.5 V0.5 H${-tickSize}`\n }\n }\n\n _renderAxisLabel (selection = this.axisGroup): void {\n const { type, label, labelMargin, labelFontSize } = this.config\n\n // Remove the old label first to calculate the axis size properly\n selection.selectAll(`.${s.label}`).remove()\n\n // Calculate label position and rotation\n const axisPosition = this.getPosition()\n // We always use this.axisRenderHelperGroup to calculate the size of the axis because\n // this.axisGroup will give us incorrect values due to animation\n const { width: axisWidth, height: axisHeight } = this._axisRawBBox ?? selection.node().getBBox()\n\n const offsetX = type === AxisType.X ? this._width / 2 : (-1) ** (+(axisPosition === Position.Left)) * axisWidth\n const offsetY = type === AxisType.X ? (-1) ** (+(axisPosition === Position.Top)) * axisHeight : this._height / 2\n\n const marginX = type === AxisType.X ? 0 : (-1) ** (+(axisPosition === Position.Left)) * labelMargin\n const marginY = type === AxisType.X ? (-1) ** (+(axisPosition === Position.Top)) * labelMargin : 0\n\n const rotation = type === AxisType.Y ? -90 : 0\n\n // Append new label\n selection\n .append('text')\n .attr('class', s.label)\n .text(label)\n .style('font-size', labelFontSize)\n .attr('dy', `${this._getLabelDY()}em`)\n .attr('transform', `translate(${offsetX + marginX},${offsetY + marginY}) rotate(${rotation})`)\n }\n\n _getLabelDY (): number {\n const { type, position } = this.config\n switch (type) {\n case AxisType.X:\n switch (position) {\n case Position.Top: return 0\n case Position.Bottom: default: return 0.75\n }\n case AxisType.Y:\n switch (position) {\n case Position.Right: return 0.75\n case Position.Left: default: return -0.25\n }\n }\n }\n\n _alignTickLabels (): void {\n const { config: { type, tickTextAlign, position } } = this\n\n const tickText = this.g.selectAll('g.tick > text')\n const textAnchor = this._getTickTextAnchor(tickTextAlign)\n const translateX = type === AxisType.X ? 0 : this._getYTickTextTranslate(tickTextAlign, position)\n\n tickText\n .attr('text-anchor', textAnchor)\n .attr('transform', `translate(${translateX},0)`)\n }\n\n _getTickTextAnchor (textAlign: TextAlign): string {\n switch (textAlign) {\n case TextAlign.Left: return 'start'\n case TextAlign.Right: return 'end'\n case TextAlign.Center: return 'middle'\n default: return null\n }\n }\n\n _getYTickTextTranslate (textAlign: TextAlign, axisPosition: Position = Position.Left): number {\n const defaultTickTextSpacingPx = 9 // Default in D3\n const width = this._axisRawBBox.width - defaultTickTextSpacingPx\n\n switch (textAlign) {\n case TextAlign.Left: return axisPosition === Position.Left ? width * -1 : 0\n case TextAlign.Right: return axisPosition === Position.Left ? 0 : width\n case TextAlign.Center: return axisPosition === Position.Left ? width * (-0.5) : width * 0.5\n default: return 0\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n _onTickMouseOver (d: any, event: MouseEvent): void {\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n _onTickMouseOut (d: any, event: MouseEvent): void {\n }\n}\n"],"names":["s.grid","s.tick","s.axis","s.hideTickLine","s.hideDomain","label","s.label","s"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/axis/index.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\nimport { interrupt } from 'd3-transition'\nimport { Axis as D3Axis, axisBottom, axisLeft, axisRight, axisTop } from 'd3-axis'\n\n// Core\nimport { XYComponentCore } from 'core/xy-component'\n\n// Types\nimport { Position } from 'types/position'\nimport { Spacing } from 'types/spacing'\nimport { FitMode, TextAlign, UnovisText, UnovisTextOptions, VerticalAlign } from 'types/text'\n\n// Utils\nimport { smartTransition } from 'utils/d3'\nimport { renderTextToSvgTextElement, trimSVGText } from 'utils/text'\n\n// Local Types\nimport { AxisType } from './types'\n\n// Config\nimport { AxisConfig, AxisConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\nexport class Axis<Datum> extends XYComponentCore<Datum, AxisConfig<Datum>, AxisConfigInterface<Datum>> {\n static selectors = s\n config: AxisConfig<Datum> = new AxisConfig<Datum>()\n axisGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n gridGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n\n private _axisRawBBox: DOMRect\n private _axisSizeBBox: SVGRect\n private _requiredMargin: Spacing\n private _defaultNumTicks = 3\n private _minMaxTicksOnlyEnforceWidth = 250\n\n events = {}\n\n constructor (config?: AxisConfigInterface<Datum>) {\n super()\n if (config) this.config.init(config)\n\n this.axisGroup = this.g.append('g')\n this.gridGroup = this.g.append('g')\n .attr('class', s.grid)\n }\n\n /** Renders axis to an invisible grouped to calculate automatic chart margins */\n preRender (): void {\n const { config } = this\n const axisRenderHelperGroup = this.g.append('g').attr('opacity', 0)\n\n this._renderAxis(axisRenderHelperGroup, 0)\n\n // Store axis raw BBox (without the label) for further label positioning (see _renderAxisLabel)\n this._axisRawBBox = axisRenderHelperGroup.node().getBBox()\n\n // Align tick text\n if (config.tickTextAlign) this._alignTickLabels()\n\n // Render label and store total axis size and required margins\n this._renderAxisLabel(axisRenderHelperGroup)\n this._axisSizeBBox = this._getAxisSize(axisRenderHelperGroup)\n this._requiredMargin = this._getRequiredMargin(this._axisSizeBBox)\n\n axisRenderHelperGroup.remove()\n }\n\n getPosition (): Position {\n const { config: { type, position } } = this\n return (position ?? ((type === AxisType.X) ? Position.Bottom : Position.Left)) as Position\n }\n\n _getAxisSize (selection: Selection<SVGGElement, unknown, SVGGElement, undefined>): SVGRect {\n const bBox = selection.node().getBBox()\n return bBox\n }\n\n _getRequiredMargin (axisSize = this._axisSizeBBox): Spacing {\n const { config: { type, position } } = this\n\n switch (type) {\n case AxisType.X: {\n const tolerancePx = 1\n const xEnd = this._axisSizeBBox.x + this._axisSizeBBox.width\n\n const left = this._axisSizeBBox.x < 0 ? Math.abs(this._axisSizeBBox.x) : 0\n const right = (xEnd - this._width) > tolerancePx ? xEnd - this._width : 0\n\n switch (position) {\n case Position.Top: return { top: axisSize.height, left, right }\n case Position.Bottom: default: return { bottom: axisSize.height, left, right }\n }\n }\n case AxisType.Y: {\n const bleedY = axisSize.height > this._height ? (axisSize.height - this._height) / 2 : 0\n const top = bleedY\n const bottom = bleedY\n\n switch (position) {\n case Position.Right: return { right: axisSize.width, top, bottom }\n case Position.Left: default: return { left: axisSize.width, top, bottom }\n }\n }\n }\n }\n\n getRequiredMargin (): Spacing {\n return this._requiredMargin\n }\n\n /** Calculates axis transform:translate offset based on passed container margins */\n getOffset (containerMargin: Spacing): {left: number; top: number} {\n const { config: { type, position } } = this\n\n switch (type) {\n case AxisType.X:\n switch (position) {\n case Position.Top: return { top: containerMargin.top, left: containerMargin.left }\n case Position.Bottom: default: return { top: containerMargin.top + this._height, left: containerMargin.left }\n }\n case AxisType.Y:\n switch (position) {\n case Position.Right: return { top: containerMargin.top, left: containerMargin.left + this._width }\n case Position.Left: default: return { top: containerMargin.top, left: containerMargin.left }\n }\n }\n }\n\n _render (duration = this.config.duration, selection = this.axisGroup): void {\n const { config } = this\n\n this._renderAxis(selection, duration)\n this._renderAxisLabel(selection)\n\n if (config.gridLine) {\n const gridGen = this._buildGrid().tickFormat(() => '')\n gridGen.tickValues(this._getConfiguredTickValues())\n // Interrupting all active transitions first to prevent them from being stuck.\n // Somehow we see it happening in Angular apps.\n this.gridGroup.selectAll('*').interrupt()\n smartTransition(this.gridGroup, duration).call(gridGen).style('opacity', 1)\n } else {\n smartTransition(this.gridGroup, duration).style('opacity', 0)\n }\n\n if (config.tickTextAlign) this._alignTickLabels()\n }\n\n _buildAxis (): D3Axis<any> {\n const { config: { type, position, tickPadding } } = this\n\n const ticks = this._getNumTicks()\n switch (type) {\n case AxisType.X:\n switch (position) {\n case Position.Top: return axisTop(this.xScale).ticks(ticks).tickPadding(tickPadding)\n case Position.Bottom: default: return axisBottom(this.xScale).ticks(ticks).tickPadding(tickPadding)\n }\n case AxisType.Y:\n switch (position) {\n case Position.Right: return axisRight(this.yScale).ticks(ticks).tickPadding(tickPadding)\n case Position.Left: default: return axisLeft(this.yScale).ticks(ticks).tickPadding(tickPadding)\n }\n }\n }\n\n _buildGrid (): D3Axis<any> {\n const { config: { type, position } } = this\n\n const ticks = this._getNumTicks()\n switch (type) {\n case AxisType.X:\n switch (position) {\n case Position.Top: return axisTop(this.xScale).ticks(ticks * 2).tickSize(-this._height).tickSizeOuter(0)\n case Position.Bottom: default: return axisBottom(this.xScale).ticks(ticks * 2).tickSize(-this._height).tickSizeOuter(0)\n }\n case AxisType.Y:\n switch (position) {\n case Position.Right: return axisRight(this.yScale).ticks(ticks * 2).tickSize(-this._width).tickSizeOuter(0)\n case Position.Left: default: return axisLeft(this.yScale).ticks(ticks * 2).tickSize(-this._width).tickSizeOuter(0)\n }\n }\n }\n\n _renderAxis (selection = this.axisGroup, duration = this.config.duration): void {\n const { config } = this\n\n const axisGen = this._buildAxis()\n axisGen.tickValues(this._getConfiguredTickValues())\n\n // Interrupting all active transitions first to prevent them from being stuck.\n // Somehow we see it happening in Angular apps.\n selection.selectAll('*').interrupt()\n smartTransition(selection, duration).call(axisGen)\n\n const ticks = selection.selectAll<SVGGElement, number | Date>('g.tick')\n const tickValues = ticks.data()\n\n ticks\n .classed(s.tick, true)\n .style('font-size', config.tickTextFontSize)\n\n // We interrupt transition on tick Text to make it 'wrappable'\n const tickText = selection.selectAll<SVGTextElement, number | Date>('g.tick > text')\n tickText.nodes().forEach(node => interrupt(node))\n\n tickText.each((value, i, elements) => {\n const text = config.tickFormat?.(value, i, tickValues) ?? `${value}`\n const textElement = elements[i]\n const textMaxWidth = config.tickTextWidth || (config.type === AxisType.X ? this._containerWidth / (ticks.size() + 1) : this._containerWidth / 5)\n const styleDeclaration = getComputedStyle(textElement)\n const fontSize = Number.parseFloat(styleDeclaration.fontSize)\n const fontFamily = styleDeclaration.fontFamily\n\n if (config.tickTextFitMode === FitMode.Trim) {\n const textElementSelection = select(textElement).text(text)\n trimSVGText(textElementSelection, textMaxWidth, config.tickTextTrimType, true, fontSize, 0.58)\n } else {\n const textBlock: UnovisText = { text, fontFamily, fontSize }\n const textOptions: UnovisTextOptions = {\n verticalAlign: config.type === AxisType.X ? VerticalAlign.Top : VerticalAlign.Middle,\n width: textMaxWidth,\n }\n renderTextToSvgTextElement(textElement, textBlock, textOptions)\n }\n })\n\n selection\n .classed(s.axis, true)\n .classed(s.hideTickLine, !config.tickLine)\n .classed(s.hideDomain, !config.domainLine)\n\n if (config.fullSize) {\n const path = this._getFullDomainPath(0)\n smartTransition(selection.select('.domain'), duration).attr('d', path)\n }\n }\n\n _getNumTicks (): number {\n const { config: { type, numTicks } } = this\n\n if (numTicks) return numTicks\n\n if (type === AxisType.X) {\n const xRange = this.xScale.range() as [number, number]\n const width = xRange[1] - xRange[0]\n return Math.floor(width / 175)\n }\n\n if (type === AxisType.Y) {\n const yRange = this.yScale.range() as [number, number]\n const height = Math.abs(yRange[0] - yRange[1])\n return Math.pow(height, 0.85) / 25\n }\n\n return this._defaultNumTicks\n }\n\n _getConfiguredTickValues (): number[] | null {\n const { config: { tickValues, type, minMaxTicksOnly } } = this\n const scale = type === AxisType.X ? this.xScale : this.yScale\n const scaleDomain = scale?.domain()\n\n if (tickValues) {\n return tickValues.filter(v => (v >= scaleDomain[0]) && (v <= scaleDomain[1]))\n }\n\n if (minMaxTicksOnly || (type === AxisType.X && this._width < this._minMaxTicksOnlyEnforceWidth)) {\n return scaleDomain as number[]\n }\n\n return null\n }\n\n _getFullDomainPath (tickSize = 0): string {\n const { config: { type } } = this\n switch (type) {\n case AxisType.X: return `M0.5, ${tickSize} V0.5 H${this._width + 0.5} V${tickSize}`\n case AxisType.Y: return `M${-tickSize}, ${this._height + 0.5} H0.5 V0.5 H${-tickSize}`\n }\n }\n\n _renderAxisLabel (selection = this.axisGroup): void {\n const { type, label, labelMargin, labelFontSize } = this.config\n\n // Remove the old label first to calculate the axis size properly\n selection.selectAll(`.${s.label}`).remove()\n\n // Calculate label position and rotation\n const axisPosition = this.getPosition()\n // We always use this.axisRenderHelperGroup to calculate the size of the axis because\n // this.axisGroup will give us incorrect values due to animation\n const { width: axisWidth, height: axisHeight } = this._axisRawBBox ?? selection.node().getBBox()\n\n const offsetX = type === AxisType.X ? this._width / 2 : (-1) ** (+(axisPosition === Position.Left)) * axisWidth\n const offsetY = type === AxisType.X ? (-1) ** (+(axisPosition === Position.Top)) * axisHeight : this._height / 2\n\n const marginX = type === AxisType.X ? 0 : (-1) ** (+(axisPosition === Position.Left)) * labelMargin\n const marginY = type === AxisType.X ? (-1) ** (+(axisPosition === Position.Top)) * labelMargin : 0\n\n const rotation = type === AxisType.Y ? -90 : 0\n\n // Append new label\n selection\n .append('text')\n .attr('class', s.label)\n .text(label)\n .style('font-size', labelFontSize)\n .attr('dy', `${this._getLabelDY()}em`)\n .attr('transform', `translate(${offsetX + marginX},${offsetY + marginY}) rotate(${rotation})`)\n }\n\n _getLabelDY (): number {\n const { type, position } = this.config\n switch (type) {\n case AxisType.X:\n switch (position) {\n case Position.Top: return 0\n case Position.Bottom: default: return 0.75\n }\n case AxisType.Y:\n switch (position) {\n case Position.Right: return 0.75\n case Position.Left: default: return -0.25\n }\n }\n }\n\n _alignTickLabels (): void {\n const { config: { type, tickTextAlign, position } } = this\n\n const tickText = this.g.selectAll('g.tick > text')\n const textAnchor = this._getTickTextAnchor(tickTextAlign)\n const translateX = type === AxisType.X ? 0 : this._getYTickTextTranslate(tickTextAlign, position)\n\n tickText\n .attr('text-anchor', textAnchor)\n .attr('transform', `translate(${translateX},0)`)\n }\n\n _getTickTextAnchor (textAlign: TextAlign): string {\n switch (textAlign) {\n case TextAlign.Left: return 'start'\n case TextAlign.Right: return 'end'\n case TextAlign.Center: return 'middle'\n default: return null\n }\n }\n\n _getYTickTextTranslate (textAlign: TextAlign, axisPosition: Position = Position.Left): number {\n const defaultTickTextSpacingPx = 9 // Default in D3\n const width = this._axisRawBBox.width - defaultTickTextSpacingPx\n\n switch (textAlign) {\n case TextAlign.Left: return axisPosition === Position.Left ? width * -1 : 0\n case TextAlign.Right: return axisPosition === Position.Left ? 0 : width\n case TextAlign.Center: return axisPosition === Position.Left ? width * (-0.5) : width * 0.5\n default: return 0\n }\n }\n}\n"],"names":["s.grid","s.tick","s.axis","s.hideTickLine","s.hideDomain","label","s.label","s"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { select } from 'd3-selection';
|
|
2
2
|
import { color } from 'd3-color';
|
|
3
|
-
import {
|
|
3
|
+
import { trimSVGText } from '../../../utils/text.js';
|
|
4
4
|
import { smartTransition } from '../../../utils/d3.js';
|
|
5
5
|
import { getValue, getString, getNumber } from '../../../utils/data.js';
|
|
6
6
|
import { getColor, hexToBrightness } from '../../../utils/color.js';
|
|
@@ -78,7 +78,9 @@ function updateLabel(selection, config, width, radiusScale, duration) {
|
|
|
78
78
|
const radius = radiusScale(d.y1) - getNumber(d, config.nodeWidth) / 2;
|
|
79
79
|
const arcLength = radius * radianArcLength;
|
|
80
80
|
const maxWidth = (nodeLabelAlignment === ChordLabelAlignment.Along ? arcLength : width) - LABEL_PADDING * 2;
|
|
81
|
-
select(elements[i])
|
|
81
|
+
const textElementSelection = select(elements[i]);
|
|
82
|
+
trimSVGText(textElementSelection, maxWidth);
|
|
83
|
+
textElementSelection
|
|
82
84
|
.attr('dx', nodeLabelAlignment === ChordLabelAlignment.Along ? LABEL_PADDING : null)
|
|
83
85
|
.attr('dy', nodeLabelAlignment === ChordLabelAlignment.Along ? getNumber(d.data, nodeWidth) / 2 : null);
|
|
84
86
|
if (nodeLabelAlignment === ChordLabelAlignment.Along) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.js","sources":["../../../../src/components/chord-diagram/modules/label.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\nimport { ScaleContinuousNumeric } from 'd3-scale'\nimport { color } from 'd3-color'\n\n// Utils\nimport { wrapTextElement } from 'utils/text'\nimport { smartTransition } from 'utils/d3'\nimport { getNumber, getString, getValue } from 'utils/data'\nimport { getColor, hexToBrightness } from 'utils/color'\n\n// Config\nimport { ChordDiagramConfig } from '../config'\n\n// Local Types\nimport { ChordInputLink, ChordInputNode, ChordLabelAlignment, ChordNode } from '../types'\n\n// Styles\nimport * as s from '../style'\n\nexport const LABEL_PADDING = 3\n\nfunction getLabelFillColor<N extends ChordInputNode, L extends ChordInputLink> (\n d: ChordNode<N>,\n config: ChordDiagramConfig<N, L>\n): string {\n const nodeLabelAlignment = getValue(d.data, config.nodeLabelAlignment) ?? ChordLabelAlignment.Along\n switch (nodeLabelAlignment) {\n case ChordLabelAlignment.Perpendicular: {\n return getColor(d.data, config.nodeColor, d.height)\n }\n case ChordLabelAlignment.Along: {\n const c = getColor(d.data, config.nodeColor, d.height)\n const colorParsed = color(c)\n const brightness = colorParsed ? hexToBrightness(colorParsed.hex()) : 0\n return brightness > 0.65 ? 'var(--vis-chord-diagram-label-text-fill-color-dark)' : 'var(--vis-chord-diagram-label-text-fill-color-bright)'\n }\n }\n}\n\nfunction getLabelTextAnchor<N extends ChordInputNode, L extends ChordInputLink> (\n d: ChordNode<N>,\n config: ChordDiagramConfig<N, L>\n): string | null {\n const nodeLabelAlignment = getValue(d.data, config.nodeLabelAlignment) ?? ChordLabelAlignment.Along\n switch (nodeLabelAlignment) {\n case ChordLabelAlignment.Perpendicular: {\n const angleCenter = (d.x0 + d.x1) / 2\n const angleDegree = angleCenter * 180 / Math.PI\n return angleDegree < 180 ? 'start' : 'end'\n }\n case ChordLabelAlignment.Along: {\n return null\n }\n }\n}\n\nfunction getLabelTransform<N extends ChordInputNode, L extends ChordInputLink> (\n d: ChordNode<N>,\n config: ChordDiagramConfig<N, L>,\n radiusScale: ScaleContinuousNumeric<number, number>\n): string | null {\n const nodeLabelAlignment = getValue(d.data, config.nodeLabelAlignment) ?? ChordLabelAlignment.Along\n switch (nodeLabelAlignment) {\n case ChordLabelAlignment.Perpendicular: {\n const r = radiusScale(d.y1) + LABEL_PADDING\n const angleCenter = (d.x0 + d.x1) / 2\n const angle = angleCenter - Math.PI / 2\n const x = r * Math.cos(angle)\n const y = r * Math.sin(angle)\n return `translate(${x}, ${y})`\n }\n case ChordLabelAlignment.Along:\n return null\n }\n}\n\nexport function createLabel<N extends ChordInputNode, L extends ChordInputLink> (\n selection: Selection<SVGGElement, ChordNode<N>, SVGGElement, unknown>,\n config: ChordDiagramConfig<N, L>,\n radiusScale: ScaleContinuousNumeric<number, number>\n): void {\n selection.style('opacity', 0)\n .attr('transform', d => getLabelTransform(d, config, radiusScale))\n\n selection.append('text')\n .attr('class', s.label)\n .style('fill', d => getColor(d.data, config.nodeColor, d.height))\n}\n\nexport function updateLabel<N extends ChordInputNode, L extends ChordInputLink> (\n selection: Selection<SVGGElement, ChordNode<N>, SVGGElement, unknown>,\n config: ChordDiagramConfig<N, L>,\n width: number,\n radiusScale: ScaleContinuousNumeric<number, number>,\n duration: number\n): void {\n const { nodeLabel, nodeLabelColor, nodeWidth } = config\n\n smartTransition(selection, duration)\n .attr('transform', d => getLabelTransform(d, config, radiusScale))\n .style('opacity', 1)\n\n const label: Selection<SVGTextElement, ChordNode<N>, SVGElement, unknown> = selection.select(`.${s.label}`)\n label.select('textPath').remove()\n label\n .text(d => getString(d.data, nodeLabel))\n .style('fill', d => getColor(d.data, nodeLabelColor) ?? getLabelFillColor(d, config))\n .style('text-anchor', d => getLabelTextAnchor(d, config))\n\n label.each((d: ChordNode<N>, i: number, elements) => {\n const nodeLabelAlignment = getValue(d.data, config.nodeLabelAlignment) ?? ChordLabelAlignment.Along\n const radianArcLength = d.x1 - d.x0 - getNumber(d, config.padAngle) * 2\n const radius = radiusScale(d.y1) - getNumber(d, config.nodeWidth) / 2\n const arcLength = radius * radianArcLength\n const maxWidth = (nodeLabelAlignment === ChordLabelAlignment.Along ? arcLength : width) - LABEL_PADDING * 2\n\n select(elements[i]).call(wrapTextElement, { width: maxWidth, trimOnly: true })\n .attr('dx', nodeLabelAlignment === ChordLabelAlignment.Along ? LABEL_PADDING : null)\n .attr('dy', nodeLabelAlignment === ChordLabelAlignment.Along ? getNumber(d.data, nodeWidth) / 2 : null)\n\n if (nodeLabelAlignment === ChordLabelAlignment.Along) {\n const textElement = select(elements[i])\n const textWidth = textElement.node().getBoundingClientRect().width\n const labelText = textElement.text()\n\n select(elements[i])\n .text('')\n .style('display', textWidth > maxWidth && 'none')\n\n select(elements[i]).append('textPath')\n .attr('href', `#${d.uid}`)\n .text(labelText)\n }\n })\n\n smartTransition(label, duration)\n .attr('transform', d => {\n const nodeLabelAlignment = getValue(d.data, config.nodeLabelAlignment)\n if (nodeLabelAlignment !== ChordLabelAlignment.Perpendicular) return null\n const angleCenter = (d.x0 + d.x1) / 2\n const angleDegree = angleCenter * 180 / Math.PI\n return `rotate(${angleDegree < 180 ? angleDegree - 90 : angleDegree + 90})`\n })\n}\n\nexport function removeLabel (\n selection: Selection<SVGGElement, unknown, SVGGElement, unknown>,\n duration: number\n): void {\n smartTransition(selection, duration)\n .style('opacity', 0)\n .remove()\n}\n"],"names":["s.label","label"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"label.js","sources":["../../../../src/components/chord-diagram/modules/label.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\nimport { ScaleContinuousNumeric } from 'd3-scale'\nimport { color } from 'd3-color'\n\n// Utils\nimport { trimSVGText } from 'utils/text'\nimport { smartTransition } from 'utils/d3'\nimport { getNumber, getString, getValue } from 'utils/data'\nimport { getColor, hexToBrightness } from 'utils/color'\n\n// Config\nimport { ChordDiagramConfig } from '../config'\n\n// Local Types\nimport { ChordInputLink, ChordInputNode, ChordLabelAlignment, ChordNode } from '../types'\n\n// Styles\nimport * as s from '../style'\n\nexport const LABEL_PADDING = 3\n\nfunction getLabelFillColor<N extends ChordInputNode, L extends ChordInputLink> (\n d: ChordNode<N>,\n config: ChordDiagramConfig<N, L>\n): string {\n const nodeLabelAlignment = getValue(d.data, config.nodeLabelAlignment) ?? ChordLabelAlignment.Along\n switch (nodeLabelAlignment) {\n case ChordLabelAlignment.Perpendicular: {\n return getColor(d.data, config.nodeColor, d.height)\n }\n case ChordLabelAlignment.Along: {\n const c = getColor(d.data, config.nodeColor, d.height)\n const colorParsed = color(c)\n const brightness = colorParsed ? hexToBrightness(colorParsed.hex()) : 0\n return brightness > 0.65 ? 'var(--vis-chord-diagram-label-text-fill-color-dark)' : 'var(--vis-chord-diagram-label-text-fill-color-bright)'\n }\n }\n}\n\nfunction getLabelTextAnchor<N extends ChordInputNode, L extends ChordInputLink> (\n d: ChordNode<N>,\n config: ChordDiagramConfig<N, L>\n): string | null {\n const nodeLabelAlignment = getValue(d.data, config.nodeLabelAlignment) ?? ChordLabelAlignment.Along\n switch (nodeLabelAlignment) {\n case ChordLabelAlignment.Perpendicular: {\n const angleCenter = (d.x0 + d.x1) / 2\n const angleDegree = angleCenter * 180 / Math.PI\n return angleDegree < 180 ? 'start' : 'end'\n }\n case ChordLabelAlignment.Along: {\n return null\n }\n }\n}\n\nfunction getLabelTransform<N extends ChordInputNode, L extends ChordInputLink> (\n d: ChordNode<N>,\n config: ChordDiagramConfig<N, L>,\n radiusScale: ScaleContinuousNumeric<number, number>\n): string | null {\n const nodeLabelAlignment = getValue(d.data, config.nodeLabelAlignment) ?? ChordLabelAlignment.Along\n switch (nodeLabelAlignment) {\n case ChordLabelAlignment.Perpendicular: {\n const r = radiusScale(d.y1) + LABEL_PADDING\n const angleCenter = (d.x0 + d.x1) / 2\n const angle = angleCenter - Math.PI / 2\n const x = r * Math.cos(angle)\n const y = r * Math.sin(angle)\n return `translate(${x}, ${y})`\n }\n case ChordLabelAlignment.Along:\n return null\n }\n}\n\nexport function createLabel<N extends ChordInputNode, L extends ChordInputLink> (\n selection: Selection<SVGGElement, ChordNode<N>, SVGGElement, unknown>,\n config: ChordDiagramConfig<N, L>,\n radiusScale: ScaleContinuousNumeric<number, number>\n): void {\n selection.style('opacity', 0)\n .attr('transform', d => getLabelTransform(d, config, radiusScale))\n\n selection.append('text')\n .attr('class', s.label)\n .style('fill', d => getColor(d.data, config.nodeColor, d.height))\n}\n\nexport function updateLabel<N extends ChordInputNode, L extends ChordInputLink> (\n selection: Selection<SVGGElement, ChordNode<N>, SVGGElement, unknown>,\n config: ChordDiagramConfig<N, L>,\n width: number,\n radiusScale: ScaleContinuousNumeric<number, number>,\n duration: number\n): void {\n const { nodeLabel, nodeLabelColor, nodeWidth } = config\n\n smartTransition(selection, duration)\n .attr('transform', d => getLabelTransform(d, config, radiusScale))\n .style('opacity', 1)\n\n const label: Selection<SVGTextElement, ChordNode<N>, SVGElement, unknown> = selection.select(`.${s.label}`)\n label.select('textPath').remove()\n label\n .text(d => getString(d.data, nodeLabel))\n .style('fill', d => getColor(d.data, nodeLabelColor) ?? getLabelFillColor(d, config))\n .style('text-anchor', d => getLabelTextAnchor(d, config))\n\n label.each((d: ChordNode<N>, i: number, elements) => {\n const nodeLabelAlignment = getValue(d.data, config.nodeLabelAlignment) ?? ChordLabelAlignment.Along\n const radianArcLength = d.x1 - d.x0 - getNumber(d, config.padAngle) * 2\n const radius = radiusScale(d.y1) - getNumber(d, config.nodeWidth) / 2\n const arcLength = radius * radianArcLength\n const maxWidth = (nodeLabelAlignment === ChordLabelAlignment.Along ? arcLength : width) - LABEL_PADDING * 2\n\n const textElementSelection = select(elements[i])\n trimSVGText(textElementSelection, maxWidth)\n textElementSelection\n .attr('dx', nodeLabelAlignment === ChordLabelAlignment.Along ? LABEL_PADDING : null)\n .attr('dy', nodeLabelAlignment === ChordLabelAlignment.Along ? getNumber(d.data, nodeWidth) / 2 : null)\n\n if (nodeLabelAlignment === ChordLabelAlignment.Along) {\n const textElement = select(elements[i])\n const textWidth = textElement.node().getBoundingClientRect().width\n const labelText = textElement.text()\n\n select(elements[i])\n .text('')\n .style('display', textWidth > maxWidth && 'none')\n\n select(elements[i]).append('textPath')\n .attr('href', `#${d.uid}`)\n .text(labelText)\n }\n })\n\n smartTransition(label, duration)\n .attr('transform', d => {\n const nodeLabelAlignment = getValue(d.data, config.nodeLabelAlignment)\n if (nodeLabelAlignment !== ChordLabelAlignment.Perpendicular) return null\n const angleCenter = (d.x0 + d.x1) / 2\n const angleDegree = angleCenter * 180 / Math.PI\n return `rotate(${angleDegree < 180 ? angleDegree - 90 : angleDegree + 90})`\n })\n}\n\nexport function removeLabel (\n selection: Selection<SVGGElement, unknown, SVGGElement, unknown>,\n duration: number\n): void {\n smartTransition(selection, duration)\n .style('opacity', 0)\n .remove()\n}\n"],"names":["s.label","label"],"mappings":"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"}
|
|
@@ -4,7 +4,6 @@ import { SeriesDataModel } from '../../data-models/series.js';
|
|
|
4
4
|
import { smartTransition } from '../../utils/d3.js';
|
|
5
5
|
import { getNumber, isNumber, clamp } from '../../utils/data.js';
|
|
6
6
|
import { wrapSVGText } from '../../utils/text.js';
|
|
7
|
-
import { VerticalAlign } from '../../types/text.js';
|
|
8
7
|
import { DonutConfig } from './config.js';
|
|
9
8
|
import { createArc, updateArc, removeArc } from './modules/arc.js';
|
|
10
9
|
import * as style from './style.js';
|
|
@@ -88,7 +87,7 @@ class Donut extends ComponentCore {
|
|
|
88
87
|
.attr('dy', config.centralLabel ? '0.55em' : null)
|
|
89
88
|
.text((_f = config.centralSubLabel) !== null && _f !== void 0 ? _f : null);
|
|
90
89
|
if (config.centralSubLabelWrap)
|
|
91
|
-
wrapSVGText(this.centralSubLabel,
|
|
90
|
+
wrapSVGText(this.centralSubLabel, innerRadius * 1.9);
|
|
92
91
|
// Background
|
|
93
92
|
this.arcBackground.attr('class', background)
|
|
94
93
|
.attr('visibility', config.showBackground ? null : 'hidden')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/donut/index.ts"],"sourcesContent":["import { Selection } from 'd3-selection'\nimport { pie, arc } from 'd3-shape'\n\n// Core\nimport { ComponentCore } from 'core/component'\nimport { SeriesDataModel } from 'data-models/series'\n\n// Utils\nimport { smartTransition } from 'utils/d3'\nimport { isNumber, clamp, getNumber } from 'utils/data'\nimport { wrapSVGText } from 'utils/text'\n\n// Types\nimport { Spacing } from 'types/spacing'\nimport { VerticalAlign } from 'types/text'\n\n// Local Types\nimport { DonutArcDatum, DonutArcAnimState, DonutDatum } from './types'\n\n// Config\nimport { DonutConfig, DonutConfigInterface } from './config'\n\n// Modules\nimport { createArc, updateArc, removeArc } from './modules/arc'\n\n// Styles\nimport * as s from './style'\n\nexport class Donut<Datum> extends ComponentCore<Datum[], DonutConfig<Datum>, DonutConfigInterface<Datum>> {\n static selectors = s\n config: DonutConfig<Datum> = new DonutConfig()\n datamodel: SeriesDataModel<Datum> = new SeriesDataModel()\n\n arcBackground: Selection<SVGPathElement, unknown, SVGGElement, unknown>\n arcGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n centralLabel: Selection<SVGTextElement, unknown, SVGGElement, unknown>\n centralSubLabel: Selection<SVGTextElement, unknown, SVGGElement, unknown>\n arcGen = arc<DonutArcAnimState>()\n\n events = {\n }\n\n constructor (config?: DonutConfigInterface<Datum>) {\n super()\n if (config) this.config.init(config)\n this.arcBackground = this.g.append('path')\n this.arcGroup = this.g.append('g')\n this.centralLabel = this.g.append('text')\n .attr('class', s.centralLabel)\n this.centralSubLabel = this.g.append('text')\n .attr('class', s.centralSubLabel)\n }\n\n get bleed (): Spacing {\n return { top: 0, bottom: 0, left: 0, right: 0 }\n }\n\n _render (customDuration?: number): void {\n const { config, datamodel, bleed } = this\n\n // Wrap data to preserve original indices\n const data: DonutDatum<Datum>[] = datamodel.data\n .map((d, i) => ({\n index: i,\n datum: d,\n }))\n .filter(d => config.showEmptySegments || getNumber(d.datum, config.value, d.index))\n\n const duration = isNumber(customDuration) ? customDuration : config.duration\n const outerRadius = config.radius || Math.min(this._width - bleed.left - bleed.right, this._height - bleed.top - bleed.bottom) / 2\n const innerRadius = config.arcWidth === 0 ? 0 : clamp(outerRadius - config.arcWidth, 0, outerRadius - 1)\n\n this.arcGen\n .startAngle(d => d.startAngle)\n .endAngle(d => d.endAngle)\n .innerRadius(d => d.innerRadius)\n .outerRadius(d => d.outerRadius)\n .padAngle(d => d.padAngle)\n .cornerRadius(config.cornerRadius)\n\n const pieGen = pie<DonutDatum<Datum>>()\n .startAngle(config.angleRange?.[0] ?? 0)\n .endAngle(config.angleRange?.[1] ?? 2 * Math.PI)\n .padAngle(config.padAngle)\n .value(d => getNumber(d.datum, config.value, d.index) || 0)\n .sort(config.sortFunction)\n\n this.arcGroup.attr('transform', `translate(${this._width / 2},${this._height / 2})`)\n\n const arcData: DonutArcDatum<Datum>[] = pieGen(data).map(d => {\n const arc = {\n ...d,\n data: d.data.datum,\n index: d.data.index,\n innerRadius,\n outerRadius,\n }\n\n if (config.showEmptySegments && d.endAngle - d.startAngle - d.padAngle <= Number.EPSILON) {\n arc.endAngle = d.startAngle + Math.max(config.emptySegmentAngle, config.padAngle)\n arc.padAngle = d.padAngle / 2\n }\n return arc\n })\n\n // Arc segments\n const arcsSelection = this.arcGroup\n .selectAll<SVGPathElement, DonutArcDatum<Datum>>(`.${s.segment}`)\n .data(arcData, (d: DonutArcDatum<Datum>) => config.id(d.data, d.index))\n\n const arcsEnter = arcsSelection.enter().append('path')\n .attr('class', s.segment)\n .call(createArc, config)\n\n const arcsMerged = arcsSelection.merge(arcsEnter)\n arcsMerged.call(updateArc, config, this.arcGen, duration)\n arcsMerged.sort((a, b) => b.value - a.value)\n\n arcsSelection.exit<DonutArcDatum<Datum>>()\n .attr('class', s.segmentExit)\n .call(removeArc, duration)\n\n // Label\n this.centralLabel\n .attr('transform', `translate(${this._width / 2},${this._height / 2})`)\n .attr('dy', config.centralSubLabel ? '-0.55em' : null)\n .text(config.centralLabel ?? null)\n\n this.centralSubLabel\n .attr('transform', `translate(${this._width / 2},${this._height / 2})`)\n .attr('dy', config.centralLabel ? '0.55em' : null)\n .text(config.centralSubLabel ?? null)\n\n if (config.centralSubLabelWrap) wrapSVGText(this.centralSubLabel, { width: innerRadius * 1.9, verticalAlign: VerticalAlign.Top })\n\n // Background\n this.arcBackground.attr('class', s.background)\n .attr('visibility', config.showBackground ? null : 'hidden')\n .attr('transform', `translate(${this._width / 2},${this._height / 2})`)\n\n smartTransition(this.arcBackground, duration)\n .attr('d', this.arcGen({\n startAngle: config.backgroundAngleRange?.[0] ?? config.angleRange?.[0] ?? 0,\n endAngle: config.backgroundAngleRange?.[1] ?? config.angleRange?.[1] ?? 2 * Math.PI,\n innerRadius,\n outerRadius,\n }))\n }\n}\n"],"names":["s.centralLabel","s.centralSubLabel","s.segment","s.segmentExit","s.background","s"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/donut/index.ts"],"sourcesContent":["import { Selection } from 'd3-selection'\nimport { pie, arc } from 'd3-shape'\n\n// Core\nimport { ComponentCore } from 'core/component'\nimport { SeriesDataModel } from 'data-models/series'\n\n// Utils\nimport { smartTransition } from 'utils/d3'\nimport { isNumber, clamp, getNumber } from 'utils/data'\nimport { wrapSVGText } from 'utils/text'\n\n// Types\nimport { Spacing } from 'types/spacing'\n\n// Local Types\nimport { DonutArcDatum, DonutArcAnimState, DonutDatum } from './types'\n\n// Config\nimport { DonutConfig, DonutConfigInterface } from './config'\n\n// Modules\nimport { createArc, updateArc, removeArc } from './modules/arc'\n\n// Styles\nimport * as s from './style'\n\nexport class Donut<Datum> extends ComponentCore<Datum[], DonutConfig<Datum>, DonutConfigInterface<Datum>> {\n static selectors = s\n config: DonutConfig<Datum> = new DonutConfig()\n datamodel: SeriesDataModel<Datum> = new SeriesDataModel()\n\n arcBackground: Selection<SVGPathElement, unknown, SVGGElement, unknown>\n arcGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n centralLabel: Selection<SVGTextElement, unknown, SVGGElement, unknown>\n centralSubLabel: Selection<SVGTextElement, unknown, SVGGElement, unknown>\n arcGen = arc<DonutArcAnimState>()\n\n events = {\n }\n\n constructor (config?: DonutConfigInterface<Datum>) {\n super()\n if (config) this.config.init(config)\n this.arcBackground = this.g.append('path')\n this.arcGroup = this.g.append('g')\n this.centralLabel = this.g.append('text')\n .attr('class', s.centralLabel)\n this.centralSubLabel = this.g.append('text')\n .attr('class', s.centralSubLabel)\n }\n\n get bleed (): Spacing {\n return { top: 0, bottom: 0, left: 0, right: 0 }\n }\n\n _render (customDuration?: number): void {\n const { config, datamodel, bleed } = this\n\n // Wrap data to preserve original indices\n const data: DonutDatum<Datum>[] = datamodel.data\n .map((d, i) => ({\n index: i,\n datum: d,\n }))\n .filter(d => config.showEmptySegments || getNumber(d.datum, config.value, d.index))\n\n const duration = isNumber(customDuration) ? customDuration : config.duration\n const outerRadius = config.radius || Math.min(this._width - bleed.left - bleed.right, this._height - bleed.top - bleed.bottom) / 2\n const innerRadius = config.arcWidth === 0 ? 0 : clamp(outerRadius - config.arcWidth, 0, outerRadius - 1)\n\n this.arcGen\n .startAngle(d => d.startAngle)\n .endAngle(d => d.endAngle)\n .innerRadius(d => d.innerRadius)\n .outerRadius(d => d.outerRadius)\n .padAngle(d => d.padAngle)\n .cornerRadius(config.cornerRadius)\n\n const pieGen = pie<DonutDatum<Datum>>()\n .startAngle(config.angleRange?.[0] ?? 0)\n .endAngle(config.angleRange?.[1] ?? 2 * Math.PI)\n .padAngle(config.padAngle)\n .value(d => getNumber(d.datum, config.value, d.index) || 0)\n .sort(config.sortFunction)\n\n this.arcGroup.attr('transform', `translate(${this._width / 2},${this._height / 2})`)\n\n const arcData: DonutArcDatum<Datum>[] = pieGen(data).map(d => {\n const arc = {\n ...d,\n data: d.data.datum,\n index: d.data.index,\n innerRadius,\n outerRadius,\n }\n\n if (config.showEmptySegments && d.endAngle - d.startAngle - d.padAngle <= Number.EPSILON) {\n arc.endAngle = d.startAngle + Math.max(config.emptySegmentAngle, config.padAngle)\n arc.padAngle = d.padAngle / 2\n }\n return arc\n })\n\n // Arc segments\n const arcsSelection = this.arcGroup\n .selectAll<SVGPathElement, DonutArcDatum<Datum>>(`.${s.segment}`)\n .data(arcData, (d: DonutArcDatum<Datum>) => config.id(d.data, d.index))\n\n const arcsEnter = arcsSelection.enter().append('path')\n .attr('class', s.segment)\n .call(createArc, config)\n\n const arcsMerged = arcsSelection.merge(arcsEnter)\n arcsMerged.call(updateArc, config, this.arcGen, duration)\n arcsMerged.sort((a, b) => b.value - a.value)\n\n arcsSelection.exit<DonutArcDatum<Datum>>()\n .attr('class', s.segmentExit)\n .call(removeArc, duration)\n\n // Label\n this.centralLabel\n .attr('transform', `translate(${this._width / 2},${this._height / 2})`)\n .attr('dy', config.centralSubLabel ? '-0.55em' : null)\n .text(config.centralLabel ?? null)\n\n this.centralSubLabel\n .attr('transform', `translate(${this._width / 2},${this._height / 2})`)\n .attr('dy', config.centralLabel ? '0.55em' : null)\n .text(config.centralSubLabel ?? null)\n\n if (config.centralSubLabelWrap) wrapSVGText(this.centralSubLabel, innerRadius * 1.9)\n\n // Background\n this.arcBackground.attr('class', s.background)\n .attr('visibility', config.showBackground ? null : 'hidden')\n .attr('transform', `translate(${this._width / 2},${this._height / 2})`)\n\n smartTransition(this.arcBackground, duration)\n .attr('d', this.arcGen({\n startAngle: config.backgroundAngleRange?.[0] ?? config.angleRange?.[0] ?? 0,\n endAngle: config.backgroundAngleRange?.[1] ?? config.angleRange?.[1] ?? 2 * Math.PI,\n innerRadius,\n outerRadius,\n }))\n }\n}\n"],"names":["s.centralLabel","s.centralSubLabel","s.segment","s.segmentExit","s.background","s"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { css, injectGlobal } from '@emotion/css';
|
|
2
|
-
import {
|
|
2
|
+
import { UNOVIS_ICON_FONT_FAMILY_DEFAULT } from '../../styles/index.js';
|
|
3
3
|
|
|
4
4
|
const root = css `
|
|
5
5
|
label: flow-legend-component;
|
|
@@ -78,7 +78,7 @@ const label = (labelFontSize, labelColor) => css `
|
|
|
78
78
|
const arrow = (arrowColor) => css `
|
|
79
79
|
label: arrow;
|
|
80
80
|
|
|
81
|
-
font-family: var(--vis-flow-legend-arrow-font-family, ${
|
|
81
|
+
font-family: var(--vis-flow-legend-arrow-font-family, ${UNOVIS_ICON_FONT_FAMILY_DEFAULT});
|
|
82
82
|
font-size: 9px;
|
|
83
83
|
vertical-align: middle;
|
|
84
84
|
color: ${arrowColor || 'var(--vis-flow-legend-arrow-color)'};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.js","sources":["../../../src/components/flow-legend/style.ts"],"sourcesContent":["import { css, injectGlobal } from '@emotion/css'\nimport {
|
|
1
|
+
{"version":3,"file":"style.js","sources":["../../../src/components/flow-legend/style.ts"],"sourcesContent":["import { css, injectGlobal } from '@emotion/css'\nimport { UNOVIS_ICON_FONT_FAMILY_DEFAULT } from 'styles/index'\n\nexport const root = css`\n label: flow-legend-component;\n\n position: relative;\n user-select: none;\n`\n\nexport const globalStyles = injectGlobal`\n :root {\n --vis-flow-legend-label-background: #ffffff;\n --vis-flow-legend-label-color: #71788a;\n --vis-flow-legend-link-color: #E5E9F7;\n --vis-flow-legend-arrow-color: #E5E9F7;\n --vis-flow-legend-label-padding: 5px 15px;\n --vis-flow-legend-arrow-padding: 0 10px;\n /* --vis-flow-legend-arrow-font-family: Undefined by default to allow proper fallback to var(DEFAULT_ICON_FONT_FAMILY)*/\n\n --vis-dark-flow-legend-label-background: #292b34;\n --vis-dark-flow-legend-label-color: #E5E9F7;\n --vis-dark-flow-legend-link-color: #71788a;\n --vis-dark-flow-legend-arrow-color: #71788a;\n }\n\n body.theme-dark ${`.${root}`} {\n --vis-flow-legend-label-background: var(--vis-dark-flow-legend-label-background);\n --vis-flow-legend-label-color: var(--vis-dark-flow-legend-label-color);\n --vis-flow-legend-link-color: var(--vis-dark-flow-legend-link-color);\n --vis-flow-legend-arrow-color: var(--vis-dark-flow-legend-arrow-color);\n }\n`\n\nexport const line = (lineColor: string): string => css`\n label: line;\n\n height: 2px;\n width: 100%;\n background-color: ${lineColor || 'var(--vis-flow-legend-link-color)'};\n position: absolute;\n top: 50%;\n`\n\nexport const labels = css`\n label: labels;\n\n position: relative;\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n`\n\nexport const item = css`\n label: item;\n\n position: relative;\n max-width: 50px;\n\n padding: 10px;\n`\n\nexport const clickable = css`\n cursor: pointer;\n\n &:hover {\n text-decoration: underline;\n }\n`\n\nexport const label = (labelFontSize: number, labelColor: string): string => css`\n label: label;\n\n transform: translate(-50%, 0%);\n margin-left: 7px;\n background-color: var(--vis-flow-legend-label-background);\n padding: var(--vis-flow-legend-label-padding);\n font-size: ${labelFontSize}px;\n color: ${labelColor || 'var(--vis-flow-legend-label-color)'};\n display: inline-table;\n text-align: center;\n`\n\nexport const arrow = (arrowColor: string): string => css`\n label: arrow;\n\n font-family: var(--vis-flow-legend-arrow-font-family, ${UNOVIS_ICON_FONT_FAMILY_DEFAULT});\n font-size: 9px;\n vertical-align: middle;\n color: ${arrowColor || 'var(--vis-flow-legend-arrow-color)'};\n background-color: var(--vis-flow-legend-label-background);\n padding: var(--vis-flow-legend-arrow-padding);\n transform: translate(-25%, 0%);\n display: inline-table;\n text-align: center;\n`\n"],"names":[],"mappings":";;;AAGO,MAAM,IAAI,GAAG,GAAG,CAAA,CAAA;;;;;EAKtB;AAEM,MAAM,YAAY,GAAG,YAAY,CAAA,CAAA;;;;;;;;;;;;;;;;AAgBpB,kBAAA,EAAA,CAAA,CAAA,EAAI,IAAI,CAAE,CAAA,CAAA;;;;;;EAM7B;AAEY,MAAA,IAAI,GAAG,CAAC,SAAiB,KAAa,GAAG,CAAA,CAAA;;;;;AAKhC,oBAAA,EAAA,SAAS,IAAI,mCAAmC,CAAA;;;EAGrE;AAEM,MAAM,MAAM,GAAG,GAAG,CAAA,CAAA;;;;;;;;EAQxB;AAEM,MAAM,IAAI,GAAG,GAAG,CAAA,CAAA;;;;;;;EAOtB;AAEM,MAAM,SAAS,GAAG,GAAG,CAAA,CAAA;;;;;;EAM3B;AAEM,MAAM,KAAK,GAAG,CAAC,aAAqB,EAAE,UAAkB,KAAa,GAAG,CAAA,CAAA;;;;;;;eAOhE,aAAa,CAAA;AACjB,SAAA,EAAA,UAAU,IAAI,oCAAoC,CAAA;;;EAG5D;AAEY,MAAA,KAAK,GAAG,CAAC,UAAkB,KAAa,GAAG,CAAA,CAAA;;;0DAGE,+BAA+B,CAAA;;;AAG9E,SAAA,EAAA,UAAU,IAAI,oCAAoC,CAAA;;;;;;;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { select } from 'd3-selection';
|
|
2
2
|
import { arc } from 'd3-shape';
|
|
3
|
-
import {
|
|
3
|
+
import { trimString } from '../../../../utils/text.js';
|
|
4
4
|
import { polygon } from '../../../../utils/path.js';
|
|
5
5
|
import { smartTransition } from '../../../../utils/d3.js';
|
|
6
6
|
import { getValue, getNumber, getString, getBoolean, throttle } from '../../../../utils/data.js';
|
|
@@ -179,10 +179,10 @@ function updateNodes(selection, config, duration, scale = 1) {
|
|
|
179
179
|
const labelText$1 = getString(d, nodeLabel, d._index);
|
|
180
180
|
const sublabelText = getString(d, nodeSubLabel, d._index);
|
|
181
181
|
const labelTextTrimmed = getBoolean(d, nodeLabelTrim, d._index)
|
|
182
|
-
?
|
|
182
|
+
? trimString(labelText$1, getNumber(d, nodeLabelTrimLength, d._index), getValue(d, nodeLabelTrimMode, d._index))
|
|
183
183
|
: labelText$1;
|
|
184
184
|
const sublabelTextTrimmed = getBoolean(d, nodeSubLabelTrim, d._index)
|
|
185
|
-
?
|
|
185
|
+
? trimString(sublabelText, getNumber(d, nodeSubLabelTrimLength, d._index), getValue(d, nodeSubLabelTrimMode, d._index))
|
|
186
186
|
: sublabelText;
|
|
187
187
|
labelTextContent$1.text(labelTextTrimmed);
|
|
188
188
|
sublabelTextContent.text(sublabelTextTrimmed);
|