@unovis/ts 1.6.8-stellar-beta.0 → 1.7.0-mcp.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/annotations/config.js.map +1 -1
- package/components/annotations/index.js.map +1 -1
- package/components/annotations/style.js.map +1 -1
- package/components/area/config.d.ts +5 -0
- package/components/area/config.js.map +1 -1
- package/components/area/index.js +19 -6
- package/components/area/index.js.map +1 -1
- package/components/area/style.js.map +1 -1
- package/components/axis/config.js.map +1 -1
- package/components/axis/index.d.ts +0 -1
- package/components/axis/index.js +6 -47
- package/components/axis/index.js.map +1 -1
- package/components/axis/style.js.map +1 -1
- package/components/boxplot/config.d.ts +31 -0
- package/components/boxplot/config.js +6 -0
- package/components/boxplot/config.js.map +1 -0
- package/components/boxplot/index.d.ts +21 -0
- package/components/boxplot/index.js +216 -0
- package/components/boxplot/index.js.map +1 -0
- package/components/boxplot/style.d.ts +11 -0
- package/components/boxplot/style.js +56 -0
- package/components/boxplot/style.js.map +1 -0
- package/components/boxplot/types.d.ts +10 -0
- package/components/brush/config.js.map +1 -1
- package/components/brush/index.js.map +1 -1
- package/components/brush/style.js.map +1 -1
- package/components/bullet-legend/config.d.ts +4 -1
- package/components/bullet-legend/config.js.map +1 -1
- package/components/bullet-legend/index.js +1 -1
- package/components/bullet-legend/index.js.map +1 -1
- package/components/bullet-legend/modules/shape.d.ts +2 -2
- package/components/bullet-legend/modules/shape.js +15 -4
- package/components/bullet-legend/modules/shape.js.map +1 -1
- package/components/bullet-legend/style.js.map +1 -1
- package/components/bullet-legend/types.d.ts +4 -0
- package/components/bullet-legend/types.js.map +1 -1
- package/components/chord-diagram/config.d.ts +5 -0
- package/components/chord-diagram/config.js +1 -1
- package/components/chord-diagram/config.js.map +1 -1
- package/components/chord-diagram/index.js +1 -1
- package/components/chord-diagram/index.js.map +1 -1
- package/components/chord-diagram/modules/label.js +2 -1
- package/components/chord-diagram/modules/label.js.map +1 -1
- package/components/chord-diagram/modules/layout.js.map +1 -1
- package/components/chord-diagram/modules/link.js +3 -1
- package/components/chord-diagram/modules/link.js.map +1 -1
- package/components/chord-diagram/modules/node.js +3 -1
- package/components/chord-diagram/modules/node.js.map +1 -1
- package/components/chord-diagram/style.js.map +1 -1
- package/components/chord-diagram/types.js.map +1 -1
- package/components/crosshair/config.d.ts +15 -0
- package/components/crosshair/config.js +2 -1
- package/components/crosshair/config.js.map +1 -1
- package/components/crosshair/constants.d.ts +7 -0
- package/components/crosshair/constants.js +12 -0
- package/components/crosshair/constants.js.map +1 -0
- package/components/crosshair/index.d.ts +7 -0
- package/components/crosshair/index.js +62 -12
- package/components/crosshair/index.js.map +1 -1
- package/components/crosshair/style.d.ts +5 -1
- package/components/crosshair/style.js +28 -18
- package/components/crosshair/style.js.map +1 -1
- package/components/donut/config.d.ts +5 -1
- package/components/donut/config.js +1 -1
- package/components/donut/config.js.map +1 -1
- package/components/donut/index.js.map +1 -1
- package/components/donut/modules/arc.js +6 -1
- package/components/donut/modules/arc.js.map +1 -1
- package/components/donut/style.js.map +1 -1
- package/components/flow-legend/config.js.map +1 -1
- package/components/flow-legend/index.js.map +1 -1
- package/components/flow-legend/style.js.map +1 -1
- package/components/free-brush/config.js.map +1 -1
- package/components/free-brush/index.js.map +1 -1
- package/components/free-brush/style.js.map +1 -1
- package/components/graph/config.d.ts +0 -6
- package/components/graph/config.js +1 -1
- package/components/graph/config.js.map +1 -1
- package/components/graph/index.d.ts +0 -18
- package/components/graph/index.js +7 -251
- package/components/graph/index.js.map +1 -1
- package/components/graph/modules/layout-helpers.js.map +1 -1
- package/components/graph/modules/layout.js.map +1 -1
- package/components/graph/modules/link/helper.js +1 -1
- package/components/graph/modules/link/helper.js.map +1 -1
- package/components/graph/modules/link/index.js +1 -1
- package/components/graph/modules/link/index.js.map +1 -1
- package/components/graph/modules/link/style.js.map +1 -1
- package/components/graph/modules/node/helper.js +1 -1
- package/components/graph/modules/node/helper.js.map +1 -1
- package/components/graph/modules/node/index.js +1 -1
- package/components/graph/modules/node/index.js.map +1 -1
- package/components/graph/modules/node/style.js.map +1 -1
- package/components/graph/modules/panel/helper.js.map +1 -1
- package/components/graph/modules/panel/index.js.map +1 -1
- package/components/graph/modules/panel/style.js.map +1 -1
- package/components/graph/modules/shape.js.map +1 -1
- package/components/graph/style.js.map +1 -1
- package/components/graph/types.js.map +1 -1
- package/components/grouped-bar/config.d.ts +4 -1
- package/components/grouped-bar/config.js +1 -1
- package/components/grouped-bar/config.js.map +1 -1
- package/components/grouped-bar/index.js +7 -2
- package/components/grouped-bar/index.js.map +1 -1
- package/components/grouped-bar/style.js.map +1 -1
- package/components/heatmap/config.d.ts +49 -0
- package/components/heatmap/config.js +8 -0
- package/components/heatmap/config.js.map +1 -0
- package/components/heatmap/index.d.ts +39 -0
- package/components/heatmap/index.js +240 -0
- package/components/heatmap/index.js.map +1 -0
- package/components/heatmap/style.d.ts +47 -0
- package/components/heatmap/style.js +69 -0
- package/components/heatmap/style.js.map +1 -0
- package/components/heatmap/types.d.ts +27 -0
- package/components/heatmap/types.js +8 -0
- package/components/heatmap/types.js.map +1 -0
- package/components/heatmap/utils.d.ts +24 -0
- package/components/heatmap/utils.js +48 -0
- package/components/heatmap/utils.js.map +1 -0
- package/components/leaflet-flow-map/config.js.map +1 -1
- package/components/leaflet-flow-map/index.js.map +1 -1
- package/components/leaflet-map/config.js.map +1 -1
- package/components/leaflet-map/index.js +4 -1
- package/components/leaflet-map/index.js.map +1 -1
- package/components/leaflet-map/modules/clusterBackground.js.map +1 -1
- package/components/leaflet-map/modules/map.js.map +1 -1
- package/components/leaflet-map/modules/node.js +2 -2
- package/components/leaflet-map/modules/node.js.map +1 -1
- package/components/leaflet-map/modules/selectionRing.js.map +1 -1
- package/components/leaflet-map/modules/utils.js.map +1 -1
- package/components/leaflet-map/renderer/mapboxgl-layer.js.map +1 -1
- package/components/leaflet-map/renderer/mapboxgl-utils.js.map +1 -1
- package/components/leaflet-map/style.js.map +1 -1
- package/components/leaflet-map/types.js.map +1 -1
- package/components/line/config.d.ts +3 -0
- package/components/line/config.js.map +1 -1
- package/components/line/index.js +15 -6
- package/components/line/index.js.map +1 -1
- package/components/nested-donut/config.d.ts +3 -0
- package/components/nested-donut/config.js +1 -1
- package/components/nested-donut/config.js.map +1 -1
- package/components/nested-donut/index.js +1 -1
- package/components/nested-donut/index.js.map +1 -1
- package/components/nested-donut/modules/arc.js +6 -1
- package/components/nested-donut/modules/arc.js.map +1 -1
- package/components/nested-donut/modules/label.js.map +1 -1
- package/components/nested-donut/style.js.map +1 -1
- package/components/plotband/config.js.map +1 -1
- package/components/plotband/index.js.map +1 -1
- package/components/plotband/style.js.map +1 -1
- package/components/plotline/config.js.map +1 -1
- package/components/plotline/index.js.map +1 -1
- package/components/plotline/style.js.map +1 -1
- package/components/radial-bar/config.d.ts +49 -0
- package/components/radial-bar/config.js +7 -0
- package/components/radial-bar/config.js.map +1 -0
- package/components/radial-bar/index.d.ts +23 -0
- package/components/radial-bar/index.js +197 -0
- package/components/radial-bar/index.js.map +1 -0
- package/components/radial-bar/modules/bar.d.ts +10 -0
- package/components/radial-bar/modules/bar.js +57 -0
- package/components/radial-bar/modules/bar.js.map +1 -0
- package/components/radial-bar/style.d.ts +42 -0
- package/components/radial-bar/style.js +64 -0
- package/components/radial-bar/style.js.map +1 -0
- package/components/radial-bar/types.d.ts +26 -0
- package/components/radial-bar/types.js +2 -0
- package/components/radial-bar/types.js.map +1 -0
- package/components/radial-bar/utils.d.ts +6 -0
- package/components/radial-bar/utils.js +43 -0
- package/components/radial-bar/utils.js.map +1 -0
- package/components/rolling-pin-legend/config.js.map +1 -1
- package/components/rolling-pin-legend/index.js.map +1 -1
- package/components/rolling-pin-legend/style.js.map +1 -1
- package/components/sankey/config.d.ts +5 -0
- package/components/sankey/config.js +1 -1
- package/components/sankey/config.js.map +1 -1
- package/components/sankey/index.js.map +1 -1
- package/components/sankey/modules/label.js +6 -7
- package/components/sankey/modules/label.js.map +1 -1
- package/components/sankey/modules/link.js +3 -1
- package/components/sankey/modules/link.js.map +1 -1
- package/components/sankey/modules/node.js +11 -5
- package/components/sankey/modules/node.js.map +1 -1
- package/components/sankey/style.js.map +1 -1
- package/components/sankey/types.js.map +1 -1
- package/components/scatter/config.d.ts +3 -0
- package/components/scatter/config.js +1 -1
- package/components/scatter/config.js.map +1 -1
- package/components/scatter/index.js +8 -3
- package/components/scatter/index.js.map +1 -1
- package/components/scatter/modules/point.js +6 -1
- package/components/scatter/modules/point.js.map +1 -1
- package/components/scatter/modules/utils.js +3 -4
- package/components/scatter/modules/utils.js.map +1 -1
- package/components/scatter/types.d.ts +1 -0
- package/components/stacked-bar/config.d.ts +4 -1
- package/components/stacked-bar/config.js +1 -1
- package/components/stacked-bar/config.js.map +1 -1
- package/components/stacked-bar/index.js +7 -2
- package/components/stacked-bar/index.js.map +1 -1
- package/components/stacked-bar/style.js.map +1 -1
- package/components/timeline/config.d.ts +3 -0
- package/components/timeline/config.js +1 -1
- package/components/timeline/config.js.map +1 -1
- package/components/timeline/index.js +9 -4
- package/components/timeline/index.js.map +1 -1
- package/components/timeline/style.js.map +1 -1
- package/components/timeline/utils.js.map +1 -1
- package/components/tooltip/config.js.map +1 -1
- package/components/tooltip/index.js +2 -2
- package/components/tooltip/index.js.map +1 -1
- package/components/tooltip/style.js.map +1 -1
- package/components/topojson-map/config.js.map +1 -1
- package/components/topojson-map/index.js.map +1 -1
- package/components/topojson-map/modules/flow.js.map +1 -1
- package/components/topojson-map/modules/selectionRing.js.map +1 -1
- package/components/topojson-map/style.js.map +1 -1
- package/components/topojson-map/utils.js +2 -9
- package/components/topojson-map/utils.js.map +1 -1
- package/components/treemap/config.js.map +1 -1
- package/components/treemap/index.js +2 -3
- package/components/treemap/index.js.map +1 -1
- package/components/treemap/style.js.map +1 -1
- package/components/vis-controls/index.js.map +1 -1
- package/components/vis-controls/style.js.map +1 -1
- package/components/xy-labels/config.js.map +1 -1
- package/components/xy-labels/index.js +3 -3
- package/components/xy-labels/index.js.map +1 -1
- package/components/xy-labels/modules/label.d.ts +2 -1
- package/components/xy-labels/modules/label.js +5 -4
- package/components/xy-labels/modules/label.js.map +1 -1
- package/components.d.ts +8 -0
- package/components.js +4 -0
- package/components.js.map +1 -1
- package/containers/single-container/config.js.map +1 -1
- package/containers/single-container/index.js +5 -3
- package/containers/single-container/index.js.map +1 -1
- package/containers/xy-container/config.js.map +1 -1
- package/containers/xy-container/index.js +10 -2
- package/containers/xy-container/index.js.map +1 -1
- package/core/component/config.js.map +1 -1
- package/core/component/index.d.ts +5 -0
- package/core/component/index.js +7 -1
- package/core/component/index.js.map +1 -1
- package/core/container/config.d.ts +6 -0
- package/core/container/config.js +1 -0
- package/core/container/config.js.map +1 -1
- package/core/container/index.js +5 -2
- package/core/container/index.js.map +1 -1
- package/core/xy-component/config.d.ts +4 -0
- package/core/xy-component/config.js.map +1 -1
- package/core/xy-component/index.js.map +1 -1
- package/data-models/graph.js.map +1 -1
- package/data-models/map-graph.js.map +1 -1
- package/data-models/map.js.map +1 -1
- package/index.d.ts +1 -0
- package/index.js +11 -3
- package/index.js.map +1 -1
- package/package.json +3 -3
- package/styles/colors.js.map +1 -1
- package/styles/index.d.ts +1 -0
- package/styles/index.js +6 -5
- package/styles/index.js.map +1 -1
- package/styles/patterns.d.ts +32 -5
- package/styles/patterns.js +90 -22
- package/styles/patterns.js.map +1 -1
- package/types/accessor.d.ts +2 -1
- package/types/svg.js.map +1 -1
- package/types/text.d.ts +4 -0
- package/types/text.js.map +1 -1
- package/types.d.ts +2 -0
- package/types.js +2 -0
- package/types.js.map +1 -1
- package/utils/cache.d.ts +1 -0
- package/utils/cache.js +12 -0
- package/utils/cache.js.map +1 -0
- package/utils/color.d.ts +7 -3
- package/utils/color.js +35 -9
- package/utils/color.js.map +1 -1
- package/utils/data.d.ts +9 -0
- package/utils/data.js +54 -1
- package/utils/data.js.map +1 -1
- package/utils/index.d.ts +2 -0
- package/utils/index.js +5 -3
- package/utils/index.js.map +1 -1
- package/utils/map.js.map +1 -1
- package/utils/misc.js.map +1 -1
- package/utils/path.js.map +1 -1
- package/utils/pattern.d.ts +17 -0
- package/utils/pattern.js +69 -0
- package/utils/pattern.js.map +1 -0
- package/utils/style.js.map +1 -1
- package/utils/svg.js.map +1 -1
- package/utils/text-measure.d.ts +6 -0
- package/utils/text-measure.js +118 -0
- package/utils/text-measure.js.map +1 -0
- package/utils/text-overlap.d.ts +32 -0
- package/utils/text-overlap.js +103 -0
- package/utils/text-overlap.js.map +1 -0
- package/utils/text.d.ts +2 -18
- package/utils/text.js +84 -89
- package/utils/text.js.map +1 -1
- package/utils/to-px.js +6 -1
- package/utils/to-px.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sources":["../../../src/components/annotations/config.ts"],"sourcesContent":["import { ComponentConfigInterface, ComponentDefaultConfig } from 'core/component/config'\n\n// Types\nimport { AnnotationItem } from './types'\n\nexport interface AnnotationsConfigInterface extends ComponentConfigInterface {\n /** Legend items. Array of `AnnotationItem`:\n * ```\n * {\n * content: string | UnovisText | UnovisText[];\n * subject?: AnnotationSubject;\n * x?: LengthUnit;\n * y?: LengthUnit;\n * width?: LengthUnit;\n * height?: LengthUnit;\n * }\n * ```\n * To learn more, see our docs https://unovis.dev/docs/auxiliary/Annotations/\n * Default: `[]` */\n items: AnnotationItem[] | undefined;\n /** Debug option to render bounding boxes around text elements. Default: `false` */\n renderTextBoundingBoxes?: boolean;\n}\n\nexport const AnnotationsDefaultConfig: AnnotationsConfigInterface = {\n ...ComponentDefaultConfig,\n items: [],\n renderTextBoundingBoxes: false,\n}\n"],"names":[],"mappings":";;AAwBO,MAAM,wBAAwB,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAChC,sBAAsB,CACzB,EAAA,EAAA,KAAK,EAAE,EAAE,EACT,uBAAuB,EAAE,KAAK;;;;"}
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../../src/components/annotations/config.ts"],"sourcesContent":["import { ComponentConfigInterface, ComponentDefaultConfig } from '@/core/component/config'\n\n// Types\nimport { AnnotationItem } from './types'\n\nexport interface AnnotationsConfigInterface extends ComponentConfigInterface {\n /** Legend items. Array of `AnnotationItem`:\n * ```\n * {\n * content: string | UnovisText | UnovisText[];\n * subject?: AnnotationSubject;\n * x?: LengthUnit;\n * y?: LengthUnit;\n * width?: LengthUnit;\n * height?: LengthUnit;\n * }\n * ```\n * To learn more, see our docs https://unovis.dev/docs/auxiliary/Annotations/\n * Default: `[]` */\n items: AnnotationItem[] | undefined;\n /** Debug option to render bounding boxes around text elements. Default: `false` */\n renderTextBoundingBoxes?: boolean;\n}\n\nexport const AnnotationsDefaultConfig: AnnotationsConfigInterface = {\n ...ComponentDefaultConfig,\n items: [],\n renderTextBoundingBoxes: false,\n}\n"],"names":[],"mappings":";;AAwBO,MAAM,wBAAwB,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAChC,sBAAsB,CACzB,EAAA,EAAA,KAAK,EAAE,EAAE,EACT,uBAAuB,EAAE,KAAK;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/annotations/index.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\n\n// Core\nimport { ComponentCore } from 'core/component'\n\n// Utils\nimport { isNumber } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\nimport { renderTextIntoFrame } from 'utils/text'\nimport { parseUnit } from 'utils/misc'\nimport { UNOVIS_TEXT_DEFAULT } from 'styles'\n\n// Local Types\nimport { AnnotationItem, AnnotationSubject } from './types'\n\n// Config\nimport { AnnotationsDefaultConfig, AnnotationsConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\nexport class Annotations extends ComponentCore<unknown[], AnnotationsConfigInterface> {\n static selectors = s\n static cssVariables = s.variables\n protected _defaultConfig = AnnotationsDefaultConfig as AnnotationsConfigInterface\n public config: AnnotationsConfigInterface = this._defaultConfig\n\n g: Selection<SVGGElement, unknown, null, undefined>\n\n events = {}\n\n constructor (config?: AnnotationsConfigInterface) {\n super()\n if (config) this.setConfig(config)\n }\n\n _render (customDuration?: number): void {\n super._render(customDuration)\n const { config } = this\n\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n const annotations = this.g.selectAll<SVGGElement, AnnotationItem[]>(`.${s.annotation}`)\n .data(config.items, d => JSON.stringify(d))\n\n const annotationsEnter = annotations.enter().append('g')\n .attr('class', s.annotation)\n .style('opacity', 0)\n\n // Content\n annotationsEnter.append('g').attr('class', s.annotationContent)\n\n const annotationsMerged = annotationsEnter.merge(annotations)\n .attr('cursor', d => d?.cursor)\n .each((annotation, i, elements) => {\n if (annotation.content) {\n const content = typeof annotation.content === 'string' ? { ...UNOVIS_TEXT_DEFAULT, text: annotation.content } : annotation.content\n const x = parseUnit(annotation.x, this._width)\n const y = parseUnit(annotation.y, this._height)\n const width = parseUnit(annotation.width, this._width)\n const height = parseUnit(annotation.height, this._height)\n const options = { ...annotation, x, y, width, height }\n\n const contentGroupElement = select(elements[i]).select<SVGGElement>(`.${s.annotationContent}`)\n renderTextIntoFrame(contentGroupElement.node(), content, options)\n\n // Render debug bounding boxes showing the frame (x, y, width, height)\n contentGroupElement.selectAll(`.${s.debugBoundingBox}`).remove()\n if (config.renderTextBoundingBoxes) {\n const debugWidth = width ?? 100\n const debugHeight = height || 0.1\n contentGroupElement.append('rect')\n .attr('class', s.debugBoundingBox)\n .attr('x', x)\n .attr('y', y)\n .attr('width', debugWidth)\n .attr('height', debugHeight)\n }\n }\n\n if (annotation.subject) {\n requestAnimationFrame(() => this._renderSubject(elements[i], annotation.subject))\n } else {\n select(elements[i]).select(`.${s.annotationSubject}`).remove()\n }\n })\n\n smartTransition(annotationsMerged, duration)\n .style('opacity', 1)\n\n smartTransition(annotations.exit(), duration)\n .style('opacity', 0)\n .remove()\n }\n\n\n private _renderSubject (\n annotationGroupElement: SVGElement,\n subject: AnnotationSubject | undefined\n ): void {\n const annotationGroup = select(annotationGroupElement)\n const contentGroup = annotationGroup.select<SVGGElement>(`.${s.annotationContent}`)\n\n // Create subject group if it doesn't exist\n let subjectGroup = annotationGroup.select<SVGGElement>(`.${s.annotationSubject}`)\n if (subjectGroup.empty()) {\n subjectGroup = annotationGroup.append('g').attr('class', s.annotationSubject)\n subjectGroup.append('circle')\n subjectGroup.append('line')\n }\n\n const subjectX: number | null = parseUnit(typeof subject?.x === 'function' ? subject.x() : subject?.x, this._width) ?? null\n const subjectY: number | null = parseUnit(typeof subject?.y === 'function' ? subject.y() : subject?.y, this._height) ?? null\n\n const subjectStrokeColor: string | null = subject?.strokeColor ?? null\n const subjectFillColor: string | null = subject?.fillColor ?? null\n const subjectStrokeDasharray: string | null = subject?.strokeDasharray ?? null\n const connectorLineColor: string | null = subject?.connectorLineColor ?? null\n const connectorLineStrokeDasharray: string | null = subject?.connectorLineStrokeDasharray ?? null\n const subjectRadius: number | null = subject?.radius ?? 0\n const padding = subject?.padding ?? 5\n\n const contentBbox = contentGroup.node().getBBox()\n const dy = Math.abs(subjectY - (contentBbox.y + contentBbox.height / 2))\n const dx = Math.abs(subjectX - (contentBbox.x + contentBbox.width / 2))\n const annotationPadding = 5\n const x2 = (dx < dy) && ((subjectY < contentBbox.y) || (subjectY > (contentBbox.y + contentBbox.height)))\n ? contentBbox.x + contentBbox.width / 2\n : (subjectX < contentBbox.x) ? contentBbox.x - annotationPadding : contentBbox.x + contentBbox.width + annotationPadding\n\n const y2 = (dx >= dy) || ((subjectY >= contentBbox.y) && (subjectY <= (contentBbox.y + contentBbox.height)))\n ? contentBbox.y + contentBbox.height / 2\n : (subjectY < contentBbox.y) ? contentBbox.y - annotationPadding : contentBbox.y + contentBbox.height + annotationPadding\n\n const angle = Math.atan2(y2 - subjectY, x2 - subjectX) * 180 / Math.PI\n const x1 = subjectX + Math.cos(angle * Math.PI / 180) * (subjectRadius + padding)\n const y1 = subjectY + Math.sin(angle * Math.PI / 180) * (subjectRadius + padding)\n\n subjectGroup.select('circle')\n .attr('cx', subjectX)\n .attr('cy', subjectY)\n .attr('r', subjectRadius)\n .style('stroke', subjectStrokeColor)\n .style('fill', subjectFillColor)\n .style('stroke-dasharray', subjectStrokeDasharray)\n\n subjectGroup.select('line')\n .attr('x1', x1)\n .attr('y1', y1)\n .attr('x2', x1)\n .attr('y2', y1)\n .attr('x2', x2)\n .attr('y2', y2)\n .style('stroke', connectorLineColor)\n .style('stroke-dasharray', connectorLineStrokeDasharray)\n }\n}\n"],"names":["s.annotation","s.annotationContent","s.debugBoundingBox","s.annotationSubject","s","s.variables"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/annotations/index.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\n\n// Core\nimport { ComponentCore } from '@/core/component'\n\n// Utils\nimport { isNumber } from '@/utils/data'\nimport { smartTransition } from '@/utils/d3'\nimport { renderTextIntoFrame } from '@/utils/text'\nimport { parseUnit } from '@/utils/misc'\nimport { UNOVIS_TEXT_DEFAULT } from '@/styles'\n\n// Local Types\nimport { AnnotationItem, AnnotationSubject } from './types'\n\n// Config\nimport { AnnotationsDefaultConfig, AnnotationsConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\nexport class Annotations extends ComponentCore<unknown[], AnnotationsConfigInterface> {\n static selectors = s\n static cssVariables = s.variables\n protected _defaultConfig = AnnotationsDefaultConfig as AnnotationsConfigInterface\n public config: AnnotationsConfigInterface = this._defaultConfig\n\n g: Selection<SVGGElement, unknown, null, undefined>\n\n events = {}\n\n constructor (config?: AnnotationsConfigInterface) {\n super()\n if (config) this.setConfig(config)\n }\n\n _render (customDuration?: number): void {\n super._render(customDuration)\n const { config } = this\n\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n const annotations = this.g.selectAll<SVGGElement, AnnotationItem[]>(`.${s.annotation}`)\n .data(config.items, d => JSON.stringify(d))\n\n const annotationsEnter = annotations.enter().append('g')\n .attr('class', s.annotation)\n .style('opacity', 0)\n\n // Content\n annotationsEnter.append('g').attr('class', s.annotationContent)\n\n const annotationsMerged = annotationsEnter.merge(annotations)\n .attr('cursor', d => d?.cursor)\n .each((annotation, i, elements) => {\n if (annotation.content) {\n const content = typeof annotation.content === 'string' ? { ...UNOVIS_TEXT_DEFAULT, text: annotation.content } : annotation.content\n const x = parseUnit(annotation.x, this._width)\n const y = parseUnit(annotation.y, this._height)\n const width = parseUnit(annotation.width, this._width)\n const height = parseUnit(annotation.height, this._height)\n const options = { ...annotation, x, y, width, height }\n\n const contentGroupElement = select(elements[i]).select<SVGGElement>(`.${s.annotationContent}`)\n renderTextIntoFrame(contentGroupElement.node(), content, options)\n\n // Render debug bounding boxes showing the frame (x, y, width, height)\n contentGroupElement.selectAll(`.${s.debugBoundingBox}`).remove()\n if (config.renderTextBoundingBoxes) {\n const debugWidth = width ?? 100\n const debugHeight = height || 0.1\n contentGroupElement.append('rect')\n .attr('class', s.debugBoundingBox)\n .attr('x', x)\n .attr('y', y)\n .attr('width', debugWidth)\n .attr('height', debugHeight)\n }\n }\n\n if (annotation.subject) {\n requestAnimationFrame(() => this._renderSubject(elements[i], annotation.subject))\n } else {\n select(elements[i]).select(`.${s.annotationSubject}`).remove()\n }\n })\n\n smartTransition(annotationsMerged, duration)\n .style('opacity', 1)\n\n smartTransition(annotations.exit(), duration)\n .style('opacity', 0)\n .remove()\n }\n\n\n private _renderSubject (\n annotationGroupElement: SVGElement,\n subject: AnnotationSubject | undefined\n ): void {\n const annotationGroup = select(annotationGroupElement)\n const contentGroup = annotationGroup.select<SVGGElement>(`.${s.annotationContent}`)\n\n // Create subject group if it doesn't exist\n let subjectGroup = annotationGroup.select<SVGGElement>(`.${s.annotationSubject}`)\n if (subjectGroup.empty()) {\n subjectGroup = annotationGroup.append('g').attr('class', s.annotationSubject)\n subjectGroup.append('circle')\n subjectGroup.append('line')\n }\n\n const subjectX: number | null = parseUnit(typeof subject?.x === 'function' ? subject.x() : subject?.x, this._width) ?? null\n const subjectY: number | null = parseUnit(typeof subject?.y === 'function' ? subject.y() : subject?.y, this._height) ?? null\n\n const subjectStrokeColor: string | null = subject?.strokeColor ?? null\n const subjectFillColor: string | null = subject?.fillColor ?? null\n const subjectStrokeDasharray: string | null = subject?.strokeDasharray ?? null\n const connectorLineColor: string | null = subject?.connectorLineColor ?? null\n const connectorLineStrokeDasharray: string | null = subject?.connectorLineStrokeDasharray ?? null\n const subjectRadius: number | null = subject?.radius ?? 0\n const padding = subject?.padding ?? 5\n\n const contentBbox = contentGroup.node().getBBox()\n const dy = Math.abs(subjectY - (contentBbox.y + contentBbox.height / 2))\n const dx = Math.abs(subjectX - (contentBbox.x + contentBbox.width / 2))\n const annotationPadding = 5\n const x2 = (dx < dy) && ((subjectY < contentBbox.y) || (subjectY > (contentBbox.y + contentBbox.height)))\n ? contentBbox.x + contentBbox.width / 2\n : (subjectX < contentBbox.x) ? contentBbox.x - annotationPadding : contentBbox.x + contentBbox.width + annotationPadding\n\n const y2 = (dx >= dy) || ((subjectY >= contentBbox.y) && (subjectY <= (contentBbox.y + contentBbox.height)))\n ? contentBbox.y + contentBbox.height / 2\n : (subjectY < contentBbox.y) ? contentBbox.y - annotationPadding : contentBbox.y + contentBbox.height + annotationPadding\n\n const angle = Math.atan2(y2 - subjectY, x2 - subjectX) * 180 / Math.PI\n const x1 = subjectX + Math.cos(angle * Math.PI / 180) * (subjectRadius + padding)\n const y1 = subjectY + Math.sin(angle * Math.PI / 180) * (subjectRadius + padding)\n\n subjectGroup.select('circle')\n .attr('cx', subjectX)\n .attr('cy', subjectY)\n .attr('r', subjectRadius)\n .style('stroke', subjectStrokeColor)\n .style('fill', subjectFillColor)\n .style('stroke-dasharray', subjectStrokeDasharray)\n\n subjectGroup.select('line')\n .attr('x1', x1)\n .attr('y1', y1)\n .attr('x2', x1)\n .attr('y2', y1)\n .attr('x2', x2)\n .attr('y2', y2)\n .style('stroke', connectorLineColor)\n .style('stroke-dasharray', connectorLineStrokeDasharray)\n }\n}\n"],"names":["s.annotation","s.annotationContent","s.debugBoundingBox","s.annotationSubject","s","s.variables"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.js","sources":["../../../src/components/annotations/style.ts"],"sourcesContent":["import { css } from '@emotion/css'\n\n// Utils\nimport { getCssVarNames, injectGlobalCssVariables } from 'utils/style'\n\nconst cssVarDefaults = {\n '--vis-annotations-text-color': '#282C34',\n\n '--vis-annotations-connector-stroke-color': '#444',\n '--vis-annotations-connector-stroke-width': '1px',\n '--vis-annotations-connector-stroke-dasharray': 'none',\n\n '--vis-annotations-subject-stroke-color': '#444',\n '--vis-annotations-subject-fill-color': 'none',\n '--vis-annotations-subject-stroke-dasharray': 'none',\n\n '--vis-annotations-debug-bounding-box-stroke-color': '#f00',\n\n '--vis-dark-annotations-text-color': '#e8e9ef',\n '--vis-dark-annotations-connector-stroke-color': '#fff',\n '--vis-dark-annotations-subject-stroke-color': '#fff',\n}\n\nexport const root = css`\n label: annotations-component;\n`\nexport const variables = getCssVarNames(cssVarDefaults)\ninjectGlobalCssVariables(cssVarDefaults, root)\n\nexport const annotation = css`\n label: annotation;\n`\n\nexport const annotationSubject = css`\n label: annotationSubject;\n\n line {\n stroke: var(${variables.annotationsConnectorStrokeColor});\n stroke-width: var(${variables.annotationsConnectorStrokeWidth});\n stroke-dasharray: var(${variables.annotationsConnectorStrokeDasharray});\n }\n\n circle {\n stroke: var(${variables.annotationsSubjectStrokeColor});\n fill: var(${variables.annotationsSubjectFillColor});\n stroke-dasharray: var(${variables.annotationsSubjectStrokeDasharray});\n }\n`\n\nexport const annotationContent = css`\n label: annotationContent;\n > text {\n fill: var(--vis-annotations-text-color);\n }\n`\n\nexport const debugBoundingBox = css`\n label: debugBoundingBox;\n fill: none;\n stroke: var(--vis-annotations-debug-bounding-box-stroke-color);\n stroke-width: 1;\n`\n"],"names":[],"mappings":";;;AAKA,MAAM,cAAc,GAAG;AACrB,IAAA,8BAA8B,EAAE,SAAS;AAEzC,IAAA,0CAA0C,EAAE,MAAM;AAClD,IAAA,0CAA0C,EAAE,KAAK;AACjD,IAAA,8CAA8C,EAAE,MAAM;AAEtD,IAAA,wCAAwC,EAAE,MAAM;AAChD,IAAA,sCAAsC,EAAE,MAAM;AAC9C,IAAA,4CAA4C,EAAE,MAAM;AAEpD,IAAA,mDAAmD,EAAE,MAAM;AAE3D,IAAA,mCAAmC,EAAE,SAAS;AAC9C,IAAA,+CAA+C,EAAE,MAAM;AACvD,IAAA,6CAA6C,EAAE,MAAM;CACtD,CAAA;AAEM,MAAM,IAAI,GAAG,GAAG,CAAA,CAAA;;EAEtB;MACY,SAAS,GAAG,cAAc,CAAC,cAAc,EAAC;AACvD,wBAAwB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;AAEvC,MAAM,UAAU,GAAG,GAAG,CAAA,CAAA;;EAE5B;AAEM,MAAM,iBAAiB,GAAG,GAAG,CAAA,CAAA;;;;AAIlB,gBAAA,EAAA,SAAS,CAAC,+BAA+B,CAAA;AACnC,sBAAA,EAAA,SAAS,CAAC,+BAA+B,CAAA;AACrC,0BAAA,EAAA,SAAS,CAAC,mCAAmC,CAAA;;;;AAIvD,gBAAA,EAAA,SAAS,CAAC,6BAA6B,CAAA;AACzC,cAAA,EAAA,SAAS,CAAC,2BAA2B,CAAA;AACzB,0BAAA,EAAA,SAAS,CAAC,iCAAiC,CAAA;;EAEtE;AAEM,MAAM,iBAAiB,GAAG,GAAG,CAAA,CAAA;;;;;EAKnC;AAEM,MAAM,gBAAgB,GAAG,GAAG,CAAA,CAAA;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"style.js","sources":["../../../src/components/annotations/style.ts"],"sourcesContent":["import { css } from '@emotion/css'\n\n// Utils\nimport { getCssVarNames, injectGlobalCssVariables } from '@/utils/style'\n\nconst cssVarDefaults = {\n '--vis-annotations-text-color': '#282C34',\n\n '--vis-annotations-connector-stroke-color': '#444',\n '--vis-annotations-connector-stroke-width': '1px',\n '--vis-annotations-connector-stroke-dasharray': 'none',\n\n '--vis-annotations-subject-stroke-color': '#444',\n '--vis-annotations-subject-fill-color': 'none',\n '--vis-annotations-subject-stroke-dasharray': 'none',\n\n '--vis-annotations-debug-bounding-box-stroke-color': '#f00',\n\n '--vis-dark-annotations-text-color': '#e8e9ef',\n '--vis-dark-annotations-connector-stroke-color': '#fff',\n '--vis-dark-annotations-subject-stroke-color': '#fff',\n}\n\nexport const root = css`\n label: annotations-component;\n`\nexport const variables = getCssVarNames(cssVarDefaults)\ninjectGlobalCssVariables(cssVarDefaults, root)\n\nexport const annotation = css`\n label: annotation;\n`\n\nexport const annotationSubject = css`\n label: annotationSubject;\n\n line {\n stroke: var(${variables.annotationsConnectorStrokeColor});\n stroke-width: var(${variables.annotationsConnectorStrokeWidth});\n stroke-dasharray: var(${variables.annotationsConnectorStrokeDasharray});\n }\n\n circle {\n stroke: var(${variables.annotationsSubjectStrokeColor});\n fill: var(${variables.annotationsSubjectFillColor});\n stroke-dasharray: var(${variables.annotationsSubjectStrokeDasharray});\n }\n`\n\nexport const annotationContent = css`\n label: annotationContent;\n > text {\n fill: var(--vis-annotations-text-color);\n }\n`\n\nexport const debugBoundingBox = css`\n label: debugBoundingBox;\n fill: none;\n stroke: var(--vis-annotations-debug-bounding-box-stroke-color);\n stroke-width: 1;\n`\n"],"names":[],"mappings":";;;AAKA,MAAM,cAAc,GAAG;AACrB,IAAA,8BAA8B,EAAE,SAAS;AAEzC,IAAA,0CAA0C,EAAE,MAAM;AAClD,IAAA,0CAA0C,EAAE,KAAK;AACjD,IAAA,8CAA8C,EAAE,MAAM;AAEtD,IAAA,wCAAwC,EAAE,MAAM;AAChD,IAAA,sCAAsC,EAAE,MAAM;AAC9C,IAAA,4CAA4C,EAAE,MAAM;AAEpD,IAAA,mDAAmD,EAAE,MAAM;AAE3D,IAAA,mCAAmC,EAAE,SAAS;AAC9C,IAAA,+CAA+C,EAAE,MAAM;AACvD,IAAA,6CAA6C,EAAE,MAAM;CACtD,CAAA;AAEM,MAAM,IAAI,GAAG,GAAG,CAAA,CAAA;;EAEtB;MACY,SAAS,GAAG,cAAc,CAAC,cAAc,EAAC;AACvD,wBAAwB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;AAEvC,MAAM,UAAU,GAAG,GAAG,CAAA,CAAA;;EAE5B;AAEM,MAAM,iBAAiB,GAAG,GAAG,CAAA,CAAA;;;;AAIlB,gBAAA,EAAA,SAAS,CAAC,+BAA+B,CAAA;AACnC,sBAAA,EAAA,SAAS,CAAC,+BAA+B,CAAA;AACrC,0BAAA,EAAA,SAAS,CAAC,mCAAmC,CAAA;;;;AAIvD,gBAAA,EAAA,SAAS,CAAC,6BAA6B,CAAA;AACzC,cAAA,EAAA,SAAS,CAAC,2BAA2B,CAAA;AACzB,0BAAA,EAAA,SAAS,CAAC,iCAAiC,CAAA;;EAEtE;AAEM,MAAM,iBAAiB,GAAG,GAAG,CAAA,CAAA;;;;;EAKnC;AAEM,MAAM,gBAAgB,GAAG,GAAG,CAAA,CAAA;;;;;;;;;"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { XYComponentConfigInterface } from "../../core/xy-component/config";
|
|
2
2
|
import { CurveType } from "../../types/curve";
|
|
3
3
|
import { ColorAccessor, GenericAccessor, NumericAccessor, StringAccessor } from "../../types/accessor";
|
|
4
|
+
import { FillPatternType, LinePatternType } from "../../styles/patterns";
|
|
4
5
|
export interface AreaConfigInterface<Datum> extends XYComponentConfigInterface<Datum> {
|
|
5
6
|
/** Area color accessor function. The whole data array will be passed as the first argument. Default: `undefined` */
|
|
6
7
|
color?: ColorAccessor<Datum[]>;
|
|
8
|
+
/** Area fill pattern accessor. Resolves to a `FillPatternType`. The whole data array is passed as the first argument. Default: `undefined` */
|
|
9
|
+
pattern?: GenericAccessor<FillPatternType, Datum[]>;
|
|
7
10
|
/** Curve type from the CurveType enum. Default: `CurveType.MonotoneX` */
|
|
8
11
|
curveType?: CurveType | string;
|
|
9
12
|
/** Baseline value or accessor function. Default: `undefined` */
|
|
@@ -20,6 +23,8 @@ export interface AreaConfigInterface<Datum> extends XYComponentConfigInterface<D
|
|
|
20
23
|
lineWidth?: number;
|
|
21
24
|
/** Line dash array, see SVG's stroke-dasharray. Default: `undefined` */
|
|
22
25
|
lineDashArray?: GenericAccessor<number[], Datum[]>;
|
|
26
|
+
/** Pattern accessor for the area's outline. Resolves to a `LinePatternType`. The whole data array is passed as the first argument. Default: `undefined` */
|
|
27
|
+
linePattern?: GenericAccessor<LinePatternType, Datum[]>;
|
|
23
28
|
/** If an area is smaller than 1px, extend it to have 1px height. Default: `false`
|
|
24
29
|
* @deprecated Use minHeight instead
|
|
25
30
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sources":["../../../src/components/area/config.ts"],"sourcesContent":["import { XYComponentConfigInterface, XYComponentDefaultConfig } from 'core/xy-component/config'\n\n// Types\nimport { CurveType } from 'types/curve'\nimport { ColorAccessor, GenericAccessor, NumericAccessor, StringAccessor } from 'types/accessor'\n\nexport interface AreaConfigInterface<Datum> extends XYComponentConfigInterface<Datum> {\n /** Area color accessor function. The whole data array will be passed as the first argument. Default: `undefined` */\n color?: ColorAccessor<Datum[]>;\n /** Curve type from the CurveType enum. Default: `CurveType.MonotoneX` */\n curveType?: CurveType | string;\n /** Baseline value or accessor function. Default: `undefined` */\n baseline?: NumericAccessor<Datum>;\n /** Opacity value or accessor function. Default: `1` */\n opacity?: NumericAccessor<Datum[]>;\n /** Optional area cursor. String or accessor function. Default: `null` */\n cursor?: StringAccessor<Datum[]>;\n /** Display a line on the top of the area. Default: `false` */\n line?: boolean;\n /** Line color accessor function. The whole data array will be passed as the first argument. Default: `undefined` */\n lineColor?: ColorAccessor<Datum[]>;\n /** Line width in pixels. Default: `2` */\n lineWidth?: number;\n /** Line dash array, see SVG's stroke-dasharray. Default: `undefined` */\n lineDashArray?: GenericAccessor<number[], Datum[]>;\n /** If an area is smaller than 1px, extend it to have 1px height. Default: `false`\n * @deprecated Use minHeight instead\n */\n minHeight1Px?: boolean;\n /** Minimum height of the area, use carefully.\n * This setting is useful when some of the area values are zeros or very small so visually they become\n * practically invisible, but you want to show that the data behind them exists and they're not just empty segments.\n * Default: `undefined` */\n minHeight?: number;\n /** Whether to stack min height areas or not. Default: `undefined` */\n stackMinHeight?: boolean;\n}\n\nexport const AreaDefaultConfig: AreaConfigInterface<unknown> = {\n ...XYComponentDefaultConfig,\n color: undefined,\n curveType: CurveType.MonotoneX,\n baseline: (): number => 0,\n opacity: 1,\n cursor: null,\n line: false,\n lineColor: undefined,\n lineWidth: 2,\n lineDashArray: undefined,\n minHeight1Px: false,\n minHeight: undefined,\n stackMinHeight: false,\n}\n"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../../src/components/area/config.ts"],"sourcesContent":["import { XYComponentConfigInterface, XYComponentDefaultConfig } from '@/core/xy-component/config'\n\n// Types\nimport { CurveType } from '@/types/curve'\nimport { ColorAccessor, GenericAccessor, NumericAccessor, StringAccessor } from '@/types/accessor'\nimport { FillPatternType, LinePatternType } from '@/styles/patterns'\n\nexport interface AreaConfigInterface<Datum> extends XYComponentConfigInterface<Datum> {\n /** Area color accessor function. The whole data array will be passed as the first argument. Default: `undefined` */\n color?: ColorAccessor<Datum[]>;\n /** Area fill pattern accessor. Resolves to a `FillPatternType`. The whole data array is passed as the first argument. Default: `undefined` */\n pattern?: GenericAccessor<FillPatternType, Datum[]>;\n /** Curve type from the CurveType enum. Default: `CurveType.MonotoneX` */\n curveType?: CurveType | string;\n /** Baseline value or accessor function. Default: `undefined` */\n baseline?: NumericAccessor<Datum>;\n /** Opacity value or accessor function. Default: `1` */\n opacity?: NumericAccessor<Datum[]>;\n /** Optional area cursor. String or accessor function. Default: `null` */\n cursor?: StringAccessor<Datum[]>;\n /** Display a line on the top of the area. Default: `false` */\n line?: boolean;\n /** Line color accessor function. The whole data array will be passed as the first argument. Default: `undefined` */\n lineColor?: ColorAccessor<Datum[]>;\n /** Line width in pixels. Default: `2` */\n lineWidth?: number;\n /** Line dash array, see SVG's stroke-dasharray. Default: `undefined` */\n lineDashArray?: GenericAccessor<number[], Datum[]>;\n /** Pattern accessor for the area's outline. Resolves to a `LinePatternType`. The whole data array is passed as the first argument. Default: `undefined` */\n linePattern?: GenericAccessor<LinePatternType, Datum[]>;\n /** If an area is smaller than 1px, extend it to have 1px height. Default: `false`\n * @deprecated Use minHeight instead\n */\n minHeight1Px?: boolean;\n /** Minimum height of the area, use carefully.\n * This setting is useful when some of the area values are zeros or very small so visually they become\n * practically invisible, but you want to show that the data behind them exists and they're not just empty segments.\n * Default: `undefined` */\n minHeight?: number;\n /** Whether to stack min height areas or not. Default: `undefined` */\n stackMinHeight?: boolean;\n}\n\nexport const AreaDefaultConfig: AreaConfigInterface<unknown> = {\n ...XYComponentDefaultConfig,\n color: undefined,\n curveType: CurveType.MonotoneX,\n baseline: (): number => 0,\n opacity: 1,\n cursor: null,\n line: false,\n lineColor: undefined,\n lineWidth: 2,\n lineDashArray: undefined,\n minHeight1Px: false,\n minHeight: undefined,\n stackMinHeight: false,\n}\n"],"names":[],"mappings":";;;AA2Ca,MAAA,iBAAiB,GACzB,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,wBAAwB,CAC3B,EAAA,EAAA,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,SAAS,CAAC,SAAS,EAC9B,QAAQ,EAAE,MAAc,CAAC,EACzB,OAAO,EAAE,CAAC,EACV,MAAM,EAAE,IAAI,EACZ,IAAI,EAAE,KAAK,EACX,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,CAAC,EACZ,aAAa,EAAE,SAAS,EACxB,YAAY,EAAE,KAAK,EACnB,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,KAAK,EAAA;;;;"}
|
package/components/area/index.js
CHANGED
|
@@ -5,6 +5,7 @@ import { XYComponentCore } from '../../core/xy-component/index.js';
|
|
|
5
5
|
import { isNumber, isArray, getNumber, getStackedData, clamp, getString, getValue, filterDataByRange, getStackedExtent } from '../../utils/data.js';
|
|
6
6
|
import { smartTransition } from '../../utils/d3.js';
|
|
7
7
|
import { getColor } from '../../utils/color.js';
|
|
8
|
+
import { UNOVIS_PATTERN_INDEX_ATTR, getFillPatternValue, getPattern, getLinePatternValue } from '../../utils/pattern.js';
|
|
8
9
|
import { Curve } from '../../types/curve.js';
|
|
9
10
|
import { Direction } from '../../types/direction.js';
|
|
10
11
|
import { AreaDefaultConfig } from './config.js';
|
|
@@ -47,6 +48,7 @@ class Area extends XYComponentCore {
|
|
|
47
48
|
super._render(customDuration);
|
|
48
49
|
const { config, datamodel: { data } } = this;
|
|
49
50
|
const duration = isNumber(customDuration) ? customDuration : config.duration;
|
|
51
|
+
const colorOptions = { colorFn: this._colorFunction };
|
|
50
52
|
const curveGen = Curve[config.curveType];
|
|
51
53
|
this._areaGen = area()
|
|
52
54
|
.x(d => d.x)
|
|
@@ -100,14 +102,17 @@ class Area extends XYComponentCore {
|
|
|
100
102
|
const areasEnter = areas.enter().append('path')
|
|
101
103
|
.attr('class', area$1)
|
|
102
104
|
.attr('d', d => this._areaGen(d) || this._emptyPath())
|
|
105
|
+
.attr(UNOVIS_PATTERN_INDEX_ATTR, (d, i) => areaMaxIdx - i)
|
|
103
106
|
.style('opacity', 0)
|
|
104
|
-
.style('fill', (d, i) => getColor(data, config.color, areaMaxIdx - i));
|
|
107
|
+
.style('fill', (d, i) => { var _a; return getColor(data, config.color, areaMaxIdx - i, (_a = config.colorKeys) === null || _a === void 0 ? void 0 : _a[areaMaxIdx - i], colorOptions); })
|
|
108
|
+
.style('mask', (d, i) => getFillPatternValue(getPattern(data, config.pattern, areaMaxIdx - i)));
|
|
105
109
|
const areasMerged = smartTransition(areasEnter.merge(areas), duration)
|
|
106
110
|
.style('opacity', (d, i) => {
|
|
107
111
|
const isDefined = d.some(p => (p.y0 - p.y1) !== 0);
|
|
108
112
|
return isDefined ? getNumber(data, config.opacity, areaMaxIdx - i) : 0;
|
|
109
113
|
})
|
|
110
|
-
.style('fill', (d, i) => getColor(data, config.color, areaMaxIdx - i))
|
|
114
|
+
.style('fill', (d, i) => { var _a; return getColor(data, config.color, areaMaxIdx - i, (_a = config.colorKeys) === null || _a === void 0 ? void 0 : _a[areaMaxIdx - i], colorOptions); })
|
|
115
|
+
.style('mask', (d, i) => getFillPatternValue(getPattern(data, config.pattern, areaMaxIdx - i)))
|
|
111
116
|
.style('cursor', (d, i) => getString(data, config.cursor, areaMaxIdx - i));
|
|
112
117
|
if (duration) {
|
|
113
118
|
const transition = areasMerged;
|
|
@@ -128,6 +133,7 @@ class Area extends XYComponentCore {
|
|
|
128
133
|
_renderLines(duration, stackedData) {
|
|
129
134
|
var _a;
|
|
130
135
|
const { config, datamodel: { data } } = this;
|
|
136
|
+
const colorOptions = { colorFn: this._colorFunction };
|
|
131
137
|
const areaMaxIdx = stackedData.length - 1;
|
|
132
138
|
const stackedDataReversed = [...stackedData].reverse();
|
|
133
139
|
const colorAccessor = (_a = config.lineColor) !== null && _a !== void 0 ? _a : config.color;
|
|
@@ -135,17 +141,24 @@ class Area extends XYComponentCore {
|
|
|
135
141
|
.selectAll(`.${areaLinePath}`)
|
|
136
142
|
.data(stackedDataReversed);
|
|
137
143
|
const areas = this.g.selectAll(`.${area$1}`).nodes();
|
|
144
|
+
const getLineColor = (i) => { var _a; return getColor(data, colorAccessor, areaMaxIdx - i, (_a = config.colorKeys) === null || _a === void 0 ? void 0 : _a[areaMaxIdx - i], colorOptions); };
|
|
145
|
+
const getLinePattern = (i, el) => getLinePatternValue(getPattern(data, config.linePattern, areaMaxIdx - i), getLineColor(i), el);
|
|
146
|
+
// Explicit `lineDashArray` takes precedence over the resolved pattern's dash array
|
|
147
|
+
const getLineDashArray = (i) => { var _a, _b, _c, _d; return (_d = (_b = (_a = getValue(data, config.lineDashArray, i)) === null || _a === void 0 ? void 0 : _a.join(' ')) !== null && _b !== void 0 ? _b : (_c = getLinePattern(i)) === null || _c === void 0 ? void 0 : _c.dashArray) !== null && _d !== void 0 ? _d : null; };
|
|
138
148
|
const linesEnter = lines.enter().insert('path', (d, i) => areas[i + 1])
|
|
139
149
|
.attr('class', areaLinePath)
|
|
140
|
-
.attr(
|
|
150
|
+
.attr(UNOVIS_PATTERN_INDEX_ATTR, (d, i) => areaMaxIdx - i)
|
|
151
|
+
.attr('stroke', (d, i) => getLineColor(i))
|
|
141
152
|
.attr('stroke-width', config.lineWidth)
|
|
142
|
-
.attr('stroke-opacity', 0)
|
|
153
|
+
.attr('stroke-opacity', 0)
|
|
154
|
+
.style('marker', function (d, i) { var _a, _b; return (_b = (_a = getLinePattern(i, this)) === null || _a === void 0 ? void 0 : _a.marker) !== null && _b !== void 0 ? _b : null; });
|
|
143
155
|
const linesMerged = smartTransition(linesEnter.merge(lines), duration)
|
|
144
|
-
.attr('stroke', (d, i) =>
|
|
156
|
+
.attr('stroke', (d, i) => getLineColor(i))
|
|
145
157
|
.attr('stroke-width', config.lineWidth)
|
|
146
158
|
.attr('stroke-opacity', 1)
|
|
147
159
|
.attr('cursor', (d, i) => getString(data, config.cursor, areaMaxIdx - i))
|
|
148
|
-
.style('
|
|
160
|
+
.style('marker', (d, i, nodes) => { var _a, _b; return (_b = (_a = getLinePattern(i, nodes[i])) === null || _a === void 0 ? void 0 : _a.marker) !== null && _b !== void 0 ? _b : null; })
|
|
161
|
+
.style('stroke-dasharray', (d, i) => getLineDashArray(i));
|
|
149
162
|
const curveGen = Curve[config.curveType];
|
|
150
163
|
this._lineGen = line()
|
|
151
164
|
.x(d => d.x)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/area/index.ts"],"sourcesContent":["import { select } from 'd3-selection'\nimport { Transition } from 'd3-transition'\nimport { area, Area as AreaInterface, line, Line as LineInterface } from 'd3-shape'\nimport { interpolatePath } from 'd3-interpolate-path'\n\n// Core\nimport { XYComponentCore } from 'core/xy-component'\n\n// Utils\nimport { getNumber, getString, isArray, isNumber, getStackedExtent, getStackedData, filterDataByRange, getValue, clamp } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\nimport { getColor } from 'utils/color'\n\n// Types\nimport { Curve, CurveType } from 'types/curve'\nimport { NumericAccessor } from 'types/accessor'\nimport { Spacing } from 'types/spacing'\nimport { Direction } from 'types/direction'\n\n// Local Types\nimport { AreaDatum } from './types'\n\n// Config\nimport { AreaDefaultConfig, AreaConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\nexport class Area<Datum> extends XYComponentCore<Datum, AreaConfigInterface<Datum>> {\n static selectors = s\n protected _defaultConfig = AreaDefaultConfig as AreaConfigInterface<Datum>\n public config: AreaConfigInterface<Datum> = this._defaultConfig\n public stacked = true\n private _areaGen: AreaInterface<AreaDatum>\n private _lineGen: LineInterface<AreaDatum>\n private _prevNegative: boolean[] | undefined // To help guessing the stack direction when an accessor was set to null or 0\n\n events = {\n [Area.selectors.area]: {},\n }\n\n constructor (config?: AreaConfigInterface<Datum>) {\n super()\n if (config) this.setConfig(config)\n\n // Determine if the provided chart should be stacked\n this.stacked = Array.isArray(this.config.y)\n }\n\n get bleed (): Spacing {\n const { config: { line, lineWidth } } = this\n if (!line) return { top: 0, bottom: 0, left: 0, right: 0 }\n\n const yDomain = this.yScale.domain() as [number, number]\n const yDirection = this.yScale.range()[0] > this.yScale.range()[1]\n ? Direction.North\n : Direction.South\n const isYDirectionSouth = yDirection === Direction.South\n\n const isLineThick = lineWidth > 3\n const isLineVeryThick = lineWidth >= 10\n return {\n top: !isLineVeryThick && (\n (!isYDirectionSouth && (yDomain[1] === 0)) || (isYDirectionSouth && (yDomain[0] === 0))\n ) ? 0 : lineWidth / 2,\n bottom: !isLineVeryThick && (\n (!isYDirectionSouth && (yDomain[0] === 0)) || (isYDirectionSouth && (yDomain[1] === 0))\n ) ? 0 : lineWidth / 2,\n left: isLineThick ? lineWidth / 2 : 0,\n right: isLineThick ? lineWidth / 2 : 0,\n }\n }\n\n _render (customDuration?: number): void {\n super._render(customDuration)\n const { config, datamodel: { data } } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n const curveGen = Curve[config.curveType as CurveType]\n this._areaGen = area<AreaDatum>()\n .x(d => d.x)\n .y0(d => d.y0)\n .y1(d => d.y1)\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n .curve(curveGen)\n\n const yAccessors = (isArray(config.y) ? config.y : [config.y]) as NumericAccessor<Datum>[]\n const areaDataX = data.map((d, i) => this.xScale(getNumber(d, config.x, i)))\n\n const stacked = getStackedData(data, config.baseline, yAccessors, this._prevNegative)\n this._prevNegative = stacked.map(s => !!s.isMostlyNegative)\n\n // Clamp to the visible y range so the area and its fill stay within the container\n const yRange = this.yScale.range()\n const yRangeMin = Math.min(yRange[0], yRange[1])\n const yRangeMax = Math.max(yRange[0], yRange[1])\n\n const minHeightCumulativeArray: number[] = []\n const stackedData: AreaDatum[][] = stacked.map(\n arr => arr.map(\n (d, j) => {\n const x = areaDataX[j]\n const y0 = clamp(this.yScale(d[0]), yRangeMin, yRangeMax)\n const y1 = clamp(this.yScale(d[1]), yRangeMin, yRangeMax)\n const isNegativeArea = y1 > y0\n\n // Only apply cumulative adjustment if `config.stackMinHeight` is true\n const cumulative = config.stackMinHeight ? (minHeightCumulativeArray[j] || 0) : 0\n const adjustedY0 = isNegativeArea ? y0 + cumulative : y0 - cumulative\n const adjustedY1 = isNegativeArea ? y1 + cumulative : y1 - cumulative\n\n // Calculate height adjustment if needed\n let heightAdjustment = 0\n if ((config.minHeight || config.minHeight1Px) &&\n Math.abs(adjustedY1 - adjustedY0) < (config.minHeight ?? 1)) {\n heightAdjustment = (config.minHeight ?? 1) - Math.abs(adjustedY1 - adjustedY0)\n\n // Only update cumulative array if we're stacking min heights\n if (config.stackMinHeight) {\n minHeightCumulativeArray[j] = cumulative + heightAdjustment\n }\n }\n\n return {\n x,\n y0: adjustedY0,\n y1: isNegativeArea ? adjustedY1 + heightAdjustment : adjustedY1 - heightAdjustment,\n }\n }\n )\n )\n\n // We reverse the data in order to have the first areas to be displayed on top\n // for better visibility when they're close to zero\n const areaMaxIdx = stackedData.length - 1\n const stackedDataReversed = [...stackedData].reverse()\n const areas = this.g\n .selectAll<SVGPathElement, AreaDatum>(`.${s.area}`)\n .data(stackedDataReversed)\n\n const areasEnter = areas.enter().append('path')\n .attr('class', s.area)\n .attr('d', d => this._areaGen(d) || this._emptyPath())\n .style('opacity', 0)\n .style('fill', (d, i) => getColor(data, config.color, areaMaxIdx - i))\n\n const areasMerged = smartTransition(areasEnter.merge(areas), duration)\n .style('opacity', (d, i) => {\n const isDefined = d.some(p => (p.y0 - p.y1) !== 0)\n return isDefined ? getNumber(data, config.opacity, areaMaxIdx - i) : 0\n })\n .style('fill', (d, i) => getColor(data, config.color, areaMaxIdx - i))\n .style('cursor', (d, i) => getString(data, config.cursor, areaMaxIdx - i))\n\n if (duration) {\n const transition = areasMerged as Transition<SVGPathElement, AreaDatum[], SVGGElement, AreaDatum[]>\n transition.attrTween('d', (d, i, el) => {\n const previous = select(el[i]).attr('d')\n const next = this._areaGen(d) || this._emptyPath()\n return interpolatePath(previous, next)\n })\n } else {\n areasMerged.attr('d', d => this._areaGen(d) || this._emptyPath())\n }\n\n smartTransition(areas.exit(), duration)\n .style('opacity', 0)\n .remove()\n\n this._renderLines(duration, config.line ? stackedData : [])\n }\n\n _renderLines (duration: number, stackedData: AreaDatum[][]): void {\n const { config, datamodel: { data } } = this\n const areaMaxIdx = stackedData.length - 1\n const stackedDataReversed = [...stackedData].reverse()\n const colorAccessor = config.lineColor ?? config.color\n const lines = this.g\n .selectAll<SVGPathElement, AreaDatum[]>(`.${s.areaLinePath}`)\n .data(stackedDataReversed)\n\n const areas = this.g.selectAll(`.${s.area}`).nodes()\n const linesEnter = lines.enter().insert('path', (d, i) => areas[i + 1])\n .attr('class', s.areaLinePath)\n .attr('stroke', (d, i) => getColor(data, colorAccessor, areaMaxIdx - i))\n .attr('stroke-width', config.lineWidth)\n .attr('stroke-opacity', 0)\n\n const linesMerged = smartTransition(linesEnter.merge(lines), duration)\n .attr('stroke', (d, i) => getColor(data, colorAccessor, areaMaxIdx - i))\n .attr('stroke-width', config.lineWidth)\n .attr('stroke-opacity', 1)\n .attr('cursor', (d, i) => getString(data, config.cursor, areaMaxIdx - i))\n .style('stroke-dasharray', (d, i) => getValue<Datum[], number[]>(data, config.lineDashArray, i)?.join(' ') ?? null)\n\n const curveGen = Curve[config.curveType as CurveType]\n this._lineGen = line<AreaDatum>()\n .x(d => d.x)\n .y(d => d.y1)\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n .curve(curveGen)\n\n if (duration) {\n const lineTransition = linesMerged as Transition<SVGPathElement, AreaDatum[], SVGGElement, AreaDatum[]>\n lineTransition.attrTween('d', (d, i, el) => {\n const previous = select(el[i]).attr('d') || this._emptyLinePath()\n const next = this._lineGen(d) || this._emptyLinePath()\n return interpolatePath(previous, next)\n })\n } else {\n linesMerged.attr('d', d => this._lineGen(d) || this._emptyLinePath())\n }\n\n smartTransition(lines.exit(), duration)\n .style('opacity', 0)\n .remove()\n }\n\n getYDataExtent (scaleByVisibleData: boolean): number[] {\n const { config, datamodel } = this\n const yAccessors = (isArray(config.y) ? config.y : [config.y]) as NumericAccessor<Datum>[]\n\n const xDomain = this.xScale.domain() as [number, number]\n const data = scaleByVisibleData ? filterDataByRange(datamodel.data, xDomain, config.x, true) : datamodel.data\n return getStackedExtent(data, config.baseline, ...yAccessors)\n }\n\n _emptyPath (): string {\n const xRange = this.xScale.range()\n const yDomain = this.yScale.domain() as number[]\n\n const y0 = this.yScale((yDomain[0] + yDomain[1]) / 2)\n const y1 = y0\n\n return this._areaGen([\n { y0, y1, x: xRange[0] },\n { y0, y1, x: xRange[1] },\n ])\n }\n\n _emptyLinePath (): string {\n const xRange = this.xScale.range()\n const yRange = this.yScale.range()\n return `M${xRange[0]},${yRange[0]} L${xRange[1]},${yRange[0]}`\n }\n}\n"],"names":["s.area","s.areaLinePath","s"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/area/index.ts"],"sourcesContent":["import { select } from 'd3-selection'\nimport { Transition } from 'd3-transition'\nimport { area, Area as AreaInterface, line, Line as LineInterface } from 'd3-shape'\nimport { interpolatePath } from 'd3-interpolate-path'\n\n// Core\nimport { XYComponentCore } from '@/core/xy-component'\n\n// Utils\nimport { getNumber, getString, isArray, isNumber, getStackedExtent, getStackedData, filterDataByRange, getValue, clamp } from '@/utils/data'\nimport { smartTransition } from '@/utils/d3'\nimport { getColor } from '@/utils/color'\nimport { getPattern, getFillPatternValue, getLinePatternValue, UNOVIS_PATTERN_INDEX_ATTR } from '@/utils/pattern'\n\n// Types\nimport { Curve, CurveType } from '@/types/curve'\nimport { NumericAccessor } from '@/types/accessor'\nimport { Spacing } from '@/types/spacing'\nimport { Direction } from '@/types/direction'\n\n// Local Types\nimport { AreaDatum } from './types'\n\n// Config\nimport { AreaDefaultConfig, AreaConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\nexport class Area<Datum> extends XYComponentCore<Datum, AreaConfigInterface<Datum>> {\n static selectors = s\n protected _defaultConfig = AreaDefaultConfig as AreaConfigInterface<Datum>\n public config: AreaConfigInterface<Datum> = this._defaultConfig\n public stacked = true\n private _areaGen: AreaInterface<AreaDatum>\n private _lineGen: LineInterface<AreaDatum>\n private _prevNegative: boolean[] | undefined // To help guessing the stack direction when an accessor was set to null or 0\n\n events = {\n [Area.selectors.area]: {},\n }\n\n constructor (config?: AreaConfigInterface<Datum>) {\n super()\n if (config) this.setConfig(config)\n\n // Determine if the provided chart should be stacked\n this.stacked = Array.isArray(this.config.y)\n }\n\n get bleed (): Spacing {\n const { config: { line, lineWidth } } = this\n if (!line) return { top: 0, bottom: 0, left: 0, right: 0 }\n\n const yDomain = this.yScale.domain() as [number, number]\n const yDirection = this.yScale.range()[0] > this.yScale.range()[1]\n ? Direction.North\n : Direction.South\n const isYDirectionSouth = yDirection === Direction.South\n\n const isLineThick = lineWidth > 3\n const isLineVeryThick = lineWidth >= 10\n return {\n top: !isLineVeryThick && (\n (!isYDirectionSouth && (yDomain[1] === 0)) || (isYDirectionSouth && (yDomain[0] === 0))\n ) ? 0 : lineWidth / 2,\n bottom: !isLineVeryThick && (\n (!isYDirectionSouth && (yDomain[0] === 0)) || (isYDirectionSouth && (yDomain[1] === 0))\n ) ? 0 : lineWidth / 2,\n left: isLineThick ? lineWidth / 2 : 0,\n right: isLineThick ? lineWidth / 2 : 0,\n }\n }\n\n _render (customDuration?: number): void {\n super._render(customDuration)\n const { config, datamodel: { data } } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n const colorOptions = { colorFn: this._colorFunction }\n\n const curveGen = Curve[config.curveType as CurveType]\n this._areaGen = area<AreaDatum>()\n .x(d => d.x)\n .y0(d => d.y0)\n .y1(d => d.y1)\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n .curve(curveGen)\n\n const yAccessors = (isArray(config.y) ? config.y : [config.y]) as NumericAccessor<Datum>[]\n const areaDataX = data.map((d, i) => this.xScale(getNumber(d, config.x, i)))\n\n const stacked = getStackedData(data, config.baseline, yAccessors, this._prevNegative)\n this._prevNegative = stacked.map(s => !!s.isMostlyNegative)\n\n // Clamp to the visible y range so the area and its fill stay within the container\n const yRange = this.yScale.range()\n const yRangeMin = Math.min(yRange[0], yRange[1])\n const yRangeMax = Math.max(yRange[0], yRange[1])\n\n const minHeightCumulativeArray: number[] = []\n const stackedData: AreaDatum[][] = stacked.map(\n arr => arr.map(\n (d, j) => {\n const x = areaDataX[j]\n const y0 = clamp(this.yScale(d[0]), yRangeMin, yRangeMax)\n const y1 = clamp(this.yScale(d[1]), yRangeMin, yRangeMax)\n const isNegativeArea = y1 > y0\n\n // Only apply cumulative adjustment if `config.stackMinHeight` is true\n const cumulative = config.stackMinHeight ? (minHeightCumulativeArray[j] || 0) : 0\n const adjustedY0 = isNegativeArea ? y0 + cumulative : y0 - cumulative\n const adjustedY1 = isNegativeArea ? y1 + cumulative : y1 - cumulative\n\n // Calculate height adjustment if needed\n let heightAdjustment = 0\n if ((config.minHeight || config.minHeight1Px) &&\n Math.abs(adjustedY1 - adjustedY0) < (config.minHeight ?? 1)) {\n heightAdjustment = (config.minHeight ?? 1) - Math.abs(adjustedY1 - adjustedY0)\n\n // Only update cumulative array if we're stacking min heights\n if (config.stackMinHeight) {\n minHeightCumulativeArray[j] = cumulative + heightAdjustment\n }\n }\n\n return {\n x,\n y0: adjustedY0,\n y1: isNegativeArea ? adjustedY1 + heightAdjustment : adjustedY1 - heightAdjustment,\n }\n }\n )\n )\n\n // We reverse the data in order to have the first areas to be displayed on top\n // for better visibility when they're close to zero\n const areaMaxIdx = stackedData.length - 1\n const stackedDataReversed = [...stackedData].reverse()\n const areas = this.g\n .selectAll<SVGPathElement, AreaDatum>(`.${s.area}`)\n .data(stackedDataReversed)\n\n const areasEnter = areas.enter().append('path')\n .attr('class', s.area)\n .attr('d', d => this._areaGen(d) || this._emptyPath())\n .attr(UNOVIS_PATTERN_INDEX_ATTR, (d, i) => areaMaxIdx - i)\n .style('opacity', 0)\n .style('fill', (d, i) => getColor(data, config.color, areaMaxIdx - i, config.colorKeys?.[areaMaxIdx - i], colorOptions))\n .style('mask', (d, i) => getFillPatternValue(getPattern(data, config.pattern, areaMaxIdx - i)))\n\n const areasMerged = smartTransition(areasEnter.merge(areas), duration)\n .style('opacity', (d, i) => {\n const isDefined = d.some(p => (p.y0 - p.y1) !== 0)\n return isDefined ? getNumber(data, config.opacity, areaMaxIdx - i) : 0\n })\n .style('fill', (d, i) => getColor(data, config.color, areaMaxIdx - i, config.colorKeys?.[areaMaxIdx - i], colorOptions))\n .style('mask', (d, i) => getFillPatternValue(getPattern(data, config.pattern, areaMaxIdx - i)))\n .style('cursor', (d, i) => getString(data, config.cursor, areaMaxIdx - i))\n\n if (duration) {\n const transition = areasMerged as Transition<SVGPathElement, AreaDatum[], SVGGElement, AreaDatum[]>\n transition.attrTween('d', (d, i, el) => {\n const previous = select(el[i]).attr('d')\n const next = this._areaGen(d) || this._emptyPath()\n return interpolatePath(previous, next)\n })\n } else {\n areasMerged.attr('d', d => this._areaGen(d) || this._emptyPath())\n }\n\n smartTransition(areas.exit(), duration)\n .style('opacity', 0)\n .remove()\n\n this._renderLines(duration, config.line ? stackedData : [])\n }\n\n _renderLines (duration: number, stackedData: AreaDatum[][]): void {\n const { config, datamodel: { data } } = this\n const colorOptions = { colorFn: this._colorFunction }\n const areaMaxIdx = stackedData.length - 1\n const stackedDataReversed = [...stackedData].reverse()\n const colorAccessor = config.lineColor ?? config.color\n const lines = this.g\n .selectAll<SVGPathElement, AreaDatum[]>(`.${s.areaLinePath}`)\n .data(stackedDataReversed)\n\n const areas = this.g.selectAll(`.${s.area}`).nodes()\n\n const getLineColor = (i: number): string => getColor(data, colorAccessor, areaMaxIdx - i, config.colorKeys?.[areaMaxIdx - i], colorOptions)\n const getLinePattern = (i: number, el?: SVGPathElement | null): { marker: string | null; dashArray: string | null } | null =>\n getLinePatternValue(getPattern(data, config.linePattern, areaMaxIdx - i), getLineColor(i), el)\n // Explicit `lineDashArray` takes precedence over the resolved pattern's dash array\n const getLineDashArray = (i: number): string | null =>\n getValue<Datum[], number[]>(data, config.lineDashArray, i)?.join(' ') ?? getLinePattern(i)?.dashArray ?? null\n\n const linesEnter = lines.enter().insert('path', (d, i) => areas[i + 1])\n .attr('class', s.areaLinePath)\n .attr(UNOVIS_PATTERN_INDEX_ATTR, (d, i) => areaMaxIdx - i)\n .attr('stroke', (d, i) => getLineColor(i))\n .attr('stroke-width', config.lineWidth)\n .attr('stroke-opacity', 0)\n .style('marker', function (d, i) { return getLinePattern(i, this)?.marker ?? null })\n\n const linesMerged = smartTransition(linesEnter.merge(lines), duration)\n .attr('stroke', (d, i) => getLineColor(i))\n .attr('stroke-width', config.lineWidth)\n .attr('stroke-opacity', 1)\n .attr('cursor', (d, i) => getString(data, config.cursor, areaMaxIdx - i))\n .style('marker', (d, i, nodes) => getLinePattern(i, nodes[i])?.marker ?? null)\n .style('stroke-dasharray', (d, i) => getLineDashArray(i))\n\n const curveGen = Curve[config.curveType as CurveType]\n this._lineGen = line<AreaDatum>()\n .x(d => d.x)\n .y(d => d.y1)\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n .curve(curveGen)\n\n if (duration) {\n const lineTransition = linesMerged as Transition<SVGPathElement, AreaDatum[], SVGGElement, AreaDatum[]>\n lineTransition.attrTween('d', (d, i, el) => {\n const previous = select(el[i]).attr('d') || this._emptyLinePath()\n const next = this._lineGen(d) || this._emptyLinePath()\n return interpolatePath(previous, next)\n })\n } else {\n linesMerged.attr('d', d => this._lineGen(d) || this._emptyLinePath())\n }\n\n smartTransition(lines.exit(), duration)\n .style('opacity', 0)\n .remove()\n }\n\n getYDataExtent (scaleByVisibleData: boolean): number[] {\n const { config, datamodel } = this\n const yAccessors = (isArray(config.y) ? config.y : [config.y]) as NumericAccessor<Datum>[]\n\n const xDomain = this.xScale.domain() as [number, number]\n const data = scaleByVisibleData ? filterDataByRange(datamodel.data, xDomain, config.x, true) : datamodel.data\n return getStackedExtent(data, config.baseline, ...yAccessors)\n }\n\n _emptyPath (): string {\n const xRange = this.xScale.range()\n const yDomain = this.yScale.domain() as number[]\n\n const y0 = this.yScale((yDomain[0] + yDomain[1]) / 2)\n const y1 = y0\n\n return this._areaGen([\n { y0, y1, x: xRange[0] },\n { y0, y1, x: xRange[1] },\n ])\n }\n\n _emptyLinePath (): string {\n const xRange = this.xScale.range()\n const yRange = this.yScale.range()\n return `M${xRange[0]},${yRange[0]} L${xRange[1]},${yRange[0]}`\n }\n}\n"],"names":["s.area","s.areaLinePath","s"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.js","sources":["../../../src/components/area/style.ts"],"sourcesContent":["import { css, injectGlobal } from '@emotion/css'\nimport { darkThemeCssSelectors } from 'utils/theme'\n\n\nexport const root = css`\n label: area-component;\n`\n\nexport const globalStyles = injectGlobal`\n :root {\n --vis-area-cursor: default;\n --vis-area-fill-opacity: 1;\n --vis-area-stroke-color: none;\n --vis-area-stroke-width: 0px;\n --vis-area-stroke-dasharray: none;\n --vis-area-stroke-opacity: 1;\n --vis-area-hover-fill-opacity: none;\n --vis-area-hover-stroke-width: none;\n\n /* Dark Theme */\n --vis-dark-area-stroke-color: none;\n }\n\n ${darkThemeCssSelectors} ${`.${root}`} {\n --vis-area-fill-opacity: 0.5;\n --vis-area-stroke-color: var(--vis-dark-area-stroke-color);\n }\n\n`\nexport const area = css`\n label: area;\n cursor: var(--vis-area-cursor);\n fill-opacity: var(--vis-area-fill-opacity);\n stroke-width: var(--vis-area-stroke-width);\n stroke-dasharray: var(--vis-area-stroke-dasharray);\n stroke: var(--vis-area-stroke-color);\n stroke-opacity: var(--vis-area-stroke-opacity);\n\n &:hover {\n fill-opacity: var(--vis-area-hover-fill-opacity);\n stroke-width: var(--vis-area-hover-stroke-width);\n }\n`\n\nexport const areaLinePath = css`\n label: areaLinePath;\n fill: none;\n stroke-dasharray: var(--vis-line-stroke-dasharray);\n stroke-dashoffset: var(--vis-line-stroke-dashoffset);\n`\n"],"names":[],"mappings":";;;AAIO,MAAM,IAAI,GAAG,GAAG,CAAA,CAAA;;EAEtB;AAEM,MAAM,YAAY,GAAG,YAAY,CAAA,CAAA;;;;;;;;;;;;;;;IAepC,qBAAqB,CAAA,CAAA,EAAI,CAAI,CAAA,EAAA,IAAI,CAAE,CAAA,CAAA;;;;;EAKtC;AACM,MAAM,IAAI,GAAG,GAAG,CAAA,CAAA;;;;;;;;;;;;;EAatB;AAEM,MAAM,YAAY,GAAG,GAAG,CAAA,CAAA;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"style.js","sources":["../../../src/components/area/style.ts"],"sourcesContent":["import { css, injectGlobal } from '@emotion/css'\nimport { darkThemeCssSelectors } from '@/utils/theme'\n\n\nexport const root = css`\n label: area-component;\n`\n\nexport const globalStyles = injectGlobal`\n :root {\n --vis-area-cursor: default;\n --vis-area-fill-opacity: 1;\n --vis-area-stroke-color: none;\n --vis-area-stroke-width: 0px;\n --vis-area-stroke-dasharray: none;\n --vis-area-stroke-opacity: 1;\n --vis-area-hover-fill-opacity: none;\n --vis-area-hover-stroke-width: none;\n\n /* Dark Theme */\n --vis-dark-area-stroke-color: none;\n }\n\n ${darkThemeCssSelectors} ${`.${root}`} {\n --vis-area-fill-opacity: 0.5;\n --vis-area-stroke-color: var(--vis-dark-area-stroke-color);\n }\n\n`\nexport const area = css`\n label: area;\n cursor: var(--vis-area-cursor);\n fill-opacity: var(--vis-area-fill-opacity);\n stroke-width: var(--vis-area-stroke-width);\n stroke-dasharray: var(--vis-area-stroke-dasharray);\n stroke: var(--vis-area-stroke-color);\n stroke-opacity: var(--vis-area-stroke-opacity);\n\n &:hover {\n fill-opacity: var(--vis-area-hover-fill-opacity);\n stroke-width: var(--vis-area-hover-stroke-width);\n }\n`\n\nexport const areaLinePath = css`\n label: areaLinePath;\n fill: none;\n stroke-dasharray: var(--vis-line-stroke-dasharray);\n stroke-dashoffset: var(--vis-line-stroke-dashoffset);\n`\n"],"names":[],"mappings":";;;AAIO,MAAM,IAAI,GAAG,GAAG,CAAA,CAAA;;EAEtB;AAEM,MAAM,YAAY,GAAG,YAAY,CAAA,CAAA;;;;;;;;;;;;;;;IAepC,qBAAqB,CAAA,CAAA,EAAI,CAAI,CAAA,EAAA,IAAI,CAAE,CAAA,CAAA;;;;;EAKtC;AACM,MAAM,IAAI,GAAG,GAAG,CAAA,CAAA;;;;;;;;;;;;;EAatB;AAEM,MAAM,YAAY,GAAG,GAAG,CAAA,CAAA;;;;;;;;;"}
|
|
@@ -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 | `${Position}`;\n /** Axis type: `AxisType.X` or `AxisType.Y` */\n type?: AxisType | `${AxisType}`;\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 /** Label text fit mode: `FitMode.Wrap` or `FitMode.Trim`. Default: `FitMode.Wrap`. */\n labelTextFitMode?: FitMode | `${FitMode}`;\n /** Label text trim mode: `TrimMode.Start`, `TrimMode.Middle` or `TrimMode.End`. Default: `TrimMode.Middle` */\n labelTextTrimType?: TrimMode | `${TrimMode}`;\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 only the min and max axis ticks. Default: `false` */\n minMaxTicksOnly?: boolean;\n /** Show grid lines for the min and max axis ticks. Default: `false` */\n minMaxTicksOnlyShowGridLines?: boolean;\n /** Draw only the min and max axis ticks, when the chart\n * width is less than the specified value.\n * Default: `250` */\n minMaxTicksOnlyWhenWidthIsLess?: number;\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 | `${FitMode}`;\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 | `${TrimMode}`;\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 | `${TextAlign}` |\n ((tickValue: number | Date, tickIndex: number, tickValues: number[] | Date[], tickPosition: [number, number], componentWidth: number, componentHeight: number) => TextAlign | `${TextAlign}`);\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 /** Hide tick labels that overlap with each other.\n * To define overlapping, a simple bounding box collision detection algorithm is used.\n * Which means the result won't be accurate when `tickTextAngle` is specified.\n * Default: `undefined` */\n tickTextHideOverlapping?: boolean;\n /** The spacing in pixels between the tick and it's label. Default: `8` */\n tickPadding?: number;\n /** The size of the tick marks in pixels. Accepts a single number (applies to both inner and outer ticks)\n * or a tuple `[innerTickSize, outerTickSize]`. Default: `6` */\n tickSize?: number | [number, number];\n}\n\nexport const AxisDefaultConfig: AxisConfigInterface<unknown> = {\n ...XYComponentDefaultConfig,\n position: undefined,\n type: undefined,\n label: undefined,\n labelFontSize: null,\n labelTextFitMode: FitMode.Wrap,\n labelTextTrimType: TrimMode.Middle,\n gridLine: true,\n tickLine: true,\n domainLine: true,\n numTicks: undefined,\n minMaxTicksOnly: false,\n minMaxTicksOnlyWhenWidthIsLess: 250,\n minMaxTicksOnlyShowGridLines: 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 tickTextAngle: undefined,\n labelMargin: 8,\n labelColor: null,\n tickFormat: undefined,\n tickValues: undefined,\n fullSize: true,\n tickPadding: 8,\n tickSize: 6,\n tickTextHideOverlapping: undefined,\n}\n"],"names":[],"mappings":";;;AA8EO,MAAM,iBAAiB,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACzB,wBAAwB,CAAA,EAAA,EAC3B,QAAQ,EAAE,SAAS,EACnB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,IAAI,EACnB,gBAAgB,EAAE,OAAO,CAAC,IAAI,EAC9B,iBAAiB,EAAE,QAAQ,CAAC,MAAM,EAClC,QAAQ,EAAE,IAAI,EACd,QAAQ,EAAE,IAAI,EACd,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,SAAS,EACnB,eAAe,EAAE,KAAK,EACtB,8BAA8B,EAAE,GAAG,EACnC,4BAA4B,EAAE,KAAK,EACnC,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,aAAa,EAAE,SAAS,EACxB,WAAW,EAAE,CAAC,EACd,UAAU,EAAE,IAAI,EAChB,UAAU,EAAE,SAAS,EACrB,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,IAAI,EACd,WAAW,EAAE,CAAC,EACd,QAAQ,EAAE,CAAC,EACX,uBAAuB,EAAE,SAAS;;;;"}
|
|
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 | `${Position}`;\n /** Axis type: `AxisType.X` or `AxisType.Y` */\n type?: AxisType | `${AxisType}`;\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 /** Label text fit mode: `FitMode.Wrap` or `FitMode.Trim`. Default: `FitMode.Wrap`. */\n labelTextFitMode?: FitMode | `${FitMode}`;\n /** Label text trim mode: `TrimMode.Start`, `TrimMode.Middle` or `TrimMode.End`. Default: `TrimMode.Middle` */\n labelTextTrimType?: TrimMode | `${TrimMode}`;\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 only the min and max axis ticks. Default: `false` */\n minMaxTicksOnly?: boolean;\n /** Show grid lines for the min and max axis ticks. Default: `false` */\n minMaxTicksOnlyShowGridLines?: boolean;\n /** Draw only the min and max axis ticks, when the chart\n * width is less than the specified value.\n * Default: `250` */\n minMaxTicksOnlyWhenWidthIsLess?: number;\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 | `${FitMode}`;\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 | `${TrimMode}`;\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 | `${TextAlign}` |\n ((tickValue: number | Date, tickIndex: number, tickValues: number[] | Date[], tickPosition: [number, number], componentWidth: number, componentHeight: number) => TextAlign | `${TextAlign}`);\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 /** Hide tick labels that overlap with each other.\n * To define overlapping, a simple bounding box collision detection algorithm is used.\n * Which means the result won't be accurate when `tickTextAngle` is specified.\n * Default: `undefined` */\n tickTextHideOverlapping?: boolean;\n /** The spacing in pixels between the tick and it's label. Default: `8` */\n tickPadding?: number;\n /** The size of the tick marks in pixels. Accepts a single number (applies to both inner and outer ticks)\n * or a tuple `[innerTickSize, outerTickSize]`. Default: `6` */\n tickSize?: number | [number, number];\n}\n\nexport const AxisDefaultConfig: AxisConfigInterface<unknown> = {\n ...XYComponentDefaultConfig,\n position: undefined,\n type: undefined,\n label: undefined,\n labelFontSize: null,\n labelTextFitMode: FitMode.Wrap,\n labelTextTrimType: TrimMode.Middle,\n gridLine: true,\n tickLine: true,\n domainLine: true,\n numTicks: undefined,\n minMaxTicksOnly: false,\n minMaxTicksOnlyWhenWidthIsLess: 250,\n minMaxTicksOnlyShowGridLines: 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 tickTextAngle: undefined,\n labelMargin: 8,\n labelColor: null,\n tickFormat: undefined,\n tickValues: undefined,\n fullSize: true,\n tickPadding: 8,\n tickSize: 6,\n tickTextHideOverlapping: undefined,\n}\n"],"names":[],"mappings":";;;AA8EO,MAAM,iBAAiB,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACzB,wBAAwB,CAAA,EAAA,EAC3B,QAAQ,EAAE,SAAS,EACnB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,IAAI,EACnB,gBAAgB,EAAE,OAAO,CAAC,IAAI,EAC9B,iBAAiB,EAAE,QAAQ,CAAC,MAAM,EAClC,QAAQ,EAAE,IAAI,EACd,QAAQ,EAAE,IAAI,EACd,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,SAAS,EACnB,eAAe,EAAE,KAAK,EACtB,8BAA8B,EAAE,GAAG,EACnC,4BAA4B,EAAE,KAAK,EACnC,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,aAAa,EAAE,SAAS,EACxB,WAAW,EAAE,CAAC,EACd,UAAU,EAAE,IAAI,EAChB,UAAU,EAAE,SAAS,EACrB,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,IAAI,EACd,WAAW,EAAE,CAAC,EACd,QAAQ,EAAE,CAAC,EACX,uBAAuB,EAAE,SAAS;;;;"}
|
|
@@ -35,7 +35,6 @@ export declare class Axis<Datum> extends XYComponentCore<Datum, AxisConfigInterf
|
|
|
35
35
|
private _buildGrid;
|
|
36
36
|
private _renderAxis;
|
|
37
37
|
private _resolveTickLabelOverlap;
|
|
38
|
-
private _collideTickLabels;
|
|
39
38
|
private _getNumTicks;
|
|
40
39
|
private _getConfiguredTickValues;
|
|
41
40
|
private _shouldRenderMinMaxTicksOnly;
|
package/components/axis/index.js
CHANGED
|
@@ -6,8 +6,9 @@ import { Position } from '../../types/position.js';
|
|
|
6
6
|
import { VerticalAlign, FitMode, TextAlign } from '../../types/text.js';
|
|
7
7
|
import { smartTransition } from '../../utils/d3.js';
|
|
8
8
|
import { trimSVGText, renderTextToSvgTextElement, wrapSVGText, textAlignToAnchor } from '../../utils/text.js';
|
|
9
|
+
import { getCachedComputedTextLength } from '../../utils/text-measure.js';
|
|
9
10
|
import { isEqual, isFunction } from '../../utils/data.js';
|
|
10
|
-
import {
|
|
11
|
+
import { hideOverlappingLabels } from '../../utils/text-overlap.js';
|
|
11
12
|
import { getFontWidthToHeightRatio } from '../../styles/index.js';
|
|
12
13
|
import { AxisType } from './types.js';
|
|
13
14
|
import { AxisDefaultConfig } from './config.js';
|
|
@@ -244,7 +245,7 @@ class Axis extends XYComponentCore {
|
|
|
244
245
|
};
|
|
245
246
|
if (config.tickTextFitMode === FitMode.Trim) {
|
|
246
247
|
const textElementSelection = select(textElement).text(text);
|
|
247
|
-
trimSVGText(textElementSelection, textMaxWidth, config.tickTextTrimType
|
|
248
|
+
trimSVGText(textElementSelection, textMaxWidth, config.tickTextTrimType);
|
|
248
249
|
text = select(textElement).text();
|
|
249
250
|
}
|
|
250
251
|
const textBlock = Object.assign({ text }, this._tickTextStyleCached);
|
|
@@ -270,46 +271,7 @@ class Axis extends XYComponentCore {
|
|
|
270
271
|
cancelAnimationFrame(this._collideTickLabelsAnimFrameId);
|
|
271
272
|
// Colliding labels in the next frame to prevent forced reflow
|
|
272
273
|
this._collideTickLabelsAnimFrameId = requestAnimationFrame(() => {
|
|
273
|
-
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
_collideTickLabels(selection) {
|
|
277
|
-
// Reset visibility of all labels
|
|
278
|
-
selection.each((d, i, elements) => {
|
|
279
|
-
const node = elements[i];
|
|
280
|
-
node._visible = true;
|
|
281
|
-
});
|
|
282
|
-
// We do three iterations because not all overlapping labels can be resolved in the first iteration
|
|
283
|
-
const numIterations = 3;
|
|
284
|
-
for (let i = 0; i < numIterations; i += 1) {
|
|
285
|
-
// Run collision detection and set labels visibility
|
|
286
|
-
selection.each((d, i, elements) => {
|
|
287
|
-
const label1 = elements[i];
|
|
288
|
-
const isLabel1Visible = label1._visible;
|
|
289
|
-
if (!isLabel1Visible)
|
|
290
|
-
return;
|
|
291
|
-
// Calculate bounding rect of point's label
|
|
292
|
-
const label1BoundingRect = label1.getBoundingClientRect();
|
|
293
|
-
for (let j = i + 1; j < elements.length; j += 1) {
|
|
294
|
-
if (i === j)
|
|
295
|
-
continue;
|
|
296
|
-
const label2 = elements[j];
|
|
297
|
-
const isLabel2Visible = label2._visible;
|
|
298
|
-
if (isLabel2Visible) {
|
|
299
|
-
const label2BoundingRect = label2.getBoundingClientRect();
|
|
300
|
-
const intersect = rectIntersect(label1BoundingRect, label2BoundingRect, -5);
|
|
301
|
-
if (intersect) {
|
|
302
|
-
label2._visible = false;
|
|
303
|
-
break;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
// Hide the overlapping labels
|
|
310
|
-
selection.each((d, i, elements) => {
|
|
311
|
-
const label = elements[i];
|
|
312
|
-
select(label).style('opacity', label._visible ? 1 : 0);
|
|
274
|
+
hideOverlappingLabels(tickTextSelection, { tolerance: -5 });
|
|
313
275
|
});
|
|
314
276
|
}
|
|
315
277
|
_getNumTicks() {
|
|
@@ -374,7 +336,7 @@ class Axis extends XYComponentCore {
|
|
|
374
336
|
if (labelTextFitMode === FitMode.Wrap) {
|
|
375
337
|
// For Y-axis, use the chart height as the maximum width before rotation
|
|
376
338
|
const maxWidth = type === AxisType.Y ? this._height : this._width;
|
|
377
|
-
const currentTextWidth = textElement.node()
|
|
339
|
+
const currentTextWidth = getCachedComputedTextLength(textElement.node());
|
|
378
340
|
if (currentTextWidth > maxWidth) {
|
|
379
341
|
wrapSVGText(textElement, maxWidth);
|
|
380
342
|
isWrapped = true;
|
|
@@ -390,10 +352,7 @@ class Axis extends XYComponentCore {
|
|
|
390
352
|
}
|
|
391
353
|
else {
|
|
392
354
|
const trimWidth = type === AxisType.X ? labelWidth : labelHeight;
|
|
393
|
-
|
|
394
|
-
const fontSize = Number.parseFloat(styleDeclaration.fontSize);
|
|
395
|
-
// Use the default fontWidthToHeightRatio
|
|
396
|
-
trimSVGText(textElement, trimWidth, this.config.labelTextTrimType, true, fontSize);
|
|
355
|
+
trimSVGText(textElement, trimWidth, this.config.labelTextTrimType);
|
|
397
356
|
const trimmedBBox = textElement.node().getBBox();
|
|
398
357
|
labelWidth = trimmedBBox.width;
|
|
399
358
|
labelHeight = trimmedBBox.height;
|