@unovis/ts 1.3.0-beta.2 → 1.3.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/components/area/config.d.ts +10 -6
  2. package/components/area/config.js +12 -3
  3. package/components/area/config.js.map +1 -1
  4. package/components/area/index.d.ts +6 -5
  5. package/components/area/index.js +9 -10
  6. package/components/area/index.js.map +1 -1
  7. package/components/axis/config.d.ts +27 -3
  8. package/components/axis/config.js +30 -3
  9. package/components/axis/config.js.map +1 -1
  10. package/components/axis/index.d.ts +3 -4
  11. package/components/axis/index.js +4 -7
  12. package/components/axis/index.js.map +1 -1
  13. package/components/brush/config.d.ts +12 -2
  14. package/components/brush/config.js +20 -11
  15. package/components/brush/config.js.map +1 -1
  16. package/components/brush/index.d.ts +3 -4
  17. package/components/brush/index.js +3 -4
  18. package/components/brush/index.js.map +1 -1
  19. package/components/bullet-legend/config.d.ts +10 -1
  20. package/components/bullet-legend/config.js +14 -11
  21. package/components/bullet-legend/config.js.map +1 -1
  22. package/components/bullet-legend/index.d.ts +3 -4
  23. package/components/bullet-legend/index.js +2 -5
  24. package/components/bullet-legend/index.js.map +1 -1
  25. package/components/chord-diagram/config.d.ts +23 -7
  26. package/components/chord-diagram/config.js +22 -3
  27. package/components/chord-diagram/config.js.map +1 -1
  28. package/components/chord-diagram/index.d.ts +3 -4
  29. package/components/chord-diagram/index.js +6 -7
  30. package/components/chord-diagram/index.js.map +1 -1
  31. package/components/chord-diagram/modules/label.d.ts +3 -3
  32. package/components/chord-diagram/modules/label.js +1 -1
  33. package/components/chord-diagram/modules/label.js.map +1 -1
  34. package/components/chord-diagram/modules/link.d.ts +2 -2
  35. package/components/chord-diagram/modules/link.js.map +1 -1
  36. package/components/chord-diagram/modules/node.d.ts +2 -2
  37. package/components/chord-diagram/modules/node.js.map +1 -1
  38. package/components/chord-diagram/types.d.ts +2 -3
  39. package/components/chord-diagram/types.js.map +1 -1
  40. package/components/crosshair/config.d.ts +14 -4
  41. package/components/crosshair/config.js +16 -3
  42. package/components/crosshair/config.js.map +1 -1
  43. package/components/crosshair/index.d.ts +3 -4
  44. package/components/crosshair/index.js +3 -4
  45. package/components/crosshair/index.js.map +1 -1
  46. package/components/donut/config.d.ts +19 -2
  47. package/components/donut/config.js +24 -5
  48. package/components/donut/config.js.map +1 -1
  49. package/components/donut/index.d.ts +3 -4
  50. package/components/donut/index.js +4 -5
  51. package/components/donut/index.js.map +1 -1
  52. package/components/donut/modules/arc.d.ts +3 -3
  53. package/components/donut/modules/arc.js.map +1 -1
  54. package/components/flow-legend/config.d.ts +11 -1
  55. package/components/flow-legend/config.js +16 -11
  56. package/components/flow-legend/config.js.map +1 -1
  57. package/components/flow-legend/index.d.ts +3 -4
  58. package/components/flow-legend/index.js +2 -5
  59. package/components/flow-legend/index.js.map +1 -1
  60. package/components/free-brush/config.d.ts +12 -2
  61. package/components/free-brush/config.js +20 -11
  62. package/components/free-brush/config.js.map +1 -1
  63. package/components/free-brush/index.d.ts +3 -4
  64. package/components/free-brush/index.js +5 -6
  65. package/components/free-brush/index.js.map +1 -1
  66. package/components/graph/config.d.ts +75 -3
  67. package/components/graph/config.js +78 -12
  68. package/components/graph/config.js.map +1 -1
  69. package/components/graph/index.d.ts +7 -8
  70. package/components/graph/index.js +3 -4
  71. package/components/graph/index.js.map +1 -1
  72. package/components/graph/modules/layout.d.ts +7 -7
  73. package/components/graph/modules/layout.js.map +1 -1
  74. package/components/graph/modules/link/helper.d.ts +5 -5
  75. package/components/graph/modules/link/helper.js.map +1 -1
  76. package/components/graph/modules/link/index.d.ts +6 -6
  77. package/components/graph/modules/link/index.js.map +1 -1
  78. package/components/graph/modules/node/index.d.ts +6 -6
  79. package/components/graph/modules/node/index.js +2 -2
  80. package/components/graph/modules/node/index.js.map +1 -1
  81. package/components/graph/modules/panel/helper.d.ts +4 -4
  82. package/components/graph/modules/panel/helper.js.map +1 -1
  83. package/components/graph/modules/panel/index.d.ts +3 -3
  84. package/components/graph/modules/panel/index.js.map +1 -1
  85. package/components/grouped-bar/config.d.ts +13 -5
  86. package/components/grouped-bar/config.js +16 -5
  87. package/components/grouped-bar/config.js.map +1 -1
  88. package/components/grouped-bar/index.d.ts +3 -4
  89. package/components/grouped-bar/index.js +3 -4
  90. package/components/grouped-bar/index.js.map +1 -1
  91. package/components/leaflet-flow-map/config.d.ts +16 -2
  92. package/components/leaflet-flow-map/config.js +21 -3
  93. package/components/leaflet-flow-map/config.js.map +1 -1
  94. package/components/leaflet-flow-map/index.d.ts +3 -4
  95. package/components/leaflet-flow-map/index.js +2 -3
  96. package/components/leaflet-flow-map/index.js.map +1 -1
  97. package/components/leaflet-map/config.d.ts +59 -4
  98. package/components/leaflet-map/config.js +67 -23
  99. package/components/leaflet-map/config.js.map +1 -1
  100. package/components/leaflet-map/index.d.ts +3 -4
  101. package/components/leaflet-map/index.js +3 -4
  102. package/components/leaflet-map/index.js.map +1 -1
  103. package/components/leaflet-map/modules/map.d.ts +3 -3
  104. package/components/leaflet-map/modules/map.js.map +1 -1
  105. package/components/leaflet-map/modules/utils.d.ts +4 -4
  106. package/components/leaflet-map/modules/utils.js +2 -6
  107. package/components/leaflet-map/modules/utils.js.map +1 -1
  108. package/components/leaflet-map/renderer/mapboxgl-layer.d.ts +2 -2
  109. package/components/leaflet-map/renderer/mapboxgl-layer.js.map +1 -1
  110. package/components/line/config.d.ts +11 -6
  111. package/components/line/config.js +13 -3
  112. package/components/line/config.js.map +1 -1
  113. package/components/line/index.d.ts +3 -4
  114. package/components/line/index.js +4 -5
  115. package/components/line/index.js.map +1 -1
  116. package/components/nested-donut/config.d.ts +21 -2
  117. package/components/nested-donut/config.js +24 -3
  118. package/components/nested-donut/config.js.map +1 -1
  119. package/components/nested-donut/index.d.ts +3 -4
  120. package/components/nested-donut/index.js +3 -4
  121. package/components/nested-donut/index.js.map +1 -1
  122. package/components/nested-donut/modules/arc.d.ts +3 -3
  123. package/components/nested-donut/modules/arc.js.map +1 -1
  124. package/components/nested-donut/modules/label.d.ts +2 -2
  125. package/components/nested-donut/modules/label.js.map +1 -1
  126. package/components/sankey/config.d.ts +47 -2
  127. package/components/sankey/config.js +57 -10
  128. package/components/sankey/config.js.map +1 -1
  129. package/components/sankey/index.d.ts +3 -4
  130. package/components/sankey/index.js +2 -3
  131. package/components/sankey/index.js.map +1 -1
  132. package/components/sankey/modules/label.d.ts +7 -7
  133. package/components/sankey/modules/label.js.map +1 -1
  134. package/components/sankey/modules/link.d.ts +2 -2
  135. package/components/sankey/modules/link.js.map +1 -1
  136. package/components/sankey/modules/node.d.ts +7 -7
  137. package/components/sankey/modules/node.js +1 -1
  138. package/components/sankey/modules/node.js.map +1 -1
  139. package/components/scatter/config.d.ts +16 -4
  140. package/components/scatter/config.js +19 -5
  141. package/components/scatter/config.js.map +1 -1
  142. package/components/scatter/index.d.ts +3 -4
  143. package/components/scatter/index.js +5 -5
  144. package/components/scatter/index.js.map +1 -1
  145. package/components/scatter/modules/point.d.ts +2 -2
  146. package/components/scatter/modules/point.js.map +1 -1
  147. package/components/scatter/modules/utils.d.ts +2 -2
  148. package/components/scatter/modules/utils.js.map +1 -1
  149. package/components/stacked-bar/config.d.ts +13 -5
  150. package/components/stacked-bar/config.js +16 -5
  151. package/components/stacked-bar/config.js.map +1 -1
  152. package/components/stacked-bar/index.d.ts +3 -4
  153. package/components/stacked-bar/index.js +3 -4
  154. package/components/stacked-bar/index.js.map +1 -1
  155. package/components/timeline/config.d.ts +16 -5
  156. package/components/timeline/config.js +21 -9
  157. package/components/timeline/config.js.map +1 -1
  158. package/components/timeline/index.d.ts +3 -4
  159. package/components/timeline/index.js +3 -4
  160. package/components/timeline/index.js.map +1 -1
  161. package/components/tooltip/config.d.ts +15 -1
  162. package/components/tooltip/config.js +16 -12
  163. package/components/tooltip/config.js.map +1 -1
  164. package/components/tooltip/index.d.ts +3 -4
  165. package/components/tooltip/index.js +3 -5
  166. package/components/tooltip/index.js.map +1 -1
  167. package/components/topojson-map/config.d.ts +36 -4
  168. package/components/topojson-map/config.js +38 -3
  169. package/components/topojson-map/config.js.map +1 -1
  170. package/components/topojson-map/index.d.ts +3 -4
  171. package/components/topojson-map/index.js +4 -4
  172. package/components/topojson-map/index.js.map +1 -1
  173. package/components/vis-controls/config.d.ts +5 -1
  174. package/components/vis-controls/config.js +9 -6
  175. package/components/vis-controls/config.js.map +1 -1
  176. package/components/vis-controls/index.d.ts +2 -3
  177. package/components/vis-controls/index.js +2 -5
  178. package/components/vis-controls/index.js.map +1 -1
  179. package/components/xy-labels/config.d.ts +16 -4
  180. package/components/xy-labels/config.js +20 -5
  181. package/components/xy-labels/config.js.map +1 -1
  182. package/components/xy-labels/index.d.ts +3 -4
  183. package/components/xy-labels/index.js +2 -3
  184. package/components/xy-labels/index.js.map +1 -1
  185. package/components/xy-labels/modules/label.d.ts +3 -3
  186. package/components/xy-labels/modules/label.js +1 -1
  187. package/components/xy-labels/modules/label.js.map +1 -1
  188. package/containers/single-container/config.d.ts +4 -2
  189. package/containers/single-container/config.js +8 -3
  190. package/containers/single-container/config.js.map +1 -1
  191. package/containers/single-container/index.d.ts +3 -4
  192. package/containers/single-container/index.js +2 -2
  193. package/containers/single-container/index.js.map +1 -1
  194. package/containers/xy-container/config.d.ts +22 -2
  195. package/containers/xy-container/config.js +26 -3
  196. package/containers/xy-container/config.js.map +1 -1
  197. package/containers/xy-container/index.d.ts +2 -5
  198. package/containers/xy-container/index.js +2 -2
  199. package/containers/xy-container/index.js.map +1 -1
  200. package/core/component/config.d.ts +6 -1
  201. package/core/component/config.js +12 -6
  202. package/core/component/config.js.map +1 -1
  203. package/core/component/index.d.ts +5 -7
  204. package/core/component/index.js +7 -8
  205. package/core/component/index.js.map +1 -1
  206. package/core/config/index.d.ts +3 -0
  207. package/core/config/index.js +16 -0
  208. package/core/config/index.js.map +1 -0
  209. package/core/container/config.d.ts +21 -1
  210. package/core/container/config.js +25 -21
  211. package/core/container/config.js.map +1 -1
  212. package/core/container/index.d.ts +4 -5
  213. package/core/container/index.js +3 -4
  214. package/core/container/index.js.map +1 -1
  215. package/core/xy-component/config.d.ts +10 -2
  216. package/core/xy-component/config.js +16 -7
  217. package/core/xy-component/config.js.map +1 -1
  218. package/core/xy-component/index.d.ts +4 -5
  219. package/core/xy-component/index.js +0 -2
  220. package/core/xy-component/index.js.map +1 -1
  221. package/data-models/map-graph.d.ts +1 -1
  222. package/data-models/map-graph.js +1 -1
  223. package/data-models/map-graph.js.map +1 -1
  224. package/package.json +1 -1
  225. package/types/accessor.d.ts +1 -1
  226. package/utils/data.d.ts +1 -1
  227. package/utils/data.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/stacked-bar/index.ts"],"sourcesContent":["import { min, max } from 'd3-array'\n\n// Core\nimport { XYComponentCore } from 'core/xy-component'\n\n// Utils\nimport { isNumber, isArray, isEmpty, clamp, getStackedExtent, getString, getNumber, getStackedData, getExtent } from 'utils/data'\nimport { roundedRectPath } from 'utils/path'\nimport { smartTransition } from 'utils/d3'\nimport { getColor } from 'utils/color'\n\n// Types\nimport { ContinuousScale } from 'types/scale'\nimport { NumericAccessor } from 'types/accessor'\nimport { Spacing } from 'types/spacing'\nimport { Orientation } from 'types/position'\n\n// Local Types\nimport { StackedBarDataRecord } from './types'\n\n// Config\nimport { StackedBarDefaultConfig, StackedBarConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\nexport class StackedBar<Datum> extends XYComponentCore<Datum, StackedBarConfigInterface<Datum>> {\n static selectors = s\n protected _defaultConfig = StackedBarDefaultConfig as StackedBarConfigInterface<Datum>\n public config: StackedBarConfigInterface<Datum> = this._defaultConfig\n\n getAccessors = (): NumericAccessor<Datum>[] => (isArray(this.config.y) ? this.config.y : [this.config.y])\n stacked = true\n events = {}\n private _prevNegative: boolean[] | undefined // To help guessing the bar direction when an accessor was set to null or 0\n private _barData: Datum[] = []\n\n constructor (config?: StackedBarConfigInterface<Datum>) {\n super()\n if (config) this.setConfig(config)\n }\n\n get bleed (): Spacing {\n this._barData = this._getVisibleData()\n if (this._barData.length === 0) return { top: 0, bottom: 0, left: 0, right: 0 }\n\n // By default, horizontal orientation is \"flipped\", i.e. the `yDirection` of `XYContainer` is set to `Direction.North`\n const isHorizontalAndFlipped = !this.isVertical() && (this.dataScale.range()[0] > this.dataScale.range()[1])\n const dataDomain = this.dataScale.domain()\n const halfGroupWidth = this._getBarWidth() / 2\n\n const dataScaleValues = this._barData.map((d, i) => getNumber(d, this.config.x, i))\n const firstDataValue = min(dataScaleValues)\n const lastDataValue = max(dataScaleValues)\n const firstValuePx = this.dataScale(firstDataValue)\n const lastValuePx = this.dataScale(lastDataValue)\n\n const dataDomainRequiredStart = this.dataScale.invert(firstValuePx + (isHorizontalAndFlipped ? halfGroupWidth : -halfGroupWidth))\n const dataDomainRequiredEnd = this.dataScale.invert(lastValuePx + (isHorizontalAndFlipped ? -halfGroupWidth : halfGroupWidth))\n const bleedPxStart = dataDomainRequiredStart <= dataDomain[0] ? this.dataScale(dataDomain[0]) - this.dataScale(dataDomainRequiredStart) : 0\n const bleedPxEnd = dataDomainRequiredEnd > dataDomain[1] ? this.dataScale(dataDomainRequiredEnd) - this.dataScale(dataDomain[1]) : 0\n\n return {\n top: this.isVertical() ? 0 : (isHorizontalAndFlipped ? -bleedPxEnd : bleedPxStart),\n bottom: this.isVertical() ? 0 : (isHorizontalAndFlipped ? -bleedPxStart : bleedPxEnd),\n left: this.isVertical() ? bleedPxStart : 0,\n right: this.isVertical() ? bleedPxEnd : 0,\n }\n }\n\n private get dataScale (): ContinuousScale {\n return this.isVertical() ? this.xScale : this.yScale\n }\n\n private get valueScale (): ContinuousScale {\n return this.isVertical() ? this.yScale : this.xScale\n }\n\n private isVertical (): boolean {\n return this.config.orientation === Orientation.Vertical\n }\n\n _render (customDuration?: number): void {\n const { config } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n const yAccessors = this.getAccessors()\n const stacked = getStackedData(this._barData, 0, yAccessors, this._prevNegative)\n this._prevNegative = stacked.map(s => !!s.negative)\n\n const barGroups = this.g\n .selectAll<SVGGElement, Datum>(`.${s.barGroup}`)\n .data(this._barData, (d, i) => `${getString(d, config.id, i) ?? i}`)\n\n const getBarGroupsTransform = (d: Datum, i: number): string => {\n const v = this.dataScale(getNumber(d, config.x, i))\n const x = this.isVertical() ? v : 0\n const y = this.isVertical() ? 0 : v\n return `translate(${x},${y})`\n }\n\n const barGroupsEnter = barGroups.enter().append('g')\n .attr('class', s.barGroup)\n .attr('transform', getBarGroupsTransform)\n .style('opacity', 1)\n\n const barGroupsMerged = barGroupsEnter.merge(barGroups)\n smartTransition(barGroupsMerged, duration)\n .attr('transform', getBarGroupsTransform)\n .style('opacity', 1)\n\n const barGroupExit = barGroups.exit()\n .attr('class', s.barGroupExit)\n\n smartTransition(barGroupExit, duration)\n .style('opacity', 0)\n .remove()\n\n // Animate bars from exiting groups going down\n smartTransition(barGroupExit.selectAll(`.${s.bar}`), duration)\n .attr('transform', this.isVertical()\n ? `translate(0,${this._height / 3})`\n : `translate(${this._width / 6},0)`\n )\n\n // Render Bars\n const bars = barGroupsMerged\n .selectAll<SVGPathElement, StackedBarDataRecord<Datum>>(`.${s.bar}`)\n .data((d, j) => stacked.map((s) =>\n ({ ...d, _stacked: s[j], _negative: s.negative, _ending: s.ending }))\n )\n\n const barsEnter = bars.enter().append('path')\n .attr('class', s.bar)\n .attr('d', (d, j) => this._getBarPath(d, j, true))\n .style('fill', (d, j) => getColor(d, config.color, j))\n\n const barsMerged = barsEnter.merge(bars)\n\n smartTransition(barsMerged, duration)\n .attr('d', (d, j) => this._getBarPath(d, j))\n .style('fill', (d, j) => getColor(d, config.color, j))\n .style('cursor', (d, j) => getString(d, config.cursor, j))\n\n smartTransition(bars.exit(), duration)\n .style('opacity', 0)\n .remove()\n }\n\n _getBarWidth (): number {\n const { config, datamodel: { data } } = this\n if (isEmpty(data)) return 0\n if (config.barWidth) return min([config.barWidth, config.barMaxWidth])\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const isOrdinal = this.dataScale.bandwidth\n const domain = (this.dataScale.domain ? this.dataScale.domain() : []) as number[]\n const domainLength = isOrdinal ? domain.length : domain[1] - domain[0]\n\n // If the dataStep property is provided the amount of data elements is calculates as domainLength / dataStep\n // otherwise we get the number of data elements within the domain range\n // Or if the scale is ordinal we use data.length\n let dataSize = (1 + domainLength / config.dataStep) ||\n (!isOrdinal && data.filter((d, i) => {\n const value = getNumber(d, config.x, i)\n return (value >= domain[0]) && (value <= domain[1])\n }).length) ||\n data.length\n\n // We increase the dataSize by 1 to take into account possible additional domain space\n if (!isOrdinal && dataSize >= 2) dataSize += 1\n\n const c = dataSize < 2 ? 1 : 1 - config.barPadding\n const barWidth = c * (this.isVertical() ? this._width : this._height) / dataSize\n\n return min([barWidth, config.barMaxWidth])\n }\n\n _getVisibleData (): Datum[] {\n const { config, datamodel: { data } } = this\n\n const groupWidth = this._getBarWidth()\n const halfGroupWidthPx = data.length < 2 ? 0 : groupWidth / 2\n\n const scale = this.dataScale\n const halfGroupWidth = Math.abs((scale.invert(halfGroupWidthPx) as number) - (scale.invert(0) as number))\n const filtered = data?.filter((d, i) => {\n const v = getNumber(d, config.x, i)\n const domain: number[] | Date[] = scale.domain()\n const domainMin = +domain[0]\n const domainMax = +domain[1]\n return (v >= (domainMin - halfGroupWidth)) && (v <= (domainMax + halfGroupWidth))\n })\n\n return filtered\n }\n\n _getBarPath (d: StackedBarDataRecord<Datum>, accessorIndex: number, isEntering = false): string {\n const { config } = this\n const yAccessors = this.getAccessors()\n const barWidth = this._getBarWidth()\n\n const isNegative = d._negative\n const isEnding = d._ending // The most top bar or, if the value is negative, the most bottom bar\n // Todo: Find a way to pass the datum index to `getNumber` below\n const value = getNumber(d, yAccessors[accessorIndex])\n\n const height = isEntering ? 0 : Math.abs(this.valueScale(d._stacked[0]) - this.valueScale(d._stacked[1]))\n const h = !isEntering && config.barMinHeight1Px && (height < 1) && isFinite(value) && (value !== config.barMinHeightZeroValue) ? 1 : height\n const y = isEntering\n ? this.valueScale(0)\n : this.valueScale(isNegative ? d._stacked[0] : d._stacked[1]) - (height < 1 && config.barMinHeight1Px ? 1 : 0)\n\n const x = -barWidth / 2\n const width = barWidth\n\n const cornerRadius = config.roundedCorners\n ? isNumber(config.roundedCorners) ? +config.roundedCorners : width / 2\n : 0\n const cornerRadiusClamped = clamp(cornerRadius, 0, Math.min(height, width) / 2)\n const isNorthDirected = this.yScale.range()[0] > this.yScale.range()[1]\n\n return roundedRectPath({\n x: this.isVertical() ? x : y - h,\n y: this.isVertical() ? y + (isNorthDirected ? 0 : -h) : x,\n w: this.isVertical() ? width : h,\n h: this.isVertical() ? h : width,\n tl: isEnding && (this.isVertical()\n ? (!isNegative && isNorthDirected) || (isNegative && !isNorthDirected)\n : isNegative\n ),\n tr: isEnding && (this.isVertical()\n ? (!isNegative && isNorthDirected) || (isNegative && !isNorthDirected)\n : !isNegative\n ),\n br: isEnding && (this.isVertical()\n ? (isNegative && isNorthDirected) || (!isNegative && !isNorthDirected)\n : !isNegative\n ),\n bl: isEnding && (this.isVertical()\n ? (isNegative && isNorthDirected) || (!isNegative && !isNorthDirected)\n : isNegative\n ),\n r: cornerRadiusClamped,\n })\n }\n\n getValueScaleExtent (scaleByVisibleData: boolean): number[] {\n const { datamodel } = this\n const yAccessors = this.getAccessors()\n\n const data = scaleByVisibleData ? this._getVisibleData() : datamodel.data\n return getStackedExtent(data, ...yAccessors)\n }\n\n getDataScaleExtent (): number[] {\n const { config, datamodel } = this\n return getExtent(datamodel.data, config.x)\n }\n\n getYDataExtent (scaleByVisibleData: boolean): number[] {\n return this.isVertical() ? this.getValueScaleExtent(scaleByVisibleData) : this.getDataScaleExtent()\n }\n\n getXDataExtent (): number[] {\n return this.isVertical() ? this.getDataScaleExtent() : this.getValueScaleExtent(false)\n }\n}\n"],"names":["s.barGroup","barGroupExit","s.barGroupExit","s.bar","s"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/stacked-bar/index.ts"],"sourcesContent":["import { min, max } from 'd3-array'\n\n// Core\nimport { XYComponentCore } from 'core/xy-component'\n\n// Utils\nimport { isNumber, isArray, isEmpty, clamp, getStackedExtent, getString, getNumber, getStackedData, getExtent } from 'utils/data'\nimport { roundedRectPath } from 'utils/path'\nimport { smartTransition } from 'utils/d3'\nimport { getColor } from 'utils/color'\n\n// Types\nimport { ContinuousScale } from 'types/scale'\nimport { NumericAccessor } from 'types/accessor'\nimport { Spacing } from 'types/spacing'\nimport { Orientation } from 'types/position'\n\n// Local Types\nimport { StackedBarDataRecord } from './types'\n\n// Config\nimport { StackedBarConfig, StackedBarConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\nexport class StackedBar<Datum> extends XYComponentCore<Datum, StackedBarConfig<Datum>, StackedBarConfigInterface<Datum>> {\n static selectors = s\n config: StackedBarConfig<Datum> = new StackedBarConfig()\n getAccessors = (): NumericAccessor<Datum>[] => (isArray(this.config.y) ? this.config.y : [this.config.y])\n stacked = true\n events = {}\n private _prevNegative: boolean[] | undefined // To help guessing the bar direction when an accessor was set to null or 0\n private _barData: Datum[] = []\n\n constructor (config?: StackedBarConfigInterface<Datum>) {\n super()\n if (config) this.config.init(config)\n }\n\n get bleed (): Spacing {\n this._barData = this._getVisibleData()\n if (this._barData.length === 0) return { top: 0, bottom: 0, left: 0, right: 0 }\n\n // By default, horizontal orientation is \"flipped\", i.e. the `yDirection` of `XYContainer` is set to `Direction.North`\n const isHorizontalAndFlipped = !this.isVertical() && (this.dataScale.range()[0] > this.dataScale.range()[1])\n const dataDomain = this.dataScale.domain()\n const halfGroupWidth = this._getBarWidth() / 2\n\n const dataScaleValues = this._barData.map((d, i) => getNumber(d, this.config.x, i))\n const firstDataValue = min(dataScaleValues)\n const lastDataValue = max(dataScaleValues)\n const firstValuePx = this.dataScale(firstDataValue)\n const lastValuePx = this.dataScale(lastDataValue)\n\n const dataDomainRequiredStart = this.dataScale.invert(firstValuePx + (isHorizontalAndFlipped ? halfGroupWidth : -halfGroupWidth))\n const dataDomainRequiredEnd = this.dataScale.invert(lastValuePx + (isHorizontalAndFlipped ? -halfGroupWidth : halfGroupWidth))\n const bleedPxStart = dataDomainRequiredStart <= dataDomain[0] ? this.dataScale(dataDomain[0]) - this.dataScale(dataDomainRequiredStart) : 0\n const bleedPxEnd = dataDomainRequiredEnd > dataDomain[1] ? this.dataScale(dataDomainRequiredEnd) - this.dataScale(dataDomain[1]) : 0\n\n return {\n top: this.isVertical() ? 0 : (isHorizontalAndFlipped ? -bleedPxEnd : bleedPxStart),\n bottom: this.isVertical() ? 0 : (isHorizontalAndFlipped ? -bleedPxStart : bleedPxEnd),\n left: this.isVertical() ? bleedPxStart : 0,\n right: this.isVertical() ? bleedPxEnd : 0,\n }\n }\n\n private get dataScale (): ContinuousScale {\n return this.isVertical() ? this.xScale : this.yScale\n }\n\n private get valueScale (): ContinuousScale {\n return this.isVertical() ? this.yScale : this.xScale\n }\n\n private isVertical (): boolean {\n return this.config.orientation === Orientation.Vertical\n }\n\n _render (customDuration?: number): void {\n const { config } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n const yAccessors = this.getAccessors()\n const stacked = getStackedData(this._barData, 0, yAccessors, this._prevNegative)\n this._prevNegative = stacked.map(s => !!s.negative)\n\n const barGroups = this.g\n .selectAll<SVGGElement, Datum>(`.${s.barGroup}`)\n .data(this._barData, (d, i) => `${getString(d, config.id, i) ?? i}`)\n\n const getBarGroupsTransform = (d: Datum, i: number): string => {\n const v = this.dataScale(getNumber(d, config.x, i))\n const x = this.isVertical() ? v : 0\n const y = this.isVertical() ? 0 : v\n return `translate(${x},${y})`\n }\n\n const barGroupsEnter = barGroups.enter().append('g')\n .attr('class', s.barGroup)\n .attr('transform', getBarGroupsTransform)\n .style('opacity', 1)\n\n const barGroupsMerged = barGroupsEnter.merge(barGroups)\n smartTransition(barGroupsMerged, duration)\n .attr('transform', getBarGroupsTransform)\n .style('opacity', 1)\n\n const barGroupExit = barGroups.exit()\n .attr('class', s.barGroupExit)\n\n smartTransition(barGroupExit, duration)\n .style('opacity', 0)\n .remove()\n\n // Animate bars from exiting groups going down\n smartTransition(barGroupExit.selectAll(`.${s.bar}`), duration)\n .attr('transform', this.isVertical()\n ? `translate(0,${this._height / 3})`\n : `translate(${this._width / 6},0)`\n )\n\n // Render Bars\n const bars = barGroupsMerged\n .selectAll<SVGPathElement, StackedBarDataRecord<Datum>>(`.${s.bar}`)\n .data((d, j) => stacked.map((s) =>\n ({ ...d, _stacked: s[j], _negative: s.negative, _ending: s.ending }))\n )\n\n const barsEnter = bars.enter().append('path')\n .attr('class', s.bar)\n .attr('d', (d, j) => this._getBarPath(d, j, true))\n .style('fill', (d, j) => getColor(d, config.color, j))\n\n const barsMerged = barsEnter.merge(bars)\n\n smartTransition(barsMerged, duration)\n .attr('d', (d, j) => this._getBarPath(d, j))\n .style('fill', (d, j) => getColor(d, config.color, j))\n .style('cursor', (d, j) => getString(d, config.cursor, j))\n\n smartTransition(bars.exit(), duration)\n .style('opacity', 0)\n .remove()\n }\n\n _getBarWidth (): number {\n const { config, datamodel: { data } } = this\n if (isEmpty(data)) return 0\n if (config.barWidth) return min([config.barWidth, config.barMaxWidth])\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const isOrdinal = this.dataScale.bandwidth\n const domain = (this.dataScale.domain ? this.dataScale.domain() : []) as number[]\n const domainLength = isOrdinal ? domain.length : domain[1] - domain[0]\n\n // If the dataStep property is provided the amount of data elements is calculates as domainLength / dataStep\n // otherwise we get the number of data elements within the domain range\n // Or if the scale is ordinal we use data.length\n let dataSize = (1 + domainLength / config.dataStep) ||\n (!isOrdinal && data.filter((d, i) => {\n const value = getNumber(d, config.x, i)\n return (value >= domain[0]) && (value <= domain[1])\n }).length) ||\n data.length\n\n // We increase the dataSize by 1 to take into account possible additional domain space\n if (!isOrdinal && dataSize >= 2) dataSize += 1\n\n const c = dataSize < 2 ? 1 : 1 - config.barPadding\n const barWidth = c * (this.isVertical() ? this._width : this._height) / dataSize\n\n return min([barWidth, config.barMaxWidth])\n }\n\n _getVisibleData (): Datum[] {\n const { config, datamodel: { data } } = this\n\n const groupWidth = this._getBarWidth()\n const halfGroupWidthPx = data.length < 2 ? 0 : groupWidth / 2\n\n const scale = this.dataScale\n const halfGroupWidth = Math.abs((scale.invert(halfGroupWidthPx) as number) - (scale.invert(0) as number))\n const filtered = data?.filter((d, i) => {\n const v = getNumber(d, config.x, i)\n const domain: number[] | Date[] = scale.domain()\n const domainMin = +domain[0]\n const domainMax = +domain[1]\n return (v >= (domainMin - halfGroupWidth)) && (v <= (domainMax + halfGroupWidth))\n })\n\n return filtered\n }\n\n _getBarPath (d: StackedBarDataRecord<Datum>, accessorIndex: number, isEntering = false): string {\n const { config } = this\n const yAccessors = this.getAccessors()\n const barWidth = this._getBarWidth()\n\n const isNegative = d._negative\n const isEnding = d._ending // The most top bar or, if the value is negative, the most bottom bar\n // Todo: Find a way to pass the datum index to `getNumber` below\n const value = getNumber(d, yAccessors[accessorIndex])\n\n const height = isEntering ? 0 : Math.abs(this.valueScale(d._stacked[0]) - this.valueScale(d._stacked[1]))\n const h = !isEntering && config.barMinHeight1Px && (height < 1) && isFinite(value) && (value !== config.barMinHeightZeroValue) ? 1 : height\n const y = isEntering\n ? this.valueScale(0)\n : this.valueScale(isNegative ? d._stacked[0] : d._stacked[1]) - (height < 1 && config.barMinHeight1Px ? 1 : 0)\n\n const x = -barWidth / 2\n const width = barWidth\n\n const cornerRadius = config.roundedCorners\n ? isNumber(config.roundedCorners) ? +config.roundedCorners : width / 2\n : 0\n const cornerRadiusClamped = clamp(cornerRadius, 0, Math.min(height, width) / 2)\n const isNorthDirected = this.yScale.range()[0] > this.yScale.range()[1]\n\n return roundedRectPath({\n x: this.isVertical() ? x : y - h,\n y: this.isVertical() ? y + (isNorthDirected ? 0 : -h) : x,\n w: this.isVertical() ? width : h,\n h: this.isVertical() ? h : width,\n tl: isEnding && (this.isVertical()\n ? (!isNegative && isNorthDirected) || (isNegative && !isNorthDirected)\n : isNegative\n ),\n tr: isEnding && (this.isVertical()\n ? (!isNegative && isNorthDirected) || (isNegative && !isNorthDirected)\n : !isNegative\n ),\n br: isEnding && (this.isVertical()\n ? (isNegative && isNorthDirected) || (!isNegative && !isNorthDirected)\n : !isNegative\n ),\n bl: isEnding && (this.isVertical()\n ? (isNegative && isNorthDirected) || (!isNegative && !isNorthDirected)\n : isNegative\n ),\n r: cornerRadiusClamped,\n })\n }\n\n getValueScaleExtent (scaleByVisibleData: boolean): number[] {\n const { datamodel } = this\n const yAccessors = this.getAccessors()\n\n const data = scaleByVisibleData ? this._getVisibleData() : datamodel.data\n return getStackedExtent(data, ...yAccessors)\n }\n\n getDataScaleExtent (): number[] {\n const { config, datamodel } = this\n return getExtent(datamodel.data, config.x)\n }\n\n getYDataExtent (scaleByVisibleData: boolean): number[] {\n return this.isVertical() ? this.getValueScaleExtent(scaleByVisibleData) : this.getDataScaleExtent()\n }\n\n getXDataExtent (): number[] {\n return this.isVertical() ? this.getDataScaleExtent() : this.getValueScaleExtent(false)\n }\n}\n"],"names":["s.barGroup","barGroupExit","s.barGroupExit","s.bar","s"],"mappings":"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"}
@@ -1,9 +1,7 @@
1
- import { XYComponentConfigInterface } from "../../core/xy-component/config";
1
+ import { XYComponentConfigInterface, XYComponentConfig } from "../../core/xy-component/config";
2
2
  import { WithOptional } from "../../types/misc";
3
- import { ColorAccessor, NumericAccessor, StringAccessor } from "../../types/accessor";
3
+ import { NumericAccessor, StringAccessor } from "../../types/accessor";
4
4
  export interface TimelineConfigInterface<Datum> extends WithOptional<XYComponentConfigInterface<Datum>, 'y'> {
5
- /** Timeline item color accessor function. Default: `d => d.color` */
6
- color?: ColorAccessor<Datum>;
7
5
  /** Width of the timeline items. Default: `8` */
8
6
  lineWidth?: NumericAccessor<Datum>;
9
7
  /** Display rounded ends for timeline items. Default: `true` */
@@ -29,4 +27,17 @@ export interface TimelineConfigInterface<Datum> extends WithOptional<XYComponent
29
27
  /** Sets the minimum line length to 1 pixel for better visibility of small values. Default: `false` */
30
28
  showEmptySegments?: boolean;
31
29
  }
32
- export declare const TimelineDefaultConfig: TimelineConfigInterface<unknown>;
30
+ export declare class TimelineConfig<Datum> extends XYComponentConfig<Datum> implements TimelineConfigInterface<Datum> {
31
+ lineWidth: number;
32
+ lineCap: boolean;
33
+ rowHeight: number;
34
+ length: NumericAccessor<Datum>;
35
+ type: StringAccessor<Datum>;
36
+ cursor: any;
37
+ labelWidth: any;
38
+ showLabels: boolean;
39
+ maxLabelWidth: number;
40
+ alternatingRowColors: boolean;
41
+ onScroll: any;
42
+ showEmptySegments: boolean;
43
+ }
@@ -1,12 +1,24 @@
1
- import { XYComponentDefaultConfig } from '../../core/xy-component/config.js';
1
+ import { XYComponentConfig } from '../../core/xy-component/config.js';
2
2
 
3
- const TimelineDefaultConfig = Object.assign(Object.assign({}, XYComponentDefaultConfig), {
4
- // eslint-disable-next-line dot-notation
5
- color: (d) => d['color'], lineWidth: 8, lineCap: false, rowHeight: 22,
6
- // eslint-disable-next-line dot-notation
7
- length: (d) => d['length'],
8
- // eslint-disable-next-line dot-notation
9
- type: (d) => d['type'], cursor: null, labelWidth: undefined, showLabels: false, maxLabelWidth: 120, alternatingRowColors: true, onScroll: undefined, showEmptySegments: false });
3
+ class TimelineConfig extends XYComponentConfig {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.lineWidth = 8;
7
+ this.lineCap = false;
8
+ this.rowHeight = 22;
9
+ // eslint-disable-next-line dot-notation
10
+ this.length = d => d['length'];
11
+ // eslint-disable-next-line dot-notation
12
+ this.type = d => d['type'];
13
+ this.cursor = null;
14
+ this.labelWidth = undefined;
15
+ this.showLabels = false;
16
+ this.maxLabelWidth = 120;
17
+ this.alternatingRowColors = true;
18
+ this.onScroll = undefined;
19
+ this.showEmptySegments = false;
20
+ }
21
+ }
10
22
 
11
- export { TimelineDefaultConfig };
23
+ export { TimelineConfig };
12
24
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sources":["../../../src/components/timeline/config.ts"],"sourcesContent":["import { XYComponentConfigInterface, XYComponentDefaultConfig } from 'core/xy-component/config'\n\n// Types\nimport { WithOptional } from 'types/misc'\nimport { ColorAccessor, NumericAccessor, StringAccessor } from 'types/accessor'\n\nexport interface TimelineConfigInterface<Datum> extends WithOptional<XYComponentConfigInterface<Datum>, 'y'> {\n /** Timeline item color accessor function. Default: `d => d.color` */\n color?: ColorAccessor<Datum>;\n /** Width of the timeline items. Default: `8` */\n lineWidth?: NumericAccessor<Datum>;\n /** Display rounded ends for timeline items. Default: `true` */\n lineCap?: boolean;\n /** Timeline row height. Default: `22` */\n rowHeight?: number;\n /** Timeline item length accessor function. Default: `d => d.length` */\n length?: NumericAccessor<Datum>;\n /** Timeline item type accessor function. Records of one type will be plotted in one row. Default: `d => d.type` */\n type?: StringAccessor<Datum>;\n /** Configurable Timeline item cursor when hovering over. Default: `null` */\n cursor?: StringAccessor<Datum>;\n /** Show item type labels when set to `true`. Default: `false` */\n showLabels?: boolean;\n /** Fixed label width in pixels. Labels longer than the specified value will be trimmed. Default: `undefined` */\n labelWidth?: number;\n /** Maximum label width in pixels. Labels longer than the specified value will be trimmed. Default: `120` */\n maxLabelWidth?: number;\n /** Alternating row colors. Default: `true` */\n alternatingRowColors?: boolean;\n /** Scrolling callback function: `(scrollTop: number) => void`. Default: `undefined` */\n onScroll?: (scrollTop: number) => void;\n /** Sets the minimum line length to 1 pixel for better visibility of small values. Default: `false` */\n showEmptySegments?: boolean;\n}\n\nexport const TimelineDefaultConfig: TimelineConfigInterface<unknown> = {\n ...XYComponentDefaultConfig,\n // eslint-disable-next-line dot-notation\n color: (d: unknown): string => d['color'],\n lineWidth: 8,\n lineCap: false,\n rowHeight: 22,\n // eslint-disable-next-line dot-notation\n length: <Datum>(d: Datum): number => d['length'],\n // eslint-disable-next-line dot-notation\n type: <Datum>(d: Datum): string => d['type'],\n cursor: null,\n labelWidth: undefined,\n showLabels: false,\n maxLabelWidth: 120,\n alternatingRowColors: true,\n onScroll: undefined,\n showEmptySegments: false,\n}\n"],"names":[],"mappings":";;AAmCO,MAAM,qBAAqB,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAC7B,wBAAwB,CAAA,EAAA;;IAE3B,KAAK,EAAE,CAAC,CAAU,KAAa,CAAC,CAAC,OAAO,CAAC,EACzC,SAAS,EAAE,CAAC,EACZ,OAAO,EAAE,KAAK,EACd,SAAS,EAAE,EAAE;;IAEb,MAAM,EAAE,CAAQ,CAAQ,KAAa,CAAC,CAAC,QAAQ,CAAC;;AAEhD,IAAA,IAAI,EAAE,CAAQ,CAAQ,KAAa,CAAC,CAAC,MAAM,CAAC,EAC5C,MAAM,EAAE,IAAI,EACZ,UAAU,EAAE,SAAS,EACrB,UAAU,EAAE,KAAK,EACjB,aAAa,EAAE,GAAG,EAClB,oBAAoB,EAAE,IAAI,EAC1B,QAAQ,EAAE,SAAS,EACnB,iBAAiB,EAAE,KAAK;;;;"}
1
+ {"version":3,"file":"config.js","sources":["../../../src/components/timeline/config.ts"],"sourcesContent":["import { XYComponentConfigInterface, XYComponentConfig } from 'core/xy-component/config'\n\n// Types\nimport { WithOptional } from 'types/misc'\nimport { NumericAccessor, StringAccessor } from 'types/accessor'\n\nexport interface TimelineConfigInterface<Datum> extends WithOptional<XYComponentConfigInterface<Datum>, 'y'> {\n /** Width of the timeline items. Default: `8` */\n lineWidth?: NumericAccessor<Datum>;\n /** Display rounded ends for timeline items. Default: `true` */\n lineCap?: boolean;\n /** Timeline row height. Default: `22` */\n rowHeight?: number;\n /** Timeline item length accessor function. Default: `d => d.length` */\n length?: NumericAccessor<Datum>;\n /** Timeline item type accessor function. Records of one type will be plotted in one row. Default: `d => d.type` */\n type?: StringAccessor<Datum>;\n /** Configurable Timeline item cursor when hovering over. Default: `null` */\n cursor?: StringAccessor<Datum>;\n /** Show item type labels when set to `true`. Default: `false` */\n showLabels?: boolean;\n /** Fixed label width in pixels. Labels longer than the specified value will be trimmed. Default: `undefined` */\n labelWidth?: number;\n /** Maximum label width in pixels. Labels longer than the specified value will be trimmed. Default: `120` */\n maxLabelWidth?: number;\n /** Alternating row colors. Default: `true` */\n alternatingRowColors?: boolean;\n /** Scrolling callback function: `(scrollTop: number) => void`. Default: `undefined` */\n onScroll?: (scrollTop: number) => void;\n /** Sets the minimum line length to 1 pixel for better visibility of small values. Default: `false` */\n showEmptySegments?: boolean;\n}\n\nexport class TimelineConfig<Datum> extends XYComponentConfig<Datum> implements TimelineConfigInterface<Datum> {\n lineWidth = 8\n lineCap = false\n rowHeight = 22\n // eslint-disable-next-line dot-notation\n length: NumericAccessor<Datum> = d => d['length']\n // eslint-disable-next-line dot-notation\n type: StringAccessor<Datum> = d => d['type']\n cursor = null\n labelWidth = undefined\n showLabels = false\n maxLabelWidth = 120\n alternatingRowColors = true\n onScroll = undefined\n showEmptySegments = false\n}\n"],"names":[],"mappings":";;AAiCM,MAAO,cAAsB,SAAQ,iBAAwB,CAAA;AAAnE,IAAA,WAAA,GAAA;;QACE,IAAS,CAAA,SAAA,GAAG,CAAC,CAAA;QACb,IAAO,CAAA,OAAA,GAAG,KAAK,CAAA;QACf,IAAS,CAAA,SAAA,GAAG,EAAE,CAAA;;QAEd,IAAM,CAAA,MAAA,GAA2B,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAA;;QAEjD,IAAI,CAAA,IAAA,GAA0B,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAA;QAC5C,IAAM,CAAA,MAAA,GAAG,IAAI,CAAA;QACb,IAAU,CAAA,UAAA,GAAG,SAAS,CAAA;QACtB,IAAU,CAAA,UAAA,GAAG,KAAK,CAAA;QAClB,IAAa,CAAA,aAAA,GAAG,GAAG,CAAA;QACnB,IAAoB,CAAA,oBAAA,GAAG,IAAI,CAAA;QAC3B,IAAQ,CAAA,QAAA,GAAG,SAAS,CAAA;QACpB,IAAiB,CAAA,iBAAA,GAAG,KAAK,CAAA;KAC1B;AAAA;;;;"}
@@ -1,10 +1,9 @@
1
1
  import { XYComponentCore } from "../../core/xy-component";
2
- import { TimelineConfigInterface } from './config';
2
+ import { TimelineConfig, TimelineConfigInterface } from './config';
3
3
  import * as s from './style';
4
- export declare class Timeline<Datum> extends XYComponentCore<Datum, TimelineConfigInterface<Datum>> {
4
+ export declare class Timeline<Datum> extends XYComponentCore<Datum, TimelineConfig<Datum>, TimelineConfigInterface<Datum>> {
5
5
  static selectors: typeof s;
6
- protected _defaultConfig: TimelineConfigInterface<Datum>;
7
- config: TimelineConfigInterface<Datum>;
6
+ config: TimelineConfig<Datum>;
8
7
  events: {
9
8
  [x: string]: {
10
9
  wheel: (d: unknown, event: WheelEvent) => void;
@@ -7,15 +7,14 @@ import { isNumber, unique, arrayOfIndices, getString, getNumber, getMin, getMax
7
7
  import { smartTransition } from '../../utils/d3.js';
8
8
  import { getColor } from '../../utils/color.js';
9
9
  import { trimSVGText } from '../../utils/text.js';
10
- import { TimelineDefaultConfig } from './config.js';
10
+ import { TimelineConfig } from './config.js';
11
11
  import * as style from './style.js';
12
12
  import { background, rows, lines, labels, scrollbar, scrollbarBackground, scrollbarHandle, label, row, rowOdd, line } from './style.js';
13
13
 
14
14
  class Timeline extends XYComponentCore {
15
15
  constructor(config) {
16
16
  super();
17
- this._defaultConfig = TimelineDefaultConfig;
18
- this.config = this._defaultConfig;
17
+ this.config = new TimelineConfig();
19
18
  this.events = {
20
19
  [Timeline.selectors.rows]: {
21
20
  wheel: this._onMouseWheel.bind(this),
@@ -31,7 +30,7 @@ class Timeline extends XYComponentCore {
31
30
  this._scrollbarHeight = 0;
32
31
  this._labelMargin = 5;
33
32
  if (config)
34
- this.setConfig(config);
33
+ this.config.init(config);
35
34
  // Invisible background rect to track events
36
35
  this._background = this.g.append('rect').attr('class', background);
37
36
  // Group for content
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/timeline/index.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\nimport { Transition } from 'd3-transition'\nimport { scaleOrdinal, ScaleOrdinal } from 'd3-scale'\nimport { drag, D3DragEvent } from 'd3-drag'\nimport { max } from 'd3-array'\n\n// Core\nimport { XYComponentCore } from 'core/xy-component'\n\n// Utils\nimport { isNumber, unique, arrayOfIndices, getMin, getMax, getString, getNumber } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\nimport { getColor } from 'utils/color'\nimport { trimSVGText } from 'utils/text'\n\n// Config\nimport { TimelineDefaultConfig, TimelineConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\nexport class Timeline<Datum> extends XYComponentCore<Datum, TimelineConfigInterface<Datum>> {\n static selectors = s\n protected _defaultConfig = TimelineDefaultConfig as TimelineConfigInterface<Datum>\n public config: TimelineConfigInterface<Datum> = this._defaultConfig\n\n events = {\n [Timeline.selectors.rows]: {\n wheel: this._onMouseWheel.bind(this),\n },\n [Timeline.selectors.line]: {\n wheel: this._onMouseWheel.bind(this),\n },\n }\n\n private _background: Selection<SVGRectElement, unknown, SVGGElement, unknown>\n private _rowsGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private _linesGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private _labelsGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private _scrollBarGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private _scrollBarBackground: Selection<SVGRectElement, unknown, SVGGElement, unknown>\n private _scrollBarHandle: Selection<SVGRectElement, unknown, SVGGElement, unknown>\n private _scrollBarWidth = 5\n private _scrollDistance = 0\n private _scrollBarMargin = 5\n private _maxScroll = 0\n private _scrollbarHeight = 0\n private _labelMargin = 5\n\n constructor (config?: TimelineConfigInterface<Datum>) {\n super()\n if (config) this.setConfig(config)\n\n // Invisible background rect to track events\n this._background = this.g.append('rect').attr('class', s.background)\n\n // Group for content\n this._rowsGroup = this.g.append('g').attr('class', s.rows)\n this._linesGroup = this.g.append('g').attr('class', s.lines)\n this._labelsGroup = this.g.append('g').attr('class', s.labels)\n this._scrollBarGroup = this.g.append('g').attr('class', s.scrollbar)\n\n // Scroll bar\n this._scrollBarBackground = this._scrollBarGroup.append('rect')\n .attr('class', s.scrollbarBackground)\n\n this._scrollBarHandle = this._scrollBarGroup.append('rect')\n .attr('class', s.scrollbarHandle)\n\n // Set up scrollbar drag event\n const dragBehaviour = drag<SVGRectElement, unknown>()\n .on('drag', this._onScrollbarDrag.bind(this))\n\n this._scrollBarHandle.call(dragBehaviour)\n }\n\n get bleed (): { top: number; bottom: number; left: number; right: number } {\n const { config, datamodel: { data } } = this\n\n // We calculate the longest label width to set the bleed values accordingly\n let labelsBleed = 0\n if (config.showLabels) {\n if (config.labelWidth) labelsBleed = config.labelWidth + this._labelMargin\n else {\n const recordLabels = this._getRecordLabels(data)\n const longestLabel = recordLabels.reduce((acc, val) => acc.length > val.length ? acc : val, '')\n const label = this._labelsGroup.append('text')\n .attr('class', s.label)\n .text(longestLabel)\n .call(trimSVGText, config.maxLabelWidth)\n const labelWidth = label.node().getBBox().width\n this._labelsGroup.empty()\n\n const tolerance = 1.15 // Some characters are wider than others so we add a little of extra space to take that into account\n labelsBleed = labelWidth ? tolerance * labelWidth + this._labelMargin : 0\n }\n }\n\n const maxLineWidth = this._getMaxLineWidth()\n return {\n top: 0,\n bottom: 0,\n left: maxLineWidth / 2 + labelsBleed,\n right: maxLineWidth / 2 + this._scrollBarWidth + this._scrollBarMargin,\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 xRange = this.xScale.range()\n const yRange = this.yScale.range()\n const yStart = Math.min(...yRange)\n const yHeight = Math.abs(yRange[1] - yRange[0])\n const maxLineWidth = this._getMaxLineWidth()\n const recordLabels = this._getRecordLabels(data)\n const recordLabelsUnique = unique(recordLabels)\n const numUniqueRecords = recordLabelsUnique.length\n\n // Ordinal scale to handle records on the same type\n const ordinalScale: ScaleOrdinal<string, number> = scaleOrdinal()\n ordinalScale.range(arrayOfIndices(numUniqueRecords))\n\n // Invisible Background rect to track events\n this._background\n .attr('width', this._width)\n .attr('height', this._height)\n .attr('opacity', 0)\n\n // Labels\n const labels = this._labelsGroup.selectAll<SVGTextElement, string>(`.${s.label}`)\n .data(config.showLabels ? recordLabelsUnique : [])\n\n const labelsEnter = labels.enter().append('text')\n .attr('class', s.label)\n\n labelsEnter.merge(labels)\n .attr('x', xRange[0] - maxLineWidth / 2 - this._labelMargin)\n .attr('y', (label, i) => yStart + (ordinalScale(label) + 0.5) * config.rowHeight)\n .text(label => label)\n .each((label, i, els) => {\n trimSVGText(select(els[i]), config.labelWidth || config.maxLabelWidth)\n })\n\n labels.exit().remove()\n\n // Row background rects\n const xStart = xRange[0]\n const numRows = Math.max(Math.floor(yHeight / config.rowHeight), numUniqueRecords)\n const recordTypes: (string | undefined)[] = Array(numRows).fill(null).map((_, i) => recordLabelsUnique[i])\n const rects = this._rowsGroup.selectAll<SVGRectElement, number>(`.${s.row}`)\n .data(recordTypes)\n\n const rectsEnter = rects.enter().append('rect')\n .attr('class', s.row)\n\n rectsEnter.merge(rects)\n .classed(s.rowOdd, config.alternatingRowColors ? (_, i) => !(i % 2) : null)\n .attr('x', xStart - maxLineWidth / 2)\n .attr('width', xRange[1] - xStart + maxLineWidth)\n .attr('y', (_, i) => yStart + i * config.rowHeight)\n .attr('height', config.rowHeight)\n\n rects.exit().remove()\n\n // Lines\n const lines = this._linesGroup.selectAll<SVGRectElement, Datum>(`.${s.line}`)\n .data(data, (d: Datum, i) => `${getString(d, config.id, i) ?? i}`)\n const linesEnter = lines.enter().append('rect')\n .attr('class', s.line)\n .classed(s.rowOdd, config.alternatingRowColors\n ? (d, i) => !(recordLabelsUnique.indexOf(this._getRecordType(d, i)) % 2)\n : null)\n .style('fill', (d, i) => getColor(d, config.color, i))\n .attr('transform', 'translate(0, 10)')\n .style('opacity', 0)\n this._positionLines(linesEnter, ordinalScale)\n\n const linesMerged = smartTransition(linesEnter.merge(lines), duration)\n .style('fill', (d, i) => getColor(d, config.color, ordinalScale(this._getRecordType(d, i))))\n .attr('transform', 'translate(0, 0)')\n .style('cursor', (d, i) => getString(d, config.cursor, i))\n .style('opacity', 1)\n\n this._positionLines(linesMerged, ordinalScale)\n\n smartTransition(lines.exit(), duration)\n .style('opacity', 0)\n .remove()\n\n // Scroll Bar\n const contentBBox = this._rowsGroup.node().getBBox() // We determine content size using the rects group because lines are animated\n const absoluteContentHeight = contentBBox.height\n this._scrollbarHeight = yHeight * yHeight / absoluteContentHeight || 0\n this._maxScroll = Math.max(absoluteContentHeight - yHeight, 0)\n\n this._scrollBarGroup\n .attr('transform', `translate(${this._width - this._scrollBarWidth}, ${yStart})`)\n .attr('opacity', this._maxScroll ? 1 : 0)\n\n this._scrollBarBackground\n .attr('width', this._scrollBarWidth)\n .attr('height', this._height)\n .attr('rx', this._scrollBarWidth / 2)\n .attr('ry', this._scrollBarWidth / 2)\n\n this._scrollBarHandle\n .attr('width', this._scrollBarWidth)\n .attr('height', this._scrollbarHeight)\n .attr('rx', this._scrollBarWidth / 2)\n .attr('ry', this._scrollBarWidth / 2)\n\n this._updateScrollPosition(0)\n }\n\n private _positionLines (\n selection: Selection<SVGRectElement, Datum, SVGGElement, unknown> | Transition<SVGRectElement, Datum, SVGGElement, unknown>,\n ordinalScale: ScaleOrdinal<string, number>\n ): void {\n const { config, xScale, yScale } = this\n const yRange = yScale.range()\n const yStart = Math.min(...yRange)\n\n selection.each((d, i, elements) => {\n const x = getNumber(d, config.x, i)\n const y = ordinalScale(this._getRecordType(d, i)) * config.rowHeight\n const length = getNumber(d, config.length, i) ?? 0\n\n // Rect dimensions\n const height = getNumber(d, config.lineWidth, i)\n const width = xScale(x + length) - xScale(x)\n\n if (width < 0) {\n console.warn('Unovis | Timeline: Line segments should not have negative lengths. Setting to 0.')\n }\n\n select(elements[i])\n .attr('x', xScale(x))\n .attr('y', yStart + y + (config.rowHeight - height) / 2)\n .attr('width', config.showEmptySegments\n ? Math.max(config.lineCap ? height : 1, width)\n : Math.max(0, width))\n .attr('height', height)\n .attr('rx', config.lineCap ? height / 2 : null)\n .style('opacity', 1)\n })\n }\n\n private _onScrollbarDrag (event: D3DragEvent<any, any, any>): void {\n const yRange = this.yScale.range()\n const yHeight = Math.abs(yRange[1] - yRange[0])\n this._updateScrollPosition(event.dy * this._maxScroll / (yHeight - this._scrollbarHeight))\n }\n\n private _onMouseWheel (d: unknown, event: WheelEvent): void {\n const { config } = this\n\n this._updateScrollPosition(event?.deltaY)\n if (this._scrollDistance > 0 && this._scrollDistance < this._maxScroll) event?.preventDefault()\n\n config.onScroll?.(this._scrollDistance)\n\n // Programmatically trigger a mousemove event to update Tooltip or Crosshair if they were set up\n const e = new Event('mousemove')\n this.element.dispatchEvent(e)\n }\n\n private _updateScrollPosition (diff: number): void {\n const yRange = this.yScale.range()\n const yHeight = Math.abs(yRange[1] - yRange[0])\n\n this._scrollDistance += diff\n this._scrollDistance = Math.max(0, this._scrollDistance)\n this._scrollDistance = Math.min(this._maxScroll, this._scrollDistance)\n\n this._linesGroup.attr('transform', `translate(0,${-this._scrollDistance})`)\n this._rowsGroup.attr('transform', `translate(0,${-this._scrollDistance})`)\n this._labelsGroup.attr('transform', `translate(0,${-this._scrollDistance})`)\n const scrollBarPosition = (this._scrollDistance / this._maxScroll * (yHeight - this._scrollbarHeight)) || 0\n this._scrollBarHandle.attr('y', scrollBarPosition)\n }\n\n private _getMaxLineWidth (): number {\n const { config, datamodel: { data } } = this\n return max(data, (d, i) => getNumber(d, config.lineWidth, i)) ?? 0\n }\n\n private _getRecordType (d: Datum, i: number): string {\n return getString(d, this.config.type) || `__${i}`\n }\n\n private _getRecordLabels (data: Datum[]): string[] {\n return data.map((d, i) => getString(d, this.config.type) || `${i + 1}`)\n }\n\n // Override the default XYComponent getXDataExtent method to take into account line lengths\n getXDataExtent (): number[] {\n const { config, datamodel } = this\n const min = getMin(datamodel.data, config.x)\n const max = getMax(datamodel.data, (d, i) => getNumber(d, config.x, i) + (getNumber(d, config.length, i) ?? 0))\n return [min, max]\n }\n}\n"],"names":["s.background","s.rows","s.lines","s.labels","s.scrollbar","s.scrollbarBackground","s.scrollbarHandle","label","s.label","s.row","s.rowOdd","s.line","s"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/timeline/index.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\nimport { Transition } from 'd3-transition'\nimport { scaleOrdinal, ScaleOrdinal } from 'd3-scale'\nimport { drag, D3DragEvent } from 'd3-drag'\nimport { max } from 'd3-array'\n\n// Core\nimport { XYComponentCore } from 'core/xy-component'\n\n// Utils\nimport { isNumber, unique, arrayOfIndices, getMin, getMax, getString, getNumber } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\nimport { getColor } from 'utils/color'\nimport { trimSVGText } from 'utils/text'\n\n// Config\nimport { TimelineConfig, TimelineConfigInterface } from './config'\n\n// Styles\nimport * as s from './style'\n\nexport class Timeline<Datum> extends XYComponentCore<Datum, TimelineConfig<Datum>, TimelineConfigInterface<Datum>> {\n static selectors = s\n config: TimelineConfig<Datum> = new TimelineConfig()\n events = {\n [Timeline.selectors.rows]: {\n wheel: this._onMouseWheel.bind(this),\n },\n [Timeline.selectors.line]: {\n wheel: this._onMouseWheel.bind(this),\n },\n }\n\n private _background: Selection<SVGRectElement, unknown, SVGGElement, unknown>\n private _rowsGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private _linesGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private _labelsGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private _scrollBarGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n private _scrollBarBackground: Selection<SVGRectElement, unknown, SVGGElement, unknown>\n private _scrollBarHandle: Selection<SVGRectElement, unknown, SVGGElement, unknown>\n private _scrollBarWidth = 5\n private _scrollDistance = 0\n private _scrollBarMargin = 5\n private _maxScroll = 0\n private _scrollbarHeight = 0\n private _labelMargin = 5\n\n constructor (config?: TimelineConfigInterface<Datum>) {\n super()\n if (config) this.config.init(config)\n\n // Invisible background rect to track events\n this._background = this.g.append('rect').attr('class', s.background)\n\n // Group for content\n this._rowsGroup = this.g.append('g').attr('class', s.rows)\n this._linesGroup = this.g.append('g').attr('class', s.lines)\n this._labelsGroup = this.g.append('g').attr('class', s.labels)\n this._scrollBarGroup = this.g.append('g').attr('class', s.scrollbar)\n\n // Scroll bar\n this._scrollBarBackground = this._scrollBarGroup.append('rect')\n .attr('class', s.scrollbarBackground)\n\n this._scrollBarHandle = this._scrollBarGroup.append('rect')\n .attr('class', s.scrollbarHandle)\n\n // Set up scrollbar drag event\n const dragBehaviour = drag<SVGRectElement, unknown>()\n .on('drag', this._onScrollbarDrag.bind(this))\n\n this._scrollBarHandle.call(dragBehaviour)\n }\n\n get bleed (): { top: number; bottom: number; left: number; right: number } {\n const { config, datamodel: { data } } = this\n\n // We calculate the longest label width to set the bleed values accordingly\n let labelsBleed = 0\n if (config.showLabels) {\n if (config.labelWidth) labelsBleed = config.labelWidth + this._labelMargin\n else {\n const recordLabels = this._getRecordLabels(data)\n const longestLabel = recordLabels.reduce((acc, val) => acc.length > val.length ? acc : val, '')\n const label = this._labelsGroup.append('text')\n .attr('class', s.label)\n .text(longestLabel)\n .call(trimSVGText, config.maxLabelWidth)\n const labelWidth = label.node().getBBox().width\n this._labelsGroup.empty()\n\n const tolerance = 1.15 // Some characters are wider than others so we add a little of extra space to take that into account\n labelsBleed = labelWidth ? tolerance * labelWidth + this._labelMargin : 0\n }\n }\n\n const maxLineWidth = this._getMaxLineWidth()\n return {\n top: 0,\n bottom: 0,\n left: maxLineWidth / 2 + labelsBleed,\n right: maxLineWidth / 2 + this._scrollBarWidth + this._scrollBarMargin,\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 xRange = this.xScale.range()\n const yRange = this.yScale.range()\n const yStart = Math.min(...yRange)\n const yHeight = Math.abs(yRange[1] - yRange[0])\n const maxLineWidth = this._getMaxLineWidth()\n const recordLabels = this._getRecordLabels(data)\n const recordLabelsUnique = unique(recordLabels)\n const numUniqueRecords = recordLabelsUnique.length\n\n // Ordinal scale to handle records on the same type\n const ordinalScale: ScaleOrdinal<string, number> = scaleOrdinal()\n ordinalScale.range(arrayOfIndices(numUniqueRecords))\n\n // Invisible Background rect to track events\n this._background\n .attr('width', this._width)\n .attr('height', this._height)\n .attr('opacity', 0)\n\n // Labels\n const labels = this._labelsGroup.selectAll<SVGTextElement, string>(`.${s.label}`)\n .data(config.showLabels ? recordLabelsUnique : [])\n\n const labelsEnter = labels.enter().append('text')\n .attr('class', s.label)\n\n labelsEnter.merge(labels)\n .attr('x', xRange[0] - maxLineWidth / 2 - this._labelMargin)\n .attr('y', (label, i) => yStart + (ordinalScale(label) + 0.5) * config.rowHeight)\n .text(label => label)\n .each((label, i, els) => {\n trimSVGText(select(els[i]), config.labelWidth || config.maxLabelWidth)\n })\n\n labels.exit().remove()\n\n // Row background rects\n const xStart = xRange[0]\n const numRows = Math.max(Math.floor(yHeight / config.rowHeight), numUniqueRecords)\n const recordTypes: (string | undefined)[] = Array(numRows).fill(null).map((_, i) => recordLabelsUnique[i])\n const rects = this._rowsGroup.selectAll<SVGRectElement, number>(`.${s.row}`)\n .data(recordTypes)\n\n const rectsEnter = rects.enter().append('rect')\n .attr('class', s.row)\n\n rectsEnter.merge(rects)\n .classed(s.rowOdd, config.alternatingRowColors ? (_, i) => !(i % 2) : null)\n .attr('x', xStart - maxLineWidth / 2)\n .attr('width', xRange[1] - xStart + maxLineWidth)\n .attr('y', (_, i) => yStart + i * config.rowHeight)\n .attr('height', config.rowHeight)\n\n rects.exit().remove()\n\n // Lines\n const lines = this._linesGroup.selectAll<SVGRectElement, Datum>(`.${s.line}`)\n .data(data, (d: Datum, i) => `${getString(d, config.id, i) ?? i}`)\n const linesEnter = lines.enter().append('rect')\n .attr('class', s.line)\n .classed(s.rowOdd, config.alternatingRowColors\n ? (d, i) => !(recordLabelsUnique.indexOf(this._getRecordType(d, i)) % 2)\n : null)\n .style('fill', (d, i) => getColor(d, config.color, i))\n .attr('transform', 'translate(0, 10)')\n .style('opacity', 0)\n this._positionLines(linesEnter, ordinalScale)\n\n const linesMerged = smartTransition(linesEnter.merge(lines), duration)\n .style('fill', (d, i) => getColor(d, config.color, ordinalScale(this._getRecordType(d, i))))\n .attr('transform', 'translate(0, 0)')\n .style('cursor', (d, i) => getString(d, config.cursor, i))\n .style('opacity', 1)\n\n this._positionLines(linesMerged, ordinalScale)\n\n smartTransition(lines.exit(), duration)\n .style('opacity', 0)\n .remove()\n\n // Scroll Bar\n const contentBBox = this._rowsGroup.node().getBBox() // We determine content size using the rects group because lines are animated\n const absoluteContentHeight = contentBBox.height\n this._scrollbarHeight = yHeight * yHeight / absoluteContentHeight || 0\n this._maxScroll = Math.max(absoluteContentHeight - yHeight, 0)\n\n this._scrollBarGroup\n .attr('transform', `translate(${this._width - this._scrollBarWidth}, ${yStart})`)\n .attr('opacity', this._maxScroll ? 1 : 0)\n\n this._scrollBarBackground\n .attr('width', this._scrollBarWidth)\n .attr('height', this._height)\n .attr('rx', this._scrollBarWidth / 2)\n .attr('ry', this._scrollBarWidth / 2)\n\n this._scrollBarHandle\n .attr('width', this._scrollBarWidth)\n .attr('height', this._scrollbarHeight)\n .attr('rx', this._scrollBarWidth / 2)\n .attr('ry', this._scrollBarWidth / 2)\n\n this._updateScrollPosition(0)\n }\n\n private _positionLines (\n selection: Selection<SVGRectElement, Datum, SVGGElement, unknown> | Transition<SVGRectElement, Datum, SVGGElement, unknown>,\n ordinalScale: ScaleOrdinal<string, number>\n ): void {\n const { config, xScale, yScale } = this\n const yRange = yScale.range()\n const yStart = Math.min(...yRange)\n\n selection.each((d, i, elements) => {\n const x = getNumber(d, config.x, i)\n const y = ordinalScale(this._getRecordType(d, i)) * config.rowHeight\n const length = getNumber(d, config.length, i) ?? 0\n\n // Rect dimensions\n const height = getNumber(d, config.lineWidth, i)\n const width = xScale(x + length) - xScale(x)\n\n if (width < 0) {\n console.warn('Unovis | Timeline: Line segments should not have negative lengths. Setting to 0.')\n }\n\n select(elements[i])\n .attr('x', xScale(x))\n .attr('y', yStart + y + (config.rowHeight - height) / 2)\n .attr('width', config.showEmptySegments\n ? Math.max(config.lineCap ? height : 1, width)\n : Math.max(0, width))\n .attr('height', height)\n .attr('rx', config.lineCap ? height / 2 : null)\n .style('opacity', 1)\n })\n }\n\n private _onScrollbarDrag (event: D3DragEvent<any, any, any>): void {\n const yRange = this.yScale.range()\n const yHeight = Math.abs(yRange[1] - yRange[0])\n this._updateScrollPosition(event.dy * this._maxScroll / (yHeight - this._scrollbarHeight))\n }\n\n private _onMouseWheel (d: unknown, event: WheelEvent): void {\n const { config } = this\n\n this._updateScrollPosition(event?.deltaY)\n if (this._scrollDistance > 0 && this._scrollDistance < this._maxScroll) event?.preventDefault()\n\n config.onScroll?.(this._scrollDistance)\n\n // Programmatically trigger a mousemove event to update Tooltip or Crosshair if they were set up\n const e = new Event('mousemove')\n this.element.dispatchEvent(e)\n }\n\n private _updateScrollPosition (diff: number): void {\n const yRange = this.yScale.range()\n const yHeight = Math.abs(yRange[1] - yRange[0])\n\n this._scrollDistance += diff\n this._scrollDistance = Math.max(0, this._scrollDistance)\n this._scrollDistance = Math.min(this._maxScroll, this._scrollDistance)\n\n this._linesGroup.attr('transform', `translate(0,${-this._scrollDistance})`)\n this._rowsGroup.attr('transform', `translate(0,${-this._scrollDistance})`)\n this._labelsGroup.attr('transform', `translate(0,${-this._scrollDistance})`)\n const scrollBarPosition = (this._scrollDistance / this._maxScroll * (yHeight - this._scrollbarHeight)) || 0\n this._scrollBarHandle.attr('y', scrollBarPosition)\n }\n\n private _getMaxLineWidth (): number {\n const { config, datamodel: { data } } = this\n return max(data, (d, i) => getNumber(d, config.lineWidth, i)) ?? 0\n }\n\n private _getRecordType (d: Datum, i: number): string {\n return getString(d, this.config.type) || `__${i}`\n }\n\n private _getRecordLabels (data: Datum[]): string[] {\n return data.map((d, i) => getString(d, this.config.type) || `${i + 1}`)\n }\n\n // Override the default XYComponent getXDataExtent method to take into account line lengths\n getXDataExtent (): number[] {\n const { config, datamodel } = this\n const min = getMin(datamodel.data, config.x)\n const max = getMax(datamodel.data, (d, i) => getNumber(d, config.x, i) + (getNumber(d, config.length, i) ?? 0))\n return [min, max]\n }\n}\n"],"names":["s.background","s.rows","s.lines","s.labels","s.scrollbar","s.scrollbarBackground","s.scrollbarHandle","label","s.label","s.row","s.rowOdd","s.line","s"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { Config } from "../../core/config";
1
2
  import { ComponentCore } from "../../core/component";
2
3
  import { Position } from "../../types/position";
3
4
  export interface TooltipConfigInterface {
@@ -51,4 +52,17 @@ export interface TooltipConfigInterface {
51
52
  [attr: string]: string | number | boolean;
52
53
  };
53
54
  }
54
- export declare const TooltipDefaultConfig: TooltipConfigInterface;
55
+ export declare class TooltipConfig extends Config implements TooltipConfigInterface {
56
+ components: ComponentCore<unknown>[];
57
+ container: any;
58
+ horizontalPlacement: Position;
59
+ horizontalShift: number;
60
+ verticalPlacement: Position;
61
+ verticalShift: number;
62
+ attributes: {
63
+ [attr: string]: string | number | boolean;
64
+ };
65
+ triggers: {
66
+ [selector: string]: (data: any, i: number, elements: (HTMLElement | SVGElement)[]) => string | HTMLElement | undefined | null;
67
+ };
68
+ }
@@ -1,16 +1,20 @@
1
+ import { Config } from '../../core/config/index.js';
1
2
  import { Position } from '../../types/position.js';
2
3
 
3
- // Types
4
- const TooltipDefaultConfig = {
5
- components: [],
6
- container: undefined,
7
- horizontalPlacement: Position.Auto,
8
- horizontalShift: 0,
9
- verticalPlacement: Position.Top,
10
- verticalShift: 0,
11
- attributes: {},
12
- triggers: {},
13
- };
4
+ /* eslint-disable no-irregular-whitespace */
5
+ class TooltipConfig extends Config {
6
+ constructor() {
7
+ super(...arguments);
8
+ this.components = [];
9
+ this.container = undefined;
10
+ this.horizontalPlacement = Position.Auto;
11
+ this.horizontalShift = 0;
12
+ this.verticalPlacement = Position.Top;
13
+ this.verticalShift = 0;
14
+ this.attributes = {};
15
+ this.triggers = {};
16
+ }
17
+ }
14
18
 
15
- export { TooltipDefaultConfig };
19
+ export { TooltipConfig };
16
20
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sources":["../../../src/components/tooltip/config.ts"],"sourcesContent":["/* eslint-disable no-irregular-whitespace */\nimport { ComponentCore } from 'core/component'\n\n// Types\nimport { Position } from 'types/position'\n\nexport interface TooltipConfigInterface {\n /** An array of visualization components to interact with. Default: `[]` */\n components?: ComponentCore<unknown>[];\n /** Container to where the Tooltip component should be inserted. Default: `undefined` */\n container?: HTMLElement;\n /** Horizontal placement of the tooltip. Default: `Position.Auto` */\n horizontalPlacement?: Position | string | undefined;\n /** Horizontal shift of the tooltip in pixels. Default: `0` */\n horizontalShift?: number;\n /** Vertical placement of the tooltip. Default: `Position.Top` */\n verticalPlacement?: Position | string | undefined;\n /** Vertical shift of the tooltip in pixels. Default: `0` */\n verticalShift?: number;\n /** Defines the content of the tooltip and hovering over which elements should trigger it.\n * An object containing properties in the following format:\n *\n * ```\n * {\n *  [selectorString]: (d: unknown) => string | HTMLElement\n * }\n * ```\n * e.g.:\n * ```\n * {\n *  [Area.selectors.area]: (d: AreaDatum[]) => `<div>${d.value.toString()}</div>\n * }\n * ```\n */\n triggers?: {\n [selector: string]: (data: any, i: number, elements: (HTMLElement | SVGElement)[]) => string | HTMLElement | undefined | null;\n };\n /** Custom DOM attributes for the tooltip. Useful when you need to refer to a specific tooltip instance\n * by using a CSS selector. Attributes configuration object has the following structure:\n *\n * ```\n * {\n *  [attributeName]: attribute value\n * }\n * ```\n * e.g.:\n * ```\n * {\n *  'type': 'area-tooltip',\n *  'value': 42\n * }\n * ```\n */\n attributes?: { [attr: string]: string | number | boolean };\n}\n\nexport const TooltipDefaultConfig: TooltipConfigInterface = {\n components: [],\n container: undefined,\n horizontalPlacement: Position.Auto,\n horizontalShift: 0,\n verticalPlacement: Position.Top,\n verticalShift: 0,\n attributes: {},\n triggers: {},\n}\n\n"],"names":[],"mappings":";;AAGA;AAqDa,MAAA,oBAAoB,GAA2B;AAC1D,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,SAAS,EAAE,SAAS;IACpB,mBAAmB,EAAE,QAAQ,CAAC,IAAI;AAClC,IAAA,eAAe,EAAE,CAAC;IAClB,iBAAiB,EAAE,QAAQ,CAAC,GAAG;AAC/B,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,QAAQ,EAAE,EAAE;;;;;"}
1
+ {"version":3,"file":"config.js","sources":["../../../src/components/tooltip/config.ts"],"sourcesContent":["/* eslint-disable no-irregular-whitespace */\nimport { Config } from 'core/config'\nimport { ComponentCore } from 'core/component'\n\n// Types\nimport { Position } from 'types/position'\n\nexport interface TooltipConfigInterface {\n /** An array of visualization components to interact with. Default: `[]` */\n components?: ComponentCore<unknown>[];\n /** Container to where the Tooltip component should be inserted. Default: `undefined` */\n container?: HTMLElement;\n /** Horizontal placement of the tooltip. Default: `Position.Auto` */\n horizontalPlacement?: Position | string | undefined;\n /** Horizontal shift of the tooltip in pixels. Default: `0` */\n horizontalShift?: number;\n /** Vertical placement of the tooltip. Default: `Position.Top` */\n verticalPlacement?: Position | string | undefined;\n /** Vertical shift of the tooltip in pixels. Default: `0` */\n verticalShift?: number;\n /** Defines the content of the tooltip and hovering over which elements should trigger it.\n * An object containing properties in the following format:\n *\n * ```\n * {\n *  [selectorString]: (d: unknown) => string | HTMLElement\n * }\n * ```\n * e.g.:\n * ```\n * {\n *  [Area.selectors.area]: (d: AreaDatum[]) => `<div>${d.value.toString()}</div>\n * }\n * ```\n */\n triggers?: {\n [selector: string]: (data: any, i: number, elements: (HTMLElement | SVGElement)[]) => string | HTMLElement | undefined | null;\n };\n /** Custom DOM attributes for the tooltip. Useful when you need to refer to a specific tooltip instance\n * by using a CSS selector. Attributes configuration object has the following structure:\n *\n * ```\n * {\n *  [attributeName]: attribute value\n * }\n * ```\n * e.g.:\n * ```\n * {\n *  'type': 'area-tooltip',\n *  'value': 42\n * }\n * ```\n */\n attributes?: { [attr: string]: string | number | boolean };\n}\n\nexport class TooltipConfig extends Config implements TooltipConfigInterface {\n components: ComponentCore<unknown>[] = []\n container = undefined\n horizontalPlacement = Position.Auto\n horizontalShift = 0\n verticalPlacement = Position.Top\n verticalShift = 0\n attributes: { [attr: string]: string | number | boolean } = {}\n triggers: {\n [selector: string]: (data: any, i: number, elements: (HTMLElement | SVGElement)[]) => string | HTMLElement | undefined | null;\n } = {}\n}\n"],"names":[],"mappings":";;;AAAA;AAyDM,MAAO,aAAc,SAAQ,MAAM,CAAA;AAAzC,IAAA,WAAA,GAAA;;QACE,IAAU,CAAA,UAAA,GAA6B,EAAE,CAAA;QACzC,IAAS,CAAA,SAAA,GAAG,SAAS,CAAA;AACrB,QAAA,IAAA,CAAA,mBAAmB,GAAG,QAAQ,CAAC,IAAI,CAAA;QACnC,IAAe,CAAA,eAAA,GAAG,CAAC,CAAA;AACnB,QAAA,IAAA,CAAA,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAA;QAChC,IAAa,CAAA,aAAA,GAAG,CAAC,CAAA;QACjB,IAAU,CAAA,UAAA,GAAkD,EAAE,CAAA;QAC9D,IAAQ,CAAA,QAAA,GAEJ,EAAE,CAAA;KACP;AAAA;;;;"}
@@ -1,12 +1,11 @@
1
1
  import { Selection } from 'd3-selection';
2
2
  import { ComponentCore } from "../../core/component";
3
- import { TooltipConfigInterface } from './config';
3
+ import { TooltipConfig, TooltipConfigInterface } from './config';
4
4
  export declare class Tooltip {
5
5
  element: HTMLElement;
6
6
  div: Selection<HTMLElement, unknown, null, undefined>;
7
- protected _defaultConfig: TooltipConfigInterface;
8
- config: TooltipConfigInterface;
9
- prevConfig: TooltipConfigInterface;
7
+ config: TooltipConfig;
8
+ prevConfig: TooltipConfig;
10
9
  components: ComponentCore<unknown>[];
11
10
  static selectors: any;
12
11
  private _setUpEventsThrottled;
@@ -1,14 +1,12 @@
1
1
  import { select, pointer } from 'd3-selection';
2
2
  import { Position } from '../../types/position.js';
3
- import { throttle, merge } from '../../utils/data.js';
4
- import { TooltipDefaultConfig } from './config.js';
3
+ import { throttle } from '../../utils/data.js';
4
+ import { TooltipConfig } from './config.js';
5
5
  import * as style from './style.js';
6
6
  import { tooltip, show, positionFixed } from './style.js';
7
7
 
8
8
  class Tooltip {
9
9
  constructor(config = {}) {
10
- this._defaultConfig = TooltipDefaultConfig;
11
- this.config = this._defaultConfig;
12
10
  this._setUpEventsThrottled = throttle(this._setUpEvents, 500);
13
11
  this._setContainerPositionThrottled = throttle(this._setContainerPosition, 500);
14
12
  this._isShown = false;
@@ -21,7 +19,7 @@ class Tooltip {
21
19
  setConfig(config) {
22
20
  var _a;
23
21
  this.prevConfig = this.config;
24
- this.config = merge(this._defaultConfig, config);
22
+ this.config = new TooltipConfig().init(config);
25
23
  if (this.config.container && (this.config.container !== ((_a = this.prevConfig) === null || _a === void 0 ? void 0 : _a.container))) {
26
24
  this.setContainer(this.config.container);
27
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/components/tooltip/index.ts"],"sourcesContent":["import { select, Selection, pointer } from 'd3-selection'\n\n// Core\nimport { ComponentCore } from 'core/component'\n\n// Types\nimport { Position } from 'types/position'\n\n// Utils\nimport { merge, throttle } from 'utils/data'\n\n// Config\nimport { TooltipDefaultConfig, TooltipConfigInterface } from './config'\n\n// Style\nimport * as s from './style'\n\nexport class Tooltip {\n element: HTMLElement\n div: Selection<HTMLElement, unknown, null, undefined>\n protected _defaultConfig = TooltipDefaultConfig as TooltipConfigInterface\n public config: TooltipConfigInterface = this._defaultConfig\n prevConfig: TooltipConfigInterface\n components: ComponentCore<unknown>[]\n static selectors = s\n private _setUpEventsThrottled = throttle(this._setUpEvents, 500)\n private _setContainerPositionThrottled = throttle(this._setContainerPosition, 500)\n private _isShown = false\n private _container: HTMLElement\n\n constructor (config: TooltipConfigInterface = {}) {\n this.element = document.createElement('div')\n this.div = select(this.element)\n .attr('class', s.tooltip)\n\n this.setConfig(config)\n this.components = this.config.components\n }\n\n public setConfig (config: TooltipConfigInterface): void {\n this.prevConfig = this.config\n this.config = merge(this._defaultConfig, config)\n\n if (this.config.container && (this.config.container !== this.prevConfig?.container)) {\n this.setContainer(this.config.container)\n }\n\n this._setUpAttributes()\n }\n\n public setContainer (container: HTMLElement): void {\n this.element.parentNode?.removeChild(this.element)\n\n this._container = container\n this._container.appendChild(this.element)\n\n this._setContainerPositionThrottled()\n }\n\n public getContainer (): HTMLElement {\n return this._container\n }\n\n public hasContainer (): boolean {\n return !!this._container && this._container.isConnected\n }\n\n public setComponents (components: ComponentCore<unknown>[]): void {\n this.components = components\n }\n\n public update (): void {\n if (!this._container) return\n\n this._setUpEventsThrottled()\n }\n\n public show (html: string | HTMLElement, pos: { x: number; y: number }): void {\n if (html instanceof HTMLElement) {\n const node = this.div.select(':first-child').node()\n if (node !== html) this.div.html('').append(() => html)\n } else {\n this.div.html(html)\n }\n\n this.div.classed(s.show, true)\n this._isShown = true\n this.place(pos)\n }\n\n public hide (): void {\n this.div.classed(s.show, false)\n this._isShown = false\n }\n\n public place (pos: { x: number; y: number }): void {\n if (!this.hasContainer()) {\n console.warn('Unovis | Tooltip: Container was not set or is not initialized yet')\n return\n }\n const { config } = this\n const isContainerBody = this.isContainerBody()\n const width = this.element.offsetWidth\n const height = this.element.offsetHeight\n const containerHeight = isContainerBody ? window.innerHeight : this._container.scrollHeight\n const containerWidth = isContainerBody ? window.innerWidth : this._container.scrollWidth\n\n const horizontalPlacement = config.horizontalPlacement === Position.Auto\n ? (pos.x > containerWidth / 2 ? Position.Left : Position.Right)\n : config.horizontalPlacement\n\n const verticalPlacement = config.verticalPlacement === Position.Auto\n ? (pos.y > containerHeight / 2 ? Position.Top : Position.Bottom)\n : config.verticalPlacement\n\n // dx and dy variables shift the tooltip from the default position (above the cursor, centred horizontally)\n const margin = 5\n const dx = horizontalPlacement === Position.Left ? -width - margin - config.horizontalShift\n : horizontalPlacement === Position.Center ? -width / 2\n : margin + config.horizontalShift\n const dy = verticalPlacement === Position.Bottom ? height + margin + config.verticalShift\n : verticalPlacement === Position.Center ? height / 2\n : -margin - config.verticalShift\n\n // Constraint to container\n const paddingX = 10\n const hitRight = pos.x > (containerWidth - width - dx - paddingX)\n const hitLeft = pos.x < -dx + paddingX\n const constraintX = hitRight ? (containerWidth - width - dx) - pos.x - paddingX\n : hitLeft ? -dx - pos.x + paddingX : 0\n\n const paddingY = 10\n const hitBottom = pos.y > (containerHeight - dy - paddingY)\n const hitTop = pos.y < (height - dy + paddingY)\n const constraintY = hitBottom ? containerHeight - dy - pos.y - paddingY\n : hitTop ? height - dy - pos.y + paddingY : 0\n\n // Placing\n // If the container size is smaller than the the tooltip size we just stick the tooltip to the top / left\n const x = containerWidth < width ? 0 : pos.x + constraintX + dx\n const y = containerHeight < height ? height : pos.y + constraintY + dy\n\n this.div\n .classed(s.positionFixed, isContainerBody)\n .style('top', isContainerBody ? `${y - height}px` : 'unset')\n .style('bottom', !isContainerBody ? `${containerHeight - y}px` : 'unset')\n .style('left', `${x}px`)\n }\n\n public isContainerBody (): boolean {\n return this._container === document.body\n }\n\n private _setContainerPosition (): void {\n // Tooltip position calculation relies on the parent position\n // If it's not set (static), we set it to `relative` (not a good practice)\n if (getComputedStyle(this._container)?.position === 'static') {\n this._container.style.position = 'relative'\n }\n }\n\n private _setUpEvents (): void {\n const { config: { triggers } } = this\n const isContainerBody = this.isContainerBody()\n\n // We use the Event Delegation pattern to set up Tooltip events\n // Every component will have single `mousemove` and `mouseleave` event listener functions, where we'll check\n // the `path` of the event and trigger corresponding callbacks\n this.components.forEach(component => {\n const selection = select(component.element)\n selection\n .on('mousemove.tooltip', (e: MouseEvent) => {\n const [x, y] = isContainerBody ? [e.clientX, e.clientY] : pointer(e, this._container)\n const path: (HTMLElement | SVGGElement)[] = (e.composedPath && e.composedPath()) || (e as any).path || [e.target]\n\n // Go through all of the configured triggers\n for (const className of Object.keys(triggers)) {\n const template = triggers[className]\n const els = selection.selectAll<HTMLElement | SVGGElement, unknown>(`.${className}`).nodes()\n\n // Go through all of the elements in the event path (from the deepest element upwards)\n for (const el of path) {\n if (el === selection.node()) break // Break on the component's level (usually the `<g>` element)\n if (el.classList.contains(className)) { // If there's a match, show the tooltip\n const i = els.indexOf(el)\n const d = select(el).datum()\n const content = template(d, i, els)\n if (content) this.show(content, { x, y })\n else this.hide()\n\n e.stopPropagation() // Stop propagation to prevent other interfering events from being triggered, e.g. Crosshair\n return // Stop looking for other matches\n }\n }\n }\n\n // Hide the tooltip if the event didn't pass through any of the configured triggers.\n // We use the `this._isShown` condition as a little performance optimization tweak\n // (we don't want the tooltip to update its class on every mouse movement, see `this.hide()`).\n if (this._isShown) this.hide()\n })\n .on('mouseleave.tooltip', (e: MouseEvent) => {\n e.stopPropagation() // Stop propagation to prevent other interfering events from being triggered, e.g. Crosshair\n this.hide()\n })\n })\n }\n\n private _setUpAttributes (): void {\n const attributesMap = this.config.attributes\n if (!attributesMap) return\n\n Object.keys(attributesMap).forEach(attr => {\n this.div.attr(attr, attributesMap[attr])\n })\n }\n\n public destroy (): void {\n this.div?.remove()\n }\n}\n"],"names":["s.tooltip","s.show","s.positionFixed","s"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/tooltip/index.ts"],"sourcesContent":["import { select, Selection, pointer } from 'd3-selection'\n\n// Core\nimport { ComponentCore } from 'core/component'\n\n// Types\nimport { Position } from 'types/position'\n\n// Utils\nimport { throttle } from 'utils/data'\n\n// Config\nimport { TooltipConfig, TooltipConfigInterface } from './config'\n\n// Style\nimport * as s from './style'\n\nexport class Tooltip {\n element: HTMLElement\n div: Selection<HTMLElement, unknown, null, undefined>\n config: TooltipConfig\n prevConfig: TooltipConfig\n components: ComponentCore<unknown>[]\n static selectors = s\n private _setUpEventsThrottled = throttle(this._setUpEvents, 500)\n private _setContainerPositionThrottled = throttle(this._setContainerPosition, 500)\n private _isShown = false\n private _container: HTMLElement\n\n constructor (config: TooltipConfigInterface = {}) {\n this.element = document.createElement('div')\n this.div = select(this.element)\n .attr('class', s.tooltip)\n\n this.setConfig(config)\n this.components = this.config.components\n }\n\n public setConfig (config: TooltipConfigInterface): void {\n this.prevConfig = this.config\n this.config = new TooltipConfig().init(config)\n\n if (this.config.container && (this.config.container !== this.prevConfig?.container)) {\n this.setContainer(this.config.container)\n }\n\n this._setUpAttributes()\n }\n\n public setContainer (container: HTMLElement): void {\n this.element.parentNode?.removeChild(this.element)\n\n this._container = container\n this._container.appendChild(this.element)\n\n this._setContainerPositionThrottled()\n }\n\n public getContainer (): HTMLElement {\n return this._container\n }\n\n public hasContainer (): boolean {\n return !!this._container && this._container.isConnected\n }\n\n public setComponents (components: ComponentCore<unknown>[]): void {\n this.components = components\n }\n\n public update (): void {\n if (!this._container) return\n\n this._setUpEventsThrottled()\n }\n\n public show (html: string | HTMLElement, pos: { x: number; y: number }): void {\n if (html instanceof HTMLElement) {\n const node = this.div.select(':first-child').node()\n if (node !== html) this.div.html('').append(() => html)\n } else {\n this.div.html(html)\n }\n\n this.div.classed(s.show, true)\n this._isShown = true\n this.place(pos)\n }\n\n public hide (): void {\n this.div.classed(s.show, false)\n this._isShown = false\n }\n\n public place (pos: { x: number; y: number }): void {\n if (!this.hasContainer()) {\n console.warn('Unovis | Tooltip: Container was not set or is not initialized yet')\n return\n }\n const { config } = this\n const isContainerBody = this.isContainerBody()\n const width = this.element.offsetWidth\n const height = this.element.offsetHeight\n const containerHeight = isContainerBody ? window.innerHeight : this._container.scrollHeight\n const containerWidth = isContainerBody ? window.innerWidth : this._container.scrollWidth\n\n const horizontalPlacement = config.horizontalPlacement === Position.Auto\n ? (pos.x > containerWidth / 2 ? Position.Left : Position.Right)\n : config.horizontalPlacement\n\n const verticalPlacement = config.verticalPlacement === Position.Auto\n ? (pos.y > containerHeight / 2 ? Position.Top : Position.Bottom)\n : config.verticalPlacement\n\n // dx and dy variables shift the tooltip from the default position (above the cursor, centred horizontally)\n const margin = 5\n const dx = horizontalPlacement === Position.Left ? -width - margin - config.horizontalShift\n : horizontalPlacement === Position.Center ? -width / 2\n : margin + config.horizontalShift\n const dy = verticalPlacement === Position.Bottom ? height + margin + config.verticalShift\n : verticalPlacement === Position.Center ? height / 2\n : -margin - config.verticalShift\n\n // Constraint to container\n const paddingX = 10\n const hitRight = pos.x > (containerWidth - width - dx - paddingX)\n const hitLeft = pos.x < -dx + paddingX\n const constraintX = hitRight ? (containerWidth - width - dx) - pos.x - paddingX\n : hitLeft ? -dx - pos.x + paddingX : 0\n\n const paddingY = 10\n const hitBottom = pos.y > (containerHeight - dy - paddingY)\n const hitTop = pos.y < (height - dy + paddingY)\n const constraintY = hitBottom ? containerHeight - dy - pos.y - paddingY\n : hitTop ? height - dy - pos.y + paddingY : 0\n\n // Placing\n // If the container size is smaller than the the tooltip size we just stick the tooltip to the top / left\n const x = containerWidth < width ? 0 : pos.x + constraintX + dx\n const y = containerHeight < height ? height : pos.y + constraintY + dy\n\n this.div\n .classed(s.positionFixed, isContainerBody)\n .style('top', isContainerBody ? `${y - height}px` : 'unset')\n .style('bottom', !isContainerBody ? `${containerHeight - y}px` : 'unset')\n .style('left', `${x}px`)\n }\n\n public isContainerBody (): boolean {\n return this._container === document.body\n }\n\n private _setContainerPosition (): void {\n // Tooltip position calculation relies on the parent position\n // If it's not set (static), we set it to `relative` (not a good practice)\n if (getComputedStyle(this._container)?.position === 'static') {\n this._container.style.position = 'relative'\n }\n }\n\n private _setUpEvents (): void {\n const { config: { triggers } } = this\n const isContainerBody = this.isContainerBody()\n\n // We use the Event Delegation pattern to set up Tooltip events\n // Every component will have single `mousemove` and `mouseleave` event listener functions, where we'll check\n // the `path` of the event and trigger corresponding callbacks\n this.components.forEach(component => {\n const selection = select(component.element)\n selection\n .on('mousemove.tooltip', (e: MouseEvent) => {\n const [x, y] = isContainerBody ? [e.clientX, e.clientY] : pointer(e, this._container)\n const path: (HTMLElement | SVGGElement)[] = (e.composedPath && e.composedPath()) || (e as any).path || [e.target]\n\n // Go through all of the configured triggers\n for (const className of Object.keys(triggers)) {\n const template = triggers[className]\n const els = selection.selectAll<HTMLElement | SVGGElement, unknown>(`.${className}`).nodes()\n\n // Go through all of the elements in the event path (from the deepest element upwards)\n for (const el of path) {\n if (el === selection.node()) break // Break on the component's level (usually the `<g>` element)\n if (el.classList.contains(className)) { // If there's a match, show the tooltip\n const i = els.indexOf(el)\n const d = select(el).datum()\n const content = template(d, i, els)\n if (content) this.show(content, { x, y })\n else this.hide()\n\n e.stopPropagation() // Stop propagation to prevent other interfering events from being triggered, e.g. Crosshair\n return // Stop looking for other matches\n }\n }\n }\n\n // Hide the tooltip if the event didn't pass through any of the configured triggers.\n // We use the `this._isShown` condition as a little performance optimization tweak\n // (we don't want the tooltip to update its class on every mouse movement, see `this.hide()`).\n if (this._isShown) this.hide()\n })\n .on('mouseleave.tooltip', (e: MouseEvent) => {\n e.stopPropagation() // Stop propagation to prevent other interfering events from being triggered, e.g. Crosshair\n this.hide()\n })\n })\n }\n\n private _setUpAttributes (): void {\n const attributesMap = this.config.attributes\n if (!attributesMap) return\n\n Object.keys(attributesMap).forEach(attr => {\n this.div.attr(attr, attributesMap[attr])\n })\n }\n\n public destroy (): void {\n this.div?.remove()\n }\n}\n"],"names":["s.tooltip","s.show","s.positionFixed","s"],"mappings":"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"}