@unovis/ts 1.4.2-beta.0 → 1.5.0-alpha.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.
- package/components/axis/config.d.ts +2 -0
- package/components/axis/config.js.map +1 -1
- package/components/axis/index.js +16 -17
- package/components/axis/index.js.map +1 -1
- package/components/brush/index.js +4 -4
- package/components/brush/index.js.map +1 -1
- package/components/brush/style.d.ts +44 -1
- package/components/brush/style.js +39 -32
- package/components/brush/style.js.map +1 -1
- package/components/graph/config.d.ts +10 -13
- package/components/graph/config.js +2 -2
- package/components/graph/config.js.map +1 -1
- package/components/graph/index.d.ts +3 -13
- package/components/graph/index.js +63 -173
- package/components/graph/index.js.map +1 -1
- package/components/graph/modules/layout.js +14 -6
- package/components/graph/modules/layout.js.map +1 -1
- package/components/graph/modules/node/index.d.ts +4 -3
- package/components/graph/modules/node/index.js +62 -34
- package/components/graph/modules/node/index.js.map +1 -1
- package/components/graph/modules/node/style.d.ts +0 -2
- package/components/graph/modules/node/style.js +4 -34
- package/components/graph/modules/node/style.js.map +1 -1
- package/components/graph/style.d.ts +0 -1
- package/components/graph/style.js +1 -22
- package/components/graph/style.js.map +1 -1
- package/components/graph/types.d.ts +0 -1
- package/components/graph/types.js.map +1 -1
- package/components/tooltip/config.d.ts +7 -1
- package/components/tooltip/config.js +2 -0
- package/components/tooltip/config.js.map +1 -1
- package/components/tooltip/index.d.ts +9 -1
- package/components/tooltip/index.js +139 -41
- package/components/tooltip/index.js.map +1 -1
- package/components/tooltip/style.d.ts +1 -1
- package/components/tooltip/style.js +25 -25
- package/components/tooltip/style.js.map +1 -1
- package/data-models/graph.d.ts +0 -2
- package/data-models/graph.js +0 -6
- package/data-models/graph.js.map +1 -1
- package/index.d.ts +2 -0
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/types/text.d.ts +2 -0
- package/types/text.js.map +1 -1
- package/utils/text.d.ts +1 -1
- package/utils/text.js +27 -15
- package/utils/text.js.map +1 -1
|
@@ -47,6 +47,8 @@ export interface AxisConfigInterface<Datum> extends Partial<XYComponentConfigInt
|
|
|
47
47
|
tickTextAlign?: TextAlign | string;
|
|
48
48
|
/** Font color of the tick text as CSS string. Default: `null` */
|
|
49
49
|
tickTextColor?: string | null;
|
|
50
|
+
/** Text rotation angle for ticks. Default: `undefined` */
|
|
51
|
+
tickTextAngle?: number;
|
|
50
52
|
/** The spacing in pixels between the tick and it's label. Default: `8` */
|
|
51
53
|
tickPadding?: number;
|
|
52
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sources":["../../../src/components/axis/config.ts"],"sourcesContent":["import { XYComponentConfigInterface, XYComponentDefaultConfig } 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 /** Font color of the axis label as CSS string. Default: `null` */\n labelColor?: string | null;\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 | Date, i: number, ticks: number[] | 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: `undefined` */\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 /** Font color of the tick text as CSS string. Default: `null` */\n tickTextColor?: string | null;\n /** The spacing in pixels between the tick and it's label. Default: `8` */\n tickPadding?: number;\n}\n\nexport const AxisDefaultConfig: AxisConfigInterface<unknown> = {\n ...XYComponentDefaultConfig,\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: undefined,\n tickTextForceWordBreak: false,\n tickTextTrimType: TrimMode.Middle,\n tickTextFitMode: FitMode.Wrap,\n tickTextFontSize: null,\n tickTextAlign: undefined,\n tickTextColor: null,\n labelMargin: 8,\n labelColor: null,\n tickFormat: undefined,\n tickValues: undefined,\n fullSize: true,\n tickPadding: 8,\n}\n"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../../src/components/axis/config.ts"],"sourcesContent":["import { XYComponentConfigInterface, XYComponentDefaultConfig } 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 /** Font color of the axis label as CSS string. Default: `null` */\n labelColor?: string | null;\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 | Date, i: number, ticks: number[] | 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: `undefined` */\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 /** Font color of the tick text as CSS string. Default: `null` */\n tickTextColor?: string | null;\n /** Text rotation angle for ticks. Default: `undefined` */\n tickTextAngle?: number;\n /** The spacing in pixels between the tick and it's label. Default: `8` */\n tickPadding?: number;\n}\n\nexport const AxisDefaultConfig: AxisConfigInterface<unknown> = {\n ...XYComponentDefaultConfig,\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: undefined,\n tickTextForceWordBreak: false,\n tickTextTrimType: TrimMode.Middle,\n tickTextFitMode: FitMode.Wrap,\n tickTextFontSize: null,\n tickTextAlign: undefined,\n tickTextColor: null,\n labelMargin: 8,\n labelColor: null,\n tickFormat: undefined,\n tickValues: undefined,\n fullSize: true,\n tickPadding: 8,\n}\n"],"names":[],"mappings":";;;MA2Da,iBAAiB,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACzB,wBAAwB,CAC3B,EAAA,EAAA,QAAQ,EAAE,SAAS,EACnB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,IAAI,EACnB,QAAQ,EAAE,IAAI,EACd,QAAQ,EAAE,IAAI,EACd,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,SAAS,EACnB,eAAe,EAAE,KAAK,EACtB,aAAa,EAAE,SAAS,EACxB,iBAAiB,EAAE,SAAS,EAC5B,sBAAsB,EAAE,KAAK,EAC7B,gBAAgB,EAAE,QAAQ,CAAC,MAAM,EACjC,eAAe,EAAE,OAAO,CAAC,IAAI,EAC7B,gBAAgB,EAAE,IAAI,EACtB,aAAa,EAAE,SAAS,EACxB,aAAa,EAAE,IAAI,EACnB,WAAW,EAAE,CAAC,EACd,UAAU,EAAE,IAAI,EAChB,UAAU,EAAE,SAAS,EACrB,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,IAAI,EACd,WAAW,EAAE,CAAC,EAAA;;;;"}
|
package/components/axis/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import { interrupt } from 'd3-transition';
|
|
|
3
3
|
import { axisLeft, axisRight, axisBottom, axisTop } from 'd3-axis';
|
|
4
4
|
import { XYComponentCore } from '../../core/xy-component/index.js';
|
|
5
5
|
import { Position } from '../../types/position.js';
|
|
6
|
-
import {
|
|
6
|
+
import { VerticalAlign, FitMode, TextAlign } from '../../types/text.js';
|
|
7
7
|
import { smartTransition } from '../../utils/d3.js';
|
|
8
8
|
import { trimSVGText, renderTextToSvgTextElement } from '../../utils/text.js';
|
|
9
9
|
import { isEqual } from '../../utils/data.js';
|
|
@@ -174,26 +174,26 @@ class Axis extends XYComponentCore {
|
|
|
174
174
|
tickText.nodes().forEach(node => interrupt(node));
|
|
175
175
|
tickText.each((value, i, elements) => {
|
|
176
176
|
var _a, _b;
|
|
177
|
-
|
|
177
|
+
let text = (_b = (_a = config.tickFormat) === null || _a === void 0 ? void 0 : _a.call(config, value, i, tickValues)) !== null && _b !== void 0 ? _b : `${value}`;
|
|
178
178
|
const textElement = elements[i];
|
|
179
179
|
const textMaxWidth = config.tickTextWidth || (config.type === AxisType.X ? this._containerWidth / (ticks.size() + 1) : this._containerWidth / 5);
|
|
180
180
|
const styleDeclaration = getComputedStyle(textElement);
|
|
181
181
|
const fontSize = Number.parseFloat(styleDeclaration.fontSize);
|
|
182
182
|
const fontFamily = styleDeclaration.fontFamily;
|
|
183
|
+
const textOptions = {
|
|
184
|
+
verticalAlign: config.type === AxisType.X ? VerticalAlign.Top : VerticalAlign.Middle,
|
|
185
|
+
width: textMaxWidth,
|
|
186
|
+
textRotationAngle: config.tickTextAngle,
|
|
187
|
+
separator: config.tickTextSeparator,
|
|
188
|
+
wordBreak: config.tickTextForceWordBreak,
|
|
189
|
+
};
|
|
183
190
|
if (config.tickTextFitMode === FitMode.Trim) {
|
|
184
191
|
const textElementSelection = select(textElement).text(text);
|
|
185
192
|
trimSVGText(textElementSelection, textMaxWidth, config.tickTextTrimType, true, fontSize, 0.58);
|
|
193
|
+
text = select(textElement).text();
|
|
186
194
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
const textOptions = {
|
|
190
|
-
verticalAlign: config.type === AxisType.X ? VerticalAlign.Top : VerticalAlign.Middle,
|
|
191
|
-
width: textMaxWidth,
|
|
192
|
-
separator: config.tickTextSeparator,
|
|
193
|
-
wordBreak: config.tickTextForceWordBreak,
|
|
194
|
-
};
|
|
195
|
-
renderTextToSvgTextElement(textElement, textBlock, textOptions);
|
|
196
|
-
}
|
|
195
|
+
const textBlock = { text, fontFamily, fontSize };
|
|
196
|
+
renderTextToSvgTextElement(textElement, textBlock, textOptions);
|
|
197
197
|
});
|
|
198
198
|
selection
|
|
199
199
|
.classed(axis, true)
|
|
@@ -253,14 +253,13 @@ class Axis extends XYComponentCore {
|
|
|
253
253
|
const offsetY = type === AxisType.X ? Math.pow((-1), (+(axisPosition === Position.Top))) * axisHeight : this._height / 2;
|
|
254
254
|
const marginX = type === AxisType.X ? 0 : Math.pow((-1), (+(axisPosition === Position.Left))) * labelMargin;
|
|
255
255
|
const marginY = type === AxisType.X ? Math.pow((-1), (+(axisPosition === Position.Top))) * labelMargin : 0;
|
|
256
|
-
const rotation = type === AxisType.Y ? -90 : 0;
|
|
257
256
|
// Append new label
|
|
258
257
|
selection
|
|
259
258
|
.append('text')
|
|
260
259
|
.attr('class', label)
|
|
261
260
|
.text(label$1)
|
|
262
261
|
.attr('dy', `${this._getLabelDY()}em`)
|
|
263
|
-
.attr('transform', `translate(${offsetX + marginX},${offsetY + marginY})
|
|
262
|
+
.attr('transform', `translate(${offsetX + marginX},${offsetY + marginY})`)
|
|
264
263
|
.style('font-size', labelFontSize)
|
|
265
264
|
.style('fill', this.config.labelColor);
|
|
266
265
|
}
|
|
@@ -282,15 +281,15 @@ class Axis extends XYComponentCore {
|
|
|
282
281
|
}
|
|
283
282
|
}
|
|
284
283
|
_alignTickLabels() {
|
|
285
|
-
const { config: { type, tickTextAlign, position } } = this;
|
|
284
|
+
const { config: { type, tickTextAlign, tickTextAngle, position } } = this;
|
|
286
285
|
const tickText = this.g.selectAll('g.tick > text');
|
|
287
286
|
const textAnchor = this._getTickTextAnchor(tickTextAlign);
|
|
288
287
|
const translateX = type === AxisType.X
|
|
289
288
|
? 0
|
|
290
289
|
: this._getYTickTextTranslate(tickTextAlign, position);
|
|
291
290
|
tickText
|
|
292
|
-
.attr('
|
|
293
|
-
.attr('
|
|
291
|
+
.attr('transform', `translate(${translateX},0) rotate(${tickTextAngle})`)
|
|
292
|
+
.attr('text-anchor', textAnchor);
|
|
294
293
|
}
|
|
295
294
|
_getTickTextAnchor(textAlign) {
|
|
296
295
|
switch (textAlign) {
|
|
@@ -1 +1 @@
|
|
|
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 { ContinuousScale } from 'types/scale'\nimport { Spacing } from 'types/spacing'\nimport { FitMode, TextAlign, TrimMode, UnovisText, UnovisTextOptions, VerticalAlign } from 'types/text'\n\n// Utils\nimport { smartTransition } from 'utils/d3'\nimport { renderTextToSvgTextElement, trimSVGText } from 'utils/text'\nimport { isEqual } from 'utils/data'\n\n// Local Types\nimport { AxisType } from './types'\n\n// Config\nimport { AxisDefaultConfig, AxisConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\nexport class Axis<Datum> extends XYComponentCore<Datum, AxisConfigInterface<Datum>> {\n static selectors = s\n protected _defaultConfig: AxisConfigInterface<Datum> = AxisDefaultConfig\n public config: AxisConfigInterface<Datum> = this._defaultConfig\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.setConfig(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 const tickValues: (number[] | Date[]) = this._getConfiguredTickValues() || axisGen.scale<ContinuousScale>().ticks(this._getNumTicks())\n axisGen.tickValues(tickValues)\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\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 tickText = selection.selectAll<SVGTextElement, number | Date>('g.tick > text')\n .filter(tickValue => tickValues.some((t: number | Date) => isEqual(tickValue, t))) // We use isEqual to compare Dates\n .classed(s.tickLabel, true)\n .style('fill', config.tickTextColor) as Selection<SVGTextElement, number, SVGGElement, unknown> | Selection<SVGTextElement, Date, SVGGElement, unknown>\n\n\n // We interrupt the transition on tick's <text> to make it 'wrappable'\n tickText.nodes().forEach(node => interrupt(node))\n\n tickText.each((value: number | Date, i: number, elements: ArrayLike<SVGTextElement>) => {\n const text = config.tickFormat?.(value, i, tickValues) ?? `${value}`\n const textElement = elements[i] as SVGTextElement\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<SVGTextElement, string>(textElement).text(text)\n trimSVGText(textElementSelection, textMaxWidth, config.tickTextTrimType as TrimMode, 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 separator: config.tickTextSeparator,\n wordBreak: config.tickTextForceWordBreak,\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() as [number, number]\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 .attr('dy', `${this._getLabelDY()}em`)\n .attr('transform', `translate(${offsetX + marginX},${offsetY + marginY}) rotate(${rotation})`)\n .style('font-size', labelFontSize)\n .style('fill', this.config.labelColor)\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 as TextAlign)\n const translateX = type === AxisType.X\n ? 0\n : this._getYTickTextTranslate(tickTextAlign as TextAlign, position as 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.tickLabel","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 { ContinuousScale } from 'types/scale'\nimport { Spacing } from 'types/spacing'\nimport { FitMode, TextAlign, TrimMode, UnovisText, UnovisTextOptions, VerticalAlign } from 'types/text'\n\n// Utils\nimport { smartTransition } from 'utils/d3'\nimport { renderTextToSvgTextElement, trimSVGText } from 'utils/text'\nimport { isEqual } from 'utils/data'\n\n// Local Types\nimport { AxisType } from './types'\n\n// Config\nimport { AxisDefaultConfig, AxisConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\nexport class Axis<Datum> extends XYComponentCore<Datum, AxisConfigInterface<Datum>> {\n static selectors = s\n protected _defaultConfig: AxisConfigInterface<Datum> = AxisDefaultConfig\n public config: AxisConfigInterface<Datum> = this._defaultConfig\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.setConfig(config)\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 const tickValues: (number[] | Date[]) = this._getConfiguredTickValues() || axisGen.scale<ContinuousScale>().ticks(this._getNumTicks())\n axisGen.tickValues(tickValues)\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\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 tickText = selection.selectAll<SVGTextElement, number | Date>('g.tick > text')\n .filter(tickValue => tickValues.some((t: number | Date) => isEqual(tickValue, t))) // We use isEqual to compare Dates\n .classed(s.tickLabel, true)\n .style('fill', config.tickTextColor) as Selection<SVGTextElement, number, SVGGElement, unknown> | Selection<SVGTextElement, Date, SVGGElement, unknown>\n\n\n // We interrupt the transition on tick's <text> to make it 'wrappable'\n tickText.nodes().forEach(node => interrupt(node))\n\n tickText.each((value: number | Date, i: number, elements: ArrayLike<SVGTextElement>) => {\n let text = config.tickFormat?.(value, i, tickValues) ?? `${value}`\n const textElement = elements[i] as SVGTextElement\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 const textOptions: UnovisTextOptions = {\n verticalAlign: config.type === AxisType.X ? VerticalAlign.Top : VerticalAlign.Middle,\n width: textMaxWidth,\n textRotationAngle: config.tickTextAngle,\n separator: config.tickTextSeparator,\n wordBreak: config.tickTextForceWordBreak,\n }\n\n if (config.tickTextFitMode === FitMode.Trim) {\n const textElementSelection = select<SVGTextElement, string>(textElement).text(text)\n trimSVGText(textElementSelection, textMaxWidth, config.tickTextTrimType as TrimMode, true, fontSize, 0.58)\n text = select<SVGTextElement, string>(textElement).text()\n }\n\n const textBlock: UnovisText = { text, fontFamily, fontSize }\n renderTextToSvgTextElement(textElement, textBlock, textOptions)\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() as [number, number]\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 // Append new label\n selection\n .append('text')\n .attr('class', s.label)\n .text(label)\n .attr('dy', `${this._getLabelDY()}em`)\n .attr('transform', `translate(${offsetX + marginX},${offsetY + marginY})`)\n .style('font-size', labelFontSize)\n .style('fill', this.config.labelColor)\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, tickTextAngle, position } } = this\n const tickText = this.g.selectAll('g.tick > text')\n\n const textAnchor = this._getTickTextAnchor(tickTextAlign as TextAlign)\n const translateX = type === AxisType.X\n ? 0\n : this._getYTickTextTranslate(tickTextAlign as TextAlign, position as Position)\n\n tickText\n .attr('transform', `translate(${translateX},0) rotate(${tickTextAngle})`)\n .attr('text-anchor', textAnchor)\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.tickLabel","s.axis","s.hideTickLine","s.hideDomain","label","s.label","s"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { Arrangement } from '../../types/position.js';
|
|
|
6
6
|
import { BrushDefaultConfig } from './config.js';
|
|
7
7
|
import { BrushDirection } from './types.js';
|
|
8
8
|
import * as style from './style.js';
|
|
9
|
-
import {
|
|
9
|
+
import { unselected, brush, handleLine } from './style.js';
|
|
10
10
|
|
|
11
11
|
class Brush extends XYComponentCore {
|
|
12
12
|
constructor(config) {
|
|
@@ -22,15 +22,15 @@ class Brush extends XYComponentCore {
|
|
|
22
22
|
this._firstRender = true;
|
|
23
23
|
if (config)
|
|
24
24
|
this.setConfig(config);
|
|
25
|
-
this.brush = this.g
|
|
26
|
-
.append('g')
|
|
27
|
-
.attr('class', brush);
|
|
28
25
|
const directions = [{ type: BrushDirection.West }, { type: BrushDirection.East }];
|
|
29
26
|
this.unselectedRange = this.g
|
|
30
27
|
.selectAll(`.${unselected}`)
|
|
31
28
|
.data(directions)
|
|
32
29
|
.enter().append('rect')
|
|
33
30
|
.attr('class', unselected);
|
|
31
|
+
this.brush = this.g
|
|
32
|
+
.append('g')
|
|
33
|
+
.attr('class', brush);
|
|
34
34
|
this.handleLines = this.g
|
|
35
35
|
.selectAll(`.${handleLine}`)
|
|
36
36
|
.data(directions)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/brush/index.ts"],"sourcesContent":["import { BrushBehavior, brushX, D3BrushEvent } from 'd3-brush'\nimport { Selection } from 'd3-selection'\n\n// Core\nimport { XYComponentCore } from 'core/xy-component'\n\n// Utils\nimport { isNumber, clamp } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\n\n// Types\nimport { Arrangement } from 'types/position'\n\n// Config\nimport { BrushDefaultConfig, BrushConfigInterface } from './config'\n\n// Local Types\nimport { BrushDirection, BrushHandleType } from './types'\n\n// Styles\nimport * as s from './style'\n\nexport class Brush<Datum> extends XYComponentCore<Datum, BrushConfigInterface<Datum>> {\n static selectors = s\n protected _defaultConfig = BrushDefaultConfig as BrushConfigInterface<Datum>\n clippable = false // Don't apply clipping path to this component. See XYContainer\n public config: BrushConfigInterface<Datum> = this._defaultConfig\n brush: Selection<SVGGElement, unknown, SVGGElement, unknown>\n unselectedRange: Selection<SVGRectElement, BrushHandleType, SVGGElement, unknown>\n handleLines: Selection<SVGLineElement, BrushHandleType, SVGGElement, unknown>\n brushBehaviour: BrushBehavior<unknown> = brushX()\n events = {\n [Brush.selectors.brush]: {},\n }\n\n private _selection: [number, number] | null = null\n private _firstRender = true\n\n constructor (config?: BrushConfigInterface<Datum>) {\n super()\n if (config) this.setConfig(config)\n\n this.brush = this.g\n .append('g')\n .attr('class', s.brush)\n\n const directions: BrushHandleType[] = [{ type: BrushDirection.West }, { type: BrushDirection.East }]\n this.unselectedRange = this.g\n .selectAll(`.${s.unselected}`)\n .data(directions)\n .enter().append('rect')\n .attr('class', s.unselected)\n\n this.handleLines = this.g\n .selectAll(`.${s.handleLine}`)\n .data(directions)\n .enter().append('line')\n .attr('class', s.handleLine)\n }\n\n _render (customDuration?: number): void {\n const { brushBehaviour, config } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n const xScale = this.xScale\n\n brushBehaviour\n .extent([[0, 0], [this._width, this._height]])\n .on('start', this._onBrushStart.bind(this))\n .on('brush', this._onBrushMove.bind(this))\n .on('end', this._onBrushEnd.bind(this))\n\n this.brush\n .call(brushBehaviour)\n .classed('non-draggable', !config.draggable)\n\n const yRange = [this._height, 0]\n const h = yRange[0] - yRange[1]\n\n this.g.selectAll('.handle')\n .attr('y', yRange[1])\n .attr('height', h)\n\n this.unselectedRange\n .attr('y', yRange[1])\n .attr('height', h)\n\n this.handleLines\n .attr('y1', yRange[1] + 10)\n .attr('y2', yRange[1] + h - 10)\n\n // We save the X scale range and set it to the available horizontal space to calculate the selection range in pixels correctly\n const xRange = [0, this._width]\n const xScaleRange = xScale.range()\n xScale.range(xRange)\n const selectionMin = clamp(xScale((config.selection || this._selection)?.[0]) ?? 0, xRange[0], xRange[1])\n const selectionMax = clamp(xScale((config.selection || this._selection)?.[1]) ?? 0, xRange[0], xRange[1])\n xScale.range(xScaleRange) // Restore the X scale range\n\n const selectionLength = selectionMax - selectionMin\n const brushRange = (selectionLength ? [selectionMin, selectionMax] : xRange) as [number, number]\n this._positionHandles(brushRange)\n\n smartTransition(this.brush, duration)\n .call(brushBehaviour.move, brushRange) // Sets up the brush and calls brush events\n .on('end interrupt', () => { this._firstRender = false })\n // We track the first render to not trigger user events on component initialization\n if (!duration) this._firstRender = false\n }\n\n _updateSelection (s: [number, number]): void {\n const xRange = [0, this._width]\n this.unselectedRange\n .attr('x', d => d.type === BrushDirection.West ? xRange[0] : s[1])\n .attr('width', d => {\n const length = d.type === BrushDirection.West ? s[0] - xRange[0] : xRange[1] - s[1]\n const lengthClamped = clamp(length, 0, xRange[1] - xRange[0])\n return lengthClamped\n })\n\n this._positionHandles(s)\n\n // D3 sets brush handle height to be too long, so we need to update it\n const yRange = [this._height, 0]\n const h = yRange[0] - yRange[1]\n this.g.selectAll('.handle')\n .attr('y', yRange[1])\n .attr('height', h)\n }\n\n private _positionHandles (s: [number, number]): void {\n const { config } = this\n\n this.brush.selectAll<SVGRectElement, BrushHandleType>('.handle')\n .attr('width', config.handleWidth)\n .attr('x', d => {\n if (!s) return 0\n const west = d.type === BrushDirection.West\n const inside = config.handlePosition === Arrangement.Inside\n\n if (west) return s[0] + (inside ? 0 : -config.handleWidth)\n else return s[1] + (inside ? -config.handleWidth : 0)\n })\n\n this.handleLines\n .attr('transform', d => {\n if (!s) return null\n const west = d.type === BrushDirection.West\n const inside = config.handlePosition === Arrangement.Inside\n return `translate(${west\n ? s[0] - (-1) ** Number(inside) * config.handleWidth / 2\n : s[1] + (-1) ** Number(inside) * config.handleWidth / 2},0)`\n })\n }\n\n _onBrush (event: D3BrushEvent<Datum>): void {\n const { config } = this\n const xScale = this.xScale\n const xRange = [0, this._width]\n const s = (event?.selection || xRange) as [number, number]\n const userDriven = !!event?.sourceEvent\n // Handle edge cases:\n // (event?.selection === null) happens when user clicks to reset the selection\n // (s?.[0] === s?.[1]) happens when user drags the selection out of range\n if (userDriven && (\n (event?.selection === null) || // happens when user clicks to reset the selection\n (s?.[0] === s?.[1]) || // happens when user drags the selection out of range\n (s?.[0] < xRange[0]) || //\n (s?.[0] > xRange[1]) || // happens when you drag the brush and the domain updates\n (s?.[1] < xRange[0]) || // to a smaller one and brush goes out of range\n (s?.[1] > xRange[1]) //\n )) {\n this.brush.call(this.brushBehaviour.move, xRange) // Will trigger the 'brush end' callback with `range`\n return\n }\n\n // When you reset selection by clicking on a non-selected brush area, D3 triggers the brush event twice.\n // The first call will have equal selection coordinates (e.g. [441, 441]), the second call will have the full range (e.g. [0, 700]).\n // To avoid unnecessary render from the first call we skip it\n if (s[0] !== s[1] && isNumber(s[0]) && isNumber(s[1])) {\n // We save the X scale range and set it to the available horizontal space to invert the selection correctly\n const xScaleRange = xScale.range()\n xScale.range(xRange)\n const selectedDomain = s.map(n => +xScale.invert(n)) as [number, number]\n\n if (userDriven) {\n // Constraint the selection if configured\n const xDomain = xScale.domain() as [number, number]\n const xDomainLength = Math.abs(xDomain[1] - xDomain[0])\n const selectionLength = Math.abs(selectedDomain[1] - selectedDomain[0])\n\n if (config.selectionMinLength >= xDomainLength) {\n console.warn('Unovis | Brush: Configured `selectionMinLength` is bigger than the brush domain')\n }\n\n if ((selectionLength < config.selectionMinLength) && (config.selectionMinLength < xDomainLength)) {\n const selection = config.selection ?? this._selection\n const range = [xScale(selection[0]), xScale(selection[1])] as [number, number]\n this.brush.call(this.brushBehaviour.move, range) // Will trigger the 'brush end' callback with `range`\n // Restore the X scale range\n xScale.range(xScaleRange)\n return\n } else {\n this._selection = selectedDomain\n // Restore the X scale range\n xScale.range(xScaleRange)\n }\n }\n\n this._updateSelection(s)\n if (!this._firstRender) config.onBrush(selectedDomain, event, userDriven)\n }\n }\n\n _onBrushStart (event: D3BrushEvent<Datum>): void {\n const { config } = this\n\n this._onBrush(event)\n if (!this._firstRender) config.onBrushStart(this._selection, event, !!event?.sourceEvent)\n }\n\n _onBrushMove (event: D3BrushEvent<Datum>): void {\n const { config } = this\n\n this._onBrush(event)\n if (!this._firstRender) config.onBrushMove(this._selection, event, !!event?.sourceEvent)\n }\n\n _onBrushEnd (event: D3BrushEvent<Datum>): void {\n const { config } = this\n\n this._onBrush(event)\n if (!this._firstRender) config.onBrushEnd(this._selection, event, !!event?.sourceEvent)\n }\n}\n"],"names":["s.brush","s.unselected","s.handleLine","s"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/brush/index.ts"],"sourcesContent":["import { BrushBehavior, brushX, D3BrushEvent } from 'd3-brush'\nimport { Selection } from 'd3-selection'\n\n// Core\nimport { XYComponentCore } from 'core/xy-component'\n\n// Utils\nimport { isNumber, clamp } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\n\n// Types\nimport { Arrangement } from 'types/position'\n\n// Config\nimport { BrushDefaultConfig, BrushConfigInterface } from './config'\n\n// Local Types\nimport { BrushDirection, BrushHandleType } from './types'\n\n// Styles\nimport * as s from './style'\n\nexport class Brush<Datum> extends XYComponentCore<Datum, BrushConfigInterface<Datum>> {\n static selectors = s\n protected _defaultConfig = BrushDefaultConfig as BrushConfigInterface<Datum>\n clippable = false // Don't apply clipping path to this component. See XYContainer\n public config: BrushConfigInterface<Datum> = this._defaultConfig\n brush: Selection<SVGGElement, unknown, SVGGElement, unknown>\n unselectedRange: Selection<SVGRectElement, BrushHandleType, SVGGElement, unknown>\n handleLines: Selection<SVGLineElement, BrushHandleType, SVGGElement, unknown>\n brushBehaviour: BrushBehavior<unknown> = brushX()\n events = {\n [Brush.selectors.brush]: {},\n }\n\n private _selection: [number, number] | null = null\n private _firstRender = true\n\n constructor (config?: BrushConfigInterface<Datum>) {\n super()\n if (config) this.setConfig(config)\n\n const directions: BrushHandleType[] = [{ type: BrushDirection.West }, { type: BrushDirection.East }]\n this.unselectedRange = this.g\n .selectAll(`.${s.unselected}`)\n .data(directions)\n .enter().append('rect')\n .attr('class', s.unselected)\n\n this.brush = this.g\n .append('g')\n .attr('class', s.brush)\n\n this.handleLines = this.g\n .selectAll(`.${s.handleLine}`)\n .data(directions)\n .enter().append('line')\n .attr('class', s.handleLine)\n }\n\n _render (customDuration?: number): void {\n const { brushBehaviour, config } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n const xScale = this.xScale\n\n brushBehaviour\n .extent([[0, 0], [this._width, this._height]])\n .on('start', this._onBrushStart.bind(this))\n .on('brush', this._onBrushMove.bind(this))\n .on('end', this._onBrushEnd.bind(this))\n\n this.brush\n .call(brushBehaviour)\n .classed('non-draggable', !config.draggable)\n\n const yRange = [this._height, 0]\n const h = yRange[0] - yRange[1]\n\n this.g.selectAll('.handle')\n .attr('y', yRange[1])\n .attr('height', h)\n\n this.unselectedRange\n .attr('y', yRange[1])\n .attr('height', h)\n\n this.handleLines\n .attr('y1', yRange[1] + 10)\n .attr('y2', yRange[1] + h - 10)\n\n // We save the X scale range and set it to the available horizontal space to calculate the selection range in pixels correctly\n const xRange = [0, this._width]\n const xScaleRange = xScale.range()\n xScale.range(xRange)\n const selectionMin = clamp(xScale((config.selection || this._selection)?.[0]) ?? 0, xRange[0], xRange[1])\n const selectionMax = clamp(xScale((config.selection || this._selection)?.[1]) ?? 0, xRange[0], xRange[1])\n xScale.range(xScaleRange) // Restore the X scale range\n\n const selectionLength = selectionMax - selectionMin\n const brushRange = (selectionLength ? [selectionMin, selectionMax] : xRange) as [number, number]\n this._positionHandles(brushRange)\n\n smartTransition(this.brush, duration)\n .call(brushBehaviour.move, brushRange) // Sets up the brush and calls brush events\n .on('end interrupt', () => { this._firstRender = false })\n // We track the first render to not trigger user events on component initialization\n if (!duration) this._firstRender = false\n }\n\n _updateSelection (s: [number, number]): void {\n const xRange = [0, this._width]\n this.unselectedRange\n .attr('x', d => d.type === BrushDirection.West ? xRange[0] : s[1])\n .attr('width', d => {\n const length = d.type === BrushDirection.West ? s[0] - xRange[0] : xRange[1] - s[1]\n const lengthClamped = clamp(length, 0, xRange[1] - xRange[0])\n return lengthClamped\n })\n\n this._positionHandles(s)\n\n // D3 sets brush handle height to be too long, so we need to update it\n const yRange = [this._height, 0]\n const h = yRange[0] - yRange[1]\n this.g.selectAll('.handle')\n .attr('y', yRange[1])\n .attr('height', h)\n }\n\n private _positionHandles (s: [number, number]): void {\n const { config } = this\n\n this.brush.selectAll<SVGRectElement, BrushHandleType>('.handle')\n .attr('width', config.handleWidth)\n .attr('x', d => {\n if (!s) return 0\n const west = d.type === BrushDirection.West\n const inside = config.handlePosition === Arrangement.Inside\n\n if (west) return s[0] + (inside ? 0 : -config.handleWidth)\n else return s[1] + (inside ? -config.handleWidth : 0)\n })\n\n this.handleLines\n .attr('transform', d => {\n if (!s) return null\n const west = d.type === BrushDirection.West\n const inside = config.handlePosition === Arrangement.Inside\n return `translate(${west\n ? s[0] - (-1) ** Number(inside) * config.handleWidth / 2\n : s[1] + (-1) ** Number(inside) * config.handleWidth / 2},0)`\n })\n }\n\n _onBrush (event: D3BrushEvent<Datum>): void {\n const { config } = this\n const xScale = this.xScale\n const xRange = [0, this._width]\n const s = (event?.selection || xRange) as [number, number]\n const userDriven = !!event?.sourceEvent\n // Handle edge cases:\n // (event?.selection === null) happens when user clicks to reset the selection\n // (s?.[0] === s?.[1]) happens when user drags the selection out of range\n if (userDriven && (\n (event?.selection === null) || // happens when user clicks to reset the selection\n (s?.[0] === s?.[1]) || // happens when user drags the selection out of range\n (s?.[0] < xRange[0]) || //\n (s?.[0] > xRange[1]) || // happens when you drag the brush and the domain updates\n (s?.[1] < xRange[0]) || // to a smaller one and brush goes out of range\n (s?.[1] > xRange[1]) //\n )) {\n this.brush.call(this.brushBehaviour.move, xRange) // Will trigger the 'brush end' callback with `range`\n return\n }\n\n // When you reset selection by clicking on a non-selected brush area, D3 triggers the brush event twice.\n // The first call will have equal selection coordinates (e.g. [441, 441]), the second call will have the full range (e.g. [0, 700]).\n // To avoid unnecessary render from the first call we skip it\n if (s[0] !== s[1] && isNumber(s[0]) && isNumber(s[1])) {\n // We save the X scale range and set it to the available horizontal space to invert the selection correctly\n const xScaleRange = xScale.range()\n xScale.range(xRange)\n const selectedDomain = s.map(n => +xScale.invert(n)) as [number, number]\n\n if (userDriven) {\n // Constraint the selection if configured\n const xDomain = xScale.domain() as [number, number]\n const xDomainLength = Math.abs(xDomain[1] - xDomain[0])\n const selectionLength = Math.abs(selectedDomain[1] - selectedDomain[0])\n\n if (config.selectionMinLength >= xDomainLength) {\n console.warn('Unovis | Brush: Configured `selectionMinLength` is bigger than the brush domain')\n }\n\n if ((selectionLength < config.selectionMinLength) && (config.selectionMinLength < xDomainLength)) {\n const selection = config.selection ?? this._selection\n const range = [xScale(selection[0]), xScale(selection[1])] as [number, number]\n this.brush.call(this.brushBehaviour.move, range) // Will trigger the 'brush end' callback with `range`\n // Restore the X scale range\n xScale.range(xScaleRange)\n return\n } else {\n this._selection = selectedDomain\n // Restore the X scale range\n xScale.range(xScaleRange)\n }\n }\n\n this._updateSelection(s)\n if (!this._firstRender) config.onBrush(selectedDomain, event, userDriven)\n }\n }\n\n _onBrushStart (event: D3BrushEvent<Datum>): void {\n const { config } = this\n\n this._onBrush(event)\n if (!this._firstRender) config.onBrushStart(this._selection, event, !!event?.sourceEvent)\n }\n\n _onBrushMove (event: D3BrushEvent<Datum>): void {\n const { config } = this\n\n this._onBrush(event)\n if (!this._firstRender) config.onBrushMove(this._selection, event, !!event?.sourceEvent)\n }\n\n _onBrushEnd (event: D3BrushEvent<Datum>): void {\n const { config } = this\n\n this._onBrush(event)\n if (!this._firstRender) config.onBrushEnd(this._selection, event, !!event?.sourceEvent)\n }\n}\n"],"names":["s.unselected","s.brush","s.handleLine","s"],"mappings":"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"}
|
|
@@ -1,5 +1,48 @@
|
|
|
1
1
|
export declare const root: string;
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const cssVarDefaults: {
|
|
3
|
+
'--vis-brush-selection-fill-color': string;
|
|
4
|
+
'--vis-brush-selection-stroke-color': string;
|
|
5
|
+
'--vis-brush-selection-stroke-width': string;
|
|
6
|
+
'--vis-brush-selection-opacity': string;
|
|
7
|
+
'--vis-brush-unselected-fill-color': string;
|
|
8
|
+
'--vis-brush-unselected-stroke-color': string;
|
|
9
|
+
'--vis-brush-unselected-stroke-width': string;
|
|
10
|
+
'--vis-brush-unselected-opacity': string;
|
|
11
|
+
'--vis-brush-handle-fill-color': string;
|
|
12
|
+
'--vis-brush-handle-stroke-color': string;
|
|
13
|
+
'--vis-dark-brush-selection-fill-color': string;
|
|
14
|
+
'--vis-dark-brush-selection-stroke-color': string;
|
|
15
|
+
'--vis-dark-brush-selection-stroke-width': string;
|
|
16
|
+
'--vis-dark-brush-selection-opacity': string;
|
|
17
|
+
'--vis-dark-brush-unselected-fill-color': string;
|
|
18
|
+
'--vis-dark-brush-unselected-stroke-color': string;
|
|
19
|
+
'--vis-dark-brush-unselected-stroke-width': string;
|
|
20
|
+
'--vis-dark-brush-unselected-opacity': string;
|
|
21
|
+
'--vis-dark-brush-handle-fill-color': string;
|
|
22
|
+
'--vis-dark-brush-handle-stroke-color': string;
|
|
23
|
+
};
|
|
24
|
+
export declare const variables: {
|
|
25
|
+
brushSelectionFillColor: "--vis-brush-selection-fill-color";
|
|
26
|
+
brushSelectionStrokeColor: "--vis-brush-selection-stroke-color";
|
|
27
|
+
brushSelectionStrokeWidth: "--vis-brush-selection-stroke-width";
|
|
28
|
+
brushSelectionOpacity: "--vis-brush-selection-opacity";
|
|
29
|
+
brushUnselectedFillColor: "--vis-brush-unselected-fill-color";
|
|
30
|
+
brushUnselectedStrokeColor: "--vis-brush-unselected-stroke-color";
|
|
31
|
+
brushUnselectedStrokeWidth: "--vis-brush-unselected-stroke-width";
|
|
32
|
+
brushUnselectedOpacity: "--vis-brush-unselected-opacity";
|
|
33
|
+
brushHandleFillColor: "--vis-brush-handle-fill-color";
|
|
34
|
+
brushHandleStrokeColor: "--vis-brush-handle-stroke-color";
|
|
35
|
+
darkBrushSelectionFillColor: "--vis-dark-brush-selection-fill-color";
|
|
36
|
+
darkBrushSelectionStrokeColor: "--vis-dark-brush-selection-stroke-color";
|
|
37
|
+
darkBrushSelectionStrokeWidth: "--vis-dark-brush-selection-stroke-width";
|
|
38
|
+
darkBrushSelectionOpacity: "--vis-dark-brush-selection-opacity";
|
|
39
|
+
darkBrushUnselectedFillColor: "--vis-dark-brush-unselected-fill-color";
|
|
40
|
+
darkBrushUnselectedStrokeColor: "--vis-dark-brush-unselected-stroke-color";
|
|
41
|
+
darkBrushUnselectedStrokeWidth: "--vis-dark-brush-unselected-stroke-width";
|
|
42
|
+
darkBrushUnselectedOpacity: "--vis-dark-brush-unselected-opacity";
|
|
43
|
+
darkBrushHandleFillColor: "--vis-dark-brush-handle-fill-color";
|
|
44
|
+
darkBrushHandleStrokeColor: "--vis-dark-brush-handle-stroke-color";
|
|
45
|
+
};
|
|
3
46
|
export declare const brush: string;
|
|
4
47
|
export declare const unselected: string;
|
|
5
48
|
export declare const handleLine: string;
|
|
@@ -1,42 +1,46 @@
|
|
|
1
|
-
import { css
|
|
1
|
+
import { css } from '@emotion/css';
|
|
2
|
+
import { getCssVarNames, injectGlobalCssVariables } from '../../utils/style.js';
|
|
2
3
|
|
|
3
4
|
const root = css `
|
|
4
5
|
label: brush-component;
|
|
5
6
|
`;
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
--vis-brush-selection-
|
|
9
|
-
--vis-brush-selection-stroke-
|
|
10
|
-
--vis-brush-
|
|
11
|
-
--vis-brush-
|
|
12
|
-
|
|
13
|
-
--vis-
|
|
14
|
-
--vis-
|
|
15
|
-
--vis-
|
|
16
|
-
--vis-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
--vis-brush-selection-
|
|
21
|
-
--vis-brush-selection-
|
|
22
|
-
--vis-brush-
|
|
23
|
-
--vis-brush-
|
|
24
|
-
|
|
25
|
-
|
|
7
|
+
const cssVarDefaults = {
|
|
8
|
+
'--vis-brush-selection-fill-color': 'none',
|
|
9
|
+
'--vis-brush-selection-stroke-color': 'none',
|
|
10
|
+
'--vis-brush-selection-stroke-width': '0',
|
|
11
|
+
'--vis-brush-selection-opacity': '0',
|
|
12
|
+
'--vis-brush-unselected-fill-color': '#0b1640',
|
|
13
|
+
'--vis-brush-unselected-stroke-color': '#acb2b9',
|
|
14
|
+
'--vis-brush-unselected-stroke-width': '0',
|
|
15
|
+
'--vis-brush-unselected-opacity': '0.4',
|
|
16
|
+
'--vis-brush-handle-fill-color': '#6d778c',
|
|
17
|
+
'--vis-brush-handle-stroke-color': '#eee',
|
|
18
|
+
/* Dark Theme */
|
|
19
|
+
'--vis-dark-brush-selection-fill-color': 'none',
|
|
20
|
+
'--vis-dark-brush-selection-stroke-color': 'none',
|
|
21
|
+
'--vis-dark-brush-selection-stroke-width': '0',
|
|
22
|
+
'--vis-dark-brush-selection-opacity': '0',
|
|
23
|
+
'--vis-dark-brush-unselected-fill-color': '#acb2b9',
|
|
24
|
+
'--vis-dark-brush-unselected-stroke-color': '#0b1640',
|
|
25
|
+
'--vis-dark-brush-unselected-stroke-width': '0',
|
|
26
|
+
'--vis-dark-brush-unselected-opacity': '0.4',
|
|
27
|
+
'--vis-dark-brush-handle-fill-color': '#acb2b9',
|
|
28
|
+
'--vis-dark-brush-handle-stroke-color': 'var(--vis-color-grey)',
|
|
29
|
+
};
|
|
30
|
+
const variables = getCssVarNames(cssVarDefaults);
|
|
31
|
+
injectGlobalCssVariables(cssVarDefaults, root);
|
|
26
32
|
const brush = css `
|
|
27
33
|
label: brush;
|
|
28
|
-
fill: none;
|
|
29
|
-
stroke: none;
|
|
30
34
|
|
|
31
35
|
.selection {
|
|
32
|
-
fill:
|
|
33
|
-
stroke: var(
|
|
34
|
-
stroke-width:
|
|
35
|
-
|
|
36
|
+
fill: var(${variables.brushSelectionFillColor});
|
|
37
|
+
stroke: var(${variables.brushSelectionStrokeColor});
|
|
38
|
+
stroke-width: var(${variables.brushSelectionStrokeWidth});
|
|
39
|
+
opacity: var(${variables.brushSelectionOpacity});
|
|
36
40
|
}
|
|
37
41
|
|
|
38
42
|
.handle {
|
|
39
|
-
fill: var(
|
|
43
|
+
fill: var(${variables.brushHandleFillColor});
|
|
40
44
|
}
|
|
41
45
|
|
|
42
46
|
&.non-draggable {
|
|
@@ -47,17 +51,20 @@ const brush = css `
|
|
|
47
51
|
`;
|
|
48
52
|
const unselected = css `
|
|
49
53
|
label: unselected;
|
|
50
|
-
fill: var(
|
|
51
|
-
|
|
54
|
+
fill: var(${variables.brushUnselectedFillColor});
|
|
55
|
+
stroke: var(${variables.brushUnselectedStrokeColor});
|
|
56
|
+
stroke-width: var(${variables.brushUnselectedStrokeWidth});
|
|
57
|
+
stroke-opacity: var(${variables.brushUnselectedOpacity});
|
|
58
|
+
opacity: var(${variables.brushUnselectedOpacity});
|
|
52
59
|
pointer-events: none;
|
|
53
60
|
`;
|
|
54
61
|
const handleLine = css `
|
|
55
62
|
label: handle-line;
|
|
56
|
-
stroke: var(
|
|
63
|
+
stroke: var(${variables.brushHandleStrokeColor});
|
|
57
64
|
stroke-width: 1;
|
|
58
65
|
fill: none;
|
|
59
66
|
pointer-events: none;
|
|
60
67
|
`;
|
|
61
68
|
|
|
62
|
-
export { brush, handleLine, root, unselected, variables };
|
|
69
|
+
export { brush, cssVarDefaults, handleLine, root, unselected, variables };
|
|
63
70
|
//# sourceMappingURL=style.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.js","sources":["../../../src/components/brush/style.ts"],"sourcesContent":["import { css
|
|
1
|
+
{"version":3,"file":"style.js","sources":["../../../src/components/brush/style.ts"],"sourcesContent":["import { css } from '@emotion/css'\nimport { getCssVarNames, injectGlobalCssVariables } from 'utils/style'\n\nexport const root = css`\n label: brush-component;\n`\n\nexport const cssVarDefaults = {\n '--vis-brush-selection-fill-color': 'none',\n '--vis-brush-selection-stroke-color': 'none',\n '--vis-brush-selection-stroke-width': '0',\n '--vis-brush-selection-opacity': '0',\n '--vis-brush-unselected-fill-color': '#0b1640',\n '--vis-brush-unselected-stroke-color': '#acb2b9',\n '--vis-brush-unselected-stroke-width': '0',\n '--vis-brush-unselected-opacity': '0.4',\n '--vis-brush-handle-fill-color': '#6d778c',\n '--vis-brush-handle-stroke-color': '#eee',\n\n /* Dark Theme */\n '--vis-dark-brush-selection-fill-color': 'none',\n '--vis-dark-brush-selection-stroke-color': 'none',\n '--vis-dark-brush-selection-stroke-width': '0',\n '--vis-dark-brush-selection-opacity': '0',\n '--vis-dark-brush-unselected-fill-color': '#acb2b9',\n '--vis-dark-brush-unselected-stroke-color': '#0b1640',\n '--vis-dark-brush-unselected-stroke-width': '0',\n '--vis-dark-brush-unselected-opacity': '0.4',\n '--vis-dark-brush-handle-fill-color': '#acb2b9',\n '--vis-dark-brush-handle-stroke-color': 'var(--vis-color-grey)',\n}\n\nexport const variables = getCssVarNames(cssVarDefaults)\ninjectGlobalCssVariables(cssVarDefaults, root)\n\nexport const brush = css`\n label: brush;\n\n .selection {\n fill: var(${variables.brushSelectionFillColor});\n stroke: var(${variables.brushSelectionStrokeColor});\n stroke-width: var(${variables.brushSelectionStrokeWidth});\n opacity: var(${variables.brushSelectionOpacity});\n }\n\n .handle {\n fill: var(${variables.brushHandleFillColor});\n }\n\n &.non-draggable {\n .selection, .overlay {\n pointer-events: none;\n }\n }\n`\n\nexport const unselected = css`\n label: unselected;\n fill: var(${variables.brushUnselectedFillColor});\n stroke: var(${variables.brushUnselectedStrokeColor});\n stroke-width: var(${variables.brushUnselectedStrokeWidth});\n stroke-opacity: var(${variables.brushUnselectedOpacity});\n opacity: var(${variables.brushUnselectedOpacity});\n pointer-events: none;\n`\n\nexport const handleLine = css`\n label: handle-line;\n stroke: var(${variables.brushHandleStrokeColor});\n stroke-width: 1;\n fill: none;\n pointer-events: none;\n`\n"],"names":[],"mappings":";;;AAGO,MAAM,IAAI,GAAG,GAAG,CAAA,CAAA;;EAEtB;AAEY,MAAA,cAAc,GAAG;AAC5B,IAAA,kCAAkC,EAAE,MAAM;AAC1C,IAAA,oCAAoC,EAAE,MAAM;AAC5C,IAAA,oCAAoC,EAAE,GAAG;AACzC,IAAA,+BAA+B,EAAE,GAAG;AACpC,IAAA,mCAAmC,EAAE,SAAS;AAC9C,IAAA,qCAAqC,EAAE,SAAS;AAChD,IAAA,qCAAqC,EAAE,GAAG;AAC1C,IAAA,gCAAgC,EAAE,KAAK;AACvC,IAAA,+BAA+B,EAAE,SAAS;AAC1C,IAAA,iCAAiC,EAAE,MAAM;;AAGzC,IAAA,uCAAuC,EAAE,MAAM;AAC/C,IAAA,yCAAyC,EAAE,MAAM;AACjD,IAAA,yCAAyC,EAAE,GAAG;AAC9C,IAAA,oCAAoC,EAAE,GAAG;AACzC,IAAA,wCAAwC,EAAE,SAAS;AACnD,IAAA,0CAA0C,EAAE,SAAS;AACrD,IAAA,0CAA0C,EAAE,GAAG;AAC/C,IAAA,qCAAqC,EAAE,KAAK;AAC5C,IAAA,oCAAoC,EAAE,SAAS;AAC/C,IAAA,sCAAsC,EAAE,uBAAuB;EAChE;MAEY,SAAS,GAAG,cAAc,CAAC,cAAc,EAAC;AACvD,wBAAwB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;AAEvC,MAAM,KAAK,GAAG,GAAG,CAAA,CAAA;;;;AAIR,cAAA,EAAA,SAAS,CAAC,uBAAuB,CAAA;AAC/B,gBAAA,EAAA,SAAS,CAAC,yBAAyB,CAAA;AAC7B,sBAAA,EAAA,SAAS,CAAC,yBAAyB,CAAA;AACxC,iBAAA,EAAA,SAAS,CAAC,qBAAqB,CAAA;;;;AAIlC,cAAA,EAAA,SAAS,CAAC,oBAAoB,CAAA;;;;;;;;EAQ7C;AAEM,MAAM,UAAU,GAAG,GAAG,CAAA,CAAA;;AAEf,YAAA,EAAA,SAAS,CAAC,wBAAwB,CAAA;AAChC,cAAA,EAAA,SAAS,CAAC,0BAA0B,CAAA;AAC9B,oBAAA,EAAA,SAAS,CAAC,0BAA0B,CAAA;AAClC,sBAAA,EAAA,SAAS,CAAC,sBAAsB,CAAA;AACvC,eAAA,EAAA,SAAS,CAAC,sBAAsB,CAAA;;EAEhD;AAEM,MAAM,UAAU,GAAG,GAAG,CAAA,CAAA;;AAEb,cAAA,EAAA,SAAS,CAAC,sBAAsB,CAAA;;;;;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { D3BrushEvent } from 'd3-brush';
|
|
2
1
|
import { D3DragEvent } from 'd3-drag';
|
|
3
2
|
import { D3ZoomEvent } from 'd3-zoom';
|
|
3
|
+
import { Selection } from 'd3-selection';
|
|
4
4
|
import { ComponentConfigInterface } from "../../core/component/config";
|
|
5
5
|
import { TrimMode } from "../../types/text";
|
|
6
6
|
import { GraphInputLink, GraphInputNode } from "../../types/graph";
|
|
@@ -13,8 +13,6 @@ export interface GraphConfigInterface<N extends GraphInputNode, L extends GraphI
|
|
|
13
13
|
disableZoom?: boolean;
|
|
14
14
|
/** Disable node dragging. Default: `false` */
|
|
15
15
|
disableDrag?: boolean;
|
|
16
|
-
/** Disable brush for multiple node selection. Default: `false` */
|
|
17
|
-
disableBrush?: boolean;
|
|
18
16
|
/** Interval to re-render the graph when zooming. Default: `100` */
|
|
19
17
|
zoomThrottledUpdateNodeThreshold?: number;
|
|
20
18
|
/** Type of the graph layout. Default: `GraphLayoutType.Force` */
|
|
@@ -158,13 +156,14 @@ export interface GraphConfigInterface<N extends GraphInputNode, L extends GraphI
|
|
|
158
156
|
nodeExitPosition?: GenericAccessor<[number, number], N> | undefined;
|
|
159
157
|
/** Specify the destination scale for exiting nodes in the range [0,1]. Default: `0.75` */
|
|
160
158
|
nodeExitScale?: NumericAccessor<N> | undefined;
|
|
161
|
-
/**
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
159
|
+
/** Custom "enter" function for node rendering. Default: `undefined` */
|
|
160
|
+
nodeEnterCustomRenderFunction?: (datum: GraphNode<N, L>, nodeGroupElement: SVGGElement, config: GraphConfigInterface<N, L>, duration: number, zoomLevel: number) => void;
|
|
161
|
+
/** Custom "update" function for node rendering. Default: `undefined` */
|
|
162
|
+
nodeUpdateCustomRenderFunction?: (datum: GraphNode<N, L>, nodeGroupElement: SVGGElement, config: GraphConfigInterface<N, L>, duration: number, zoomLevel: number) => void;
|
|
163
|
+
/** Custom "exit" function for node rendering. Default: `undefined` */
|
|
164
|
+
nodeExitCustomRenderFunction?: (datum: GraphNode<N, L>, nodeGroupElement: SVGGElement, config: GraphConfigInterface<N, L>, duration: number, zoomLevel: number) => void;
|
|
165
|
+
/** Set selected node by unique id. Default: `undefined` */
|
|
165
166
|
selectedNodeId?: number | string;
|
|
166
|
-
/** Set selected nodes by unique id. Default: `undefined` */
|
|
167
|
-
selectedNodeIds?: number[] | string[];
|
|
168
167
|
/** Panels configuration. An array of `GraphPanelConfig` objects. Default: `[]` */
|
|
169
168
|
panels?: GraphPanelConfig[] | undefined;
|
|
170
169
|
/** Graph node drag start callback function. Default: `undefined` */
|
|
@@ -177,9 +176,7 @@ export interface GraphConfigInterface<N extends GraphInputNode, L extends GraphI
|
|
|
177
176
|
onZoom?: (zoomScale: number, zoomScaleExtent: [number, number], event: D3ZoomEvent<SVGGElement, unknown> | undefined) => void;
|
|
178
177
|
/** Callback function to be called when the graph layout is calculated. Default: `undefined` */
|
|
179
178
|
onLayoutCalculated?: (n: GraphNode<N, L>[], links: GraphLink<N, L>[]) => void;
|
|
180
|
-
/**
|
|
181
|
-
|
|
182
|
-
/** Graph multiple node drag callback function. Default: `undefined` */
|
|
183
|
-
onNodeSelectionDrag?: (selectedNodes: GraphNode<N, L>[], event: D3DragEvent<SVGGElement, GraphNode<N, L>, unknown>) => void;
|
|
179
|
+
/** Callback function to be called when the graph rendering is complete. Default: `undefined` */
|
|
180
|
+
onRenderComplete?: (g: Selection<SVGGElement, unknown, null, undefined>, nodes: GraphNode<N, L>[], links: GraphLink<N, L>[], config: GraphConfigInterface<N, L>, duration: number, zoomLevel: number) => void;
|
|
184
181
|
}
|
|
185
182
|
export declare const GraphDefaultConfig: GraphConfigInterface<GraphInputNode, GraphInputLink>;
|