@unovis/ts 1.5.1-ql.2 → 1.5.1-xplg.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/style.js.map +1 -1
- package/components/area/index.js +1 -1
- package/components/area/index.js.map +1 -1
- package/components/area/style.js.map +1 -1
- package/components/axis/config.d.ts +1 -1
- package/components/axis/config.js.map +1 -1
- package/components/axis/index.d.ts +0 -1
- package/components/axis/index.js +2 -10
- package/components/axis/index.js.map +1 -1
- package/components/axis/style.js.map +1 -1
- package/components/brush/config.d.ts +1 -1
- package/components/brush/config.js.map +1 -1
- package/components/brush/style.js.map +1 -1
- package/components/bullet-legend/style.js.map +1 -1
- package/components/chord-diagram/style.js.map +1 -1
- package/components/crosshair/style.js.map +1 -1
- package/components/donut/config.d.ts +4 -0
- package/components/donut/config.js +1 -1
- package/components/donut/config.js.map +1 -1
- package/components/donut/constants.d.ts +2 -0
- package/components/donut/constants.js +8 -0
- package/components/donut/constants.js.map +1 -0
- package/components/donut/index.js +35 -5
- package/components/donut/index.js.map +1 -1
- package/components/donut/style.js.map +1 -1
- package/components/flow-legend/style.js.map +1 -1
- package/components/free-brush/style.js.map +1 -1
- package/components/graph/config.d.ts +24 -3
- package/components/graph/config.js +5 -2
- package/components/graph/config.js.map +1 -1
- package/components/graph/index.d.ts +12 -9
- package/components/graph/index.js +39 -25
- package/components/graph/index.js.map +1 -1
- package/components/graph/modules/layout-helpers.js +1 -1
- package/components/graph/modules/layout-helpers.js.map +1 -1
- package/components/graph/modules/layout.js +1 -1
- package/components/graph/modules/layout.js.map +1 -1
- package/components/graph/modules/link/index.d.ts +3 -2
- package/components/graph/modules/link/index.js +53 -28
- package/components/graph/modules/link/index.js.map +1 -1
- package/components/graph/modules/link/style.js +0 -2
- package/components/graph/modules/link/style.js.map +1 -1
- package/components/graph/modules/node/index.d.ts +2 -0
- package/components/graph/modules/node/index.js +7 -4
- 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/index.js +2 -2
- package/components/graph/modules/panel/index.js.map +1 -1
- package/components/graph/modules/panel/style.js.map +1 -1
- package/components/graph/style.js.map +1 -1
- package/components/graph/types.d.ts +5 -0
- package/components/graph/types.js.map +1 -1
- package/components/grouped-bar/style.js.map +1 -1
- package/components/leaflet-flow-map/config.js +1 -0
- package/components/leaflet-flow-map/config.js.map +1 -1
- package/components/leaflet-flow-map/shaders.js.map +1 -1
- package/components/leaflet-map/config.js +1 -0
- package/components/leaflet-map/config.js.map +1 -1
- package/components/leaflet-map/modules/map.js +3 -3
- package/components/leaflet-map/modules/map.js.map +1 -1
- package/components/leaflet-map/renderer/leaflet-maplibre-gl.js.map +1 -1
- package/components/leaflet-map/style.js.map +1 -1
- package/components/line/style.js.map +1 -1
- package/components/nested-donut/config.d.ts +1 -1
- package/components/nested-donut/config.js.map +1 -1
- package/components/nested-donut/style.js.map +1 -1
- package/components/sankey/modules/label.js.map +1 -1
- package/components/sankey/modules/link.js.map +1 -1
- package/components/sankey/style.js.map +1 -1
- package/components/scatter/style.js.map +1 -1
- package/components/stacked-bar/index.js +7 -5
- package/components/stacked-bar/index.js.map +1 -1
- package/components/stacked-bar/style.js.map +1 -1
- package/components/stacked-bar/types.d.ts +1 -1
- package/components/timeline/config.d.ts +65 -14
- package/components/timeline/config.js +15 -1
- package/components/timeline/config.js.map +1 -1
- package/components/timeline/constants.d.ts +3 -0
- package/components/timeline/constants.js +6 -0
- package/components/timeline/constants.js.map +1 -0
- package/components/timeline/index.d.ts +21 -10
- package/components/timeline/index.js +373 -93
- package/components/timeline/index.js.map +1 -1
- package/components/timeline/style.d.ts +7 -0
- package/components/timeline/style.js +40 -1
- package/components/timeline/style.js.map +1 -1
- package/components/timeline/types.d.ts +62 -0
- package/components/timeline/types.js +2 -0
- package/components/timeline/types.js.map +1 -0
- package/components/timeline/utils.d.ts +2 -0
- package/components/timeline/utils.js +16 -0
- package/components/timeline/utils.js.map +1 -0
- package/components/tooltip/style.js.map +1 -1
- package/components/topojson-map/index.js.map +1 -1
- package/components/topojson-map/style.js.map +1 -1
- package/components/treemap/config.d.ts +44 -0
- package/components/treemap/config.js +6 -0
- package/components/treemap/config.js.map +1 -0
- package/components/treemap/index.d.ts +16 -0
- package/components/treemap/index.js +263 -0
- package/components/treemap/index.js.map +1 -0
- package/components/treemap/style.d.ts +22 -0
- package/components/treemap/style.js +62 -0
- package/components/treemap/style.js.map +1 -0
- package/components/treemap/types.d.ts +11 -0
- package/components/treemap/types.js +2 -0
- package/components/treemap/types.js.map +1 -0
- package/components/vis-controls/style.js.map +1 -1
- package/components/xy-labels/style.js.map +1 -1
- package/components.d.ts +3 -0
- package/components.js +2 -0
- package/components.js.map +1 -1
- package/containers/single-container/config.d.ts +3 -0
- package/containers/single-container/config.js.map +1 -1
- package/containers/single-container/index.js +2 -1
- package/containers/single-container/index.js.map +1 -1
- package/containers/xy-container/config.d.ts +5 -0
- package/containers/xy-container/config.js +1 -1
- package/containers/xy-container/config.js.map +1 -1
- package/containers/xy-container/index.d.ts +1 -0
- package/containers/xy-container/index.js +15 -11
- package/containers/xy-container/index.js.map +1 -1
- package/core/container/config.js +1 -0
- package/core/container/config.js.map +1 -1
- package/data-models/graph.d.ts +3 -2
- package/data-models/graph.js +15 -6
- package/data-models/graph.js.map +1 -1
- package/data-models/index.d.ts +4 -0
- package/data-models/index.js +5 -0
- package/data-models/index.js.map +1 -0
- package/index.d.ts +1 -0
- package/index.js +10 -3
- package/index.js.map +1 -1
- package/maps/ind-regions.json.js +1 -1
- package/maps/us-counties.json.js +8 -8
- package/package.json +4 -5
- package/styles/index.js.map +1 -1
- package/styles/patterns.js.map +1 -1
- package/styles/sizes.js.map +1 -1
- package/types/data.d.ts +1 -2
- package/types/graph.d.ts +4 -0
- package/types/position.d.ts +2 -1
- package/types/position.js +1 -0
- package/types/position.js.map +1 -1
- package/types.d.ts +2 -0
- package/types.js +4 -1
- package/types.js.map +1 -1
- package/utils/color.d.ts +14 -0
- package/utils/color.js +26 -2
- package/utils/color.js.map +1 -1
- package/utils/data.d.ts +2 -2
- package/utils/data.js +10 -17
- package/utils/data.js.map +1 -1
- package/utils/index.js +3 -3
- package/utils/path.d.ts +8 -0
- package/utils/path.js +104 -1
- package/utils/path.js.map +1 -1
- package/utils/text.d.ts +10 -9
- package/utils/text.js +26 -10
- package/utils/text.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/topojson-map/index.ts"],"sourcesContent":["import { Selection } from 'd3-selection'\nimport { D3ZoomEvent, zoom, ZoomBehavior, zoomIdentity, ZoomTransform } from 'd3-zoom'\nimport { timeout } from 'd3-timer'\nimport { geoPath, GeoProjection, ExtendedFeatureCollection } from 'd3-geo'\nimport { color } from 'd3-color'\nimport { feature } from 'topojson-client'\n\n// Core\nimport { ComponentCore } from 'core/component'\nimport { MapGraphDataModel } from 'data-models/map-graph'\n\n// Utils\nimport { clamp, getNumber, getString, isNumber } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\nimport { getColor, hexToBrightness } from 'utils/color'\nimport { getCSSVariableValue, isStringCSSVariable } from 'utils/misc'\n\n// Types\nimport { MapLink } from 'types/map'\n\n// Local Types\nimport { MapData, MapFeature, MapPointLabelPosition, MapProjection } from './types'\n\n// Config\nimport { TopoJSONMapDefaultConfig, TopoJSONMapConfigInterface } from './config'\n\n// Modules\nimport { arc, getLonLat } from './utils'\n\n// Styles\nimport * as s from './style'\n\nexport class TopoJSONMap<\n AreaDatum,\n PointDatum = unknown,\n LinkDatum = unknown,\n> extends ComponentCore<\n MapData<AreaDatum, PointDatum, LinkDatum>,\n TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>\n > {\n static selectors = s\n protected _defaultConfig = TopoJSONMapDefaultConfig as TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>\n public config: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum> = this._defaultConfig\n\n datamodel: MapGraphDataModel<AreaDatum, PointDatum, LinkDatum> = new MapGraphDataModel()\n g: Selection<SVGGElement, unknown, null, undefined>\n private _firstRender = true\n private _isResizing = false\n private _initialScale: number = undefined\n private _center: [number, number]\n private _currentZoomLevel: number = undefined\n private _transform: ZoomTransform\n private _path = geoPath()\n private _projection: GeoProjection\n private _prevWidth: number\n private _prevHeight: number\n private _animFrameId: number\n\n private _featureCollection: GeoJSON.FeatureCollection\n private _zoomBehavior: ZoomBehavior<SVGGElement, unknown> = zoom()\n private _backgroundRect = this.g.append('rect').attr('class', s.background)\n private _featuresGroup = this.g.append('g').attr('class', s.features)\n private _linksGroup = this.g.append('g').attr('class', s.links)\n private _pointsGroup = this.g.append('g').attr('class', s.points)\n\n events = {\n [TopoJSONMap.selectors.point]: {},\n [TopoJSONMap.selectors.feature]: {},\n }\n\n constructor (config?: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>, data?: MapData<AreaDatum, PointDatum, LinkDatum>) {\n super()\n this._zoomBehavior.on('zoom', this._onZoom.bind(this))\n\n if (config) this.setConfig(config)\n if (data) this.setData(data)\n\n this.g.append('defs')\n .append('filter')\n .attr('id', 'heatmapFilter')\n .html(`\n <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"${this.config.heatmapModeBlurStdDeviation}\" color-interpolation-filters=\"sRGB\" result=\"blur\"></feGaussianBlur>\n <feColorMatrix class=\"blurValues\" in=\"blur\" mode=\"matrix\" values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 20 -4\"></feColorMatrix>\n `)\n }\n\n setData (data: MapData<AreaDatum, PointDatum, LinkDatum>): void {\n const { config } = this\n\n this.datamodel.pointId = config.pointId\n this.datamodel.linkSource = config.linkSource\n this.datamodel.linkTarget = config.linkTarget\n this.datamodel.data = data\n\n // If there was a data change and mapFitToPoints is enabled, we will need to re-fit the map\n this._firstRender = this._firstRender || config.mapFitToPoints\n }\n\n setConfig (config?: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>): void {\n super.setConfig(config)\n\n // Setting the default here instead of defaultConfig to prevent mutation from other TopoJSONMap instances\n const newProjection = this.config.projection ?? MapProjection.Kavrayskiy7()\n if (this._projection) {\n newProjection.scale(this._projection.scale()).translate(this._projection.translate())\n }\n this._projection = newProjection\n }\n\n _render (customDuration?: number): void {\n const { config } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n this._renderBackground()\n this._renderMap(duration)\n this._renderGroups(duration)\n this._renderLinks(duration)\n this._renderPoints(duration)\n\n // When animation is running we need to temporary disable zoom behaviour\n if (duration && !config.disableZoom) {\n this.g.on('.zoom', null)\n timeout(() => {\n this.g.call(this._zoomBehavior)\n }, duration)\n }\n\n // When zoom behaviour is active we assign the `draggable` class to show the grabbing cursor\n this.g.classed('draggable', !config.disableZoom)\n this._firstRender = false\n }\n\n _renderBackground (): void {\n this._backgroundRect\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('transform', `translate(${-this.bleed.left}, ${-this.bleed.top})`)\n }\n\n _renderGroups (duration: number): void {\n const transformString = this._transform.toString()\n smartTransition(this._featuresGroup, duration)\n .attr('transform', transformString)\n .attr('stroke-width', 1 / this._currentZoomLevel)\n\n smartTransition(this._linksGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._pointsGroup, duration)\n .attr('transform', transformString)\n }\n\n _renderMap (duration: number): void {\n const { bleed, config, datamodel } = this\n\n this.g.attr('transform', `translate(${bleed.left}, ${bleed.top})`)\n const mapData: TopoJSON.Topology = config.topojson\n const featureName = config.mapFeatureName\n const featureObject = mapData?.objects?.[featureName]\n if (!featureObject) return\n\n this._featureCollection = feature(mapData, featureObject) as GeoJSON.FeatureCollection\n const featureData = (this._featureCollection?.features ?? []) as MapFeature<AreaDatum>[]\n\n if (this._firstRender) {\n // Rendering the map for the first time.\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._initialScale = this._projection.scale()\n this._center = this._projection.translate()\n\n if (config.mapFitToPoints) {\n this._fitToPoints()\n }\n\n const zoomExtent = config.zoomExtent\n this._zoomBehavior.scaleExtent([zoomExtent[0] * this._initialScale, zoomExtent[1] * this._initialScale])\n this.setZoom(config.zoomFactor || 1)\n\n if (!config.disableZoom) {\n this.g.call(this._zoomBehavior)\n this._applyZoom()\n }\n\n this._prevWidth = this._width\n this._prevHeight = this._height\n }\n\n if (this._prevWidth !== this._width || this._prevHeight !== this._height) {\n this._onResize()\n }\n\n\n this._path.projection(this._projection)\n\n // Merge passed area data and map feature data\n const areaData = datamodel.areas\n areaData.forEach(a => {\n const feature = featureData.find(f => f.id.toString() === getString(a, config.areaId).toString())\n if (feature) feature.data = a\n else if (this._firstRender) console.warn(`Can't find feature by area code ${getString(a, config.areaId)}`)\n })\n\n const features = this._featuresGroup\n .selectAll<SVGPathElement, unknown>(`.${s.feature}`)\n .data(featureData)\n\n const featuresEnter = features.enter().append('path').attr('class', s.feature)\n smartTransition(featuresEnter.merge(features), duration)\n .attr('d', this._path)\n .style('fill', (d, i) => d.data ? getColor(d.data, config.areaColor, i) : null)\n .style('cursor', d => d.data ? getString(d.data, config.areaCursor) : null)\n features.exit().remove()\n }\n\n _renderLinks (duration: number): void {\n const { config, datamodel } = this\n const links = datamodel.links\n\n const edges = this._linksGroup\n .selectAll<SVGPathElement, MapLink<PointDatum, LinkDatum>>(`.${s.link}`)\n .data(links, (d, i) => getString(d, config.linkId, i))\n\n const edgesEnter = edges.enter().append('path').attr('class', s.link)\n .style('stroke-width', 0)\n\n smartTransition(edgesEnter.merge(edges), duration)\n .attr('d', link => {\n const source = this._projection(getLonLat(link.source, config.longitude, config.latitude))\n const target = this._projection(getLonLat(link.target, config.longitude, config.latitude))\n return arc(source, target)\n })\n .style('stroke-width', link => getNumber(link, config.linkWidth) / this._currentZoomLevel)\n .style('cursor', link => getString(link, config.linkCursor))\n .style('stroke', (link, i) => getColor(link, config.linkColor, i))\n edges.exit().remove()\n }\n\n _renderPoints (duration: number): void {\n const { config, datamodel } = this\n const pointData = datamodel.points\n\n const points = this._pointsGroup\n .selectAll<SVGGElement, PointDatum>(`.${s.point}`)\n .data(pointData, (d, i) => getString(d, config.pointId, i))\n\n // Enter\n const pointsEnter = points.enter().append('g').attr('class', s.point)\n .attr('transform', d => {\n const pos = this._projection(getLonLat(d, config.longitude, config.latitude))\n return `translate(${pos[0]},${pos[1]})`\n })\n .style('opacity', 0)\n\n pointsEnter.append('circle').attr('class', s.pointCircle)\n .attr('r', 0)\n .style('fill', (d, i) => getColor(d, config.pointColor, i))\n .style('stroke-width', d => getNumber(d, config.pointStrokeWidth))\n\n pointsEnter.append('text').attr('class', s.pointLabel)\n .style('opacity', 0)\n\n // Update\n const pointsMerged = pointsEnter.merge(points)\n smartTransition(pointsMerged, duration)\n .attr('transform', d => {\n const pos = this._projection(getLonLat(d, config.longitude, config.latitude))\n return `translate(${pos[0]},${pos[1]})`\n })\n .style('cursor', d => getString(d, config.pointCursor))\n .style('opacity', 1)\n\n smartTransition(pointsMerged.select(`.${s.pointCircle}`), duration)\n .attr('r', d => getNumber(d, config.pointRadius) / this._currentZoomLevel)\n .style('fill', (d, i) => getColor(d, config.pointColor, i))\n .style('stroke', (d, i) => getColor(d, config.pointColor, i))\n .style('stroke-width', d => getNumber(d, config.pointStrokeWidth) / this._currentZoomLevel)\n\n const pointLabelsMerged = pointsMerged.select(`.${s.pointLabel}`)\n pointLabelsMerged\n .text(d => getString(d, config.pointLabel) ?? '')\n .style('font-size', d => {\n if (config.pointLabelPosition === MapPointLabelPosition.Bottom) {\n return `calc(var(--vis-map-point-label-font-size) / ${this._currentZoomLevel}`\n }\n const pointDiameter = 2 * getNumber(d, config.pointRadius)\n const pointLabelText = getString(d, config.pointLabel) || ''\n const textLength = pointLabelText.length\n const fontSize = 0.5 * pointDiameter / Math.pow(textLength, 0.4)\n return clamp(fontSize, fontSize, 16)\n })\n .attr('y', d => {\n if (config.pointLabelPosition === MapPointLabelPosition.Center) return null\n\n const pointRadius = getNumber(d, config.pointRadius) / this._currentZoomLevel\n return pointRadius\n })\n .attr('dy', config.pointLabelPosition === MapPointLabelPosition.Center ? '0.32em' : '1em')\n\n smartTransition(pointLabelsMerged, duration)\n .style('fill', (d, i) => {\n if (config.pointLabelPosition === MapPointLabelPosition.Bottom) return null\n\n const pointColor = getColor(d, config.pointColor, i)\n const hex = color(isStringCSSVariable(pointColor) ? getCSSVariableValue(pointColor, this.element) : pointColor)?.hex()\n if (!hex) return null\n\n const brightness = hexToBrightness(hex)\n return brightness > config.pointLabelTextBrightnessRatio ? 'var(--vis-map-point-label-text-color-dark)' : 'var(--vis-map-point-label-text-color-light)'\n })\n .style('opacity', 1)\n\n // Exit\n points.exit().remove()\n\n // Heatmap\n this._pointsGroup.style('filter', (config.heatmapMode && this._currentZoomLevel < config.heatmapModeZoomLevelThreshold) ? 'url(#heatmapFilter)' : null)\n this._pointsGroup.selectAll(`.${s.pointLabel}`).style('display', (config.heatmapMode && (this._currentZoomLevel < config.heatmapModeZoomLevelThreshold)) ? 'none' : null)\n }\n\n _fitToPoints (points?: PointDatum[], pad = 0.1): void {\n const { config, datamodel } = this\n const pointData = points || datamodel.points\n if (pointData.length === 0) return\n\n this.fitView()\n\n const featureCollection: ExtendedFeatureCollection = {\n type: 'FeatureCollection',\n features: [{\n type: 'Feature',\n properties: {},\n geometry: {\n type: 'MultiPoint',\n coordinates: pointData.map(p => {\n return [\n getNumber(p, d => getNumber(d, config.longitude)),\n getNumber(p, d => getNumber(d, config.latitude)),\n ]\n }),\n },\n }],\n }\n\n this._projection.fitExtent([\n [this._width * pad, this._height * pad],\n [this._width * (1 - pad), this._height * (1 - pad)],\n ], featureCollection)\n\n const maxScale = config.zoomExtent[1] * this._initialScale\n const fittedScale = this._projection.scale()\n\n if (fittedScale > maxScale) {\n const fittedTranslate = this._projection.translate()\n const scaleRatio = maxScale / fittedScale\n\n this._projection.scale(maxScale)\n this._projection.translate([\n this._width / 2 - (this._width / 2 - fittedTranslate[0]) * scaleRatio,\n this._height / 2 - (this._height / 2 - fittedTranslate[1]) * scaleRatio,\n ])\n }\n\n // If we don't update the center, the next zoom will be centered around the previous value\n this._center = this._projection.translate()\n this._applyZoom()\n }\n\n _applyZoom (): void {\n const translate = this._center ?? this._projection.translate()\n const scale = this._initialScale * this._currentZoomLevel\n this.g.call(this._zoomBehavior.transform, zoomIdentity.translate(translate[0], translate[1]).scale(scale))\n }\n\n _onResize (): void {\n this._isResizing = true\n const prevTranslate = this._projection.translate()\n\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._initialScale = this._projection.scale()\n this._center = [\n this._projection.translate()[0] * this._center[0] / prevTranslate[0],\n this._projection.translate()[1] * this._center[1] / prevTranslate[1],\n ]\n this._applyZoom()\n\n this._isResizing = false\n this._prevWidth = this._width\n this._prevHeight = this._height\n }\n\n _onZoom (event: D3ZoomEvent<any, any>): void {\n if (this._firstRender) return // To prevent double render because of binding zoom behaviour\n const isMouseEvent = event.sourceEvent !== undefined\n const isExternalEvent = !event?.sourceEvent && !this._isResizing\n\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(this._onZoomHandler.bind(this, event.transform, isMouseEvent, isExternalEvent))\n\n if (isMouseEvent) {\n // Update the center coordinate so that the next call to _applyZoom()\n // will zoom with respect to the current view\n this._center = [event.transform.x, event.transform.y]\n }\n this._currentZoomLevel = (event?.transform.k / this._initialScale) || 1\n }\n\n _onZoomHandler (transform: ZoomTransform, isMouseEvent: boolean, isExternalEvent: boolean): void {\n const scale = transform.k / this._initialScale || 1\n const center = this._projection.translate()\n\n this._transform = zoomIdentity\n .translate(transform.x - center[0] * scale, transform.y - center[1] * scale)\n .scale(scale)\n\n const customDuration = isExternalEvent\n ? this.config.zoomDuration\n : (isMouseEvent ? 0 : null)\n\n // Call render functions that depend on this._transform\n this._renderGroups(customDuration)\n this._renderLinks(customDuration)\n this._renderPoints(customDuration)\n }\n\n public zoomIn (increment = 0.5): void {\n this.setZoom(this._currentZoomLevel + increment)\n }\n\n public zoomOut (increment = 0.5): void {\n this.setZoom(this._currentZoomLevel - increment)\n }\n\n public setZoom (zoomLevel: number): void {\n const { config } = this\n this._currentZoomLevel = clamp(zoomLevel, config.zoomExtent[0], config.zoomExtent[1])\n this._transform = zoomIdentity\n .translate(this._center[0] * (1 - this._currentZoomLevel), this._center[1] * (1 - this._currentZoomLevel))\n .scale(this._currentZoomLevel)\n // We are using this._applyZoom() instead of directly calling this._render(config.zoomDuration) because\n // we've to \"attach\" new transform to the map group element. Otherwise zoomBehavior will not know\n // that the zoom state has changed\n this._applyZoom()\n }\n\n public fitView (): void {\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._currentZoomLevel = (this._projection?.scale() / this._initialScale) || 1\n this._center = this._projection.translate()\n // We are using this._applyZoom() instead of directly calling this._render(config.zoomDuration) because\n // we've to \"attach\" new transform to the map group element. Otherwise zoomBehavior will not know\n // that the zoom state has changed\n this._applyZoom()\n }\n\n destroy (): void {\n window.cancelAnimationFrame(this._animFrameId)\n }\n}\n"],"names":["s.background","s.features","s.links","s.points","s.feature","s.link","s.point","s.pointCircle","s.pointLabel","s"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/topojson-map/index.ts"],"sourcesContent":["import { Selection } from 'd3-selection'\nimport { D3ZoomEvent, zoom, ZoomBehavior, zoomIdentity, ZoomTransform } from 'd3-zoom'\nimport { timeout } from 'd3-timer'\nimport { geoPath, GeoProjection, ExtendedFeatureCollection } from 'd3-geo'\nimport { color } from 'd3-color'\nimport { feature } from 'topojson-client'\n\n// Core\nimport { ComponentCore } from 'core/component'\nimport { MapGraphDataModel } from 'data-models/map-graph'\n\n// Utils\nimport { clamp, getNumber, getString, isNumber } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\nimport { getColor, hexToBrightness } from 'utils/color'\nimport { getCSSVariableValue, isStringCSSVariable } from 'utils/misc'\n\n// Types\nimport { MapLink } from 'types/map'\n\n// Local Types\nimport { MapData, MapFeature, MapPointLabelPosition, MapProjection } from './types'\n\n// Config\nimport { TopoJSONMapDefaultConfig, TopoJSONMapConfigInterface } from './config'\n\n// Modules\nimport { arc, getLonLat } from './utils'\n\n// Styles\nimport * as s from './style'\n\nexport class TopoJSONMap<\n AreaDatum,\n PointDatum = unknown,\n LinkDatum = unknown,\n> extends ComponentCore<\n MapData<AreaDatum, PointDatum, LinkDatum>,\n TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>\n > {\n static selectors = s\n protected _defaultConfig = TopoJSONMapDefaultConfig as TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>\n public config: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum> = this._defaultConfig\n\n datamodel: MapGraphDataModel<AreaDatum, PointDatum, LinkDatum> = new MapGraphDataModel()\n g: Selection<SVGGElement, unknown, null, undefined>\n private _firstRender = true\n private _isResizing = false\n private _initialScale: number = undefined\n private _center: [number, number]\n private _currentZoomLevel: number = undefined\n private _transform: ZoomTransform\n private _path = geoPath()\n private _projection: GeoProjection\n private _prevWidth: number\n private _prevHeight: number\n private _animFrameId: number\n\n private _featureCollection: GeoJSON.FeatureCollection\n private _zoomBehavior: ZoomBehavior<SVGGElement, unknown> = zoom()\n private _backgroundRect = this.g.append('rect').attr('class', s.background)\n private _featuresGroup = this.g.append('g').attr('class', s.features)\n private _linksGroup = this.g.append('g').attr('class', s.links)\n private _pointsGroup = this.g.append('g').attr('class', s.points)\n\n events = {\n [TopoJSONMap.selectors.point]: {},\n [TopoJSONMap.selectors.feature]: {},\n }\n\n constructor (config?: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>, data?: MapData<AreaDatum, PointDatum, LinkDatum>) {\n super()\n this._zoomBehavior.on('zoom', this._onZoom.bind(this))\n\n if (config) this.setConfig(config)\n if (data) this.setData(data)\n\n this.g.append('defs')\n .append('filter')\n .attr('id', 'heatmapFilter')\n .html(`\n <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"${this.config.heatmapModeBlurStdDeviation}\" color-interpolation-filters=\"sRGB\" result=\"blur\"></feGaussianBlur>\n <feColorMatrix class=\"blurValues\" in=\"blur\" mode=\"matrix\" values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 20 -4\"></feColorMatrix>\n `)\n }\n\n setData (data: MapData<AreaDatum, PointDatum, LinkDatum>): void {\n const { config } = this\n\n this.datamodel.pointId = config.pointId\n this.datamodel.linkSource = config.linkSource\n this.datamodel.linkTarget = config.linkTarget\n this.datamodel.data = data\n\n // If there was a data change and mapFitToPoints is enabled, we will need to re-fit the map\n this._firstRender = this._firstRender || config.mapFitToPoints\n }\n\n setConfig (config?: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>): void {\n super.setConfig(config)\n\n // Setting the default here instead of defaultConfig to prevent mutation from other TopoJSONMap instances\n const newProjection = this.config.projection ?? MapProjection.Kavrayskiy7()\n if (this._projection) {\n newProjection.scale(this._projection.scale()).translate(this._projection.translate())\n }\n this._projection = newProjection\n }\n\n _render (customDuration?: number): void {\n const { config } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n this._renderBackground()\n this._renderMap(duration)\n this._renderGroups(duration)\n this._renderLinks(duration)\n this._renderPoints(duration)\n\n // When animation is running we need to temporary disable zoom behaviour\n if (duration && !config.disableZoom) {\n this.g.on('.zoom', null)\n timeout(() => {\n this.g.call(this._zoomBehavior)\n }, duration)\n }\n\n // When zoom behaviour is active we assign the `draggable` class to show the grabbing cursor\n this.g.classed('draggable', !config.disableZoom)\n this._firstRender = false\n }\n\n _renderBackground (): void {\n this._backgroundRect\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('transform', `translate(${-this.bleed.left}, ${-this.bleed.top})`)\n }\n\n _renderGroups (duration: number): void {\n const transformString = this._transform.toString()\n smartTransition(this._featuresGroup, duration)\n .attr('transform', transformString)\n .attr('stroke-width', 1 / this._currentZoomLevel)\n\n smartTransition(this._linksGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._pointsGroup, duration)\n .attr('transform', transformString)\n }\n\n _renderMap (duration: number): void {\n const { bleed, config, datamodel } = this\n\n this.g.attr('transform', `translate(${bleed.left}, ${bleed.top})`)\n const mapData: TopoJSON.Topology = config.topojson\n const featureName = config.mapFeatureName\n const featureObject = mapData?.objects?.[featureName]\n if (!featureObject) return\n\n this._featureCollection = feature(mapData, featureObject) as GeoJSON.FeatureCollection\n const featureData = (this._featureCollection?.features ?? []) as MapFeature<AreaDatum>[]\n\n if (this._firstRender) {\n // Rendering the map for the first time.\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._initialScale = this._projection.scale()\n this._center = this._projection.translate()\n\n if (config.mapFitToPoints) {\n this._fitToPoints()\n }\n\n const zoomExtent = config.zoomExtent\n this._zoomBehavior.scaleExtent([zoomExtent[0] * this._initialScale, zoomExtent[1] * this._initialScale])\n this.setZoom(config.zoomFactor || 1)\n\n if (!config.disableZoom) {\n this.g.call(this._zoomBehavior)\n this._applyZoom()\n }\n\n this._prevWidth = this._width\n this._prevHeight = this._height\n }\n\n if (this._prevWidth !== this._width || this._prevHeight !== this._height) {\n this._onResize()\n }\n\n\n this._path.projection(this._projection)\n\n // Merge passed area data and map feature data\n const areaData = datamodel.areas\n areaData.forEach(a => {\n const feature = featureData.find(f => f.id.toString() === getString(a, config.areaId).toString())\n if (feature) feature.data = a\n else if (this._firstRender) console.warn(`Can't find feature by area code ${getString(a, config.areaId)}`)\n })\n\n const features = this._featuresGroup\n .selectAll<SVGPathElement, unknown>(`.${s.feature}`)\n .data(featureData)\n\n const featuresEnter = features.enter().append('path').attr('class', s.feature)\n smartTransition(featuresEnter.merge(features), duration)\n .attr('d', this._path)\n .style('fill', (d, i) => d.data ? getColor(d.data, config.areaColor, i) : null)\n .style('cursor', d => d.data ? getString(d.data, config.areaCursor) : null)\n features.exit().remove()\n }\n\n _renderLinks (duration: number): void {\n const { config, datamodel } = this\n const links = datamodel.links\n\n const edges = this._linksGroup\n .selectAll<SVGPathElement, MapLink<PointDatum, LinkDatum>>(`.${s.link}`)\n .data(links, (d, i) => getString(d, config.linkId, i))\n\n const edgesEnter = edges.enter().append('path').attr('class', s.link)\n .style('stroke-width', 0)\n\n smartTransition(edgesEnter.merge(edges), duration)\n .attr('d', link => {\n const source = this._projection(getLonLat(link.source, config.longitude, config.latitude))\n const target = this._projection(getLonLat(link.target, config.longitude, config.latitude))\n return arc(source, target)\n })\n .style('stroke-width', link => getNumber(link, config.linkWidth) / this._currentZoomLevel)\n .style('cursor', link => getString(link, config.linkCursor))\n .style('stroke', (link, i) => getColor(link, config.linkColor, i))\n edges.exit().remove()\n }\n\n _renderPoints (duration: number): void {\n const { config, datamodel } = this\n const pointData = datamodel.points\n\n const points = this._pointsGroup\n .selectAll<SVGGElement, PointDatum>(`.${s.point}`)\n .data(pointData, (d, i) => getString(d, config.pointId, i))\n\n // Enter\n const pointsEnter = points.enter().append('g').attr('class', s.point)\n .attr('transform', d => {\n const pos = this._projection(getLonLat(d, config.longitude, config.latitude))\n return `translate(${pos[0]},${pos[1]})`\n })\n .style('opacity', 0)\n\n pointsEnter.append('circle').attr('class', s.pointCircle)\n .attr('r', 0)\n .style('fill', (d, i) => getColor(d, config.pointColor, i))\n .style('stroke-width', d => getNumber(d, config.pointStrokeWidth))\n\n pointsEnter.append('text').attr('class', s.pointLabel)\n .style('opacity', 0)\n\n // Update\n const pointsMerged = pointsEnter.merge(points)\n smartTransition(pointsMerged, duration)\n .attr('transform', d => {\n const pos = this._projection(getLonLat(d, config.longitude, config.latitude))\n return `translate(${pos[0]},${pos[1]})`\n })\n .style('cursor', d => getString(d, config.pointCursor))\n .style('opacity', 1)\n\n smartTransition(pointsMerged.select(`.${s.pointCircle}`), duration)\n .attr('r', d => getNumber(d, config.pointRadius) / this._currentZoomLevel)\n .style('fill', (d, i) => getColor(d, config.pointColor, i))\n .style('stroke', (d, i) => getColor(d, config.pointColor, i))\n .style('stroke-width', d => getNumber(d, config.pointStrokeWidth) / this._currentZoomLevel)\n\n const pointLabelsMerged = pointsMerged.select(`.${s.pointLabel}`)\n pointLabelsMerged\n .text(d => getString(d, config.pointLabel) ?? '')\n .style('font-size', d => {\n if (config.pointLabelPosition === MapPointLabelPosition.Bottom) {\n return `calc(var(--vis-map-point-label-font-size) / ${this._currentZoomLevel}`\n }\n const pointDiameter = 2 * getNumber(d, config.pointRadius)\n const pointLabelText = getString(d, config.pointLabel) || ''\n const textLength = pointLabelText.length\n const fontSize = 0.5 * pointDiameter / Math.pow(textLength, 0.4)\n return clamp(fontSize, fontSize, 16)\n })\n .attr('y', d => {\n if (config.pointLabelPosition === MapPointLabelPosition.Center) return null\n\n const pointRadius = getNumber(d, config.pointRadius) / this._currentZoomLevel\n return pointRadius\n })\n .attr('dy', config.pointLabelPosition === MapPointLabelPosition.Center ? '0.32em' : '1em')\n\n smartTransition(pointLabelsMerged, duration)\n .style('fill', (d, i) => {\n if (config.pointLabelPosition === MapPointLabelPosition.Bottom) return null\n\n const pointColor = getColor(d, config.pointColor, i)\n const hex = color(isStringCSSVariable(pointColor) ? getCSSVariableValue(pointColor, this.element) : pointColor)?.hex()\n if (!hex) return null\n\n const brightness = hexToBrightness(hex)\n return brightness > config.pointLabelTextBrightnessRatio ? 'var(--vis-map-point-label-text-color-dark)' : 'var(--vis-map-point-label-text-color-light)'\n })\n .style('opacity', 1)\n\n // Exit\n points.exit().remove()\n\n // Heatmap\n this._pointsGroup.style('filter', (config.heatmapMode && this._currentZoomLevel < config.heatmapModeZoomLevelThreshold) ? 'url(#heatmapFilter)' : null)\n this._pointsGroup.selectAll(`.${s.pointLabel}`).style('display', (config.heatmapMode && (this._currentZoomLevel < config.heatmapModeZoomLevelThreshold)) ? 'none' : null)\n }\n\n _fitToPoints (points?: PointDatum[], pad = 0.1): void {\n const { config, datamodel } = this\n const pointData = points || datamodel.points\n if (pointData.length === 0) return\n\n this.fitView()\n\n const featureCollection: ExtendedFeatureCollection = {\n type: 'FeatureCollection',\n features: [{\n type: 'Feature',\n properties: {},\n geometry: {\n type: 'MultiPoint',\n coordinates: pointData.map(p => {\n return [\n getNumber(p, d => getNumber(d, config.longitude)),\n getNumber(p, d => getNumber(d, config.latitude)),\n ]\n }),\n },\n }],\n }\n\n this._projection.fitExtent([\n [this._width * pad, this._height * pad],\n [this._width * (1 - pad), this._height * (1 - pad)],\n ], featureCollection)\n\n const maxScale = config.zoomExtent[1] * this._initialScale\n const fittedScale = this._projection.scale()\n\n if (fittedScale > maxScale) {\n const fittedTranslate = this._projection.translate()\n const scaleRatio = maxScale / fittedScale\n\n this._projection.scale(maxScale)\n this._projection.translate([\n this._width / 2 - (this._width / 2 - fittedTranslate[0]) * scaleRatio,\n this._height / 2 - (this._height / 2 - fittedTranslate[1]) * scaleRatio,\n ])\n }\n\n // If we don't update the center, the next zoom will be centered around the previous value\n this._center = this._projection.translate()\n this._applyZoom()\n }\n\n _applyZoom (): void {\n const translate = this._center ?? this._projection.translate()\n const scale = this._initialScale * this._currentZoomLevel\n this.g.call(this._zoomBehavior.transform, zoomIdentity.translate(translate[0], translate[1]).scale(scale))\n }\n\n _onResize (): void {\n this._isResizing = true\n const prevTranslate = this._projection.translate()\n\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._initialScale = this._projection.scale()\n this._center = [\n this._projection.translate()[0] * this._center[0] / prevTranslate[0],\n this._projection.translate()[1] * this._center[1] / prevTranslate[1],\n ]\n this._applyZoom()\n\n this._isResizing = false\n this._prevWidth = this._width\n this._prevHeight = this._height\n }\n\n _onZoom (event: D3ZoomEvent<any, any>): void {\n if (this._firstRender) return // To prevent double render because of binding zoom behaviour\n const isMouseEvent = event.sourceEvent !== undefined\n const isExternalEvent = !event?.sourceEvent && !this._isResizing\n\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(this._onZoomHandler.bind(this, event.transform, isMouseEvent, isExternalEvent))\n\n if (isMouseEvent) {\n // Update the center coordinate so that the next call to _applyZoom()\n // will zoom with respect to the current view\n this._center = [event.transform.x, event.transform.y]\n }\n this._currentZoomLevel = (event?.transform.k / this._initialScale) || 1\n }\n\n _onZoomHandler (transform: ZoomTransform, isMouseEvent: boolean, isExternalEvent: boolean): void {\n const scale = transform.k / this._initialScale || 1\n const center = this._projection.translate()\n\n this._transform = zoomIdentity\n .translate(transform.x - center[0] * scale, transform.y - center[1] * scale)\n .scale(scale)\n\n const customDuration = isExternalEvent\n ? this.config.zoomDuration\n : (isMouseEvent ? 0 : null)\n\n // Call render functions that depend on this._transform\n this._renderGroups(customDuration)\n this._renderLinks(customDuration)\n this._renderPoints(customDuration)\n }\n\n public zoomIn (increment = 0.5): void {\n this.setZoom(this._currentZoomLevel + increment)\n }\n\n public zoomOut (increment = 0.5): void {\n this.setZoom(this._currentZoomLevel - increment)\n }\n\n public setZoom (zoomLevel: number): void {\n const { config } = this\n this._currentZoomLevel = clamp(zoomLevel, config.zoomExtent[0], config.zoomExtent[1])\n this._transform = zoomIdentity\n .translate(this._center[0] * (1 - this._currentZoomLevel), this._center[1] * (1 - this._currentZoomLevel))\n .scale(this._currentZoomLevel)\n // We are using this._applyZoom() instead of directly calling this._render(config.zoomDuration) because\n // we've to \"attach\" new transform to the map group element. Otherwise zoomBehavior will not know\n // that the zoom state has changed\n this._applyZoom()\n }\n\n public fitView (): void {\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._currentZoomLevel = (this._projection?.scale() / this._initialScale) || 1\n this._center = this._projection.translate()\n // We are using this._applyZoom() instead of directly calling this._render(config.zoomDuration) because\n // we've to \"attach\" new transform to the map group element. Otherwise zoomBehavior will not know\n // that the zoom state has changed\n this._applyZoom()\n }\n\n destroy (): void {\n window.cancelAnimationFrame(this._animFrameId)\n }\n}\n"],"names":["s.background","s.features","s.links","s.points","s.feature","s.link","s.point","s.pointCircle","s.pointLabel","s"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.js","sources":["../../../src/components/topojson-map/style.ts"],"sourcesContent":["import { css, injectGlobal } from '@emotion/css'\n\nexport const root = css`\n label: topojson-map-component;\n\n &.draggable {\n &:active {\n cursor: grabbing;\n cursor: -moz-grabbing;\n cursor: -webkit-grabbing;\n }\n }\n`\n\nexport const variables = injectGlobal`\n :root {\n --vis-map-feature-color: #dce3eb;\n --vis-map-boundary-color: #ffffff;\n\n --vis-map-point-label-text-color-dark: #5b5f6d;\n --vis-map-point-label-text-color-light: #fff;\n\n // Undefined by default to allow proper fallback to var(--vis-font-family)\n /* --vis-map-point-label-font-family: */\n --vis-map-point-label-font-weight: 600;\n --vis-map-point-label-font-size: 12px;\n\n /* Dark Theme */\n --vis-dark-map-feature-color: #5b5f6d;\n --vis-dark-map-boundary-color: #2a2a2a;\n --vis-dark-map-point-label-text-color-dark: #fff;\n --vis-dark-map-point-label-text-color-light:#5b5f6d;\n }\n\n body.theme-dark ${`.${root}`} {\n --vis-map-feature-color: var(--vis-dark-map-feature-color);\n --vis-map-boundary-color: var(--vis-dark-map-boundary-color);\n --vis-map-point-label-text-color-dark: var(--vis-dark-map-point-label-text-color-dark);\n --vis-map-point-label-text-color-light: var(--vis-dark-map-point-label-text-color-light);\n }\n`\n\nexport const features = css`\n label: features;\n`\n\nexport const feature = css`\n label: feature;\n fill: var(--vis-map-feature-color);\n stroke: var(--vis-map-boundary-color);\n stroke-opacity: 0.5;\n`\n\nexport const background = css`\n label: background;\n\n fill-opacity: 0;\n pointer-events: all;\n`\n\nexport const points = css`\n label: points;\n`\n\nexport const point = css`\n label: point;\n`\n\nexport const pointCircle = css`\n label: point;\n\n stroke-opacity: 0.4;\n pointer-events: fill;\n\n &:active {\n cursor: default;\n }\n`\n\nexport const pointLabel = css`\n label: label;\n\n text-anchor: middle;\n cursor: default;\n pointer-events:none;\n\n font-size: var(--vis-map-point-label-font-size);\n font-family: var(--vis-map-point-label-font-family, var(--vis-font-family));\n font-weight: var(--vis-map-point-label-font-weight);\n fill: var(--vis-map-point-label-text-color-dark);\n`\n\nexport const links = css`\n label: links;\n`\n\nexport const link = css`\n label: link;\n\n fill: none;\n stroke-opacity: .50;\n stroke-linecap: round;\n\n &:hover {\n stroke-opacity: .90;\n }\n`\n"],"names":[],"mappings":";;AAEO,MAAM,IAAI,GAAG,GAAG,CAAA
|
|
1
|
+
{"version":3,"file":"style.js","sources":["../../../src/components/topojson-map/style.ts"],"sourcesContent":["import { css, injectGlobal } from '@emotion/css'\n\nexport const root = css`\n label: topojson-map-component;\n\n &.draggable {\n &:active {\n cursor: grabbing;\n cursor: -moz-grabbing;\n cursor: -webkit-grabbing;\n }\n }\n`\n\nexport const variables = injectGlobal`\n :root {\n --vis-map-feature-color: #dce3eb;\n --vis-map-boundary-color: #ffffff;\n\n --vis-map-point-label-text-color-dark: #5b5f6d;\n --vis-map-point-label-text-color-light: #fff;\n\n // Undefined by default to allow proper fallback to var(--vis-font-family)\n /* --vis-map-point-label-font-family: */\n --vis-map-point-label-font-weight: 600;\n --vis-map-point-label-font-size: 12px;\n\n /* Dark Theme */\n --vis-dark-map-feature-color: #5b5f6d;\n --vis-dark-map-boundary-color: #2a2a2a;\n --vis-dark-map-point-label-text-color-dark: #fff;\n --vis-dark-map-point-label-text-color-light:#5b5f6d;\n }\n\n body.theme-dark ${`.${root}`} {\n --vis-map-feature-color: var(--vis-dark-map-feature-color);\n --vis-map-boundary-color: var(--vis-dark-map-boundary-color);\n --vis-map-point-label-text-color-dark: var(--vis-dark-map-point-label-text-color-dark);\n --vis-map-point-label-text-color-light: var(--vis-dark-map-point-label-text-color-light);\n }\n`\n\nexport const features = css`\n label: features;\n`\n\nexport const feature = css`\n label: feature;\n fill: var(--vis-map-feature-color);\n stroke: var(--vis-map-boundary-color);\n stroke-opacity: 0.5;\n`\n\nexport const background = css`\n label: background;\n\n fill-opacity: 0;\n pointer-events: all;\n`\n\nexport const points = css`\n label: points;\n`\n\nexport const point = css`\n label: point;\n`\n\nexport const pointCircle = css`\n label: point;\n\n stroke-opacity: 0.4;\n pointer-events: fill;\n\n &:active {\n cursor: default;\n }\n`\n\nexport const pointLabel = css`\n label: label;\n\n text-anchor: middle;\n cursor: default;\n pointer-events:none;\n\n font-size: var(--vis-map-point-label-font-size);\n font-family: var(--vis-map-point-label-font-family, var(--vis-font-family));\n font-weight: var(--vis-map-point-label-font-weight);\n fill: var(--vis-map-point-label-text-color-dark);\n`\n\nexport const links = css`\n label: links;\n`\n\nexport const link = css`\n label: link;\n\n fill: none;\n stroke-opacity: .50;\n stroke-linecap: round;\n\n &:hover {\n stroke-opacity: .90;\n }\n`\n"],"names":[],"mappings":";;AAEO,MAAM,IAAI,GAAG,GAAG,CAAA;;;;;;;;;;EAUtB;AAEM,MAAM,SAAS,GAAG,YAAY,CAAA;;;;;;;;;;;;;;;;;;;;AAoBjB,kBAAA,EAAA,CAAA,CAAA,EAAI,IAAI,CAAE,CAAA,CAAA;;;;;;EAM7B;AAEM,MAAM,QAAQ,GAAG,GAAG,CAAA;;EAE1B;AAEM,MAAM,OAAO,GAAG,GAAG,CAAA;;;;;EAKzB;AAEM,MAAM,UAAU,GAAG,GAAG,CAAA;;;;;EAK5B;AAEM,MAAM,MAAM,GAAG,GAAG,CAAA;;EAExB;AAEM,MAAM,KAAK,GAAG,GAAG,CAAA;;EAEvB;AAEM,MAAM,WAAW,GAAG,GAAG,CAAA;;;;;;;;;EAS7B;AAEM,MAAM,UAAU,GAAG,GAAG,CAAA;;;;;;;;;;;EAW5B;AAEM,MAAM,KAAK,GAAG,GAAG,CAAA;;EAEvB;AAEM,MAAM,IAAI,GAAG,GAAG,CAAA;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ComponentConfigInterface } from "../../core/component/config";
|
|
2
|
+
import { ColorAccessor, NumericAccessor, StringAccessor } from "../../types/accessor";
|
|
3
|
+
import { TreemapNode } from './types';
|
|
4
|
+
export interface TreemapConfigInterface<Datum> extends ComponentConfigInterface {
|
|
5
|
+
id?: ((d: Datum, i: number) => string | number);
|
|
6
|
+
value?: NumericAccessor<Datum>;
|
|
7
|
+
/** Array of accessor functions to defined the nested groups. Default: `[]` */
|
|
8
|
+
layers: StringAccessor<Datum>[];
|
|
9
|
+
/** A function that accepts a value number and returns a string. Default: `undefined` */
|
|
10
|
+
numberFormat?: (value: number) => string;
|
|
11
|
+
/** Color accessor function for tiles. Default: `undefined` */
|
|
12
|
+
tileColor?: ColorAccessor<TreemapNode<Datum>>;
|
|
13
|
+
/** Padding passed to D3 treemap layout. Default: `2` */
|
|
14
|
+
tilePadding?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Top padding passed to D3 treemap layout.
|
|
17
|
+
* Useful to make room for internal node labels.
|
|
18
|
+
* Default: `undefined`
|
|
19
|
+
*/
|
|
20
|
+
tilePaddingTop?: number;
|
|
21
|
+
/** Label internal nodes. Default: `false` */
|
|
22
|
+
labelInternalNodes?: boolean;
|
|
23
|
+
/** Label offset in the X direction. Default: `4` */
|
|
24
|
+
labelOffsetX?: number;
|
|
25
|
+
/** Label offset in the Y direction. Default: `4` */
|
|
26
|
+
labelOffsetY?: number;
|
|
27
|
+
/** Border radius of the tiles in pixels. Default: `2` */
|
|
28
|
+
tileBorderRadius?: number;
|
|
29
|
+
/** Minimum fraction of width for border radius. Default: `1/8` */
|
|
30
|
+
tileBorderRadiusFactor?: number;
|
|
31
|
+
/** Enable lightness variance for sibling tiles. Default: `false` */
|
|
32
|
+
enableLightnessVariance?: boolean;
|
|
33
|
+
/** Enable font size variation for leaf node labels based on value. Default: `false` */
|
|
34
|
+
enableTileLabelFontSizeVariation?: boolean;
|
|
35
|
+
/** Small font size for leaf labels (used when enableTileLabelFontSizeVariation is true). Default: `8` */
|
|
36
|
+
tileLabelSmallFontSize?: number;
|
|
37
|
+
/** Medium font size for leaf labels (used when enableTileLabelFontSizeVariation is true). Default: `12` */
|
|
38
|
+
tileLabelMediumFontSize?: number;
|
|
39
|
+
/** Large font size for leaf labels (used when enableTileLabelFontSizeVariation is true). Default: `24` */
|
|
40
|
+
tileLabelLargeFontSize?: number;
|
|
41
|
+
/** Flag for showing cursor:pointer to indicate leaf tiles are clickable. Default: `undefined` */
|
|
42
|
+
showTileClickAffordance?: boolean;
|
|
43
|
+
}
|
|
44
|
+
export declare const TreemapDefaultConfig: TreemapConfigInterface<unknown>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ComponentDefaultConfig } from '../../core/component/config.js';
|
|
2
|
+
|
|
3
|
+
const TreemapDefaultConfig = Object.assign(Object.assign({}, ComponentDefaultConfig), { id: (d, i) => { var _a; return (_a = d.id) !== null && _a !== void 0 ? _a : i; }, value: undefined, tileColor: undefined, layers: [], tilePadding: 2, tilePaddingTop: undefined, labelInternalNodes: false, labelOffsetX: 4, labelOffsetY: 4, tileBorderRadius: 2, tileBorderRadiusFactor: 1 / 8, enableLightnessVariance: false, enableTileLabelFontSizeVariation: true, tileLabelSmallFontSize: 8, tileLabelMediumFontSize: 12, tileLabelLargeFontSize: 22, showTileClickAffordance: false });
|
|
4
|
+
|
|
5
|
+
export { TreemapDefaultConfig };
|
|
6
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../../src/components/treemap/config.ts"],"sourcesContent":["import { ComponentConfigInterface, ComponentDefaultConfig } from 'core/component/config'\nimport { ColorAccessor, NumericAccessor, StringAccessor } from 'types/accessor'\nimport { TreemapNode } from './types'\n\nexport interface TreemapConfigInterface<Datum> extends ComponentConfigInterface {\n id?: ((d: Datum, i: number) => string | number);\n /* Numeric accessor for segment size value. Default: `undefined`. */\n value?: NumericAccessor<Datum>;\n\n /** Array of accessor functions to defined the nested groups. Default: `[]` */\n layers: StringAccessor<Datum>[];\n\n /** A function that accepts a value number and returns a string. Default: `undefined` */\n numberFormat?: (value: number) => string;\n\n /** Color accessor function for tiles. Default: `undefined` */\n tileColor?: ColorAccessor<TreemapNode<Datum>>;\n\n /** Padding passed to D3 treemap layout. Default: `2` */\n tilePadding?: number;\n\n /**\n * Top padding passed to D3 treemap layout.\n * Useful to make room for internal node labels.\n * Default: `undefined`\n */\n tilePaddingTop?: number;\n\n /** Label internal nodes. Default: `false` */\n labelInternalNodes?: boolean;\n\n /** Label offset in the X direction. Default: `4` */\n labelOffsetX?: number;\n\n /** Label offset in the Y direction. Default: `4` */\n labelOffsetY?: number;\n\n /** Border radius of the tiles in pixels. Default: `2` */\n tileBorderRadius?: number;\n\n /** Minimum fraction of width for border radius. Default: `1/8` */\n tileBorderRadiusFactor?: number;\n\n /** Enable lightness variance for sibling tiles. Default: `false` */\n enableLightnessVariance?: boolean;\n\n /** Enable font size variation for leaf node labels based on value. Default: `false` */\n enableTileLabelFontSizeVariation?: boolean;\n\n /** Small font size for leaf labels (used when enableTileLabelFontSizeVariation is true). Default: `8` */\n tileLabelSmallFontSize?: number;\n\n /** Medium font size for leaf labels (used when enableTileLabelFontSizeVariation is true). Default: `12` */\n tileLabelMediumFontSize?: number;\n\n /** Large font size for leaf labels (used when enableTileLabelFontSizeVariation is true). Default: `24` */\n tileLabelLargeFontSize?: number;\n\n\n /** Flag for showing cursor:pointer to indicate leaf tiles are clickable. Default: `undefined` */\n showTileClickAffordance?: boolean;\n}\n\nexport const TreemapDefaultConfig: TreemapConfigInterface<unknown> = {\n ...ComponentDefaultConfig,\n id: (d: unknown, i: number): string | number => (d as { id: string }).id ?? i,\n value: undefined,\n tileColor: undefined,\n layers: [],\n tilePadding: 2,\n tilePaddingTop: undefined,\n labelInternalNodes: false,\n labelOffsetX: 4,\n labelOffsetY: 4,\n tileBorderRadius: 2,\n tileBorderRadiusFactor: 1 / 8,\n enableLightnessVariance: false,\n enableTileLabelFontSizeVariation: true,\n tileLabelSmallFontSize: 8,\n tileLabelMediumFontSize: 12,\n tileLabelLargeFontSize: 22,\n showTileClickAffordance: false,\n}\n"],"names":[],"mappings":";;AA+Da,MAAA,oBAAoB,mCAC5B,sBAAsB,CAAA,EAAA,EACzB,EAAE,EAAE,CAAC,CAAU,EAAE,CAAS,KAAqB,EAAA,IAAA,EAAA,CAAA,CAAC,OAAA,CAAC,EAAA,GAAA,CAAoB,CAAC,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,CAAC,CAAA,EAAA,EAC7E,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,EAAE,EACV,WAAW,EAAE,CAAC,EACd,cAAc,EAAE,SAAS,EACzB,kBAAkB,EAAE,KAAK,EACzB,YAAY,EAAE,CAAC,EACf,YAAY,EAAE,CAAC,EACf,gBAAgB,EAAE,CAAC,EACnB,sBAAsB,EAAE,CAAC,GAAG,CAAC,EAC7B,uBAAuB,EAAE,KAAK,EAC9B,gCAAgC,EAAE,IAAI,EACtC,sBAAsB,EAAE,CAAC,EACzB,uBAAuB,EAAE,EAAE,EAC3B,sBAAsB,EAAE,EAAE,EAC1B,uBAAuB,EAAE,KAAK;;;;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Selection } from 'd3-selection';
|
|
2
|
+
import { ComponentCore } from "../../core/component";
|
|
3
|
+
import { SeriesDataModel } from "../../data-models/series";
|
|
4
|
+
import { TreemapConfigInterface } from './config';
|
|
5
|
+
import * as s from './style';
|
|
6
|
+
export declare class Treemap<Datum> extends ComponentCore<Datum[], TreemapConfigInterface<Datum>> {
|
|
7
|
+
static selectors: typeof s;
|
|
8
|
+
protected _defaultConfig: TreemapConfigInterface<Datum>;
|
|
9
|
+
config: TreemapConfigInterface<Datum>;
|
|
10
|
+
datamodel: SeriesDataModel<Datum>;
|
|
11
|
+
tiles: Selection<SVGGElement, unknown, SVGGElement, unknown>;
|
|
12
|
+
private isTileLargeEnough;
|
|
13
|
+
private getTileLightness;
|
|
14
|
+
constructor(config?: TreemapConfigInterface<Datum>);
|
|
15
|
+
_render(): void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { select } from 'd3-selection';
|
|
2
|
+
import { hierarchy, treemap } from 'd3-hierarchy';
|
|
3
|
+
import { extent, group, max } from 'd3-array';
|
|
4
|
+
import { scaleLinear, scaleThreshold } from 'd3-scale';
|
|
5
|
+
import { hsl } from 'd3-color';
|
|
6
|
+
import { wrapSVGText } from '../../utils/text.js';
|
|
7
|
+
import { ComponentCore } from '../../core/component/index.js';
|
|
8
|
+
import { SeriesDataModel } from '../../data-models/series.js';
|
|
9
|
+
import { getColor, getHexValue, brighter, isDarkBackground } from '../../utils/color.js';
|
|
10
|
+
import { getString, getNumber } from '../../utils/data.js';
|
|
11
|
+
import { TreemapDefaultConfig } from './config.js';
|
|
12
|
+
import * as style from './style.js';
|
|
13
|
+
import { tiles, tileGroup, tile, clickableTile, label } from './style.js';
|
|
14
|
+
|
|
15
|
+
const LIGHTNESS_VARIATION_AMOUNT = 0.08;
|
|
16
|
+
const MIN_TILE_SIZE_FOR_LABEL = 20;
|
|
17
|
+
const defaultNumberFormat = (value) => `${value}`;
|
|
18
|
+
class Treemap extends ComponentCore {
|
|
19
|
+
constructor(config) {
|
|
20
|
+
super();
|
|
21
|
+
this._defaultConfig = TreemapDefaultConfig;
|
|
22
|
+
this.config = this._defaultConfig;
|
|
23
|
+
this.datamodel = new SeriesDataModel();
|
|
24
|
+
if (config)
|
|
25
|
+
this.setConfig(config);
|
|
26
|
+
this.tiles = this.g.append('g').attr('class', tiles);
|
|
27
|
+
}
|
|
28
|
+
isTileLargeEnough(d) {
|
|
29
|
+
const w = d.x1 - d.x0;
|
|
30
|
+
const h = d.y1 - d.y0;
|
|
31
|
+
return (w >= MIN_TILE_SIZE_FOR_LABEL) && (h >= MIN_TILE_SIZE_FOR_LABEL);
|
|
32
|
+
}
|
|
33
|
+
getTileLightness(node, siblings) {
|
|
34
|
+
// Get the value extent of the sibling group
|
|
35
|
+
const [minValue, maxValue] = extent(siblings, d => d.value);
|
|
36
|
+
// If there's no range or no value, return default lightness
|
|
37
|
+
if (minValue === maxValue || !node.value)
|
|
38
|
+
return 0;
|
|
39
|
+
// Calculate relative position in the range (0 to 1)
|
|
40
|
+
// Larger values will be closer to 0 (darker)
|
|
41
|
+
return LIGHTNESS_VARIATION_AMOUNT * ((maxValue - node.value) / (maxValue - minValue));
|
|
42
|
+
}
|
|
43
|
+
_render() {
|
|
44
|
+
var _a;
|
|
45
|
+
const { config, datamodel: { data }, _width, _height } = this;
|
|
46
|
+
const { numberFormat = defaultNumberFormat } = config;
|
|
47
|
+
if (!((_a = config.layers) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
48
|
+
console.warn('Unovis | Treemap: No layers defined');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Map each layer accessor function to get string values from the data array
|
|
52
|
+
const layerAccessors = config.layers.map(layerAccessor => {
|
|
53
|
+
return (i) => getString(data[i], layerAccessor, i);
|
|
54
|
+
});
|
|
55
|
+
// Group the data indices by the layer accessors to create a hierarchical structure
|
|
56
|
+
const nestedData = group(data.keys(), ...layerAccessors);
|
|
57
|
+
// Create the hierarchy from the grouped data,
|
|
58
|
+
// which by itself is not quite right because there is an extra
|
|
59
|
+
// level of nesting that we don't want, just above the leaf nodes.
|
|
60
|
+
const rootNode = hierarchy(nestedData);
|
|
61
|
+
// Compute the aggregation
|
|
62
|
+
if (config.value) {
|
|
63
|
+
rootNode.sum(index => typeof index === 'number' && getNumber(data[index], config.value, index));
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
rootNode.count();
|
|
67
|
+
}
|
|
68
|
+
// Fix the hierarchy by removing the extra level of nesting
|
|
69
|
+
rootNode.each(node => {
|
|
70
|
+
if (!node.children) {
|
|
71
|
+
node.parent.children = null;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
const treemapLayout = treemap()
|
|
75
|
+
.size([_width, _height])
|
|
76
|
+
.round(true)
|
|
77
|
+
.padding(config.tilePadding);
|
|
78
|
+
// Apply padding to the top of each tile,
|
|
79
|
+
// but not for the root node.
|
|
80
|
+
if (this.config.tilePaddingTop !== undefined) {
|
|
81
|
+
treemapLayout.paddingTop(d => d.parent ? config.tilePaddingTop : 0);
|
|
82
|
+
}
|
|
83
|
+
// Compute the treemap layout
|
|
84
|
+
const treemapData = treemapLayout(rootNode);
|
|
85
|
+
// Process the resulting hierarchy into the type we need
|
|
86
|
+
let nodeId = 0;
|
|
87
|
+
treemapData.each(node => {
|
|
88
|
+
const n = node;
|
|
89
|
+
// Generate unique IDs for each node
|
|
90
|
+
node._id = `node-${nodeId++}`;
|
|
91
|
+
const treemapDatum = {
|
|
92
|
+
key: n.data[0],
|
|
93
|
+
};
|
|
94
|
+
// Populate the index and datum for leaf nodes
|
|
95
|
+
const isLeafNode = !n.children;
|
|
96
|
+
if (isLeafNode) {
|
|
97
|
+
treemapDatum.index = n.data[1][0];
|
|
98
|
+
treemapDatum.datum = data[treemapDatum.index];
|
|
99
|
+
}
|
|
100
|
+
node.data = treemapDatum;
|
|
101
|
+
});
|
|
102
|
+
const descendants = treemapData.descendants();
|
|
103
|
+
// Set up the brightness increase scale based on depth
|
|
104
|
+
const maxDepth = max(descendants, d => d.depth);
|
|
105
|
+
const brightnessIncrease = scaleLinear()
|
|
106
|
+
.domain([1, maxDepth])
|
|
107
|
+
.range([0, 1]);
|
|
108
|
+
// Get all leaf node values and calculate their square roots
|
|
109
|
+
// (since area is proportional to value)
|
|
110
|
+
const leafValues = descendants.filter(d => !d.children).map(d => d.value);
|
|
111
|
+
const maxLeafValue = Math.sqrt(max(leafValues)) || 0;
|
|
112
|
+
// Divide the range into three equal intervals based on the square root of values
|
|
113
|
+
// This accounts for the fact that area is proportional to value
|
|
114
|
+
const fontSizeScale = scaleThreshold()
|
|
115
|
+
.domain([
|
|
116
|
+
maxLeafValue / 3,
|
|
117
|
+
(maxLeafValue * 2) / 3, // Second third of the max value
|
|
118
|
+
])
|
|
119
|
+
.range([
|
|
120
|
+
config.tileLabelSmallFontSize,
|
|
121
|
+
config.tileLabelMediumFontSize,
|
|
122
|
+
config.tileLabelLargeFontSize,
|
|
123
|
+
]);
|
|
124
|
+
// First pass: Set base colors without considering tileColor config
|
|
125
|
+
treemapData
|
|
126
|
+
.eachBefore((node) => {
|
|
127
|
+
if (!node.children)
|
|
128
|
+
return;
|
|
129
|
+
const children = node.children;
|
|
130
|
+
children.forEach((treemapChild, i) => {
|
|
131
|
+
// Use default color scheme without tileColor config
|
|
132
|
+
let color = getColor(treemapChild, undefined, i, treemapChild.depth !== 1);
|
|
133
|
+
color = color !== null && color !== void 0 ? color : node._fill;
|
|
134
|
+
const hexColor = color ? getHexValue(color, this.g.node()) : null;
|
|
135
|
+
if (hexColor) {
|
|
136
|
+
const hslColor = hsl(hexColor);
|
|
137
|
+
if (config.enableLightnessVariance) {
|
|
138
|
+
if (!treemapChild.children) {
|
|
139
|
+
const lightnessAdjustment = this.getTileLightness(treemapChild, children);
|
|
140
|
+
hslColor.l = Math.min(1, hslColor.l + lightnessAdjustment);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
treemapChild._fill = brighter(hslColor.toString(), brightnessIncrease(treemapChild.depth));
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
treemapChild._fill = null;
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
// Second pass: Apply tileColor config as an overlay
|
|
151
|
+
if (config.tileColor) {
|
|
152
|
+
treemapData
|
|
153
|
+
.eachBefore((node) => {
|
|
154
|
+
const color = getColor(node, config.tileColor);
|
|
155
|
+
if (color !== null) {
|
|
156
|
+
node._fill = color;
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
// Render tiles
|
|
161
|
+
const visibleNodes = descendants.filter(d => d.depth > 0);
|
|
162
|
+
const tiles = this.tiles
|
|
163
|
+
.selectAll(`g.${tileGroup}`)
|
|
164
|
+
.data(visibleNodes, d => d._id);
|
|
165
|
+
const tilesEnter = tiles
|
|
166
|
+
.enter()
|
|
167
|
+
.append('g')
|
|
168
|
+
.attr('class', tileGroup);
|
|
169
|
+
// Computes the rect border radius for a given tile.
|
|
170
|
+
// The rx and ry values are the minimum of the tile
|
|
171
|
+
// border radius and some fraction the width of the tile,
|
|
172
|
+
// based on the tileBorderRadiusFactor config.
|
|
173
|
+
// This ensures that the tile border radius is not
|
|
174
|
+
// larger than the tile size, which makes small tiles
|
|
175
|
+
// look better.
|
|
176
|
+
const rx = (d) => Math.min(config.tileBorderRadius, (d.x1 - d.x0) * config.tileBorderRadiusFactor);
|
|
177
|
+
// Add clipPath elements
|
|
178
|
+
tilesEnter
|
|
179
|
+
.append('clipPath')
|
|
180
|
+
.attr('id', d => `clip-${d._id}`)
|
|
181
|
+
.append('rect')
|
|
182
|
+
.attr('rx', rx)
|
|
183
|
+
.attr('ry', rx);
|
|
184
|
+
// Tile rectangles
|
|
185
|
+
tilesEnter
|
|
186
|
+
.append('rect')
|
|
187
|
+
.classed(tile, true)
|
|
188
|
+
// Make the leaf tiles clickable if a click handler is provided
|
|
189
|
+
.classed(clickableTile, d => config.showTileClickAffordance && !d.children)
|
|
190
|
+
.attr('rx', rx)
|
|
191
|
+
.attr('ry', rx)
|
|
192
|
+
// Initialize tile positions so that the initial transition is smooth
|
|
193
|
+
.attr('x', d => d.x0)
|
|
194
|
+
.attr('y', d => d.y0)
|
|
195
|
+
.attr('width', d => d.x1 - d.x0)
|
|
196
|
+
.attr('height', d => d.y1 - d.y0)
|
|
197
|
+
.style('fill', d => { var _a; return (_a = d._fill) !== null && _a !== void 0 ? _a : getColor(d, config.tileColor); })
|
|
198
|
+
.style('opacity', 0)
|
|
199
|
+
.style('cursor', config.showTileClickAffordance ? d => !d.children ? 'pointer' : null : null);
|
|
200
|
+
tiles.merge(tilesEnter).select(`rect.${tile}`)
|
|
201
|
+
.style('fill', d => { var _a; return (_a = d._fill) !== null && _a !== void 0 ? _a : getColor(d, config.tileColor); })
|
|
202
|
+
.style('opacity', 1)
|
|
203
|
+
.attr('x', d => d.x0)
|
|
204
|
+
.attr('y', d => d.y0)
|
|
205
|
+
.attr('width', d => d.x1 - d.x0)
|
|
206
|
+
.attr('height', d => d.y1 - d.y0);
|
|
207
|
+
// Update clipPath rects
|
|
208
|
+
tiles.merge(tilesEnter).select('clipPath rect')
|
|
209
|
+
.attr('x', d => d.x0)
|
|
210
|
+
.attr('y', d => d.y0)
|
|
211
|
+
.attr('width', d => d.x1 - d.x0 - config.tilePadding)
|
|
212
|
+
.attr('height', d => d.y1 - d.y0);
|
|
213
|
+
// Tile labels
|
|
214
|
+
tilesEnter
|
|
215
|
+
.append('text')
|
|
216
|
+
.attr('class', label)
|
|
217
|
+
.attr('clip-path', d => `url(#clip-${d._id})`);
|
|
218
|
+
// Update all labels first
|
|
219
|
+
const mergedTiles = tiles.merge(tilesEnter);
|
|
220
|
+
// Hide labels that don't meet criteria
|
|
221
|
+
mergedTiles.select(`text.${label}`)
|
|
222
|
+
.style('display', d => {
|
|
223
|
+
const isAllowedNode = config.labelInternalNodes ? true : !d.children;
|
|
224
|
+
return isAllowedNode && this.isTileLargeEnough(d) ? null : 'none';
|
|
225
|
+
})
|
|
226
|
+
// Make the internal labels semibold
|
|
227
|
+
.style('font-weight', d => d.children ? '500' : 'normal');
|
|
228
|
+
// Update visible labels
|
|
229
|
+
mergedTiles.select(`text.${label}`)
|
|
230
|
+
.filter(d => {
|
|
231
|
+
const isAllowedNode = config.labelInternalNodes ? true : !d.children;
|
|
232
|
+
return isAllowedNode && this.isTileLargeEnough(d);
|
|
233
|
+
})
|
|
234
|
+
.attr('clip-path', d => `url(#clip-${d._id})`)
|
|
235
|
+
.attr('x', d => d.x0 + config.labelOffsetX)
|
|
236
|
+
.attr('y', d => d.y0 + config.labelOffsetY)
|
|
237
|
+
.each(function (d) {
|
|
238
|
+
var _a;
|
|
239
|
+
const text = select(this);
|
|
240
|
+
const label = `${d.data.key}: ${numberFormat(d.value)}`;
|
|
241
|
+
text.text(label);
|
|
242
|
+
// Set text color based on background darkness
|
|
243
|
+
const backgroundColor = (_a = d._fill) !== null && _a !== void 0 ? _a : getColor(d, config.tileColor);
|
|
244
|
+
const textColor = backgroundColor && isDarkBackground(backgroundColor) ? '#ffffff' : '#000000';
|
|
245
|
+
text.style('fill', textColor);
|
|
246
|
+
// Apply font size scaling only to leaf nodes if enabled
|
|
247
|
+
if (!d.children && config.enableTileLabelFontSizeVariation) {
|
|
248
|
+
text.style('font-size', `${fontSizeScale(Math.sqrt(d.value))}px`);
|
|
249
|
+
}
|
|
250
|
+
// Apply text wrapping to leaf nodes
|
|
251
|
+
if (!d.children) {
|
|
252
|
+
const availableWidth = d.x1 - d.x0 - (2 * config.labelOffsetX);
|
|
253
|
+
wrapSVGText(text, availableWidth);
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
// Exit
|
|
257
|
+
tiles.exit().remove();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
Treemap.selectors = style;
|
|
261
|
+
|
|
262
|
+
export { Treemap };
|
|
263
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/treemap/index.ts"],"sourcesContent":["import { Selection, select } from 'd3-selection'\nimport { hierarchy, HierarchyNode, treemap } from 'd3-hierarchy'\nimport { group, max, extent } from 'd3-array'\nimport { scaleLinear, scaleThreshold } from 'd3-scale'\nimport { hsl } from 'd3-color'\nimport { wrapSVGText } from 'utils/text'\nimport { ComponentCore } from 'core/component'\nimport { SeriesDataModel } from 'data-models/series'\nimport { getColor, brighter, getHexValue, isDarkBackground } from 'utils/color'\nimport { getString, getNumber } from 'utils/data'\nimport { TreemapConfigInterface, TreemapDefaultConfig } from './config'\nimport { TreemapDatum, TreemapNode } from './types'\n\nimport * as s from './style' // Minimum pixel size for showing labels\n\nconst LIGHTNESS_VARIATION_AMOUNT = 0.08\n\nconst MIN_TILE_SIZE_FOR_LABEL = 20\n\nconst defaultNumberFormat = (value: number): string => `${value}`\n\nexport class Treemap<Datum> extends ComponentCore<Datum[], TreemapConfigInterface<Datum>> {\n static selectors = s\n protected _defaultConfig = TreemapDefaultConfig as TreemapConfigInterface<Datum>\n public config: TreemapConfigInterface<Datum> = this._defaultConfig\n\n datamodel: SeriesDataModel<Datum> = new SeriesDataModel()\n tiles: Selection<SVGGElement, unknown, SVGGElement, unknown>\n\n private isTileLargeEnough (d: TreemapNode<Datum>): boolean {\n const w = d.x1 - d.x0\n const h = d.y1 - d.y0\n return (w >= MIN_TILE_SIZE_FOR_LABEL) && (h >= MIN_TILE_SIZE_FOR_LABEL)\n }\n\n private getTileLightness (node: TreemapNode<Datum>, siblings: TreemapNode<Datum>[]): number {\n // Get the value extent of the sibling group\n const [minValue, maxValue] = extent(siblings, d => d.value)\n\n // If there's no range or no value, return default lightness\n if (minValue === maxValue || !node.value) return 0\n\n // Calculate relative position in the range (0 to 1)\n // Larger values will be closer to 0 (darker)\n return LIGHTNESS_VARIATION_AMOUNT * ((maxValue - node.value) / (maxValue - minValue))\n }\n\n constructor (config?: TreemapConfigInterface<Datum>) {\n super()\n if (config) this.setConfig(config)\n this.tiles = this.g.append('g').attr('class', s.tiles)\n }\n\n _render (): void {\n const { config, datamodel: { data }, _width, _height } = this\n const { numberFormat = defaultNumberFormat } = config\n\n if (!config.layers?.length) {\n console.warn('Unovis | Treemap: No layers defined')\n return\n }\n\n // Map each layer accessor function to get string values from the data array\n const layerAccessors = config.layers.map(layerAccessor => {\n return (i: number) => getString(data[i], layerAccessor, i)\n })\n\n // Group the data indices by the layer accessors to create a hierarchical structure\n const nestedData = group(data.keys(), ...layerAccessors as [(d: number) => string])\n\n // Create the hierarchy from the grouped data,\n // which by itself is not quite right because there is an extra\n // level of nesting that we don't want, just above the leaf nodes.\n const rootNode = hierarchy(nestedData)\n\n // Compute the aggregation\n if (config.value) {\n rootNode.sum(index => typeof index === 'number' && getNumber(data[index], config.value, index))\n } else {\n rootNode.count()\n }\n\n // Fix the hierarchy by removing the extra level of nesting\n rootNode.each(node => {\n if (!node.children) {\n node.parent.children = null\n }\n })\n\n const treemapLayout = treemap()\n .size([_width, _height])\n .round(true)\n .padding(config.tilePadding)\n\n // Apply padding to the top of each tile,\n // but not for the root node.\n if (this.config.tilePaddingTop !== undefined) {\n treemapLayout.paddingTop(d => d.parent ? config.tilePaddingTop : 0)\n }\n\n // Compute the treemap layout\n const treemapData = treemapLayout(rootNode) as TreemapNode<Datum>\n\n // Process the resulting hierarchy into the type we need\n let nodeId = 0\n treemapData.each(node => {\n const n = node as unknown as HierarchyNode<[string, number[]]>\n // Generate unique IDs for each node\n node._id = `node-${nodeId++}`\n\n const treemapDatum: TreemapDatum<Datum> = {\n key: n.data[0],\n }\n\n // Populate the index and datum for leaf nodes\n const isLeafNode = !n.children\n if (isLeafNode) {\n treemapDatum.index = n.data[1][0]\n treemapDatum.datum = data[treemapDatum.index]\n }\n\n node.data = treemapDatum\n })\n\n const descendants = treemapData.descendants()\n\n // Set up the brightness increase scale based on depth\n const maxDepth = max(descendants, d => d.depth)\n\n const brightnessIncrease = scaleLinear()\n .domain([1, maxDepth])\n .range([0, 1])\n\n // Get all leaf node values and calculate their square roots\n // (since area is proportional to value)\n const leafValues = descendants.filter(d => !d.children).map(d => d.value)\n const maxLeafValue = Math.sqrt(max(leafValues)) || 0\n\n // Divide the range into three equal intervals based on the square root of values\n // This accounts for the fact that area is proportional to value\n const fontSizeScale = scaleThreshold<number, number>()\n .domain([\n maxLeafValue / 3, // First third of the max value\n (maxLeafValue * 2) / 3, // Second third of the max value\n ])\n .range([\n config.tileLabelSmallFontSize,\n config.tileLabelMediumFontSize,\n config.tileLabelLargeFontSize,\n ])\n\n // First pass: Set base colors without considering tileColor config\n treemapData\n .eachBefore((node) => {\n if (!node.children) return\n const children = node.children\n\n children.forEach((treemapChild, i) => {\n // Use default color scheme without tileColor config\n let color = getColor(treemapChild, undefined, i, treemapChild.depth !== 1)\n color = color ?? (node as TreemapNode<Datum>)._fill\n\n const hexColor = color ? getHexValue(color, this.g.node()) : null\n\n if (hexColor) {\n const hslColor = hsl(hexColor)\n\n if (config.enableLightnessVariance) {\n if (!treemapChild.children) {\n const lightnessAdjustment = this.getTileLightness(treemapChild, children)\n hslColor.l = Math.min(1, hslColor.l + lightnessAdjustment)\n }\n }\n\n treemapChild._fill = brighter(hslColor.toString(), brightnessIncrease(treemapChild.depth))\n } else {\n treemapChild._fill = null\n }\n })\n })\n\n // Second pass: Apply tileColor config as an overlay\n if (config.tileColor) {\n treemapData\n .eachBefore((node) => {\n const color = getColor(node, config.tileColor)\n if (color !== null) {\n node._fill = color\n }\n })\n }\n\n // Render tiles\n const visibleNodes = descendants.filter(d => d.depth > 0)\n const tiles = this.tiles\n .selectAll<SVGGElement, TreemapNode<Datum>>(`g.${s.tileGroup}`)\n .data(visibleNodes, d => d._id)\n const tilesEnter = tiles\n .enter()\n .append('g')\n .attr('class', s.tileGroup)\n\n // Computes the rect border radius for a given tile.\n // The rx and ry values are the minimum of the tile\n // border radius and some fraction the width of the tile,\n // based on the tileBorderRadiusFactor config.\n // This ensures that the tile border radius is not\n // larger than the tile size, which makes small tiles\n // look better.\n const rx = (d: TreemapNode<Datum>): number =>\n Math.min(config.tileBorderRadius, (d.x1 - d.x0) * config.tileBorderRadiusFactor)\n\n // Add clipPath elements\n tilesEnter\n .append('clipPath')\n .attr('id', d => `clip-${d._id}`)\n .append('rect')\n .attr('rx', rx)\n .attr('ry', rx)\n\n // Tile rectangles\n tilesEnter\n .append('rect')\n .classed(s.tile, true)\n\n // Make the leaf tiles clickable if a click handler is provided\n .classed(s.clickableTile, d => config.showTileClickAffordance && !d.children)\n\n .attr('rx', rx)\n .attr('ry', rx)\n // Initialize tile positions so that the initial transition is smooth\n .attr('x', d => d.x0)\n .attr('y', d => d.y0)\n .attr('width', d => d.x1 - d.x0)\n .attr('height', d => d.y1 - d.y0)\n .style('fill', d => d._fill ?? getColor(d, config.tileColor))\n .style('opacity', 0)\n .style('cursor', config.showTileClickAffordance ? d => !d.children ? 'pointer' : null : null)\n\n tiles.merge(tilesEnter).select(`rect.${s.tile}`)\n .style('fill', d => d._fill ?? getColor(d, config.tileColor))\n .style('opacity', 1)\n .attr('x', d => d.x0)\n .attr('y', d => d.y0)\n .attr('width', d => d.x1 - d.x0)\n .attr('height', d => d.y1 - d.y0)\n\n // Update clipPath rects\n tiles.merge(tilesEnter).select('clipPath rect')\n .attr('x', d => d.x0)\n .attr('y', d => d.y0)\n .attr('width', d => d.x1 - d.x0 - config.tilePadding)\n .attr('height', d => d.y1 - d.y0)\n\n // Tile labels\n tilesEnter\n .append('text')\n .attr('class', s.label)\n .attr('clip-path', d => `url(#clip-${d._id})`)\n // Update all labels first\n const mergedTiles = tiles.merge(tilesEnter)\n\n // Hide labels that don't meet criteria\n mergedTiles.select(`text.${s.label}`)\n .style('display', d => {\n const isAllowedNode = config.labelInternalNodes ? true : !d.children\n return isAllowedNode && this.isTileLargeEnough(d) ? null : 'none'\n })\n // Make the internal labels semibold\n .style('font-weight', d => d.children ? '500' : 'normal')\n\n // Update visible labels\n mergedTiles.select(`text.${s.label}`)\n .filter(d => {\n const isAllowedNode = config.labelInternalNodes ? true : !d.children\n return isAllowedNode && this.isTileLargeEnough(d)\n })\n .attr('clip-path', d => `url(#clip-${d._id})`)\n .attr('x', d => d.x0 + config.labelOffsetX)\n .attr('y', d => d.y0 + config.labelOffsetY)\n .each(function (d) {\n const text = select(this) as unknown as Selection<SVGTextElement, any, SVGElement, any>\n\n const label = `${d.data.key}: ${numberFormat(d.value)}`\n text.text(label)\n\n // Set text color based on background darkness\n const backgroundColor = d._fill ?? getColor(d, config.tileColor)\n const textColor = backgroundColor && isDarkBackground(backgroundColor) ? '#ffffff' : '#000000'\n text.style('fill', textColor)\n\n // Apply font size scaling only to leaf nodes if enabled\n if (!d.children && config.enableTileLabelFontSizeVariation) {\n text.style('font-size', `${fontSizeScale(Math.sqrt(d.value))}px`)\n }\n\n // Apply text wrapping to leaf nodes\n if (!d.children) {\n const availableWidth = d.x1 - d.x0 - (2 * config.labelOffsetX)\n wrapSVGText(text, availableWidth)\n }\n })\n\n // Exit\n tiles.exit().remove()\n }\n}\n"],"names":["s.tiles","s.tileGroup","s.tile","s.clickableTile","s.label","s"],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare const root: string;
|
|
2
|
+
export declare const variables: {
|
|
3
|
+
treemapTileStrokeColor: "--vis-treemap-tile-stroke-color";
|
|
4
|
+
treemapTileStrokeWidth: "--vis-treemap-tile-stroke-width";
|
|
5
|
+
treemapTileHoverStrokeColor: "--vis-treemap-tile-hover-stroke-color";
|
|
6
|
+
treemapTileFillColor: "--vis-treemap-tile-fill-color";
|
|
7
|
+
treemapTileBackgroundColor: "--vis-treemap-tile-background-color";
|
|
8
|
+
treemapTileCursor: "--vis-treemap-tile-cursor";
|
|
9
|
+
treemapLabelFontFamily: "--vis-treemap-label-font-family";
|
|
10
|
+
treemapLabelTextColor: "--vis-treemap-label-text-color";
|
|
11
|
+
treemapLabelFontSize: "--vis-treemap-label-font-size";
|
|
12
|
+
treemapLabelOpacity: "--vis-treemap-label-opacity";
|
|
13
|
+
darkTreemapTileStrokeColor: "--vis-dark-treemap-tile-stroke-color";
|
|
14
|
+
darkTreemapTileFillColor: "--vis-dark-treemap-tile-fill-color";
|
|
15
|
+
darkTreemapLabelTextColor: "--vis-dark-treemap-label-text-color";
|
|
16
|
+
};
|
|
17
|
+
export declare const tiles: string;
|
|
18
|
+
export declare const tileGroup: string;
|
|
19
|
+
export declare const tile: string;
|
|
20
|
+
export declare const clickableTile: string;
|
|
21
|
+
export declare const tileForeground: string;
|
|
22
|
+
export declare const label: string;
|