@unovis/ts 1.7.0-pre.0 → 1.7.0-pre.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/components/annotations/config.d.ts +2 -0
  2. package/components/annotations/config.js +1 -1
  3. package/components/annotations/config.js.map +1 -1
  4. package/components/annotations/index.d.ts +1 -0
  5. package/components/annotations/index.js +25 -10
  6. package/components/annotations/index.js.map +1 -1
  7. package/components/annotations/style.d.ts +2 -0
  8. package/components/annotations/style.js +8 -1
  9. package/components/annotations/style.js.map +1 -1
  10. package/components/area/config.d.ts +9 -1
  11. package/components/area/config.js +1 -1
  12. package/components/area/config.js.map +1 -1
  13. package/components/area/index.d.ts +6 -0
  14. package/components/area/index.js +74 -4
  15. package/components/area/index.js.map +1 -1
  16. package/components/area/style.d.ts +1 -0
  17. package/components/area/style.js +7 -1
  18. package/components/area/style.js.map +1 -1
  19. package/components/axis/index.d.ts +2 -0
  20. package/components/axis/index.js +45 -7
  21. package/components/axis/index.js.map +1 -1
  22. package/components/bullet-legend/index.d.ts +2 -0
  23. package/components/bullet-legend/index.js +9 -5
  24. package/components/bullet-legend/index.js.map +1 -1
  25. package/components/bullet-legend/modules/shape.js +3 -2
  26. package/components/bullet-legend/modules/shape.js.map +1 -1
  27. package/components/crosshair/index.js +3 -2
  28. package/components/crosshair/index.js.map +1 -1
  29. package/components/flow-legend/config.d.ts +10 -0
  30. package/components/flow-legend/config.js +4 -0
  31. package/components/flow-legend/config.js.map +1 -1
  32. package/components/flow-legend/index.d.ts +6 -2
  33. package/components/flow-legend/index.js +34 -16
  34. package/components/flow-legend/index.js.map +1 -1
  35. package/components/flow-legend/style.d.ts +3 -3
  36. package/components/flow-legend/style.js +30 -26
  37. package/components/flow-legend/style.js.map +1 -1
  38. package/components/graph/modules/link/index.js +1 -1
  39. package/components/graph/modules/link/index.js.map +1 -1
  40. package/components/graph/modules/node/index.js +2 -1
  41. package/components/graph/modules/node/index.js.map +1 -1
  42. package/components/treemap/config.d.ts +2 -0
  43. package/components/treemap/config.js +1 -1
  44. package/components/treemap/config.js.map +1 -1
  45. package/components/treemap/index.d.ts +5 -2
  46. package/components/treemap/index.js +84 -69
  47. package/components/treemap/index.js.map +1 -1
  48. package/components/treemap/style.d.ts +1 -0
  49. package/components/treemap/style.js +5 -1
  50. package/components/treemap/style.js.map +1 -1
  51. package/package.json +7 -4
  52. package/utils/misc.js +13 -2
  53. package/utils/misc.js.map +1 -1
  54. package/utils/text.d.ts +1 -1
  55. package/utils/text.js +13 -15
  56. package/utils/text.js.map +1 -1
  57. package/utils/to-px.d.ts +1 -0
  58. package/utils/to-px.js +110 -0
  59. package/utils/to-px.js.map +1 -0
@@ -8,6 +8,7 @@ import { smartTransition } from '../../utils/d3.js';
8
8
  import { trimSVGText, renderTextToSvgTextElement, wrapSVGText, textAlignToAnchor } from '../../utils/text.js';
9
9
  import { isEqual } from '../../utils/data.js';
10
10
  import { rectIntersect } from '../../utils/misc.js';
11
+ import { getFontWidthToHeightRatio } from '../../styles/index.js';
11
12
  import { AxisType } from './types.js';
12
13
  import { AxisDefaultConfig } from './config.js';
13
14
  import * as style from './style.js';
@@ -206,6 +207,10 @@ class Axis extends XYComponentCore {
206
207
  // Somehow we see it happening in Angular apps.
207
208
  selection.selectAll('*').interrupt();
208
209
  const transition = smartTransition(selection, duration).call(axisGen);
210
+ // Unset D3's default y and dy attributes because we're going to set them manually in the renderTextToSvgTextElement function
211
+ selection.selectAll('text')
212
+ .attr('dy', null)
213
+ .attr('y', null);
209
214
  // Resolving tick label overlap after the animation is over
210
215
  transition.on('end', () => {
211
216
  this._resolveTickLabelOverlap(selection);
@@ -227,28 +232,41 @@ class Axis extends XYComponentCore {
227
232
  .classed(tickTextExiting, true);
228
233
  // We interrupt the transition on tick's <text> to make it 'wrappable'
229
234
  tickText.nodes().forEach(node => interrupt(node));
235
+ const tickSize = axisGen.tickSize();
236
+ const axisPosition = this.getPosition();
237
+ const textMaxWidth = config.tickTextWidth || (config.type === AxisType.X ? this._containerWidth / (tickCount + 1) : this._containerWidth / 5);
230
238
  tickText.each((value, i, elements) => {
231
239
  var _a, _b;
232
240
  let text = (_b = (_a = config.tickFormat) === null || _a === void 0 ? void 0 : _a.call(config, value, i, tickValues)) !== null && _b !== void 0 ? _b : `${value}`;
233
241
  const textElement = elements[i];
234
- const textMaxWidth = config.tickTextWidth || (config.type === AxisType.X ? this._containerWidth / (tickCount + 1) : this._containerWidth / 5);
235
- const styleDeclaration = getComputedStyle(textElement);
236
- const fontSize = Number.parseFloat(styleDeclaration.fontSize);
237
- const fontFamily = styleDeclaration.fontFamily;
242
+ // Get and cache the tick text style
243
+ if (!this._tickTextStyleCached) {
244
+ const styleDeclaration = getComputedStyle(textElement);
245
+ this._tickTextStyleCached = {
246
+ fontSize: Number.parseFloat(styleDeclaration.fontSize),
247
+ fontFamily: styleDeclaration.fontFamily,
248
+ fontWidthToHeightRatio: getFontWidthToHeightRatio(),
249
+ };
250
+ }
251
+ // Calculate the text offset based on the axis position and the tick size
252
+ const [textOffsetX, textOffsetY] = this._getTickTextOffset(axisPosition, tickSize, this._tickTextStyleCached.fontSize);
253
+ // Prepare the Unovis text options
238
254
  const textOptions = {
239
255
  verticalAlign: config.type === AxisType.X ? VerticalAlign.Top : VerticalAlign.Middle,
240
256
  width: textMaxWidth,
241
257
  textRotationAngle: config.tickTextAngle,
242
258
  separator: config.tickTextSeparator,
243
259
  wordBreak: config.tickTextForceWordBreak,
260
+ x: textOffsetX,
261
+ y: textOffsetY,
244
262
  };
245
263
  if (config.tickTextFitMode === FitMode.Trim) {
246
264
  const textElementSelection = select(textElement).text(text);
247
- trimSVGText(textElementSelection, textMaxWidth, config.tickTextTrimType, true, fontSize, 0.58);
265
+ trimSVGText(textElementSelection, textMaxWidth, config.tickTextTrimType, true, this._tickTextStyleCached.fontSize, 0.58);
248
266
  text = select(textElement).text();
249
267
  }
250
- const textBlock = { text, fontFamily, fontSize };
251
- renderTextToSvgTextElement(textElement, textBlock, textOptions);
268
+ const textBlock = Object.assign({ text }, this._tickTextStyleCached);
269
+ renderTextToSvgTextElement(textElement, textBlock, textOptions, 'central');
252
270
  });
253
271
  selection
254
272
  .classed(axis, true)
@@ -436,6 +454,26 @@ class Axis extends XYComponentCore {
436
454
  }
437
455
  }
438
456
  }
457
+ _getTickTextOffset(axisPosition, tickSize, fontSize) {
458
+ var _a;
459
+ const { config } = this;
460
+ const angleRad = ((_a = config.tickTextAngle) !== null && _a !== void 0 ? _a : 0) / 180 * Math.PI;
461
+ const baseOffset = tickSize + config.tickPadding;
462
+ if (config.type === AxisType.X) {
463
+ const direction = axisPosition === Position.Bottom ? 1 : -1;
464
+ return [
465
+ direction * baseOffset * Math.sin(angleRad),
466
+ direction * (baseOffset + fontSize / 2) * Math.cos(angleRad),
467
+ ];
468
+ }
469
+ else {
470
+ const direction = axisPosition === Position.Right ? 1 : -1;
471
+ return [
472
+ direction * baseOffset * Math.cos(angleRad),
473
+ direction * baseOffset * Math.sin(angleRad),
474
+ ];
475
+ }
476
+ }
439
477
  _alignTickLabels() {
440
478
  const { config: { type, tickTextAlign, tickTextAngle, position } } = this;
441
479
  const tickText = this.g.selectAll('g.tick > text');
@@ -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'\nimport { NumberValue } from 'd3-scale'\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, textAlignToAnchor, trimSVGText, wrapSVGText } from 'utils/text'\nimport { isEqual } from 'utils/data'\nimport { rectIntersect } from 'utils/misc'\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 private axisGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private 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 _collideTickLabelsAnimFrameId: ReturnType<typeof requestAnimationFrame>\n\n protected 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 public 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 // 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 public getPosition (): Position {\n const { config: { type, position } } = this\n return (position ?? ((type === AxisType.X) ? Position.Bottom : Position.Left)) as Position\n }\n\n private _getAxisSize (selection: Selection<SVGGElement, unknown, SVGGElement, undefined>): SVGRect {\n const bBox = selection.node().getBBox()\n return bBox\n }\n\n private _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 public _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()\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 this._resolveTickLabelOverlap(selection)\n }\n\n private _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 private _buildGrid (): D3Axis<NumberValue | Date> {\n const { config } = this\n\n let gridGen: D3Axis<NumberValue | Date>\n switch (config.type) {\n case AxisType.X:\n switch (config.position) {\n case Position.Top: { gridGen = axisTop(this.xScale); break }\n case Position.Bottom: default: { gridGen = axisBottom(this.xScale); break }\n }\n gridGen.tickSize(-this._height)\n break\n case AxisType.Y:\n switch (config.position) {\n case Position.Right: { gridGen = axisRight(this.yScale); break }\n case Position.Left: default: { gridGen = axisLeft(this.yScale); break }\n }\n gridGen.tickSize(-this._width)\n }\n gridGen\n .tickSizeOuter(0)\n .tickFormat(() => '')\n\n const numTicks = this._getNumTicks() * 2\n const gridScale = gridGen.scale<ContinuousScale>()\n const scaleDomain = gridScale.domain()\n\n const getGridMinMaxTicksOnlyValues = (): number[] | Date[] => {\n if (!config.minMaxTicksOnlyShowGridLines) return scaleDomain\n\n const tickValues = gridScale.ticks(numTicks)\n if (tickValues.length < 2) return scaleDomain\n\n // If the last tick is far enough from the domain max value, we add it to the tick values to draw the grid line\n const tickValuesStep = +tickValues[1] - +tickValues[0]\n const domainMaxValue = scaleDomain[1]\n const diff = +domainMaxValue - +tickValues[tickValues.length - 1]\n\n return diff > tickValuesStep / 2 ? [...tickValues, domainMaxValue] as (number[] | Date[]) : tickValues\n }\n\n const tickValues = config.tickValues\n ? this._getConfiguredTickValues()\n : this._shouldRenderMinMaxTicksOnly()\n ? getGridMinMaxTicksOnlyValues()\n : gridScale.ticks(numTicks)\n\n gridGen.tickValues(tickValues)\n\n return gridGen\n }\n\n private _renderAxis (selection = this.axisGroup, duration = this.config.duration): void {\n const { config } = this\n\n const axisGen = this._buildAxis()\n const axisScale = axisGen.scale<ContinuousScale>()\n const tickValues: (number[] | Date[]) =\n config.tickValues\n ? this._getConfiguredTickValues()\n : this._shouldRenderMinMaxTicksOnly()\n ? axisScale.domain()\n : axisScale.ticks(this._getNumTicks())\n const tickCount = tickValues.length\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 const transition = smartTransition(selection, duration).call(axisGen)\n\n // Resolving tick label overlap after the animation is over\n transition.on('end', () => {\n this._resolveTickLabelOverlap(selection)\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 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 .classed(s.tickLabelHideable, Boolean(config.tickTextHideOverlapping))\n .style('fill', config.tickTextColor) as Selection<SVGTextElement, number, SVGGElement, unknown> | Selection<SVGTextElement, Date, SVGGElement, unknown>\n\n // Marking exiting elements\n selection.selectAll<SVGTextElement, number | Date>('g.tick > text')\n .filter(tickValue => !tickValues.some((t: number | Date) => isEqual(tickValue, t)))\n .classed(s.tickTextExiting, true)\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 / (tickCount + 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 private _resolveTickLabelOverlap (selection = this.axisGroup): void {\n const { config } = this\n const tickTextSelection = selection.selectAll<SVGTextElement, number | Date>(`g.tick > text:not(.${s.tickTextExiting})`)\n\n if (!config.tickTextHideOverlapping) {\n tickTextSelection.style('opacity', null)\n return\n }\n\n cancelAnimationFrame(this._collideTickLabelsAnimFrameId)\n // Colliding labels in the next frame to prevent forced reflow\n this._collideTickLabelsAnimFrameId = requestAnimationFrame(() => {\n this._collideTickLabels(tickTextSelection)\n })\n }\n\n private _collideTickLabels (selection: Selection<SVGTextElement, number | Date, SVGGElement, unknown>): void {\n type SVGOverlappingTextElement = SVGTextElement & {\n _visible: boolean;\n }\n\n // Reset visibility of all labels\n selection.each((d, i, elements) => {\n const node = elements[i] as SVGOverlappingTextElement\n node._visible = true\n })\n\n // We do three iterations because not all overlapping labels can be resolved in the first iteration\n const numIterations = 3\n for (let i = 0; i < numIterations; i += 1) {\n // Run collision detection and set labels visibility\n selection.each((d, i, elements) => {\n const label1 = elements[i] as SVGOverlappingTextElement\n const isLabel1Visible = label1._visible\n if (!isLabel1Visible) return\n\n // Calculate bounding rect of point's label\n const label1BoundingRect = label1.getBoundingClientRect()\n\n for (let j = i + 1; j < elements.length; j += 1) {\n if (i === j) continue\n const label2 = elements[j] as SVGOverlappingTextElement\n const isLabel2Visible = label2._visible\n if (isLabel2Visible) {\n const label2BoundingRect = label2.getBoundingClientRect()\n const intersect = rectIntersect(label1BoundingRect, label2BoundingRect, -5)\n if (intersect) {\n label2._visible = false\n break\n }\n }\n }\n })\n }\n\n // Hide the overlapping labels\n selection.each((d, i, elements) => {\n const label = elements[i] as SVGOverlappingTextElement\n select(label).style('opacity', label._visible ? 1 : 0)\n })\n }\n\n private _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 private _getConfiguredTickValues (): number[] | null {\n const { config } = this\n const scale = config.type === AxisType.X ? this.xScale : this.yScale\n const scaleDomain = scale?.domain() as [number, number]\n\n if (config.tickValues) {\n return config.tickValues.filter(v => (v >= scaleDomain[0]) && (v <= scaleDomain[1]))\n }\n\n return null\n }\n\n private _shouldRenderMinMaxTicksOnly (): boolean {\n const { config } = this\n return config.minMaxTicksOnly || (config.type === AxisType.X && this._width < config.minMaxTicksOnlyWhenWidthIsLess)\n }\n\n private _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 private _renderAxisLabel (selection = this.axisGroup): void {\n const { type, label, labelMargin, labelFontSize, labelTextFitMode } = this.config\n\n // Remove the old label first to calculate the axis size properly\n selection.selectAll(`.${s.label}`).remove()\n\n if (!label) return\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 rotation = type === AxisType.Y ? -90 : 0\n\n // Create the text element (without transform first)\n const textElement = selection\n .append('text')\n .attr('class', s.label)\n .attr('dy', `${this._getLabelDY()}em`)\n .style('font-size', labelFontSize)\n .style('fill', this.config.labelColor)\n\n // Set the text content\n textElement.text(label)\n\n let isWrapped = false\n if (labelTextFitMode === FitMode.Wrap) {\n // For Y-axis, use the chart height as the maximum width before rotation\n const maxWidth = type === AxisType.Y ? this._height : this._width\n const currentTextWidth = textElement.node().getComputedTextLength()\n\n if (currentTextWidth > maxWidth) {\n wrapSVGText(textElement, maxWidth)\n isWrapped = true\n }\n }\n\n // Calculate offset after wrapping to get accurate dimensions\n let labelWidth = axisWidth\n let labelHeight = axisHeight\n if (labelTextFitMode === FitMode.Wrap) {\n const labelBBox = textElement.node().getBBox()\n labelWidth = labelBBox.width\n labelHeight = labelBBox.height\n } else {\n const trimWidth = type === AxisType.X ? labelWidth : labelHeight\n const styleDeclaration = getComputedStyle(textElement.node())\n const fontSize = Number.parseFloat(styleDeclaration.fontSize)\n // Use the default fontWidthToHeightRatio\n trimSVGText(\n textElement,\n trimWidth,\n this.config.labelTextTrimType as TrimMode,\n true,\n fontSize\n )\n const trimmedBBox = textElement.node().getBBox()\n labelWidth = trimmedBBox.width\n labelHeight = trimmedBBox.height\n }\n\n /*\n we need to calculate the offset for the label based on the position and the fit mode\n for offsetX, applying Y label we need to check if it's wrap or trim, then set the offset accordingly.\n Same for offsetY, need to consider x label.\n */\n const offsetX = type === AxisType.X\n ? this._width / 2\n : type === AxisType.Y && labelTextFitMode === FitMode.Wrap && isWrapped\n ? (axisPosition === Position.Left)\n ? -axisWidth - labelHeight / 2 - 10 // there's a 10px gap between tick label and Position.Right Y label, so offset as well in the Position.Left case\n : axisWidth\n : (-1) ** (+(axisPosition === Position.Left)) * axisWidth\n const offsetY = type === AxisType.Y\n ? this._height / 2\n : type === AxisType.X && labelTextFitMode === FitMode.Wrap\n ? (axisPosition === Position.Top) ? -axisHeight - labelHeight / 2 : axisHeight\n : (-1) ** (+(axisPosition === Position.Top)) * axisHeight\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 // Apply transform and rotation after all calculations\n textElement.attr('transform', `translate(${offsetX + marginX},${offsetY + marginY}) rotate(${rotation})`)\n }\n\n private _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 private _alignTickLabels (): void {\n const { config: { type, tickTextAlign, tickTextAngle, position } } = this\n const tickText = this.g.selectAll('g.tick > text')\n\n const textAnchor = textAlignToAnchor(tickTextAlign as TextAlign)\n const translateX = type === AxisType.X\n ? 0\n : this._getYTickTextTranslate(tickTextAlign as TextAlign, position as Position)\n\n const translateValue = tickTextAngle ? `translate(${translateX},0) rotate(${tickTextAngle})` : `translate(${translateX},0)`\n tickText\n .attr('transform', translateValue)\n .attr('text-anchor', textAnchor)\n }\n\n private _getYTickTextTranslate (textAlign: TextAlign, axisPosition: Position = Position.Left): number {\n /*\n Default in D3 is 9, tickPadding is the spacing in pixels between the tick and it's label. Default: `8`\n */\n const defaultTickTextSpacingPx = this.config.tickPadding + 1\n\n // this._axisRawBBox will be undefined when autoMargin is undefined\n const width = (this._axisRawBBox?.width ?? this.axisGroup.node()?.getBBox().width ?? 0) - 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.tickLabelHideable","s.tickTextExiting","s.axis","s.hideTickLine","s.hideDomain","label","s.label","s"],"mappings":";;;;;;;;;;;;;;;AA6BM,MAAO,IAAY,SAAQ,eAAkD,CAAA;AAejF,IAAA,WAAA,CAAa,MAAmC,EAAA;AAC9C,QAAA,KAAK,EAAE,CAAA;QAdC,IAAc,CAAA,cAAA,GAA+B,iBAAiB,CAAA;AACjE,QAAA,IAAA,CAAA,MAAM,GAA+B,IAAI,CAAC,cAAc,CAAA;QAOvD,IAAgB,CAAA,gBAAA,GAAG,CAAC,CAAA;QAGlB,IAAM,CAAA,MAAA,GAAG,EAAE,CAAA;AAInB,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QAClC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACnC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;AAChC,aAAA,IAAI,CAAC,OAAO,EAAEA,IAAM,CAAC,CAAA;KACzB;;IAGM,SAAS,GAAA;AACd,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;AACvB,QAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;AAEnE,QAAA,IAAI,CAAC,WAAW,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAA;;QAG1C,IAAI,CAAC,YAAY,GAAG,qBAAqB,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;;QAG1D,IAAI,MAAM,CAAC,aAAa;YAAE,IAAI,CAAC,gBAAgB,EAAE,CAAA;;AAEjD,QAAA,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAA;QAC5C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAA;QAC7D,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAElE,qBAAqB,CAAC,MAAM,EAAE,CAAA;KAC/B;IAEM,WAAW,GAAA;QAChB,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAA;AAC3C,QAAA,QAAQ,QAAQ,KAAR,IAAA,IAAA,QAAQ,KAAR,KAAA,CAAA,GAAA,QAAQ,IAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAa;KAC3F;AAEO,IAAA,YAAY,CAAE,SAAkE,EAAA;QACtF,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;AACvC,QAAA,OAAO,IAAI,CAAA;KACZ;AAEO,IAAA,kBAAkB,CAAE,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAA;QACvD,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAA;AAE3C,QAAA,QAAQ,IAAI;AACV,YAAA,KAAK,QAAQ,CAAC,CAAC,EAAE;gBACf,MAAM,WAAW,GAAG,CAAC,CAAA;AACrB,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAA;gBAE5D,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;gBAC1E,MAAM,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;AAEzE,gBAAA,QAAQ,QAAQ;AACd,oBAAA,KAAK,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;oBAC/D,KAAK,QAAQ,CAAC,MAAM,CAAC;AAAC,oBAAA,SAAS,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AAC/E,iBAAA;AACF,aAAA;AACD,YAAA,KAAK,QAAQ,CAAC,CAAC,EAAE;gBACf,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAA;gBACxF,MAAM,GAAG,GAAG,MAAM,CAAA;gBAClB,MAAM,MAAM,GAAG,MAAM,CAAA;AAErB,gBAAA,QAAQ,QAAQ;AACd,oBAAA,KAAK,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAA;oBAClE,KAAK,QAAQ,CAAC,IAAI,CAAC;AAAC,oBAAA,SAAS,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAA;AAC1E,iBAAA;AACF,aAAA;AACF,SAAA;KACF;IAED,iBAAiB,GAAA;QACf,OAAO,IAAI,CAAC,eAAe,CAAA;KAC5B;;AAGD,IAAA,SAAS,CAAE,eAAwB,EAAA;QACjC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAA;AAE3C,QAAA,QAAQ,IAAI;YACV,KAAK,QAAQ,CAAC,CAAC;AACb,gBAAA,QAAQ,QAAQ;AACd,oBAAA,KAAK,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,CAAA;oBAClF,KAAK,QAAQ,CAAC,MAAM,CAAC;oBAAC,SAAS,OAAO,EAAE,GAAG,EAAE,eAAe,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,CAAA;AAC9G,iBAAA;YACH,KAAK,QAAQ,CAAC,CAAC;AACb,gBAAA,QAAQ,QAAQ;oBACd,KAAK,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;oBAClG,KAAK,QAAQ,CAAC,IAAI,CAAC;AAAC,oBAAA,SAAS,OAAO,EAAE,GAAG,EAAE,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,CAAA;AAC7F,iBAAA;AACJ,SAAA;KACF;AAEM,IAAA,OAAO,CAAE,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC,SAAS,EAAA;AACzE,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;AAEvB,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;AACrC,QAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAA;QAEhC,IAAI,MAAM,CAAC,QAAQ,EAAE;AACnB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;;;YAGjC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAA;AACzC,YAAA,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;AAC5E,SAAA;AAAM,aAAA;AACL,YAAA,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;AAC9D,SAAA;QAED,IAAI,MAAM,CAAC,aAAa;YAAE,IAAI,CAAC,gBAAgB,EAAE,CAAA;AACjD,QAAA,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAA;KACzC;IAEO,UAAU,GAAA;AAChB,QAAA,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,GAAG,IAAI,CAAA;AAExD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;AACjC,QAAA,QAAQ,IAAI;YACV,KAAK,QAAQ,CAAC,CAAC;AACb,gBAAA,QAAQ,QAAQ;oBACd,KAAK,QAAQ,CAAC,GAAG,EAAE,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;oBACpF,KAAK,QAAQ,CAAC,MAAM,CAAC;AAAC,oBAAA,SAAS,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;AACpG,iBAAA;YACH,KAAK,QAAQ,CAAC,CAAC;AACb,gBAAA,QAAQ,QAAQ;oBACd,KAAK,QAAQ,CAAC,KAAK,EAAE,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;oBACxF,KAAK,QAAQ,CAAC,IAAI,CAAC;AAAC,oBAAA,SAAS,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;AAChG,iBAAA;AACJ,SAAA;KACF;IAEO,UAAU,GAAA;AAChB,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;AAEvB,QAAA,IAAI,OAAmC,CAAA;QACvC,QAAQ,MAAM,CAAC,IAAI;YACjB,KAAK,QAAQ,CAAC,CAAC;gBACb,QAAQ,MAAM,CAAC,QAAQ;AACrB,oBAAA,KAAK,QAAQ,CAAC,GAAG,EAAE;AAAE,wBAAA,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBAAC,MAAK;AAAE,qBAAA;oBAC5D,KAAK,QAAQ,CAAC,MAAM,CAAC;AAAC,oBAAA,SAAS;AAAE,wBAAA,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBAAC,MAAK;AAAE,qBAAA;AAC5E,iBAAA;gBACD,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAC/B,MAAK;YACP,KAAK,QAAQ,CAAC,CAAC;gBACb,QAAQ,MAAM,CAAC,QAAQ;AACrB,oBAAA,KAAK,QAAQ,CAAC,KAAK,EAAE;AAAE,wBAAA,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBAAC,MAAK;AAAE,qBAAA;oBAChE,KAAK,QAAQ,CAAC,IAAI,CAAC;AAAC,oBAAA,SAAS;AAAE,wBAAA,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBAAC,MAAK;AAAE,qBAAA;AACxE,iBAAA;gBACD,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AACjC,SAAA;QACD,OAAO;aACJ,aAAa,CAAC,CAAC,CAAC;AAChB,aAAA,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;QAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;AACxC,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,EAAmB,CAAA;AAClD,QAAA,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,EAAE,CAAA;QAEtC,MAAM,4BAA4B,GAAG,MAAwB;YAC3D,IAAI,CAAC,MAAM,CAAC,4BAA4B;AAAE,gBAAA,OAAO,WAAW,CAAA;YAE5D,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;AAC5C,YAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;AAAE,gBAAA,OAAO,WAAW,CAAA;;AAG7C,YAAA,MAAM,cAAc,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;AACtD,YAAA,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;AACrC,YAAA,MAAM,IAAI,GAAG,CAAC,cAAc,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AAEjE,YAAA,OAAO,IAAI,GAAG,cAAc,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,EAAE,cAAc,CAAwB,GAAG,UAAU,CAAA;AACxG,SAAC,CAAA;AAED,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU;AAClC,cAAE,IAAI,CAAC,wBAAwB,EAAE;AACjC,cAAE,IAAI,CAAC,4BAA4B,EAAE;kBACjC,4BAA4B,EAAE;AAChC,kBAAE,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;AAE/B,QAAA,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;AAE9B,QAAA,OAAO,OAAO,CAAA;KACf;AAEO,IAAA,WAAW,CAAE,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAA;AAC9E,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;AAEvB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;AACjC,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,EAAmB,CAAA;AAClD,QAAA,MAAM,UAAU,GACd,MAAM,CAAC,UAAU;AACf,cAAE,IAAI,CAAC,wBAAwB,EAAE;AACjC,cAAE,IAAI,CAAC,4BAA4B,EAAE;AACnC,kBAAE,SAAS,CAAC,MAAM,EAAE;kBAClB,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAA;AAC5C,QAAA,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAA;AACnC,QAAA,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;;;QAI9B,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAA;AACpC,QAAA,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;;AAGrE,QAAA,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAK;AACxB,YAAA,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAA;AAC1C,SAAC,CAAC,CAAA;QAEF,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAA6B,QAAQ,CAAC,CAAA;QAEvE,KAAK;AACF,aAAA,OAAO,CAACC,IAAM,EAAE,IAAI,CAAC;AACrB,aAAA,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAA;;;AAI9C,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAgC,eAAe,CAAC;aACjF,MAAM,CAAC,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAgB,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;AACjF,aAAA,OAAO,CAACC,SAAW,EAAE,IAAI,CAAC;aAC1B,OAAO,CAACC,iBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;AACrE,aAAA,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAoH,CAAA;;AAGzJ,QAAA,SAAS,CAAC,SAAS,CAAgC,eAAe,CAAC;aAChE,MAAM,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAgB,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;AAClF,aAAA,OAAO,CAACC,eAAiB,EAAE,IAAI,CAAC,CAAA;;AAGnC,QAAA,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;QAEjD,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAoB,EAAE,CAAS,EAAE,QAAmC,KAAI;;YACrF,IAAI,IAAI,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,MAAM,CAAC,UAAU,+CAAjB,MAAM,EAAc,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,mCAAI,CAAG,EAAA,KAAK,EAAE,CAAA;AAClE,YAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAmB,CAAA;AACjD,YAAA,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,KAAK,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,IAAI,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,CAAA;AAC7I,YAAA,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAA;YACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;AAC7D,YAAA,MAAM,UAAU,GAAG,gBAAgB,CAAC,UAAU,CAAA;AAC9C,YAAA,MAAM,WAAW,GAAsB;AACrC,gBAAA,aAAa,EAAE,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,GAAG,aAAa,CAAC,MAAM;AACpF,gBAAA,KAAK,EAAE,YAAY;gBACnB,iBAAiB,EAAE,MAAM,CAAC,aAAa;gBACvC,SAAS,EAAE,MAAM,CAAC,iBAAiB;gBACnC,SAAS,EAAE,MAAM,CAAC,sBAAsB;aACzC,CAAA;AAED,YAAA,IAAI,MAAM,CAAC,eAAe,KAAK,OAAO,CAAC,IAAI,EAAE;gBAC3C,MAAM,oBAAoB,GAAG,MAAM,CAAyB,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACnF,gBAAA,WAAW,CAAC,oBAAoB,EAAE,YAAY,EAAE,MAAM,CAAC,gBAA4B,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;gBAC1G,IAAI,GAAG,MAAM,CAAyB,WAAW,CAAC,CAAC,IAAI,EAAE,CAAA;AAC1D,aAAA;YAED,MAAM,SAAS,GAAe,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAA;AAC5D,YAAA,0BAA0B,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;AACjE,SAAC,CAAC,CAAA;QAEF,SAAS;AACN,aAAA,OAAO,CAACC,IAAM,EAAE,IAAI,CAAC;aACrB,OAAO,CAACC,YAAc,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;aACzC,OAAO,CAACC,UAAY,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAE5C,IAAI,MAAM,CAAC,QAAQ,EAAE;YACnB,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAA;AACvC,YAAA,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;AACvE,SAAA;KACF;AAEO,IAAA,wBAAwB,CAAE,SAAS,GAAG,IAAI,CAAC,SAAS,EAAA;AAC1D,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;AACvB,QAAA,MAAM,iBAAiB,GAAG,SAAS,CAAC,SAAS,CAAgC,CAAsB,mBAAA,EAAAH,eAAiB,CAAG,CAAA,CAAA,CAAC,CAAA;AAExH,QAAA,IAAI,CAAC,MAAM,CAAC,uBAAuB,EAAE;AACnC,YAAA,iBAAiB,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YACxC,OAAM;AACP,SAAA;AAED,QAAA,oBAAoB,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;;AAExD,QAAA,IAAI,CAAC,6BAA6B,GAAG,qBAAqB,CAAC,MAAK;AAC9D,YAAA,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAA;AAC5C,SAAC,CAAC,CAAA;KACH;AAEO,IAAA,kBAAkB,CAAE,SAAyE,EAAA;;QAMnG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,KAAI;AAChC,YAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAA8B,CAAA;AACrD,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;AACtB,SAAC,CAAC,CAAA;;QAGF,MAAM,aAAa,GAAG,CAAC,CAAA;AACvB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE;;YAEzC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,KAAI;AAChC,gBAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAA8B,CAAA;AACvD,gBAAA,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAA;AACvC,gBAAA,IAAI,CAAC,eAAe;oBAAE,OAAM;;AAG5B,gBAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAA;AAEzD,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;oBAC/C,IAAI,CAAC,KAAK,CAAC;wBAAE,SAAQ;AACrB,oBAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAA8B,CAAA;AACvD,oBAAA,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAA;AACvC,oBAAA,IAAI,eAAe,EAAE;AACnB,wBAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAA;wBACzD,MAAM,SAAS,GAAG,aAAa,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,CAAA;AAC3E,wBAAA,IAAI,SAAS,EAAE;AACb,4BAAA,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAA;4BACvB,MAAK;AACN,yBAAA;AACF,qBAAA;AACF,iBAAA;AACH,aAAC,CAAC,CAAA;AACH,SAAA;;QAGD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,KAAI;AAChC,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAA8B,CAAA;YACtD,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;AACxD,SAAC,CAAC,CAAA;KACH;IAEO,YAAY,GAAA;QAClB,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAA;AAE3C,QAAA,IAAI,QAAQ;AAAE,YAAA,OAAO,QAAQ,CAAA;AAE7B,QAAA,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC,EAAE;YACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAsB,CAAA;YACtD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;YACnC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,CAAA;AAC/B,SAAA;AAED,QAAA,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC,EAAE;YACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAsB,CAAA;AACtD,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;YAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAA;AACnC,SAAA;QAED,OAAO,IAAI,CAAC,gBAAgB,CAAA;KAC7B;IAEO,wBAAwB,GAAA;AAC9B,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACpE,MAAM,WAAW,GAAG,KAAK,KAAL,IAAA,IAAA,KAAK,uBAAL,KAAK,CAAE,MAAM,EAAsB,CAAA;QAEvD,IAAI,MAAM,CAAC,UAAU,EAAE;AACrB,YAAA,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACrF,SAAA;AAED,QAAA,OAAO,IAAI,CAAA;KACZ;IAEO,4BAA4B,GAAA;AAClC,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QACvB,OAAO,MAAM,CAAC,eAAe,KAAK,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,8BAA8B,CAAC,CAAA;KACrH;IAEO,kBAAkB,CAAE,QAAQ,GAAG,CAAC,EAAA;QACtC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,CAAA;AACjC,QAAA,QAAQ,IAAI;AACV,YAAA,KAAK,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAS,MAAA,EAAA,QAAQ,CAAU,OAAA,EAAA,IAAI,CAAC,MAAM,GAAG,GAAG,CAAK,EAAA,EAAA,QAAQ,EAAE,CAAA;AACnF,YAAA,KAAK,QAAQ,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,OAAO,GAAG,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAA;AACvF,SAAA;KACF;AAEO,IAAA,gBAAgB,CAAE,SAAS,GAAG,IAAI,CAAC,SAAS,EAAA;;AAClD,QAAA,MAAM,EAAE,IAAI,SAAEI,OAAK,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;;AAGjF,QAAA,SAAS,CAAC,SAAS,CAAC,CAAA,CAAA,EAAIC,KAAO,CAAA,CAAE,CAAC,CAAC,MAAM,EAAE,CAAA;AAE3C,QAAA,IAAI,CAACD,OAAK;YAAE,OAAM;;AAGlB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;;;QAGvC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,YAAY,mCAAI,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;AAEhG,QAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;;QAG9C,MAAM,WAAW,GAAG,SAAS;aAC1B,MAAM,CAAC,MAAM,CAAC;AACd,aAAA,IAAI,CAAC,OAAO,EAAEC,KAAO,CAAC;aACtB,IAAI,CAAC,IAAI,EAAE,CAAA,EAAG,IAAI,CAAC,WAAW,EAAE,CAAA,EAAA,CAAI,CAAC;AACrC,aAAA,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC;aACjC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;;AAGxC,QAAA,WAAW,CAAC,IAAI,CAACD,OAAK,CAAC,CAAA;QAEvB,IAAI,SAAS,GAAG,KAAK,CAAA;AACrB,QAAA,IAAI,gBAAgB,KAAK,OAAO,CAAC,IAAI,EAAE;;AAErC,YAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAA;YACjE,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,qBAAqB,EAAE,CAAA;YAEnE,IAAI,gBAAgB,GAAG,QAAQ,EAAE;AAC/B,gBAAA,WAAW,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;gBAClC,SAAS,GAAG,IAAI,CAAA;AACjB,aAAA;AACF,SAAA;;QAGD,IAAI,UAAU,GAAG,SAAS,CAAA;QAC1B,IAAI,WAAW,GAAG,UAAU,CAAA;AAC5B,QAAA,IAAI,gBAAgB,KAAK,OAAO,CAAC,IAAI,EAAE;YACrC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;AAC9C,YAAA,UAAU,GAAG,SAAS,CAAC,KAAK,CAAA;AAC5B,YAAA,WAAW,GAAG,SAAS,CAAC,MAAM,CAAA;AAC/B,SAAA;AAAM,aAAA;AACL,YAAA,MAAM,SAAS,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,UAAU,GAAG,WAAW,CAAA;YAChE,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAA;YAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;;AAE7D,YAAA,WAAW,CACT,WAAW,EACX,SAAS,EACT,IAAI,CAAC,MAAM,CAAC,iBAA6B,EACzC,IAAI,EACJ,QAAQ,CACT,CAAA;YACD,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;AAChD,YAAA,UAAU,GAAG,WAAW,CAAC,KAAK,CAAA;AAC9B,YAAA,WAAW,GAAG,WAAW,CAAC,MAAM,CAAA;AACjC,SAAA;AAED;;;;AAIE;AACF,QAAA,MAAM,OAAO,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC;AACjC,cAAE,IAAI,CAAC,MAAM,GAAG,CAAC;AACjB,cAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,IAAI,gBAAgB,KAAK,OAAO,CAAC,IAAI,IAAI,SAAS;AACrE,kBAAE,CAAC,YAAY,KAAK,QAAQ,CAAC,IAAI;sBAC7B,CAAC,SAAS,GAAG,WAAW,GAAG,CAAC,GAAG,EAAE;AACnC,sBAAE,SAAS;kBACX,UAAC,CAAC,CAAC,IAAM,EAAE,YAAY,KAAK,QAAQ,CAAC,IAAI,CAAC,EAAC,GAAG,SAAS,CAAA;AAC7D,QAAA,MAAM,OAAO,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC;AACjC,cAAE,IAAI,CAAC,OAAO,GAAG,CAAC;cAChB,IAAI,KAAK,QAAQ,CAAC,CAAC,IAAI,gBAAgB,KAAK,OAAO,CAAC,IAAI;kBACtD,CAAC,YAAY,KAAK,QAAQ,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,WAAW,GAAG,CAAC,GAAG,UAAU;kBAC5E,UAAC,CAAC,CAAC,IAAM,EAAE,YAAY,KAAK,QAAQ,CAAC,GAAG,CAAC,EAAC,GAAG,UAAU,CAAA;AAE7D,QAAA,MAAM,OAAO,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,IAAA,CAAA,GAAA,EAAC,CAAC,CAAC,IAAM,EAAE,YAAY,KAAK,QAAQ,CAAC,IAAI,CAAC,EAAC,GAAG,WAAW,CAAA;AACnG,QAAA,MAAM,OAAO,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,IAAA,CAAA,GAAA,EAAC,CAAC,CAAC,IAAM,EAAE,YAAY,KAAK,QAAQ,CAAC,GAAG,CAAC,EAAC,GAAG,WAAW,GAAG,CAAC,CAAA;;AAGlG,QAAA,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,OAAO,GAAG,OAAO,CAAA,CAAA,EAAI,OAAO,GAAG,OAAO,YAAY,QAAQ,CAAA,CAAA,CAAG,CAAC,CAAA;KAC1G;IAEO,WAAW,GAAA;QACjB,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;AACtC,QAAA,QAAQ,IAAI;YACV,KAAK,QAAQ,CAAC,CAAC;AACb,gBAAA,QAAQ,QAAQ;AACd,oBAAA,KAAK,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;oBAC3B,KAAK,QAAQ,CAAC,MAAM,CAAC;AAAC,oBAAA,SAAS,OAAO,IAAI,CAAA;AAC3C,iBAAA;YACH,KAAK,QAAQ,CAAC,CAAC;AACb,gBAAA,QAAQ,QAAQ;AACd,oBAAA,KAAK,QAAQ,CAAC,KAAK,EAAE,OAAO,IAAI,CAAA;oBAChC,KAAK,QAAQ,CAAC,IAAI,CAAC;AAAC,oBAAA,SAAS,OAAO,CAAC,IAAI,CAAA;AAC1C,iBAAA;AACJ,SAAA;KACF;IAEO,gBAAgB,GAAA;AACtB,QAAA,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAA;QACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;AAElD,QAAA,MAAM,UAAU,GAAG,iBAAiB,CAAC,aAA0B,CAAC,CAAA;AAChE,QAAA,MAAM,UAAU,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC;AACpC,cAAE,CAAC;cACD,IAAI,CAAC,sBAAsB,CAAC,aAA0B,EAAE,QAAoB,CAAC,CAAA;AAEjF,QAAA,MAAM,cAAc,GAAG,aAAa,GAAG,CAAa,UAAA,EAAA,UAAU,CAAc,WAAA,EAAA,aAAa,GAAG,GAAG,CAAa,UAAA,EAAA,UAAU,KAAK,CAAA;QAC3H,QAAQ;AACL,aAAA,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC;AACjC,aAAA,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA;KACnC;AAEO,IAAA,sBAAsB,CAAE,SAAoB,EAAE,YAAyB,GAAA,QAAQ,CAAC,IAAI,EAAA;;AAC1F;;AAEE;QACF,MAAM,wBAAwB,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,CAAA;;AAG5D,QAAA,MAAM,KAAK,GAAG,CAAC,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAI,CAAC,YAAY,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,CAAA,EAAA,GAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,OAAO,EAAA,CAAG,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,CAAC,IAAI,wBAAwB,CAAA;AAElH,QAAA,QAAQ,SAAS;YACf,KAAK,SAAS,CAAC,IAAI,EAAE,OAAO,YAAY,KAAK,QAAQ,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;AAC3E,YAAA,KAAK,SAAS,CAAC,KAAK,EAAE,OAAO,YAAY,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,GAAG,KAAK,CAAA;YACvE,KAAK,SAAS,CAAC,MAAM,EAAE,OAAO,YAAY,KAAK,QAAQ,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,GAAG,CAAA;AAC3F,YAAA,SAAS,OAAO,CAAC,CAAA;AAClB,SAAA;KACF;;AApgBM,IAAS,CAAA,SAAA,GAAGE,KAAC;;;;"}
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'\nimport { NumberValue } from 'd3-scale'\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, textAlignToAnchor, trimSVGText, wrapSVGText } from 'utils/text'\nimport { isEqual } from 'utils/data'\nimport { rectIntersect } from 'utils/misc'\nimport { getFontWidthToHeightRatio } from 'styles/index'\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 private axisGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private 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 _collideTickLabelsAnimFrameId: ReturnType<typeof requestAnimationFrame>\n private _tickTextStyleCached: {\n fontSize: number;\n fontFamily: string;\n fontWidthToHeightRatio: number;\n }\n\n protected 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 public 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 // 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 public getPosition (): Position {\n const { config: { type, position } } = this\n return (position ?? ((type === AxisType.X) ? Position.Bottom : Position.Left)) as Position\n }\n\n private _getAxisSize (selection: Selection<SVGGElement, unknown, SVGGElement, undefined>): SVGRect {\n const bBox = selection.node().getBBox()\n return bBox\n }\n\n private _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 public _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()\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 this._resolveTickLabelOverlap(selection)\n }\n\n private _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 private _buildGrid (): D3Axis<NumberValue | Date> {\n const { config } = this\n\n let gridGen: D3Axis<NumberValue | Date>\n switch (config.type) {\n case AxisType.X:\n switch (config.position) {\n case Position.Top: { gridGen = axisTop(this.xScale); break }\n case Position.Bottom: default: { gridGen = axisBottom(this.xScale); break }\n }\n gridGen.tickSize(-this._height)\n break\n case AxisType.Y:\n switch (config.position) {\n case Position.Right: { gridGen = axisRight(this.yScale); break }\n case Position.Left: default: { gridGen = axisLeft(this.yScale); break }\n }\n gridGen.tickSize(-this._width)\n }\n gridGen\n .tickSizeOuter(0)\n .tickFormat(() => '')\n\n const numTicks = this._getNumTicks() * 2\n const gridScale = gridGen.scale<ContinuousScale>()\n const scaleDomain = gridScale.domain()\n\n const getGridMinMaxTicksOnlyValues = (): number[] | Date[] => {\n if (!config.minMaxTicksOnlyShowGridLines) return scaleDomain\n\n const tickValues = gridScale.ticks(numTicks)\n if (tickValues.length < 2) return scaleDomain\n\n // If the last tick is far enough from the domain max value, we add it to the tick values to draw the grid line\n const tickValuesStep = +tickValues[1] - +tickValues[0]\n const domainMaxValue = scaleDomain[1]\n const diff = +domainMaxValue - +tickValues[tickValues.length - 1]\n\n return diff > tickValuesStep / 2 ? [...tickValues, domainMaxValue] as (number[] | Date[]) : tickValues\n }\n\n const tickValues = config.tickValues\n ? this._getConfiguredTickValues()\n : this._shouldRenderMinMaxTicksOnly()\n ? getGridMinMaxTicksOnlyValues()\n : gridScale.ticks(numTicks)\n\n gridGen.tickValues(tickValues)\n\n return gridGen\n }\n\n private _renderAxis (selection = this.axisGroup, duration = this.config.duration): void {\n const { config } = this\n\n const axisGen = this._buildAxis()\n const axisScale = axisGen.scale<ContinuousScale>()\n const tickValues: (number[] | Date[]) =\n config.tickValues\n ? this._getConfiguredTickValues()\n : this._shouldRenderMinMaxTicksOnly()\n ? axisScale.domain()\n : axisScale.ticks(this._getNumTicks())\n const tickCount = tickValues.length\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 const transition = smartTransition(selection, duration).call(axisGen)\n\n // Unset D3's default y and dy attributes because we're going to set them manually in the renderTextToSvgTextElement function\n selection.selectAll<SVGTextElement, number | Date>('text')\n .attr('dy', null)\n .attr('y', null)\n\n // Resolving tick label overlap after the animation is over\n transition.on('end', () => {\n this._resolveTickLabelOverlap(selection)\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 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 .classed(s.tickLabelHideable, Boolean(config.tickTextHideOverlapping))\n .style('fill', config.tickTextColor) as Selection<SVGTextElement, number, SVGGElement, unknown> | Selection<SVGTextElement, Date, SVGGElement, unknown>\n\n // Marking exiting elements\n selection.selectAll<SVGTextElement, number | Date>('g.tick > text')\n .filter(tickValue => !tickValues.some((t: number | Date) => isEqual(tickValue, t)))\n .classed(s.tickTextExiting, true)\n\n // We interrupt the transition on tick's <text> to make it 'wrappable'\n tickText.nodes().forEach(node => interrupt(node))\n\n const tickSize = axisGen.tickSize()\n const axisPosition = this.getPosition()\n const textMaxWidth = config.tickTextWidth || (config.type === AxisType.X ? this._containerWidth / (tickCount + 1) : this._containerWidth / 5)\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\n // Get and cache the tick text style\n if (!this._tickTextStyleCached) {\n const styleDeclaration = getComputedStyle(textElement)\n this._tickTextStyleCached = {\n fontSize: Number.parseFloat(styleDeclaration.fontSize),\n fontFamily: styleDeclaration.fontFamily,\n fontWidthToHeightRatio: getFontWidthToHeightRatio(),\n }\n }\n\n // Calculate the text offset based on the axis position and the tick size\n const [textOffsetX, textOffsetY] = this._getTickTextOffset(axisPosition, tickSize, this._tickTextStyleCached.fontSize)\n\n // Prepare the Unovis text options\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 x: textOffsetX,\n y: textOffsetY,\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, this._tickTextStyleCached.fontSize, 0.58)\n text = select<SVGTextElement, string>(textElement).text()\n }\n\n const textBlock: UnovisText = { text, ...this._tickTextStyleCached }\n renderTextToSvgTextElement(textElement, textBlock, textOptions, 'central')\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 private _resolveTickLabelOverlap (selection = this.axisGroup): void {\n const { config } = this\n const tickTextSelection = selection.selectAll<SVGTextElement, number | Date>(`g.tick > text:not(.${s.tickTextExiting})`)\n\n if (!config.tickTextHideOverlapping) {\n tickTextSelection.style('opacity', null)\n return\n }\n\n cancelAnimationFrame(this._collideTickLabelsAnimFrameId)\n // Colliding labels in the next frame to prevent forced reflow\n this._collideTickLabelsAnimFrameId = requestAnimationFrame(() => {\n this._collideTickLabels(tickTextSelection)\n })\n }\n\n private _collideTickLabels (selection: Selection<SVGTextElement, number | Date, SVGGElement, unknown>): void {\n type SVGOverlappingTextElement = SVGTextElement & {\n _visible: boolean;\n }\n\n // Reset visibility of all labels\n selection.each((d, i, elements) => {\n const node = elements[i] as SVGOverlappingTextElement\n node._visible = true\n })\n\n // We do three iterations because not all overlapping labels can be resolved in the first iteration\n const numIterations = 3\n for (let i = 0; i < numIterations; i += 1) {\n // Run collision detection and set labels visibility\n selection.each((d, i, elements) => {\n const label1 = elements[i] as SVGOverlappingTextElement\n const isLabel1Visible = label1._visible\n if (!isLabel1Visible) return\n\n // Calculate bounding rect of point's label\n const label1BoundingRect = label1.getBoundingClientRect()\n\n for (let j = i + 1; j < elements.length; j += 1) {\n if (i === j) continue\n const label2 = elements[j] as SVGOverlappingTextElement\n const isLabel2Visible = label2._visible\n if (isLabel2Visible) {\n const label2BoundingRect = label2.getBoundingClientRect()\n const intersect = rectIntersect(label1BoundingRect, label2BoundingRect, -5)\n if (intersect) {\n label2._visible = false\n break\n }\n }\n }\n })\n }\n\n // Hide the overlapping labels\n selection.each((d, i, elements) => {\n const label = elements[i] as SVGOverlappingTextElement\n select(label).style('opacity', label._visible ? 1 : 0)\n })\n }\n\n private _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 private _getConfiguredTickValues (): number[] | null {\n const { config } = this\n const scale = config.type === AxisType.X ? this.xScale : this.yScale\n const scaleDomain = scale?.domain() as [number, number]\n\n if (config.tickValues) {\n return config.tickValues.filter(v => (v >= scaleDomain[0]) && (v <= scaleDomain[1]))\n }\n\n return null\n }\n\n private _shouldRenderMinMaxTicksOnly (): boolean {\n const { config } = this\n return config.minMaxTicksOnly || (config.type === AxisType.X && this._width < config.minMaxTicksOnlyWhenWidthIsLess)\n }\n\n private _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 private _renderAxisLabel (selection = this.axisGroup): void {\n const { type, label, labelMargin, labelFontSize, labelTextFitMode } = this.config\n\n // Remove the old label first to calculate the axis size properly\n selection.selectAll(`.${s.label}`).remove()\n\n if (!label) return\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 rotation = type === AxisType.Y ? -90 : 0\n\n // Create the text element (without transform first)\n const textElement = selection\n .append('text')\n .attr('class', s.label)\n .attr('dy', `${this._getLabelDY()}em`)\n .style('font-size', labelFontSize)\n .style('fill', this.config.labelColor)\n\n // Set the text content\n textElement.text(label)\n\n let isWrapped = false\n if (labelTextFitMode === FitMode.Wrap) {\n // For Y-axis, use the chart height as the maximum width before rotation\n const maxWidth = type === AxisType.Y ? this._height : this._width\n const currentTextWidth = textElement.node().getComputedTextLength()\n\n if (currentTextWidth > maxWidth) {\n wrapSVGText(textElement, maxWidth)\n isWrapped = true\n }\n }\n\n // Calculate offset after wrapping to get accurate dimensions\n let labelWidth = axisWidth\n let labelHeight = axisHeight\n if (labelTextFitMode === FitMode.Wrap) {\n const labelBBox = textElement.node().getBBox()\n labelWidth = labelBBox.width\n labelHeight = labelBBox.height\n } else {\n const trimWidth = type === AxisType.X ? labelWidth : labelHeight\n const styleDeclaration = getComputedStyle(textElement.node())\n const fontSize = Number.parseFloat(styleDeclaration.fontSize)\n // Use the default fontWidthToHeightRatio\n trimSVGText(\n textElement,\n trimWidth,\n this.config.labelTextTrimType as TrimMode,\n true,\n fontSize\n )\n const trimmedBBox = textElement.node().getBBox()\n labelWidth = trimmedBBox.width\n labelHeight = trimmedBBox.height\n }\n\n /*\n we need to calculate the offset for the label based on the position and the fit mode\n for offsetX, applying Y label we need to check if it's wrap or trim, then set the offset accordingly.\n Same for offsetY, need to consider x label.\n */\n const offsetX = type === AxisType.X\n ? this._width / 2\n : type === AxisType.Y && labelTextFitMode === FitMode.Wrap && isWrapped\n ? (axisPosition === Position.Left)\n ? -axisWidth - labelHeight / 2 - 10 // there's a 10px gap between tick label and Position.Right Y label, so offset as well in the Position.Left case\n : axisWidth\n : (-1) ** (+(axisPosition === Position.Left)) * axisWidth\n const offsetY = type === AxisType.Y\n ? this._height / 2\n : type === AxisType.X && labelTextFitMode === FitMode.Wrap\n ? (axisPosition === Position.Top) ? -axisHeight - labelHeight / 2 : axisHeight\n : (-1) ** (+(axisPosition === Position.Top)) * axisHeight\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 // Apply transform and rotation after all calculations\n textElement.attr('transform', `translate(${offsetX + marginX},${offsetY + marginY}) rotate(${rotation})`)\n }\n\n private _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 private _getTickTextOffset (axisPosition: Position, tickSize: number, fontSize: number): [number, number] {\n const { config } = this\n const angleRad = (config.tickTextAngle ?? 0) / 180 * Math.PI\n const baseOffset = tickSize + config.tickPadding\n\n if (config.type === AxisType.X) {\n const direction = axisPosition === Position.Bottom ? 1 : -1\n return [\n direction * baseOffset * Math.sin(angleRad),\n direction * (baseOffset + fontSize / 2) * Math.cos(angleRad),\n ]\n } else {\n const direction = axisPosition === Position.Right ? 1 : -1\n return [\n direction * baseOffset * Math.cos(angleRad),\n direction * baseOffset * Math.sin(angleRad),\n ]\n }\n }\n\n private _alignTickLabels (): void {\n const { config: { type, tickTextAlign, tickTextAngle, position } } = this\n const tickText = this.g.selectAll('g.tick > text')\n\n const textAnchor = textAlignToAnchor(tickTextAlign as TextAlign)\n const translateX = type === AxisType.X\n ? 0\n : this._getYTickTextTranslate(tickTextAlign as TextAlign, position as Position)\n\n const translateValue = tickTextAngle ? `translate(${translateX},0) rotate(${tickTextAngle})` : `translate(${translateX},0)`\n tickText\n .attr('transform', translateValue)\n .attr('text-anchor', textAnchor)\n }\n\n private _getYTickTextTranslate (textAlign: TextAlign, axisPosition: Position = Position.Left): number {\n /*\n Default in D3 is 9, tickPadding is the spacing in pixels between the tick and it's label. Default: `8`\n */\n const defaultTickTextSpacingPx = this.config.tickPadding + 1\n\n // this._axisRawBBox will be undefined when autoMargin is undefined\n const width = (this._axisRawBBox?.width ?? this.axisGroup.node()?.getBBox().width ?? 0) - 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.tickLabelHideable","s.tickTextExiting","s.axis","s.hideTickLine","s.hideDomain","label","s.label","s"],"mappings":"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"}
@@ -12,6 +12,8 @@ export declare class BulletLegend {
12
12
  protected _container: HTMLElement;
13
13
  private _colorAccessor;
14
14
  constructor(element: HTMLElement, config?: BulletLegendConfigInterface);
15
+ setConfig(config: BulletLegendConfigInterface): void;
16
+ /** @deprecated Use setConfig instead */
15
17
  update(config: BulletLegendConfigInterface): void;
16
18
  render(): void;
17
19
  _isItemClickable(item: BulletLegendItemInterface): boolean;
@@ -1,6 +1,7 @@
1
1
  import { select } from 'd3-selection';
2
- import toPx from 'to-px';
2
+ import { toPx } from '../../utils/to-px.js';
3
3
  import { merge } from '../../utils/data.js';
4
+ import { getCSSVariableValueInPixels } from '../../utils/misc.js';
4
5
  import { BulletLegendDefaultConfig } from './config.js';
5
6
  import { BulletLegendOrientation } from './types.js';
6
7
  import { createBullets, getBulletsTotalWidth, updateBullets } from './modules/shape.js';
@@ -17,13 +18,17 @@ class BulletLegend {
17
18
  this.div.classed(root, true);
18
19
  this.element = this.div.node();
19
20
  if (config)
20
- this.update(config);
21
+ this.setConfig(config);
21
22
  }
22
- update(config) {
23
+ setConfig(config) {
23
24
  this.prevConfig = this.config;
24
25
  this.config = merge(this._defaultConfig, config);
25
26
  this.render();
26
27
  }
28
+ /** @deprecated Use setConfig instead */
29
+ update(config) {
30
+ this.setConfig(config);
31
+ }
27
32
  render() {
28
33
  const { config } = this;
29
34
  const legendItems = this.div.selectAll(`.${item}`).data(config.items);
@@ -44,8 +49,7 @@ class BulletLegend {
44
49
  .style('width', function (d) {
45
50
  const colors = Array.isArray(d.color) ? d.color : [d.color];
46
51
  const numColors = colors.length;
47
- const defaultSize = toPx(getComputedStyle(this).getPropertyValue('--vis-legend-bullet-size')) || 9;
48
- const baseSize = config.bulletSize ? toPx(config.bulletSize) : defaultSize;
52
+ const baseSize = config.bulletSize ? toPx(config.bulletSize) : (getCSSVariableValueInPixels('var(--vis-legend-bullet-size)', this) || 9);
49
53
  const spacing = config.bulletSpacing;
50
54
  return `${getBulletsTotalWidth(baseSize, numColors, spacing)}px`;
51
55
  })
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/bullet-legend/index.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\nimport toPx from 'to-px'\n\n// Utils\nimport { merge } from 'utils/data'\n\n// Config\nimport { BulletLegendDefaultConfig, BulletLegendConfigInterface } from './config'\n\n// Local Types\nimport { BulletLegendItemInterface, BulletLegendOrientation } from './types'\n\n// Modules\nimport { createBullets, updateBullets, getBulletsTotalWidth } from './modules/shape'\n\n// Styles\nimport * as s from './style'\n\nexport class BulletLegend {\n static selectors = s\n protected _defaultConfig = BulletLegendDefaultConfig as BulletLegendConfigInterface\n public config: BulletLegendConfigInterface = this._defaultConfig\n\n div: Selection<HTMLElement, unknown, null, undefined>\n element: HTMLElement\n prevConfig: BulletLegendConfigInterface\n protected _container: HTMLElement\n\n private _colorAccessor = (d: BulletLegendItemInterface): string|string[] => d.color\n\n constructor (element: HTMLElement, config?: BulletLegendConfigInterface) {\n this._container = element\n\n this.div = config?.renderIntoProvidedDomNode ? select(this._container) : select(this._container).append<HTMLElement>('div')\n this.div.classed(s.root, true)\n\n this.element = this.div.node()\n\n if (config) this.update(config)\n }\n\n update (config: BulletLegendConfigInterface): void {\n this.prevConfig = this.config\n this.config = merge(this._defaultConfig, config)\n this.render()\n }\n\n render (): void {\n const { config } = this\n\n const legendItems = this.div.selectAll<HTMLDivElement, unknown>(`.${s.item}`).data(config.items)\n\n const legendItemsEnter = legendItems.enter().append('div')\n .on('click', this._onItemClick.bind(this))\n\n const legendItemsMerged = legendItemsEnter.merge(legendItems)\n legendItemsMerged\n .attr('class', d => `${s.item} ${d.className ?? ''}`)\n .classed(s.itemVertical, config.orientation === BulletLegendOrientation.Vertical)\n .classed(s.clickable, d => !!config.onLegendItemClick && this._isItemClickable(d))\n .attr('title', d => d.name)\n .style('display', (d: BulletLegendItemInterface) => d.hidden ? 'none' : null)\n\n // Bullet\n legendItemsEnter.append('span')\n .attr('class', s.bullet)\n .call(createBullets)\n\n legendItemsMerged.select<SVGElement>(`.${s.bullet}`)\n .style('width', function (d: BulletLegendItemInterface) {\n const colors = Array.isArray(d.color) ? d.color : [d.color]\n const numColors = colors.length\n const defaultSize = toPx(getComputedStyle(this).getPropertyValue('--vis-legend-bullet-size')) || 9\n const baseSize = config.bulletSize ? toPx(config.bulletSize) : defaultSize\n const spacing = config.bulletSpacing\n return `${getBulletsTotalWidth(baseSize, numColors, spacing)}px`\n })\n .style('height', config.bulletSize)\n .style('box-sizing', 'content-box')\n .call(updateBullets, this.config, this._colorAccessor)\n\n // Labels\n legendItemsEnter.append('span')\n .attr('class', s.label)\n .classed(config.labelClassName, true)\n .style('max-width', config.labelMaxWidth)\n .style('font-size', config.labelFontSize)\n\n legendItemsMerged.select(`.${s.label}`)\n .text((d: BulletLegendItemInterface) => d.name)\n\n legendItems.exit().remove()\n }\n\n _isItemClickable (item: BulletLegendItemInterface): boolean {\n return item.pointer === undefined ? true : item.pointer\n }\n\n _onItemClick (event: MouseEvent, d: BulletLegendItemInterface): void {\n const { config: { onLegendItemClick } } = this\n\n const legendItems = this.div.selectAll(`.${s.item}`).nodes() as HTMLElement[]\n const index = legendItems.indexOf(event.currentTarget as HTMLElement)\n if (onLegendItemClick) onLegendItemClick(d, index)\n }\n\n public destroy (): void {\n if (this.element !== this._container) this.div.remove()\n }\n}\n"],"names":["s.root","s.item","s.itemVertical","s.clickable","s.bullet","s.label","s"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/bullet-legend/index.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\n\n// Utils\nimport { toPx } from 'utils/to-px'\nimport { merge } from 'utils/data'\nimport { getCSSVariableValueInPixels } from 'utils/misc'\n\n// Config\nimport { BulletLegendDefaultConfig, BulletLegendConfigInterface } from './config'\n\n// Local Types\nimport { BulletLegendItemInterface, BulletLegendOrientation } from './types'\n\n// Modules\nimport { createBullets, updateBullets, getBulletsTotalWidth } from './modules/shape'\n\n// Styles\nimport * as s from './style'\n\nexport class BulletLegend {\n static selectors = s\n protected _defaultConfig = BulletLegendDefaultConfig as BulletLegendConfigInterface\n public config: BulletLegendConfigInterface = this._defaultConfig\n\n div: Selection<HTMLElement, unknown, null, undefined>\n element: HTMLElement\n prevConfig: BulletLegendConfigInterface\n protected _container: HTMLElement\n\n private _colorAccessor = (d: BulletLegendItemInterface): string|string[] => d.color\n\n constructor (element: HTMLElement, config?: BulletLegendConfigInterface) {\n this._container = element\n\n this.div = config?.renderIntoProvidedDomNode ? select(this._container) : select(this._container).append<HTMLElement>('div')\n this.div.classed(s.root, true)\n\n this.element = this.div.node()\n\n if (config) this.setConfig(config)\n }\n\n setConfig (config: BulletLegendConfigInterface): void {\n this.prevConfig = this.config\n this.config = merge(this._defaultConfig, config)\n this.render()\n }\n\n /** @deprecated Use setConfig instead */\n update (config: BulletLegendConfigInterface): void {\n this.setConfig(config)\n }\n\n render (): void {\n const { config } = this\n\n const legendItems = this.div.selectAll<HTMLDivElement, unknown>(`.${s.item}`).data(config.items)\n\n const legendItemsEnter = legendItems.enter().append('div')\n .on('click', this._onItemClick.bind(this))\n\n const legendItemsMerged = legendItemsEnter.merge(legendItems)\n legendItemsMerged\n .attr('class', d => `${s.item} ${d.className ?? ''}`)\n .classed(s.itemVertical, config.orientation === BulletLegendOrientation.Vertical)\n .classed(s.clickable, d => !!config.onLegendItemClick && this._isItemClickable(d))\n .attr('title', d => d.name)\n .style('display', (d: BulletLegendItemInterface) => d.hidden ? 'none' : null)\n\n // Bullet\n legendItemsEnter.append('span')\n .attr('class', s.bullet)\n .call(createBullets)\n\n legendItemsMerged.select<SVGElement>(`.${s.bullet}`)\n .style('width', function (d: BulletLegendItemInterface) {\n const colors = Array.isArray(d.color) ? d.color : [d.color]\n const numColors = colors.length\n const baseSize = config.bulletSize ? toPx(config.bulletSize) : (getCSSVariableValueInPixels('var(--vis-legend-bullet-size)', this) || 9)\n const spacing = config.bulletSpacing\n return `${getBulletsTotalWidth(baseSize, numColors, spacing)}px`\n })\n .style('height', config.bulletSize)\n .style('box-sizing', 'content-box')\n .call(updateBullets, this.config, this._colorAccessor)\n\n // Labels\n legendItemsEnter.append('span')\n .attr('class', s.label)\n .classed(config.labelClassName, true)\n .style('max-width', config.labelMaxWidth)\n .style('font-size', config.labelFontSize)\n\n legendItemsMerged.select(`.${s.label}`)\n .text((d: BulletLegendItemInterface) => d.name)\n\n legendItems.exit().remove()\n }\n\n _isItemClickable (item: BulletLegendItemInterface): boolean {\n return item.pointer === undefined ? true : item.pointer\n }\n\n _onItemClick (event: MouseEvent, d: BulletLegendItemInterface): void {\n const { config: { onLegendItemClick } } = this\n\n const legendItems = this.div.selectAll(`.${s.item}`).nodes() as HTMLElement[]\n const index = legendItems.indexOf(event.currentTarget as HTMLElement)\n if (onLegendItemClick) onLegendItemClick(d, index)\n }\n\n public destroy (): void {\n if (this.element !== this._container) this.div.remove()\n }\n}\n"],"names":["s.root","s.item","s.itemVertical","s.clickable","s.bullet","s.label","s"],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { select } from 'd3-selection';
2
2
  import { symbol } from 'd3-shape';
3
- import toPx from 'to-px';
4
3
  import { Symbol } from '../../../types/symbol.js';
5
4
  import { getColor } from '../../../utils/color.js';
6
5
  import { getString, ensureArray } from '../../../utils/data.js';
6
+ import { getCSSVariableValueInPixels } from '../../../utils/misc.js';
7
+ import { toPx } from '../../../utils/to-px.js';
7
8
  import { PATTERN_SIZE_PX } from '../../../styles/patterns.js';
8
9
  import { BulletShape } from '../types.js';
9
10
 
@@ -40,7 +41,7 @@ function updateBullets(container, config, colorAccessor) {
40
41
  const colors = ensureArray((_a = d.color) !== null && _a !== void 0 ? _a : getColor(d, colorAccessor, i));
41
42
  const numBullets = colors.length;
42
43
  const bulletWidth = BULLET_SIZE;
43
- const defaultBulletSize = toPx(getComputedStyle(els[i]).getPropertyValue('--vis-legend-bullet-size'));
44
+ const defaultBulletSize = toPx(config.bulletSize) || getCSSVariableValueInPixels('var(--vis-legend-bullet-size)', els[i]);
44
45
  const spacing = config.bulletSpacing * (BULLET_SIZE / defaultBulletSize); // Scale spacing relative to bullet size
45
46
  const width = getBulletsTotalWidth(bulletWidth, numBullets, spacing);
46
47
  const height = shape === BulletShape.Line ? BULLET_SIZE / 2.5 : BULLET_SIZE;
@@ -1 +1 @@
1
- {"version":3,"file":"shape.js","sources":["../../../../src/components/bullet-legend/modules/shape.ts"],"sourcesContent":["import { Selection, select } from 'd3-selection'\nimport { symbol } from 'd3-shape'\nimport toPx from 'to-px'\n\n// Types\nimport { ColorAccessor } from 'types/accessor'\nimport { Symbol, SymbolType } from 'types/symbol'\n\n// Utils\nimport { getColor } from 'utils/color'\nimport { ensureArray, getString } from 'utils/data'\n\n// Constants\nimport { PATTERN_SIZE_PX } from 'styles/patterns'\n\n// Local types\nimport { BulletLegendConfigInterface } from '../config'\nimport { BulletShape, BulletLegendItemInterface } from '../types'\n\n// Size with respect to the viewBox. We use this to compute path data which is independent of the\n// the configured size.\nconst BULLET_SIZE = PATTERN_SIZE_PX * 3\n\n// Different shapes need different scaling to fit the full size\nconst shapeScale: Record<SymbolType, number> = {\n [BulletShape.Circle]: Math.PI / 4,\n [BulletShape.Cross]: 5 / 9,\n [BulletShape.Diamond]: Math.sqrt(3) / 6,\n [BulletShape.Square]: 1,\n [BulletShape.Star]: 0.3,\n [BulletShape.Triangle]: Math.sqrt(3) / 4,\n [BulletShape.Wye]: 5 / 11,\n}\n\nexport function getBulletsTotalWidth (bulletSize: number, numBullets: number, spacing: number): number {\n if (numBullets < 1) return 0\n return bulletSize * numBullets + spacing * (numBullets - 1)\n}\n\nexport function createBullets (\n container: Selection<HTMLSpanElement, BulletLegendItemInterface, HTMLElement, unknown>\n): void {\n container.each((d, i, els) => {\n select(els[i]).append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .append('path')\n })\n}\n\nexport function updateBullets (\n container: Selection<SVGElement, BulletLegendItemInterface, HTMLElement, unknown>,\n config: BulletLegendConfigInterface,\n colorAccessor: ColorAccessor<BulletLegendItemInterface>\n): void {\n container.each((d, i, els) => {\n const shape = getString(d, config.bulletShape, i) as BulletShape\n const colors = ensureArray(d.color ?? getColor(d, colorAccessor, i))\n const numBullets = colors.length\n const bulletWidth = BULLET_SIZE\n const defaultBulletSize = toPx(getComputedStyle(els[i]).getPropertyValue('--vis-legend-bullet-size'))\n const spacing = config.bulletSpacing * (BULLET_SIZE / defaultBulletSize) // Scale spacing relative to bullet size\n const width = getBulletsTotalWidth(bulletWidth, numBullets, spacing)\n const height = shape === BulletShape.Line ? BULLET_SIZE / 2.5 : BULLET_SIZE\n\n const selection = select(els[i]).select('svg')\n .attr('viewBox', `0 0 ${width} ${height}`)\n\n // Remove existing paths\n selection.selectAll('path').remove()\n\n const opacity = d.inactive ? 'var(--vis-legend-bullet-inactive-opacity)' : 1\n\n // Create a path for each color\n colors.forEach((color, colorIndex) => {\n const bulletPath = selection.append('path')\n\n if (shape === BulletShape.Line) {\n const x1 = colorIndex * (bulletWidth + spacing)\n const x2 = x1 + bulletWidth\n bulletPath\n .attr('d', `M${x1},${height / 2} L${x2},${height / 2}`)\n .attr('transform', null)\n .style('opacity', opacity)\n .style('stroke', color)\n .style('stroke-width', '3px')\n .style('fill', null)\n .style('fill-opacity', null)\n .style('marker-start', 'none')\n .style('marker-end', 'none')\n } else {\n const symbolGen = symbol()\n .type(Symbol[shape])\n .size(bulletWidth * height * shapeScale[shape])\n\n const scale = (bulletWidth - 2) / bulletWidth\n let dy = height / 2\n switch (shape) {\n case BulletShape.Triangle:\n dy += height / 8\n break\n case BulletShape.Star:\n dy += height / 16\n break\n case BulletShape.Wye:\n dy -= height / 16\n break\n }\n\n const dx = colorIndex * (bulletWidth + spacing) + bulletWidth / 2\n bulletPath\n .attr('d', symbolGen)\n .attr('transform', `translate(${dx}, ${Math.round(dy)}) scale(${scale})`)\n .style('stroke', color)\n .style('stroke-width', '1px')\n .style('opacity', null)\n .style('fill', color)\n .style('fill-opacity', opacity)\n }\n })\n })\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shape.js","sources":["../../../../src/components/bullet-legend/modules/shape.ts"],"sourcesContent":["import { Selection, select } from 'd3-selection'\nimport { symbol } from 'd3-shape'\n\n// Types\nimport { ColorAccessor } from 'types/accessor'\nimport { Symbol, SymbolType } from 'types/symbol'\n\n// Utils\nimport { getColor } from 'utils/color'\nimport { ensureArray, getString } from 'utils/data'\nimport { getCSSVariableValueInPixels } from 'utils/misc'\nimport { toPx } from 'utils/to-px'\n\n// Constants\nimport { PATTERN_SIZE_PX } from 'styles/patterns'\n\n// Local types\nimport { BulletLegendConfigInterface } from '../config'\nimport { BulletShape, BulletLegendItemInterface } from '../types'\n\n// Size with respect to the viewBox. We use this to compute path data which is independent of the\n// the configured size.\nconst BULLET_SIZE = PATTERN_SIZE_PX * 3\n\n// Different shapes need different scaling to fit the full size\nconst shapeScale: Record<SymbolType, number> = {\n [BulletShape.Circle]: Math.PI / 4,\n [BulletShape.Cross]: 5 / 9,\n [BulletShape.Diamond]: Math.sqrt(3) / 6,\n [BulletShape.Square]: 1,\n [BulletShape.Star]: 0.3,\n [BulletShape.Triangle]: Math.sqrt(3) / 4,\n [BulletShape.Wye]: 5 / 11,\n}\n\nexport function getBulletsTotalWidth (bulletSize: number, numBullets: number, spacing: number): number {\n if (numBullets < 1) return 0\n return bulletSize * numBullets + spacing * (numBullets - 1)\n}\n\nexport function createBullets (\n container: Selection<HTMLSpanElement, BulletLegendItemInterface, HTMLElement, unknown>\n): void {\n container.each((d, i, els) => {\n select(els[i]).append('svg')\n .attr('width', '100%')\n .attr('height', '100%')\n .append('path')\n })\n}\n\nexport function updateBullets (\n container: Selection<SVGElement, BulletLegendItemInterface, HTMLElement, unknown>,\n config: BulletLegendConfigInterface,\n colorAccessor: ColorAccessor<BulletLegendItemInterface>\n): void {\n container.each((d, i, els) => {\n const shape = getString(d, config.bulletShape, i) as BulletShape\n const colors = ensureArray(d.color ?? getColor(d, colorAccessor, i))\n const numBullets = colors.length\n const bulletWidth = BULLET_SIZE\n const defaultBulletSize = toPx(config.bulletSize) || getCSSVariableValueInPixels('var(--vis-legend-bullet-size)', els[i])\n const spacing = config.bulletSpacing * (BULLET_SIZE / defaultBulletSize) // Scale spacing relative to bullet size\n const width = getBulletsTotalWidth(bulletWidth, numBullets, spacing)\n const height = shape === BulletShape.Line ? BULLET_SIZE / 2.5 : BULLET_SIZE\n\n const selection = select(els[i]).select('svg')\n .attr('viewBox', `0 0 ${width} ${height}`)\n\n // Remove existing paths\n selection.selectAll('path').remove()\n\n const opacity = d.inactive ? 'var(--vis-legend-bullet-inactive-opacity)' : 1\n\n // Create a path for each color\n colors.forEach((color, colorIndex) => {\n const bulletPath = selection.append('path')\n\n if (shape === BulletShape.Line) {\n const x1 = colorIndex * (bulletWidth + spacing)\n const x2 = x1 + bulletWidth\n bulletPath\n .attr('d', `M${x1},${height / 2} L${x2},${height / 2}`)\n .attr('transform', null)\n .style('opacity', opacity)\n .style('stroke', color)\n .style('stroke-width', '3px')\n .style('fill', null)\n .style('fill-opacity', null)\n .style('marker-start', 'none')\n .style('marker-end', 'none')\n } else {\n const symbolGen = symbol()\n .type(Symbol[shape])\n .size(bulletWidth * height * shapeScale[shape])\n\n const scale = (bulletWidth - 2) / bulletWidth\n let dy = height / 2\n switch (shape) {\n case BulletShape.Triangle:\n dy += height / 8\n break\n case BulletShape.Star:\n dy += height / 16\n break\n case BulletShape.Wye:\n dy -= height / 16\n break\n }\n\n const dx = colorIndex * (bulletWidth + spacing) + bulletWidth / 2\n bulletPath\n .attr('d', symbolGen)\n .attr('transform', `translate(${dx}, ${Math.round(dy)}) scale(${scale})`)\n .style('stroke', color)\n .style('stroke-width', '1px')\n .style('opacity', null)\n .style('fill', color)\n .style('fill-opacity', opacity)\n }\n })\n })\n}\n"],"names":[],"mappings":"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"}
@@ -109,6 +109,7 @@ class Crosshair extends XYComponentCore {
109
109
  if (shouldShow && tooltip && this._isContainerInViewport()) {
110
110
  const container = tooltip.getContainer() || this.container.node();
111
111
  const isContainerBody = tooltip.isContainerBody();
112
+ const nearestDatumXValue = this.accessors.x ? getNumber(nearestDatum, this.accessors.x, nearestDatumIndex) : undefined;
112
113
  if (isForceShowAtDefined) {
113
114
  // Convert SVG coordinates to screen coordinates
114
115
  const containerRect = this.container.node().getBoundingClientRect();
@@ -116,11 +117,11 @@ class Crosshair extends XYComponentCore {
116
117
  const screenX = (isContainerBody ? xPx + containerRect.left : xPx) + this._containerMargin.left;
117
118
  const screenY = this._height / 2 + (isContainerBody ? containerRect.top : 0);
118
119
  const pos = [screenX, screenY];
119
- this._showTooltip(nearestDatum, xValue, pos, leftNearestDatumIndex);
120
+ this._showTooltip(nearestDatum, nearestDatumXValue, pos, leftNearestDatumIndex);
120
121
  }
121
122
  else if (this._mouseEvent) {
122
123
  const pos = (isContainerBody ? [this._mouseEvent.clientX, this._mouseEvent.clientY] : pointer(this._mouseEvent, container));
123
- this._showTooltip(nearestDatum, xValue, pos, leftNearestDatumIndex);
124
+ this._showTooltip(nearestDatum, nearestDatumXValue, pos, leftNearestDatumIndex);
124
125
  }
125
126
  }
126
127
  else