@visactor/vseed 0.5.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/cjs/index.cjs +2 -2
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/esm/builder/builder/advanced/colorItems.d.ts +1 -0
  4. package/dist/esm/builder/builder/advanced/colorItems.js +21 -1
  5. package/dist/esm/builder/builder/advanced/colorItems.js.map +1 -1
  6. package/dist/esm/builder/builder/buildSpec.js.map +1 -1
  7. package/dist/esm/builder/builder/builder.d.ts +4 -0
  8. package/dist/esm/builder/builder/builder.js +2 -1
  9. package/dist/esm/builder/builder/builder.js.map +1 -1
  10. package/dist/esm/dataSelector/selector.js.map +1 -1
  11. package/dist/esm/pipeline/spec/chart/pipes/animation/bar.js +1 -1
  12. package/dist/esm/pipeline/spec/chart/pipes/animation/bar.js.map +1 -1
  13. package/dist/esm/pipeline/spec/chart/pipes/animation/lineOrArea.d.ts +4 -0
  14. package/dist/esm/pipeline/spec/chart/pipes/animation/radar.d.ts +4 -0
  15. package/dist/esm/pipeline/spec/chart/pipes/animation/utils/index.d.ts +1 -60
  16. package/dist/esm/pipeline/spec/chart/pipes/animation/utils/index.js +2 -44
  17. package/dist/esm/pipeline/spec/chart/pipes/animation/utils/index.js.map +1 -1
  18. package/dist/esm/pipeline/spec/chart/pipes/animation/utils/pointAtmosphere.d.ts +65 -0
  19. package/dist/esm/pipeline/spec/chart/pipes/animation/utils/pointAtmosphere.js +56 -0
  20. package/dist/esm/pipeline/spec/chart/pipes/animation/utils/pointAtmosphere.js.map +1 -0
  21. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationArea.js +2 -2
  22. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationArea.js.map +1 -1
  23. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationAreaBand.js +2 -2
  24. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationAreaBand.js.map +1 -1
  25. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationDifferenceLine.js +63 -18
  26. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationDifferenceLine.js.map +1 -1
  27. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationHorizontalLine.js +7 -13
  28. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationHorizontalLine.js.map +1 -1
  29. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationPointCommon.js +2 -2
  30. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationPointCommon.js.map +1 -1
  31. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationVerticalLine.js +9 -15
  32. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationVerticalLine.js.map +1 -1
  33. package/dist/esm/pipeline/spec/chart/pipes/annotation/utils.d.ts +2 -0
  34. package/dist/esm/pipeline/spec/chart/pipes/annotation/utils.js +15 -1
  35. package/dist/esm/pipeline/spec/chart/pipes/annotation/utils.js.map +1 -1
  36. package/dist/esm/pipeline/spec/chart/pipes/stack/stackCornerRadius.js +18 -39
  37. package/dist/esm/pipeline/spec/chart/pipes/stack/stackCornerRadius.js.map +1 -1
  38. package/dist/esm/pipeline/spec/chart/pipes/stack/stackCornerRadiusUtils.d.ts +4 -0
  39. package/dist/esm/pipeline/spec/chart/pipes/stack/stackCornerRadiusUtils.js +50 -0
  40. package/dist/esm/pipeline/spec/chart/pipes/stack/stackCornerRadiusUtils.js.map +1 -0
  41. package/dist/esm/pipeline/utils/sandbox/execute.js.map +1 -1
  42. package/dist/esm/theme/tokenTheme.d.ts +6 -0
  43. package/dist/esm/theme/tokenTheme.js +36 -7
  44. package/dist/esm/theme/tokenTheme.js.map +1 -1
  45. package/dist/esm/types/builder/builder.d.ts +1 -0
  46. package/dist/esm/types/builder/builder.js.map +1 -1
  47. package/dist/esm/types/chartType/area/zArea.d.ts +10 -0
  48. package/dist/esm/types/chartType/bar/zBar.d.ts +10 -0
  49. package/dist/esm/types/chartType/barParallel/zBarParallel.d.ts +10 -0
  50. package/dist/esm/types/chartType/column/zColumn.d.ts +10 -0
  51. package/dist/esm/types/chartType/columnParallel/zColumnParallel.d.ts +10 -0
  52. package/dist/esm/types/chartType/line/zLine.d.ts +10 -0
  53. package/dist/esm/types/properties/annotation/annotation.d.ts +10 -0
  54. package/dist/esm/types/properties/annotation/annotationDifferenceLine.d.ts +4 -0
  55. package/dist/esm/types/properties/annotation/zAnnotationDifferenceLine.d.ts +5 -0
  56. package/dist/esm/types/properties/annotation/zAnnotationDifferenceLine.js +6 -1
  57. package/dist/esm/types/properties/annotation/zAnnotationDifferenceLine.js.map +1 -1
  58. package/dist/esm/types/properties/config/annotation/annotation.d.ts +32 -5
  59. package/dist/esm/types/properties/config/annotation/zAnnotation.d.ts +30 -4
  60. package/dist/esm/types/properties/config/annotation/zAnnotation.js +11 -1
  61. package/dist/esm/types/properties/config/annotation/zAnnotation.js.map +1 -1
  62. package/dist/esm/types/properties/config/area.d.ts +30 -4
  63. package/dist/esm/types/properties/config/bar.d.ts +45 -6
  64. package/dist/esm/types/properties/config/boxplot.d.ts +15 -2
  65. package/dist/esm/types/properties/config/column.d.ts +45 -6
  66. package/dist/esm/types/properties/config/config.d.ts +285 -38
  67. package/dist/esm/types/properties/config/dualAxis.d.ts +15 -2
  68. package/dist/esm/types/properties/config/histogram.d.ts +15 -2
  69. package/dist/esm/types/properties/config/line.d.ts +15 -2
  70. package/dist/esm/types/properties/config/race.d.ts +90 -12
  71. package/dist/esm/types/properties/config/scatter.d.ts +15 -2
  72. package/dist/esm/types/properties/theme/customTheme.d.ts +570 -76
  73. package/dist/umd/index.js +332 -184
  74. package/dist/umd/index.js.map +1 -1
  75. package/package.json +3 -8
@@ -0,0 +1,56 @@
1
+ import { VScreenAnimationType } from "../types.js";
2
+ const EFFECT_NONE = VScreenAnimationType.none;
3
+ const getFinalAttribute = (mark)=>mark?.finalAttribute ?? mark?.attribute ?? {};
4
+ const atmospherePoint = (effect)=>{
5
+ if (effect === EFFECT_NONE) return {};
6
+ if ('breath' === effect) return {
7
+ channel: {
8
+ scaleX: {
9
+ from: 0.8,
10
+ to: 2
11
+ },
12
+ scaleY: {
13
+ from: 0.8,
14
+ to: 2
15
+ }
16
+ }
17
+ };
18
+ if ('reveal' === effect) return {
19
+ channel: {
20
+ fillOpacity: {
21
+ from: 0.6,
22
+ to: 1
23
+ },
24
+ strokeOpacity: {
25
+ from: 0.6,
26
+ to: 1
27
+ }
28
+ }
29
+ };
30
+ return {
31
+ channel: {
32
+ outerBorder: {
33
+ from: {
34
+ distance: 0,
35
+ strokeOpacity: 1
36
+ },
37
+ to: (...args)=>({
38
+ distance: 16,
39
+ strokeOpacity: 1e-8,
40
+ stroke: args[1]?.attribute?.fill
41
+ })
42
+ }
43
+ },
44
+ custom: (ratio, from, to, out, graphic)=>{
45
+ graphic.attribute.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity;
46
+ graphic.attribute.outerBorder = {
47
+ distance: ratio * (to.outerBorder.distance - from.outerBorder.distance) + from.outerBorder.distance,
48
+ strokeOpacity: ratio * (to.outerBorder.strokeOpacity - from.outerBorder.strokeOpacity) + from.outerBorder.strokeOpacity,
49
+ stroke: to.outerBorder.stroke
50
+ };
51
+ }
52
+ };
53
+ };
54
+ export { atmospherePoint, getFinalAttribute };
55
+
56
+ //# sourceMappingURL=pointAtmosphere.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/animation/utils/pointAtmosphere.js","sources":["../../../../../../../../src/pipeline/spec/chart/pipes/animation/utils/pointAtmosphere.ts"],"sourcesContent":["import { VScreenAnimationType, type AnimationEffect } from '../types'\n\nconst EFFECT_NONE = VScreenAnimationType.none\n\n/**\n * @description 获取图元最终属性,优先读取动画后的 finalAttribute。\n * @param mark VChart 图元对象。\n * @returns 图元最终属性。\n */\nexport const getFinalAttribute = (mark: any): Record<string, any> => {\n return mark?.finalAttribute ?? mark?.attribute ?? {}\n}\n\n/**\n * @description 生成点图元氛围动画配置,复用于折线、面积、散点和雷达图。\n * @param effect 氛围动画效果。\n * @returns 点图元氛围动画配置。\n */\nexport const atmospherePoint = (effect?: AnimationEffect) => {\n if (effect === EFFECT_NONE) {\n return {}\n }\n if (effect === 'breath') {\n return {\n channel: {\n scaleX: {\n from: 0.8,\n to: 2,\n },\n scaleY: {\n from: 0.8,\n to: 2,\n },\n },\n }\n }\n if (effect === 'reveal') {\n return {\n channel: {\n fillOpacity: { from: 0.6, to: 1 },\n strokeOpacity: { from: 0.6, to: 1 },\n },\n }\n }\n return {\n channel: {\n outerBorder: {\n from: { distance: 0, strokeOpacity: 1 },\n // 波纹描边沿用图元填充色,避免自定义配色下出现突兀色值。\n to: (...args: any[]) => ({\n distance: 16,\n strokeOpacity: 1e-8,\n stroke: args[1]?.attribute?.fill,\n }),\n },\n },\n custom: (ratio: number, from: any, to: any, out: any, graphic: any) => {\n graphic.attribute.strokeOpacity = ratio * (to.strokeOpacity - from.strokeOpacity) + from.strokeOpacity\n graphic.attribute.outerBorder = {\n distance: ratio * (to.outerBorder.distance - from.outerBorder.distance) + from.outerBorder.distance,\n strokeOpacity:\n ratio * (to.outerBorder.strokeOpacity - from.outerBorder.strokeOpacity) + from.outerBorder.strokeOpacity,\n stroke: to.outerBorder.stroke,\n }\n },\n }\n}\n"],"names":["EFFECT_NONE","VScreenAnimationType","getFinalAttribute","mark","atmospherePoint","effect","args","ratio","from","to","out","graphic"],"mappings":";AAEA,MAAMA,cAAcC,qBAAqB,IAAI;AAOtC,MAAMC,oBAAoB,CAACC,OACzBA,MAAM,kBAAkBA,MAAM,aAAa,CAAC;AAQ9C,MAAMC,kBAAkB,CAACC;IAC9B,IAAIA,WAAWL,aACb,OAAO,CAAC;IAEV,IAAIK,AAAW,aAAXA,QACF,OAAO;QACL,SAAS;YACP,QAAQ;gBACN,MAAM;gBACN,IAAI;YACN;YACA,QAAQ;gBACN,MAAM;gBACN,IAAI;YACN;QACF;IACF;IAEF,IAAIA,AAAW,aAAXA,QACF,OAAO;QACL,SAAS;YACP,aAAa;gBAAE,MAAM;gBAAK,IAAI;YAAE;YAChC,eAAe;gBAAE,MAAM;gBAAK,IAAI;YAAE;QACpC;IACF;IAEF,OAAO;QACL,SAAS;YACP,aAAa;gBACX,MAAM;oBAAE,UAAU;oBAAG,eAAe;gBAAE;gBAEtC,IAAI,CAAC,GAAGC,OAAiB;wBACvB,UAAU;wBACV,eAAe;wBACf,QAAQA,IAAI,CAAC,EAAE,EAAE,WAAW;oBAC9B;YACF;QACF;QACA,QAAQ,CAACC,OAAeC,MAAWC,IAASC,KAAUC;YACpDA,QAAQ,SAAS,CAAC,aAAa,GAAGJ,QAASE,CAAAA,GAAG,aAAa,GAAGD,KAAK,aAAY,IAAKA,KAAK,aAAa;YACtGG,QAAQ,SAAS,CAAC,WAAW,GAAG;gBAC9B,UAAUJ,QAASE,CAAAA,GAAG,WAAW,CAAC,QAAQ,GAAGD,KAAK,WAAW,CAAC,QAAO,IAAKA,KAAK,WAAW,CAAC,QAAQ;gBACnG,eACED,QAASE,CAAAA,GAAG,WAAW,CAAC,aAAa,GAAGD,KAAK,WAAW,CAAC,aAAY,IAAKA,KAAK,WAAW,CAAC,aAAa;gBAC1G,QAAQC,GAAG,WAAW,CAAC,MAAM;YAC/B;QACF;IACF;AACF"}
@@ -24,6 +24,7 @@ const annotationArea_annotationArea = (spec, context)=>{
24
24
  const defaultTextPosition = isBarLikeChart(advancedVSeed) ? 'right' : 'top';
25
25
  const markArea = annotationAreaList.flatMap((annotationArea)=>{
26
26
  const { selector: selectorPoint, text = '', textColor = theme?.textColor ?? '#ffffff', textFontSize = theme?.textFontSize ?? 12, textFontWeight = theme?.textFontWeight ?? 400, textBackgroundVisible = theme?.textBackgroundVisible ?? true, textBackgroundColor = theme?.textBackgroundColor ?? '#191d24', textBackgroundBorderColor = theme?.textBackgroundBorderColor ?? '#191d24', textBackgroundBorderWidth = theme?.textBackgroundBorderWidth ?? 1, textBackgroundBorderRadius = theme?.textBackgroundBorderRadius ?? 4, textBackgroundPadding = theme?.textBackgroundPadding ?? 4, areaColor = theme?.areaColor ?? '#888888', areaColorOpacity = theme?.areaColorOpacity ?? 0.15, areaBorderColor = theme?.areaBorderColor ?? '#888888', areaBorderRadius = theme?.areaBorderRadius ?? 4, areaBorderWidth = theme?.areaBorderWidth ?? 1, areaLineDash = theme?.areaLineDash, outerPadding = theme?.outerPadding ?? 4 } = annotationArea;
27
+ const textBackgroundOpacity = theme?.textBackgroundOpacity;
27
28
  const dataset = advancedVSeed.dataset.flat();
28
29
  const selectedData = selectorPoint ? dataset.filter((datum)=>selector(datum, selectorPoint)) : [];
29
30
  const textPosition = annotationArea.textPosition ?? defaultTextPosition;
@@ -94,7 +95,6 @@ const annotationArea_annotationArea = (spec, context)=>{
94
95
  visible: true,
95
96
  text: text,
96
97
  style: {
97
- opacity: 0.95,
98
98
  textAlign: textAlign,
99
99
  textBaseline: textBaseline,
100
100
  fill: textColor,
@@ -107,7 +107,7 @@ const annotationArea_annotationArea = (spec, context)=>{
107
107
  visible: textBackgroundVisible,
108
108
  padding: textBackgroundPadding,
109
109
  style: {
110
- opacity: 0.95,
110
+ opacity: textBackgroundOpacity ?? 0.95,
111
111
  cornerRadius: textBackgroundBorderRadius ?? 4,
112
112
  fill: textBackgroundColor,
113
113
  stroke: textBackgroundBorderColor,
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/spec/chart/pipes/annotation/annotationArea.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/annotation/annotationArea.ts"],"sourcesContent":["/**\n * @description 适用于线图、面积图等的区块标注,计算标注区块的时候,只考虑点的大小\n */\nimport type { ICartesianSeries, ILineChartSpec } from '@visactor/vchart'\nimport { selector } from '../../../../../dataSelector'\nimport type { Datum, VChartSpecPipe, VSeed } from 'src/types'\nimport { ANNOTATION_AREA_TEXT_STYLE_BY_POSITION, isSubset } from './utils'\nimport { ANNOTATION_Z_INDEX } from '../../../../utils/constant'\nimport { isBarLikeChart } from 'src/pipeline/utils/chatType'\n\nexport const annotationArea: VChartSpecPipe = (spec, context) => {\n const { advancedVSeed, vseed } = context\n const { annotation, config } = advancedVSeed\n\n if (!annotation || !annotation.annotationArea) {\n return spec\n }\n\n const theme = config?.[vseed.chartType as 'column']?.annotation?.annotationArea\n const { annotationArea } = annotation\n const annotationAreaList = Array.isArray(annotationArea) ? annotationArea : [annotationArea]\n\n const positionMap = {\n top: 'insideTop',\n topRight: 'insideTopRight',\n topLeft: 'insideTopLeft',\n bottom: 'insideBottom',\n bottomLeft: 'insideBottomLeft',\n bottomRight: 'insideBottomRight',\n left: 'insideLeft',\n right: 'insideRight',\n }\n const defaultTextPosition = isBarLikeChart(advancedVSeed as VSeed) ? 'right' : 'top'\n\n const markArea = annotationAreaList.flatMap((annotationArea) => {\n const {\n selector: selectorPoint,\n text = '',\n textColor = theme?.textColor ?? '#ffffff',\n textFontSize = theme?.textFontSize ?? 12,\n textFontWeight = theme?.textFontWeight ?? 400,\n\n textBackgroundVisible = theme?.textBackgroundVisible ?? true,\n textBackgroundColor = theme?.textBackgroundColor ?? '#191d24',\n textBackgroundBorderColor = theme?.textBackgroundBorderColor ?? '#191d24',\n textBackgroundBorderWidth = theme?.textBackgroundBorderWidth ?? 1,\n textBackgroundBorderRadius = theme?.textBackgroundBorderRadius ?? 4,\n textBackgroundPadding = theme?.textBackgroundPadding ?? 4,\n\n areaColor = theme?.areaColor ?? '#888888',\n areaColorOpacity = theme?.areaColorOpacity ?? 0.15,\n areaBorderColor = theme?.areaBorderColor ?? '#888888',\n areaBorderRadius = theme?.areaBorderRadius ?? 4,\n areaBorderWidth = theme?.areaBorderWidth ?? 1,\n areaLineDash = theme?.areaLineDash,\n\n outerPadding = theme?.outerPadding ?? 4,\n } = annotationArea\n\n const dataset = advancedVSeed.dataset.flat()\n const selectedData = selectorPoint ? dataset.filter((datum) => selector(datum, selectorPoint)) : []\n const textPosition: string = annotationArea.textPosition ?? defaultTextPosition\n const textAlign =\n annotationArea.textAlign ??\n ANNOTATION_AREA_TEXT_STYLE_BY_POSITION[textPosition as keyof typeof ANNOTATION_AREA_TEXT_STYLE_BY_POSITION]\n .textAlign\n const textBaseline =\n annotationArea.textBaseline ??\n ANNOTATION_AREA_TEXT_STYLE_BY_POSITION[textPosition as keyof typeof ANNOTATION_AREA_TEXT_STYLE_BY_POSITION]\n .textBaseline\n\n return {\n zIndex: ANNOTATION_Z_INDEX,\n regionRelative: true,\n positions: (data: Datum[], context: ICartesianSeries) => {\n const positionData = data.filter((item) => selectedData.some((datum) => isSubset(datum, item)))\n const xyList = positionData.map((datum) => context.dataToPosition(datum) as { x: number; y: number })\n\n const yAxisHelper = context.getYAxisHelper() as unknown as {\n getBandwidth: (depth?: number) => number\n getScale: () => {\n range: () => number[]\n }\n }\n const xAxisHelper = context.getXAxisHelper() as unknown as {\n getBandwidth: (depth?: number) => number\n getScale: () => {\n range: () => number[]\n }\n }\n\n if (typeof xAxisHelper?.getBandwidth === 'function') {\n const regionRect = context.getRegion().getLayoutRect()\n\n const minX = Math.min(...xyList.map((item) => item.x)) - (outerPadding || 4)\n const maxX = Math.max(...xyList.map((item) => item.x)) + (outerPadding || 4)\n const minY = 0\n const maxY = regionRect.height\n return [\n // 左上\n {\n x: minX,\n y: minY,\n },\n // 右上\n {\n x: maxX,\n y: minY,\n },\n // 右下\n {\n x: maxX,\n y: maxY,\n },\n // 左下\n {\n x: minX,\n y: maxY,\n },\n ]\n }\n\n if (typeof yAxisHelper?.getBandwidth === 'function') {\n const regionRect = context.getRegion().getLayoutRect()\n\n const minY = Math.min(...xyList.map((item) => item.y)) - (outerPadding || 4)\n const maxY = Math.max(...xyList.map((item) => item.y)) + (outerPadding || 4)\n const minX = 0\n const maxX = regionRect.width\n\n return [\n // 左上\n {\n x: minX,\n y: minY,\n },\n // 右上\n {\n x: maxX,\n y: minY,\n },\n // 右下\n {\n x: maxX,\n y: maxY,\n },\n // 左下\n {\n x: minX,\n y: maxY,\n },\n ]\n }\n\n return []\n },\n label: {\n position: (positionMap as any)[textPosition],\n visible: true,\n text: text,\n style: {\n opacity: 0.95,\n textAlign: textAlign,\n textBaseline: textBaseline,\n fill: textColor,\n stroke: textBackgroundColor,\n lineWidth: 1,\n fontSize: textFontSize,\n fontWeight: textFontWeight,\n },\n\n labelBackground: {\n visible: textBackgroundVisible,\n padding: textBackgroundPadding,\n style: {\n opacity: 0.95,\n cornerRadius: textBackgroundBorderRadius ?? 4,\n fill: textBackgroundColor,\n stroke: textBackgroundBorderColor,\n lineWidth: textBackgroundBorderWidth,\n fillOpacity: 1,\n },\n },\n },\n area: {\n style: {\n visible: true,\n fill: areaColor,\n fillOpacity: areaColorOpacity,\n stroke: areaBorderColor,\n lineWidth: areaBorderWidth,\n cornerRadius: areaBorderRadius,\n lineDash: areaLineDash,\n },\n },\n }\n }) as ILineChartSpec['markArea']\n\n return {\n ...spec,\n markArea: markArea,\n }\n}\n"],"names":["annotationArea","spec","context","advancedVSeed","vseed","annotation","config","theme","annotationAreaList","Array","positionMap","defaultTextPosition","isBarLikeChart","markArea","selectorPoint","text","textColor","textFontSize","textFontWeight","textBackgroundVisible","textBackgroundColor","textBackgroundBorderColor","textBackgroundBorderWidth","textBackgroundBorderRadius","textBackgroundPadding","areaColor","areaColorOpacity","areaBorderColor","areaBorderRadius","areaBorderWidth","areaLineDash","outerPadding","dataset","selectedData","datum","selector","textPosition","textAlign","ANNOTATION_AREA_TEXT_STYLE_BY_POSITION","textBaseline","ANNOTATION_Z_INDEX","data","positionData","item","isSubset","xyList","yAxisHelper","xAxisHelper","regionRect","minX","Math","maxX","minY","maxY"],"mappings":";;;;AAUO,MAAMA,gCAAiC,CAACC,MAAMC;IACnD,MAAM,EAAEC,aAAa,EAAEC,KAAK,EAAE,GAAGF;IACjC,MAAM,EAAEG,UAAU,EAAEC,MAAM,EAAE,GAAGH;IAE/B,IAAI,CAACE,cAAc,CAACA,WAAW,cAAc,EAC3C,OAAOJ;IAGT,MAAMM,QAAQD,QAAQ,CAACF,MAAM,SAAS,CAAa,EAAE,YAAY;IACjE,MAAM,EAAEJ,cAAc,EAAE,GAAGK;IAC3B,MAAMG,qBAAqBC,MAAM,OAAO,CAACT,kBAAkBA,iBAAiB;QAACA;KAAe;IAE5F,MAAMU,cAAc;QAClB,KAAK;QACL,UAAU;QACV,SAAS;QACT,QAAQ;QACR,YAAY;QACZ,aAAa;QACb,MAAM;QACN,OAAO;IACT;IACA,MAAMC,sBAAsBC,eAAeT,iBAA0B,UAAU;IAE/E,MAAMU,WAAWL,mBAAmB,OAAO,CAAC,CAACR;QAC3C,MAAM,EACJ,UAAUc,aAAa,EACvBC,OAAO,EAAE,EACTC,YAAYT,OAAO,aAAa,SAAS,EACzCU,eAAeV,OAAO,gBAAgB,EAAE,EACxCW,iBAAiBX,OAAO,kBAAkB,GAAG,EAE7CY,wBAAwBZ,OAAO,yBAAyB,IAAI,EAC5Da,sBAAsBb,OAAO,uBAAuB,SAAS,EAC7Dc,4BAA4Bd,OAAO,6BAA6B,SAAS,EACzEe,4BAA4Bf,OAAO,6BAA6B,CAAC,EACjEgB,6BAA6BhB,OAAO,8BAA8B,CAAC,EACnEiB,wBAAwBjB,OAAO,yBAAyB,CAAC,EAEzDkB,YAAYlB,OAAO,aAAa,SAAS,EACzCmB,mBAAmBnB,OAAO,oBAAoB,IAAI,EAClDoB,kBAAkBpB,OAAO,mBAAmB,SAAS,EACrDqB,mBAAmBrB,OAAO,oBAAoB,CAAC,EAC/CsB,kBAAkBtB,OAAO,mBAAmB,CAAC,EAC7CuB,eAAevB,OAAO,YAAY,EAElCwB,eAAexB,OAAO,gBAAgB,CAAC,EACxC,GAAGP;QAEJ,MAAMgC,UAAU7B,cAAc,OAAO,CAAC,IAAI;QAC1C,MAAM8B,eAAenB,gBAAgBkB,QAAQ,MAAM,CAAC,CAACE,QAAUC,SAASD,OAAOpB,kBAAkB,EAAE;QACnG,MAAMsB,eAAuBpC,eAAe,YAAY,IAAIW;QAC5D,MAAM0B,YACJrC,eAAe,SAAS,IACxBsC,sCAAsC,CAACF,aAAoE,CACxG,SAAS;QACd,MAAMG,eACJvC,eAAe,YAAY,IAC3BsC,sCAAsC,CAACF,aAAoE,CACxG,YAAY;QAEjB,OAAO;YACL,QAAQI;YACR,gBAAgB;YAChB,WAAW,CAACC,MAAevC;gBACzB,MAAMwC,eAAeD,KAAK,MAAM,CAAC,CAACE,OAASV,aAAa,IAAI,CAAC,CAACC,QAAUU,SAASV,OAAOS;gBACxF,MAAME,SAASH,aAAa,GAAG,CAAC,CAACR,QAAUhC,QAAQ,cAAc,CAACgC;gBAElE,MAAMY,cAAc5C,QAAQ,cAAc;gBAM1C,MAAM6C,cAAc7C,QAAQ,cAAc;gBAO1C,IAAI,AAAqC,cAArC,OAAO6C,aAAa,cAA6B;oBACnD,MAAMC,aAAa9C,QAAQ,SAAS,GAAG,aAAa;oBAEpD,MAAM+C,OAAOC,KAAK,GAAG,IAAIL,OAAO,GAAG,CAAC,CAACF,OAASA,KAAK,CAAC,KAAMZ,CAAAA,gBAAgB;oBAC1E,MAAMoB,OAAOD,KAAK,GAAG,IAAIL,OAAO,GAAG,CAAC,CAACF,OAASA,KAAK,CAAC,KAAMZ,CAAAA,gBAAgB;oBAC1E,MAAMqB,OAAO;oBACb,MAAMC,OAAOL,WAAW,MAAM;oBAC9B,OAAO;wBAEL;4BACE,GAAGC;4BACH,GAAGG;wBACL;wBAEA;4BACE,GAAGD;4BACH,GAAGC;wBACL;wBAEA;4BACE,GAAGD;4BACH,GAAGE;wBACL;wBAEA;4BACE,GAAGJ;4BACH,GAAGI;wBACL;qBACD;gBACH;gBAEA,IAAI,AAAqC,cAArC,OAAOP,aAAa,cAA6B;oBACnD,MAAME,aAAa9C,QAAQ,SAAS,GAAG,aAAa;oBAEpD,MAAMkD,OAAOF,KAAK,GAAG,IAAIL,OAAO,GAAG,CAAC,CAACF,OAASA,KAAK,CAAC,KAAMZ,CAAAA,gBAAgB;oBAC1E,MAAMsB,OAAOH,KAAK,GAAG,IAAIL,OAAO,GAAG,CAAC,CAACF,OAASA,KAAK,CAAC,KAAMZ,CAAAA,gBAAgB;oBAC1E,MAAMkB,OAAO;oBACb,MAAME,OAAOH,WAAW,KAAK;oBAE7B,OAAO;wBAEL;4BACE,GAAGC;4BACH,GAAGG;wBACL;wBAEA;4BACE,GAAGD;4BACH,GAAGC;wBACL;wBAEA;4BACE,GAAGD;4BACH,GAAGE;wBACL;wBAEA;4BACE,GAAGJ;4BACH,GAAGI;wBACL;qBACD;gBACH;gBAEA,OAAO,EAAE;YACX;YACA,OAAO;gBACL,UAAW3C,WAAmB,CAAC0B,aAAa;gBAC5C,SAAS;gBACT,MAAMrB;gBACN,OAAO;oBACL,SAAS;oBACT,WAAWsB;oBACX,cAAcE;oBACd,MAAMvB;oBACN,QAAQI;oBACR,WAAW;oBACX,UAAUH;oBACV,YAAYC;gBACd;gBAEA,iBAAiB;oBACf,SAASC;oBACT,SAASK;oBACT,OAAO;wBACL,SAAS;wBACT,cAAcD,8BAA8B;wBAC5C,MAAMH;wBACN,QAAQC;wBACR,WAAWC;wBACX,aAAa;oBACf;gBACF;YACF;YACA,MAAM;gBACJ,OAAO;oBACL,SAAS;oBACT,MAAMG;oBACN,aAAaC;oBACb,QAAQC;oBACR,WAAWE;oBACX,cAAcD;oBACd,UAAUE;gBACZ;YACF;QACF;IACF;IAEA,OAAO;QACL,GAAG7B,IAAI;QACP,UAAUY;IACZ;AACF"}
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/annotation/annotationArea.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/annotation/annotationArea.ts"],"sourcesContent":["/**\n * @description 适用于线图、面积图等的区块标注,计算标注区块的时候,只考虑点的大小\n */\nimport type { ICartesianSeries, ILineChartSpec } from '@visactor/vchart'\nimport { selector } from '../../../../../dataSelector'\nimport type { Datum, VChartSpecPipe, VSeed } from 'src/types'\nimport { ANNOTATION_AREA_TEXT_STYLE_BY_POSITION, isSubset } from './utils'\nimport { ANNOTATION_Z_INDEX } from '../../../../utils/constant'\nimport { isBarLikeChart } from 'src/pipeline/utils/chatType'\n\nexport const annotationArea: VChartSpecPipe = (spec, context) => {\n const { advancedVSeed, vseed } = context\n const { annotation, config } = advancedVSeed\n\n if (!annotation || !annotation.annotationArea) {\n return spec\n }\n\n const theme = config?.[vseed.chartType as 'column']?.annotation?.annotationArea\n const { annotationArea } = annotation\n const annotationAreaList = Array.isArray(annotationArea) ? annotationArea : [annotationArea]\n\n const positionMap = {\n top: 'insideTop',\n topRight: 'insideTopRight',\n topLeft: 'insideTopLeft',\n bottom: 'insideBottom',\n bottomLeft: 'insideBottomLeft',\n bottomRight: 'insideBottomRight',\n left: 'insideLeft',\n right: 'insideRight',\n }\n const defaultTextPosition = isBarLikeChart(advancedVSeed as VSeed) ? 'right' : 'top'\n\n const markArea = annotationAreaList.flatMap((annotationArea) => {\n const {\n selector: selectorPoint,\n text = '',\n textColor = theme?.textColor ?? '#ffffff',\n textFontSize = theme?.textFontSize ?? 12,\n textFontWeight = theme?.textFontWeight ?? 400,\n\n textBackgroundVisible = theme?.textBackgroundVisible ?? true,\n textBackgroundColor = theme?.textBackgroundColor ?? '#191d24',\n textBackgroundBorderColor = theme?.textBackgroundBorderColor ?? '#191d24',\n textBackgroundBorderWidth = theme?.textBackgroundBorderWidth ?? 1,\n textBackgroundBorderRadius = theme?.textBackgroundBorderRadius ?? 4,\n textBackgroundPadding = theme?.textBackgroundPadding ?? 4,\n\n areaColor = theme?.areaColor ?? '#888888',\n areaColorOpacity = theme?.areaColorOpacity ?? 0.15,\n areaBorderColor = theme?.areaBorderColor ?? '#888888',\n areaBorderRadius = theme?.areaBorderRadius ?? 4,\n areaBorderWidth = theme?.areaBorderWidth ?? 1,\n areaLineDash = theme?.areaLineDash,\n\n outerPadding = theme?.outerPadding ?? 4,\n } = annotationArea\n const textBackgroundOpacity = theme?.textBackgroundOpacity\n\n const dataset = advancedVSeed.dataset.flat()\n const selectedData = selectorPoint ? dataset.filter((datum) => selector(datum, selectorPoint)) : []\n const textPosition: string = annotationArea.textPosition ?? defaultTextPosition\n const textAlign =\n annotationArea.textAlign ??\n ANNOTATION_AREA_TEXT_STYLE_BY_POSITION[textPosition as keyof typeof ANNOTATION_AREA_TEXT_STYLE_BY_POSITION]\n .textAlign\n const textBaseline =\n annotationArea.textBaseline ??\n ANNOTATION_AREA_TEXT_STYLE_BY_POSITION[textPosition as keyof typeof ANNOTATION_AREA_TEXT_STYLE_BY_POSITION]\n .textBaseline\n\n return {\n zIndex: ANNOTATION_Z_INDEX,\n regionRelative: true,\n positions: (data: Datum[], context: ICartesianSeries) => {\n const positionData = data.filter((item) => selectedData.some((datum) => isSubset(datum, item)))\n const xyList = positionData.map((datum) => context.dataToPosition(datum) as { x: number; y: number })\n\n const yAxisHelper = context.getYAxisHelper() as unknown as {\n getBandwidth: (depth?: number) => number\n getScale: () => {\n range: () => number[]\n }\n }\n const xAxisHelper = context.getXAxisHelper() as unknown as {\n getBandwidth: (depth?: number) => number\n getScale: () => {\n range: () => number[]\n }\n }\n\n if (typeof xAxisHelper?.getBandwidth === 'function') {\n const regionRect = context.getRegion().getLayoutRect()\n\n const minX = Math.min(...xyList.map((item) => item.x)) - (outerPadding || 4)\n const maxX = Math.max(...xyList.map((item) => item.x)) + (outerPadding || 4)\n const minY = 0\n const maxY = regionRect.height\n return [\n // 左上\n {\n x: minX,\n y: minY,\n },\n // 右上\n {\n x: maxX,\n y: minY,\n },\n // 右下\n {\n x: maxX,\n y: maxY,\n },\n // 左下\n {\n x: minX,\n y: maxY,\n },\n ]\n }\n\n if (typeof yAxisHelper?.getBandwidth === 'function') {\n const regionRect = context.getRegion().getLayoutRect()\n\n const minY = Math.min(...xyList.map((item) => item.y)) - (outerPadding || 4)\n const maxY = Math.max(...xyList.map((item) => item.y)) + (outerPadding || 4)\n const minX = 0\n const maxX = regionRect.width\n\n return [\n // 左上\n {\n x: minX,\n y: minY,\n },\n // 右上\n {\n x: maxX,\n y: minY,\n },\n // 右下\n {\n x: maxX,\n y: maxY,\n },\n // 左下\n {\n x: minX,\n y: maxY,\n },\n ]\n }\n\n return []\n },\n label: {\n position: (positionMap as any)[textPosition],\n visible: true,\n text: text,\n style: {\n textAlign: textAlign,\n textBaseline: textBaseline,\n fill: textColor,\n stroke: textBackgroundColor,\n lineWidth: 1,\n fontSize: textFontSize,\n fontWeight: textFontWeight,\n },\n\n labelBackground: {\n visible: textBackgroundVisible,\n padding: textBackgroundPadding,\n style: {\n opacity: textBackgroundOpacity ?? 0.95,\n cornerRadius: textBackgroundBorderRadius ?? 4,\n fill: textBackgroundColor,\n stroke: textBackgroundBorderColor,\n lineWidth: textBackgroundBorderWidth,\n fillOpacity: 1,\n },\n },\n },\n area: {\n style: {\n visible: true,\n fill: areaColor,\n fillOpacity: areaColorOpacity,\n stroke: areaBorderColor,\n lineWidth: areaBorderWidth,\n cornerRadius: areaBorderRadius,\n lineDash: areaLineDash,\n },\n },\n }\n }) as ILineChartSpec['markArea']\n\n return {\n ...spec,\n markArea: markArea,\n }\n}\n"],"names":["annotationArea","spec","context","advancedVSeed","vseed","annotation","config","theme","annotationAreaList","Array","positionMap","defaultTextPosition","isBarLikeChart","markArea","selectorPoint","text","textColor","textFontSize","textFontWeight","textBackgroundVisible","textBackgroundColor","textBackgroundBorderColor","textBackgroundBorderWidth","textBackgroundBorderRadius","textBackgroundPadding","areaColor","areaColorOpacity","areaBorderColor","areaBorderRadius","areaBorderWidth","areaLineDash","outerPadding","textBackgroundOpacity","dataset","selectedData","datum","selector","textPosition","textAlign","ANNOTATION_AREA_TEXT_STYLE_BY_POSITION","textBaseline","ANNOTATION_Z_INDEX","data","positionData","item","isSubset","xyList","yAxisHelper","xAxisHelper","regionRect","minX","Math","maxX","minY","maxY"],"mappings":"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"}
@@ -24,6 +24,7 @@ const annotationAreaBand = (spec, context)=>{
24
24
  const defaultTextPosition = isBarLikeChart(advancedVSeed) ? 'right' : 'top';
25
25
  const markArea = annotationAreaList.flatMap((annotationArea)=>{
26
26
  const { selector: selectorPoint, text = '', textColor = theme?.textColor ?? '#ffffff', textFontSize = theme?.textFontSize ?? 12, textFontWeight = theme?.textFontWeight ?? 400, textBackgroundVisible = theme?.textBackgroundVisible ?? true, textBackgroundColor = theme?.textBackgroundColor ?? '#191d24', textBackgroundBorderColor = theme?.textBackgroundBorderColor ?? '#191d24', textBackgroundBorderWidth = theme?.textBackgroundBorderWidth ?? 1, textBackgroundBorderRadius = theme?.textBackgroundBorderRadius ?? 4, textBackgroundPadding = theme?.textBackgroundPadding ?? 4, areaColor = theme?.areaColor ?? '#888888', areaColorOpacity = theme?.areaColorOpacity ?? 0.15, areaBorderColor = theme?.areaBorderColor ?? '#888888', areaBorderRadius = theme?.areaBorderRadius ?? 4, areaBorderWidth = theme?.areaBorderWidth ?? 1, areaLineDash = theme?.areaLineDash, outerPadding = theme?.outerPadding ?? 4 } = annotationArea;
27
+ const textBackgroundOpacity = theme?.textBackgroundOpacity;
27
28
  const textPosition = annotationArea.textPosition ?? defaultTextPosition;
28
29
  const textAlign = annotationArea.textAlign ?? ANNOTATION_AREA_TEXT_STYLE_BY_POSITION[textPosition].textAlign;
29
30
  const textBaseline = annotationArea.textBaseline ?? ANNOTATION_AREA_TEXT_STYLE_BY_POSITION[textPosition].textBaseline;
@@ -107,7 +108,6 @@ const annotationAreaBand = (spec, context)=>{
107
108
  visible: true,
108
109
  text: text,
109
110
  style: {
110
- opacity: 0.95,
111
111
  textAlign: textAlign,
112
112
  textBaseline: textBaseline,
113
113
  stroke: textBackgroundColor,
@@ -120,7 +120,7 @@ const annotationAreaBand = (spec, context)=>{
120
120
  visible: textBackgroundVisible,
121
121
  padding: textBackgroundPadding,
122
122
  style: {
123
- opacity: 0.95,
123
+ opacity: textBackgroundOpacity ?? 0.95,
124
124
  cornerRadius: textBackgroundBorderRadius ?? 4,
125
125
  fill: textBackgroundColor,
126
126
  stroke: textBackgroundBorderColor,
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/spec/chart/pipes/annotation/annotationAreaBand.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/annotation/annotationAreaBand.ts"],"sourcesContent":["import { type ICartesianSeries, type ILineChartSpec } from '@visactor/vchart'\nimport { selector } from '../../../../../dataSelector'\nimport type { Datum, VChartSpecPipe, VSeed } from 'src/types'\nimport { ANNOTATION_AREA_TEXT_STYLE_BY_POSITION, isSubset } from './utils'\nimport { ANNOTATION_Z_INDEX } from '../../../../utils/constant'\nimport { isBarLikeChart } from 'src/pipeline/utils/chatType'\n\nexport const annotationAreaBand: VChartSpecPipe = (spec, context) => {\n const { advancedVSeed, vseed } = context\n const { annotation, config } = advancedVSeed\n\n if (!annotation || !annotation.annotationArea) {\n return spec\n }\n const theme = config?.[vseed.chartType as 'column']?.annotation?.annotationArea\n const { annotationArea } = annotation\n const annotationAreaList = Array.isArray(annotationArea) ? annotationArea : [annotationArea]\n\n const positionMap = {\n top: 'insideTop',\n topRight: 'insideTopRight',\n topLeft: 'insideTopLeft',\n bottom: 'insideBottom',\n bottomLeft: 'insideBottomLeft',\n bottomRight: 'insideBottomRight',\n left: 'insideLeft',\n right: 'insideRight',\n }\n const defaultTextPosition = isBarLikeChart(advancedVSeed as VSeed) ? 'right' : 'top'\n\n const markArea = annotationAreaList.flatMap((annotationArea) => {\n const {\n selector: selectorPoint,\n text = '',\n textColor = theme?.textColor ?? '#ffffff',\n textFontSize = theme?.textFontSize ?? 12,\n textFontWeight = theme?.textFontWeight ?? 400,\n\n textBackgroundVisible = theme?.textBackgroundVisible ?? true,\n textBackgroundColor = theme?.textBackgroundColor ?? '#191d24',\n textBackgroundBorderColor = theme?.textBackgroundBorderColor ?? '#191d24',\n textBackgroundBorderWidth = theme?.textBackgroundBorderWidth ?? 1,\n textBackgroundBorderRadius = theme?.textBackgroundBorderRadius ?? 4,\n textBackgroundPadding = theme?.textBackgroundPadding ?? 4,\n\n areaColor = theme?.areaColor ?? '#888888',\n areaColorOpacity = theme?.areaColorOpacity ?? 0.15,\n areaBorderColor = theme?.areaBorderColor ?? '#888888',\n areaBorderRadius = theme?.areaBorderRadius ?? 4,\n areaBorderWidth = theme?.areaBorderWidth ?? 1,\n areaLineDash = theme?.areaLineDash,\n\n outerPadding = theme?.outerPadding ?? 4,\n } = annotationArea\n const textPosition: string = annotationArea.textPosition ?? defaultTextPosition\n const textAlign =\n annotationArea.textAlign ??\n ANNOTATION_AREA_TEXT_STYLE_BY_POSITION[textPosition as keyof typeof ANNOTATION_AREA_TEXT_STYLE_BY_POSITION]\n .textAlign\n const textBaseline =\n annotationArea.textBaseline ??\n ANNOTATION_AREA_TEXT_STYLE_BY_POSITION[textPosition as keyof typeof ANNOTATION_AREA_TEXT_STYLE_BY_POSITION]\n .textBaseline\n\n const dataset = advancedVSeed.dataset.flat()\n const selectedData = selectorPoint ? dataset.filter((datum) => selector(datum, selectorPoint)) : []\n\n return {\n zIndex: ANNOTATION_Z_INDEX,\n regionRelative: true,\n // coordinates: selectedData,\n positions: (data: Datum[], context: ICartesianSeries & { _scaleConfig?: { bandPosition?: number } }) => {\n const positionData = data.filter((item) => selectedData.some((datum) => isSubset(datum, item)))\n const xyList = positionData.map((datum) => context.dataToPosition(datum) as { x: number; y: number })\n\n const bandPosition = context?._scaleConfig?.bandPosition || 0\n\n const yAxisHelper = context.getYAxisHelper() as unknown as {\n getBandwidth: (depth?: number) => number\n getScale: () => {\n range: () => number[]\n }\n }\n const xAxisHelper = context.getXAxisHelper() as unknown as {\n getBandwidth: (depth?: number) => number\n getScale: () => {\n range: () => number[]\n }\n }\n\n if (typeof xAxisHelper?.getBandwidth === 'function') {\n const depth = context.fieldX.length ?? 0\n const xBandWidth = xAxisHelper?.getBandwidth?.(depth - 1)\n const regionRect = context.getRegion().getLayoutRect()\n const startX = Math.min(...xyList.map((item) => item.x)) - (outerPadding || 4)\n const endX = Math.max(...xyList.map((item) => item.x)) + (outerPadding || 4)\n\n const width = endX - startX + xBandWidth\n const middleX = (endX + startX) / 2 + xBandWidth * (0.5 - bandPosition)\n\n const minX = middleX - width / 2\n const maxX = middleX + width / 2\n\n const minY = 0\n const maxY = regionRect.height\n\n return [\n // 左上\n {\n x: minX,\n y: minY,\n },\n // 右上\n {\n x: maxX,\n y: minY,\n },\n // 右下\n {\n x: maxX,\n y: maxY,\n },\n // 左下\n {\n x: minX,\n y: maxY,\n },\n ]\n }\n\n if (typeof yAxisHelper?.getBandwidth === 'function') {\n const depth = context.fieldY.length ?? 0\n const yBandWidth = yAxisHelper?.getBandwidth?.(depth - 1)\n const regionRect = context.getRegion().getLayoutRect()\n\n const startY = Math.min(...xyList.map((item) => item.y)) - (outerPadding || 4)\n const endY = Math.max(...xyList.map((item) => item.y)) + (outerPadding || 4)\n const width = endY - startY + yBandWidth\n const middleY = (endY + startY) / 2 + yBandWidth * (0.5 - bandPosition)\n\n const minY = middleY - width / 2\n const maxY = middleY + width / 2\n const minX = 0\n const maxX = regionRect.width\n\n return [\n // 左上\n {\n x: minX,\n y: minY,\n },\n // 右上\n {\n x: maxX,\n y: minY,\n },\n // 右下\n {\n x: maxX,\n y: maxY,\n },\n // 左下\n {\n x: minX,\n y: maxY,\n },\n ]\n }\n\n return []\n },\n label: {\n position: positionMap[textPosition as 'bottom'],\n visible: true,\n text: text,\n style: {\n opacity: 0.95,\n textAlign: textAlign,\n textBaseline: textBaseline,\n stroke: textBackgroundColor,\n lineWidth: 1,\n fill: textColor,\n fontSize: textFontSize,\n fontWeight: textFontWeight,\n },\n\n labelBackground: {\n visible: textBackgroundVisible,\n padding: textBackgroundPadding,\n style: {\n opacity: 0.95,\n cornerRadius: textBackgroundBorderRadius ?? 4,\n fill: textBackgroundColor,\n stroke: textBackgroundBorderColor,\n lineWidth: textBackgroundBorderWidth,\n fillOpacity: 1,\n },\n },\n },\n area: {\n style: {\n visible: true,\n fill: areaColor,\n fillOpacity: areaColorOpacity,\n stroke: areaBorderColor,\n lineWidth: areaBorderWidth,\n cornerRadius: areaBorderRadius,\n lineDash: areaLineDash,\n },\n },\n }\n }) as ILineChartSpec['markArea']\n\n return {\n ...spec,\n markArea: markArea,\n }\n}\n"],"names":["annotationAreaBand","spec","context","advancedVSeed","vseed","annotation","config","theme","annotationArea","annotationAreaList","Array","positionMap","defaultTextPosition","isBarLikeChart","markArea","selectorPoint","text","textColor","textFontSize","textFontWeight","textBackgroundVisible","textBackgroundColor","textBackgroundBorderColor","textBackgroundBorderWidth","textBackgroundBorderRadius","textBackgroundPadding","areaColor","areaColorOpacity","areaBorderColor","areaBorderRadius","areaBorderWidth","areaLineDash","outerPadding","textPosition","textAlign","ANNOTATION_AREA_TEXT_STYLE_BY_POSITION","textBaseline","dataset","selectedData","datum","selector","ANNOTATION_Z_INDEX","data","positionData","item","isSubset","xyList","bandPosition","yAxisHelper","xAxisHelper","depth","xBandWidth","regionRect","startX","Math","endX","width","middleX","minX","maxX","minY","maxY","yBandWidth","startY","endY","middleY"],"mappings":"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"}
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/annotation/annotationAreaBand.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/annotation/annotationAreaBand.ts"],"sourcesContent":["import { type ICartesianSeries, type ILineChartSpec } from '@visactor/vchart'\nimport { selector } from '../../../../../dataSelector'\nimport type { Datum, VChartSpecPipe, VSeed } from 'src/types'\nimport { ANNOTATION_AREA_TEXT_STYLE_BY_POSITION, isSubset } from './utils'\nimport { ANNOTATION_Z_INDEX } from '../../../../utils/constant'\nimport { isBarLikeChart } from 'src/pipeline/utils/chatType'\n\nexport const annotationAreaBand: VChartSpecPipe = (spec, context) => {\n const { advancedVSeed, vseed } = context\n const { annotation, config } = advancedVSeed\n\n if (!annotation || !annotation.annotationArea) {\n return spec\n }\n const theme = config?.[vseed.chartType as 'column']?.annotation?.annotationArea\n const { annotationArea } = annotation\n const annotationAreaList = Array.isArray(annotationArea) ? annotationArea : [annotationArea]\n\n const positionMap = {\n top: 'insideTop',\n topRight: 'insideTopRight',\n topLeft: 'insideTopLeft',\n bottom: 'insideBottom',\n bottomLeft: 'insideBottomLeft',\n bottomRight: 'insideBottomRight',\n left: 'insideLeft',\n right: 'insideRight',\n }\n const defaultTextPosition = isBarLikeChart(advancedVSeed as VSeed) ? 'right' : 'top'\n\n const markArea = annotationAreaList.flatMap((annotationArea) => {\n const {\n selector: selectorPoint,\n text = '',\n textColor = theme?.textColor ?? '#ffffff',\n textFontSize = theme?.textFontSize ?? 12,\n textFontWeight = theme?.textFontWeight ?? 400,\n\n textBackgroundVisible = theme?.textBackgroundVisible ?? true,\n textBackgroundColor = theme?.textBackgroundColor ?? '#191d24',\n textBackgroundBorderColor = theme?.textBackgroundBorderColor ?? '#191d24',\n textBackgroundBorderWidth = theme?.textBackgroundBorderWidth ?? 1,\n textBackgroundBorderRadius = theme?.textBackgroundBorderRadius ?? 4,\n textBackgroundPadding = theme?.textBackgroundPadding ?? 4,\n\n areaColor = theme?.areaColor ?? '#888888',\n areaColorOpacity = theme?.areaColorOpacity ?? 0.15,\n areaBorderColor = theme?.areaBorderColor ?? '#888888',\n areaBorderRadius = theme?.areaBorderRadius ?? 4,\n areaBorderWidth = theme?.areaBorderWidth ?? 1,\n areaLineDash = theme?.areaLineDash,\n\n outerPadding = theme?.outerPadding ?? 4,\n } = annotationArea\n const textBackgroundOpacity = theme?.textBackgroundOpacity\n const textPosition: string = annotationArea.textPosition ?? defaultTextPosition\n const textAlign =\n annotationArea.textAlign ??\n ANNOTATION_AREA_TEXT_STYLE_BY_POSITION[textPosition as keyof typeof ANNOTATION_AREA_TEXT_STYLE_BY_POSITION]\n .textAlign\n const textBaseline =\n annotationArea.textBaseline ??\n ANNOTATION_AREA_TEXT_STYLE_BY_POSITION[textPosition as keyof typeof ANNOTATION_AREA_TEXT_STYLE_BY_POSITION]\n .textBaseline\n\n const dataset = advancedVSeed.dataset.flat()\n const selectedData = selectorPoint ? dataset.filter((datum) => selector(datum, selectorPoint)) : []\n\n return {\n zIndex: ANNOTATION_Z_INDEX,\n regionRelative: true,\n // coordinates: selectedData,\n positions: (data: Datum[], context: ICartesianSeries & { _scaleConfig?: { bandPosition?: number } }) => {\n const positionData = data.filter((item) => selectedData.some((datum) => isSubset(datum, item)))\n const xyList = positionData.map((datum) => context.dataToPosition(datum) as { x: number; y: number })\n\n const bandPosition = context?._scaleConfig?.bandPosition || 0\n\n const yAxisHelper = context.getYAxisHelper() as unknown as {\n getBandwidth: (depth?: number) => number\n getScale: () => {\n range: () => number[]\n }\n }\n const xAxisHelper = context.getXAxisHelper() as unknown as {\n getBandwidth: (depth?: number) => number\n getScale: () => {\n range: () => number[]\n }\n }\n\n if (typeof xAxisHelper?.getBandwidth === 'function') {\n const depth = context.fieldX.length ?? 0\n const xBandWidth = xAxisHelper?.getBandwidth?.(depth - 1)\n const regionRect = context.getRegion().getLayoutRect()\n const startX = Math.min(...xyList.map((item) => item.x)) - (outerPadding || 4)\n const endX = Math.max(...xyList.map((item) => item.x)) + (outerPadding || 4)\n\n const width = endX - startX + xBandWidth\n const middleX = (endX + startX) / 2 + xBandWidth * (0.5 - bandPosition)\n\n const minX = middleX - width / 2\n const maxX = middleX + width / 2\n\n const minY = 0\n const maxY = regionRect.height\n\n return [\n // 左上\n {\n x: minX,\n y: minY,\n },\n // 右上\n {\n x: maxX,\n y: minY,\n },\n // 右下\n {\n x: maxX,\n y: maxY,\n },\n // 左下\n {\n x: minX,\n y: maxY,\n },\n ]\n }\n\n if (typeof yAxisHelper?.getBandwidth === 'function') {\n const depth = context.fieldY.length ?? 0\n const yBandWidth = yAxisHelper?.getBandwidth?.(depth - 1)\n const regionRect = context.getRegion().getLayoutRect()\n\n const startY = Math.min(...xyList.map((item) => item.y)) - (outerPadding || 4)\n const endY = Math.max(...xyList.map((item) => item.y)) + (outerPadding || 4)\n const width = endY - startY + yBandWidth\n const middleY = (endY + startY) / 2 + yBandWidth * (0.5 - bandPosition)\n\n const minY = middleY - width / 2\n const maxY = middleY + width / 2\n const minX = 0\n const maxX = regionRect.width\n\n return [\n // 左上\n {\n x: minX,\n y: minY,\n },\n // 右上\n {\n x: maxX,\n y: minY,\n },\n // 右下\n {\n x: maxX,\n y: maxY,\n },\n // 左下\n {\n x: minX,\n y: maxY,\n },\n ]\n }\n\n return []\n },\n label: {\n position: positionMap[textPosition as 'bottom'],\n visible: true,\n text: text,\n style: {\n textAlign: textAlign,\n textBaseline: textBaseline,\n stroke: textBackgroundColor,\n lineWidth: 1,\n fill: textColor,\n fontSize: textFontSize,\n fontWeight: textFontWeight,\n },\n\n labelBackground: {\n visible: textBackgroundVisible,\n padding: textBackgroundPadding,\n style: {\n opacity: textBackgroundOpacity ?? 0.95,\n cornerRadius: textBackgroundBorderRadius ?? 4,\n fill: textBackgroundColor,\n stroke: textBackgroundBorderColor,\n lineWidth: textBackgroundBorderWidth,\n fillOpacity: 1,\n },\n },\n },\n area: {\n style: {\n visible: true,\n fill: areaColor,\n fillOpacity: areaColorOpacity,\n stroke: areaBorderColor,\n lineWidth: areaBorderWidth,\n cornerRadius: areaBorderRadius,\n lineDash: areaLineDash,\n },\n },\n }\n }) as ILineChartSpec['markArea']\n\n return {\n ...spec,\n markArea: markArea,\n }\n}\n"],"names":["annotationAreaBand","spec","context","advancedVSeed","vseed","annotation","config","theme","annotationArea","annotationAreaList","Array","positionMap","defaultTextPosition","isBarLikeChart","markArea","selectorPoint","text","textColor","textFontSize","textFontWeight","textBackgroundVisible","textBackgroundColor","textBackgroundBorderColor","textBackgroundBorderWidth","textBackgroundBorderRadius","textBackgroundPadding","areaColor","areaColorOpacity","areaBorderColor","areaBorderRadius","areaBorderWidth","areaLineDash","outerPadding","textBackgroundOpacity","textPosition","textAlign","ANNOTATION_AREA_TEXT_STYLE_BY_POSITION","textBaseline","dataset","selectedData","datum","selector","ANNOTATION_Z_INDEX","data","positionData","item","isSubset","xyList","bandPosition","yAxisHelper","xAxisHelper","depth","xBandWidth","regionRect","startX","Math","endX","width","middleX","minX","maxX","minY","maxY","yBandWidth","startY","endY","middleY"],"mappings":";;;;AAOO,MAAMA,qBAAqC,CAACC,MAAMC;IACvD,MAAM,EAAEC,aAAa,EAAEC,KAAK,EAAE,GAAGF;IACjC,MAAM,EAAEG,UAAU,EAAEC,MAAM,EAAE,GAAGH;IAE/B,IAAI,CAACE,cAAc,CAACA,WAAW,cAAc,EAC3C,OAAOJ;IAET,MAAMM,QAAQD,QAAQ,CAACF,MAAM,SAAS,CAAa,EAAE,YAAY;IACjE,MAAM,EAAEI,cAAc,EAAE,GAAGH;IAC3B,MAAMI,qBAAqBC,MAAM,OAAO,CAACF,kBAAkBA,iBAAiB;QAACA;KAAe;IAE5F,MAAMG,cAAc;QAClB,KAAK;QACL,UAAU;QACV,SAAS;QACT,QAAQ;QACR,YAAY;QACZ,aAAa;QACb,MAAM;QACN,OAAO;IACT;IACA,MAAMC,sBAAsBC,eAAeV,iBAA0B,UAAU;IAE/E,MAAMW,WAAWL,mBAAmB,OAAO,CAAC,CAACD;QAC3C,MAAM,EACJ,UAAUO,aAAa,EACvBC,OAAO,EAAE,EACTC,YAAYV,OAAO,aAAa,SAAS,EACzCW,eAAeX,OAAO,gBAAgB,EAAE,EACxCY,iBAAiBZ,OAAO,kBAAkB,GAAG,EAE7Ca,wBAAwBb,OAAO,yBAAyB,IAAI,EAC5Dc,sBAAsBd,OAAO,uBAAuB,SAAS,EAC7De,4BAA4Bf,OAAO,6BAA6B,SAAS,EACzEgB,4BAA4BhB,OAAO,6BAA6B,CAAC,EACjEiB,6BAA6BjB,OAAO,8BAA8B,CAAC,EACnEkB,wBAAwBlB,OAAO,yBAAyB,CAAC,EAEzDmB,YAAYnB,OAAO,aAAa,SAAS,EACzCoB,mBAAmBpB,OAAO,oBAAoB,IAAI,EAClDqB,kBAAkBrB,OAAO,mBAAmB,SAAS,EACrDsB,mBAAmBtB,OAAO,oBAAoB,CAAC,EAC/CuB,kBAAkBvB,OAAO,mBAAmB,CAAC,EAC7CwB,eAAexB,OAAO,YAAY,EAElCyB,eAAezB,OAAO,gBAAgB,CAAC,EACxC,GAAGC;QACJ,MAAMyB,wBAAwB1B,OAAO;QACrC,MAAM2B,eAAuB1B,eAAe,YAAY,IAAII;QAC5D,MAAMuB,YACJ3B,eAAe,SAAS,IACxB4B,sCAAsC,CAACF,aAAoE,CACxG,SAAS;QACd,MAAMG,eACJ7B,eAAe,YAAY,IAC3B4B,sCAAsC,CAACF,aAAoE,CACxG,YAAY;QAEjB,MAAMI,UAAUnC,cAAc,OAAO,CAAC,IAAI;QAC1C,MAAMoC,eAAexB,gBAAgBuB,QAAQ,MAAM,CAAC,CAACE,QAAUC,SAASD,OAAOzB,kBAAkB,EAAE;QAEnG,OAAO;YACL,QAAQ2B;YACR,gBAAgB;YAEhB,WAAW,CAACC,MAAezC;gBACzB,MAAM0C,eAAeD,KAAK,MAAM,CAAC,CAACE,OAASN,aAAa,IAAI,CAAC,CAACC,QAAUM,SAASN,OAAOK;gBACxF,MAAME,SAASH,aAAa,GAAG,CAAC,CAACJ,QAAUtC,QAAQ,cAAc,CAACsC;gBAElE,MAAMQ,eAAe9C,SAAS,cAAc,gBAAgB;gBAE5D,MAAM+C,cAAc/C,QAAQ,cAAc;gBAM1C,MAAMgD,cAAchD,QAAQ,cAAc;gBAO1C,IAAI,AAAqC,cAArC,OAAOgD,aAAa,cAA6B;oBACnD,MAAMC,QAAQjD,QAAQ,MAAM,CAAC,MAAM,IAAI;oBACvC,MAAMkD,aAAaF,aAAa,eAAeC,QAAQ;oBACvD,MAAME,aAAanD,QAAQ,SAAS,GAAG,aAAa;oBACpD,MAAMoD,SAASC,KAAK,GAAG,IAAIR,OAAO,GAAG,CAAC,CAACF,OAASA,KAAK,CAAC,KAAMb,CAAAA,gBAAgB;oBAC5E,MAAMwB,OAAOD,KAAK,GAAG,IAAIR,OAAO,GAAG,CAAC,CAACF,OAASA,KAAK,CAAC,KAAMb,CAAAA,gBAAgB;oBAE1E,MAAMyB,QAAQD,OAAOF,SAASF;oBAC9B,MAAMM,UAAWF,AAAAA,CAAAA,OAAOF,MAAK,IAAK,IAAIF,aAAc,OAAMJ,YAAW;oBAErE,MAAMW,OAAOD,UAAUD,QAAQ;oBAC/B,MAAMG,OAAOF,UAAUD,QAAQ;oBAE/B,MAAMI,OAAO;oBACb,MAAMC,OAAOT,WAAW,MAAM;oBAE9B,OAAO;wBAEL;4BACE,GAAGM;4BACH,GAAGE;wBACL;wBAEA;4BACE,GAAGD;4BACH,GAAGC;wBACL;wBAEA;4BACE,GAAGD;4BACH,GAAGE;wBACL;wBAEA;4BACE,GAAGH;4BACH,GAAGG;wBACL;qBACD;gBACH;gBAEA,IAAI,AAAqC,cAArC,OAAOb,aAAa,cAA6B;oBACnD,MAAME,QAAQjD,QAAQ,MAAM,CAAC,MAAM,IAAI;oBACvC,MAAM6D,aAAad,aAAa,eAAeE,QAAQ;oBACvD,MAAME,aAAanD,QAAQ,SAAS,GAAG,aAAa;oBAEpD,MAAM8D,SAAST,KAAK,GAAG,IAAIR,OAAO,GAAG,CAAC,CAACF,OAASA,KAAK,CAAC,KAAMb,CAAAA,gBAAgB;oBAC5E,MAAMiC,OAAOV,KAAK,GAAG,IAAIR,OAAO,GAAG,CAAC,CAACF,OAASA,KAAK,CAAC,KAAMb,CAAAA,gBAAgB;oBAC1E,MAAMyB,QAAQQ,OAAOD,SAASD;oBAC9B,MAAMG,UAAWD,AAAAA,CAAAA,OAAOD,MAAK,IAAK,IAAID,aAAc,OAAMf,YAAW;oBAErE,MAAMa,OAAOK,UAAUT,QAAQ;oBAC/B,MAAMK,OAAOI,UAAUT,QAAQ;oBAC/B,MAAME,OAAO;oBACb,MAAMC,OAAOP,WAAW,KAAK;oBAE7B,OAAO;wBAEL;4BACE,GAAGM;4BACH,GAAGE;wBACL;wBAEA;4BACE,GAAGD;4BACH,GAAGC;wBACL;wBAEA;4BACE,GAAGD;4BACH,GAAGE;wBACL;wBAEA;4BACE,GAAGH;4BACH,GAAGG;wBACL;qBACD;gBACH;gBAEA,OAAO,EAAE;YACX;YACA,OAAO;gBACL,UAAUnD,WAAW,CAACuB,aAAyB;gBAC/C,SAAS;gBACT,MAAMlB;gBACN,OAAO;oBACL,WAAWmB;oBACX,cAAcE;oBACd,QAAQhB;oBACR,WAAW;oBACX,MAAMJ;oBACN,UAAUC;oBACV,YAAYC;gBACd;gBAEA,iBAAiB;oBACf,SAASC;oBACT,SAASK;oBACT,OAAO;wBACL,SAASQ,yBAAyB;wBAClC,cAAcT,8BAA8B;wBAC5C,MAAMH;wBACN,QAAQC;wBACR,WAAWC;wBACX,aAAa;oBACf;gBACF;YACF;YACA,MAAM;gBACJ,OAAO;oBACL,SAAS;oBACT,MAAMG;oBACN,aAAaC;oBACb,QAAQC;oBACR,WAAWE;oBACX,cAAcD;oBACd,UAAUE;gBACZ;YACF;QACF;IACF;IAEA,OAAO;QACL,GAAG9B,IAAI;QACP,UAAUa;IACZ;AACF"}
@@ -2,15 +2,16 @@ import { autoFormatter, createFormatter, findAllMeasures } from "../../../../uti
2
2
  import { isDimensionSelector, isFieldSelector, isMeasureSelector, isPartialDatumSelector } from "../../../../../dataSelector/index.js";
3
3
  import { isEmpty } from "remeda";
4
4
  import { ANNOTATION_Z_INDEX } from "../../../../utils/constant.js";
5
- import { buildDifferenceCoordinateDatum, buildDifferenceText, getDifferenceLineStackResolveMode, getRuntimeDifferenceValue, resolveDifferenceAnchor, usesDifferenceLineElementStackEnd } from "./annotationDifferenceLineCommon.js";
5
+ import { getAnnotationLineDash } from "./utils.js";
6
+ import { buildDifferenceCoordinateDatum, buildDifferenceText, getDifferenceLineStackResolveMode, getRuntimeDifferenceValue, inferDifferenceConnectDirection, resolveDifferenceAnchor, usesDifferenceLineElementStackEnd } from "./annotationDifferenceLineCommon.js";
6
7
  const DEFAULT_LINE_COLOR = '#BCC1CB';
7
8
  const DEFAULT_TEXT_COLOR = '#ffffff';
8
9
  const DEFAULT_TEXT_BACKGROUND_COLOR = '#BCC1CB';
9
10
  const DEFAULT_TEXT_FONT_SIZE = 12;
10
- const DEFAULT_LINE_WIDTH = 2;
11
- const DEFAULT_CORNER_RADIUS = 4;
11
+ const DEFAULT_LINE_WIDTH = 1;
12
+ const DEFAULT_CORNER_RADIUS = 3;
12
13
  const DEFAULT_LABEL_PADDING = 4;
13
- const DEFAULT_END_SYMBOL_SIZE = 12;
14
+ const DEFAULT_END_SYMBOL_SIZE = 6;
14
15
  const DEFAULT_END_SYMBOL_REF_X = -4;
15
16
  const DEFAULT_GUTTER_BASE_OFFSET = 20;
16
17
  const DEFAULT_GUTTER_RIGHT_PADDING = 44;
@@ -23,6 +24,7 @@ const DEFAULT_PERCENT_DIFFERENCE_FORMAT = {
23
24
  type: 'percent',
24
25
  fractionDigits: 2
25
26
  };
27
+ const shouldInferDifferenceConnectDirection = (chartType)=>'column' === chartType || 'bar' === chartType || 'columnParallel' === chartType || 'barParallel' === chartType;
26
28
  const getDifferenceLinePath = (index, total)=>1 === total ? 'annotationDifferenceLine' : `annotationDifferenceLine[${index}]`;
27
29
  const toArray = (value)=>{
28
30
  if (Array.isArray(value)) return value;
@@ -63,21 +65,45 @@ const mergeDifferenceLineRegionPadding = (spec, paddingPatch)=>{
63
65
  ]
64
66
  };
65
67
  };
66
- const buildFixedGutterExpandDistance = (isHorizontalChart)=>(_markerData, context)=>{
68
+ const buildFixedGutterExpandDistance = (connectDirection)=>(_markerData, context)=>{
67
69
  const region = context?.region;
68
70
  const coordinatePoints = Array.isArray(context?.coordinatePoints) ? context.coordinatePoints : [];
69
71
  if (!region || 0 === coordinatePoints.length) return 0;
70
72
  const { x: regionStartX, y: regionStartY } = region.getLayoutStartPoint();
71
- const { width } = region.getLayoutRect();
72
- if (isHorizontalChart) {
73
+ const { width, height } = region.getLayoutRect();
74
+ if ('top' === connectDirection) {
73
75
  const targetY = regionStartY - DEFAULT_GUTTER_BASE_OFFSET;
74
76
  const minY = Math.min(...coordinatePoints.map((point)=>point.y));
75
77
  return Math.max(0, minY - targetY);
76
78
  }
79
+ if ('bottom' === connectDirection) {
80
+ const targetY = regionStartY + height + DEFAULT_GUTTER_BASE_OFFSET;
81
+ const maxY = Math.max(...coordinatePoints.map((point)=>point.y));
82
+ return Math.max(0, targetY - maxY);
83
+ }
84
+ if ('left' === connectDirection) {
85
+ const targetX = regionStartX - DEFAULT_GUTTER_BASE_OFFSET;
86
+ const minX = Math.min(...coordinatePoints.map((point)=>point.x));
87
+ return Math.max(0, minX - targetX);
88
+ }
77
89
  const targetX = regionStartX + width + DEFAULT_GUTTER_BASE_OFFSET;
78
90
  const maxX = Math.max(...coordinatePoints.map((point)=>point.x));
79
91
  return Math.max(0, targetX - maxX);
80
92
  };
93
+ const getDifferenceLinePaddingPatch = (connectDirection)=>{
94
+ if ('top' === connectDirection) return {
95
+ top: DEFAULT_GUTTER_TOP_PADDING
96
+ };
97
+ if ('bottom' === connectDirection) return {
98
+ bottom: DEFAULT_GUTTER_TOP_PADDING
99
+ };
100
+ if ('left' === connectDirection) return {
101
+ left: DEFAULT_GUTTER_RIGHT_PADDING
102
+ };
103
+ return {
104
+ right: DEFAULT_GUTTER_RIGHT_PADDING
105
+ };
106
+ };
81
107
  const getAxisFormatter = (spec)=>{
82
108
  const valueAxisOrient = 'horizontal' === spec.direction ? 'bottom' : 'left';
83
109
  const formatMethod = spec.axes?.find((axis)=>axis.orient === valueAxisOrient)?.label?.formatMethod;
@@ -146,6 +172,12 @@ const annotationDifferenceLine_annotationDifferenceLine = (spec, context)=>{
146
172
  const axisFormatter = getAxisFormatter(chartSpec);
147
173
  const percentFormatter = createFormatter(DEFAULT_PERCENT_DIFFERENCE_FORMAT);
148
174
  const isHorizontalChart = 'horizontal' === chartSpec.direction;
175
+ const paddingPatch = {
176
+ top: 0,
177
+ right: 0,
178
+ bottom: 0,
179
+ left: 0
180
+ };
149
181
  const markLine = annotationDifferenceLineList.flatMap((annotationDifferenceLine, index)=>{
150
182
  try {
151
183
  assertDifferenceLineConfig(annotationDifferenceLine, getDifferenceLinePath(index, annotationDifferenceLineList.length));
@@ -169,11 +201,23 @@ const annotationDifferenceLine_annotationDifferenceLine = (spec, context)=>{
169
201
  if (start.mode !== end.mode) return [];
170
202
  const usesRuntimeStackEnd = useElementStackEnd || ('column' === vseed.chartType || 'bar' === vseed.chartType) && 'element' === start.mode && 'auto' === stackResolveMode;
171
203
  const useBracketStyle = isBracketChart || ('column' === vseed.chartType || 'bar' === vseed.chartType) && 'element' === start.mode && 'auto' === stackResolveMode;
172
- const connectDirection = isHorizontalChart ? 'top' : 'right';
173
- const expandDistance = buildFixedGutterExpandDistance(isHorizontalChart);
204
+ const connectDirection = shouldInferDifferenceConnectDirection(vseed.chartType) ? inferDifferenceConnectDirection(vseed, [
205
+ start.value,
206
+ end.value
207
+ ]) : isHorizontalChart ? 'top' : 'right';
208
+ const expandDistance = buildFixedGutterExpandDistance(connectDirection);
209
+ const currentPaddingPatch = getDifferenceLinePaddingPatch(connectDirection);
210
+ paddingPatch.top = Math.max(paddingPatch.top, currentPaddingPatch.top ?? 0);
211
+ paddingPatch.right = Math.max(paddingPatch.right, currentPaddingPatch.right ?? 0);
212
+ paddingPatch.bottom = Math.max(paddingPatch.bottom, currentPaddingPatch.bottom ?? 0);
213
+ paddingPatch.left = Math.max(paddingPatch.left, currentPaddingPatch.left ?? 0);
174
214
  const lineColor = annotationDifferenceLine.lineColor ?? theme?.lineColor ?? DEFAULT_LINE_COLOR;
215
+ const lineStyle = annotationDifferenceLine.lineStyle;
216
+ const themeLineStyle = theme?.lineStyle;
217
+ const configuredLineDash = lineStyle ? getAnnotationLineDash(lineStyle) : theme?.lineDash ?? (themeLineStyle ? getAnnotationLineDash(themeLineStyle) : void 0);
175
218
  const textColor = annotationDifferenceLine.textColor ?? theme?.textColor ?? DEFAULT_TEXT_COLOR;
176
219
  const textBackgroundColor = annotationDifferenceLine.textBackgroundColor ?? theme?.textBackgroundColor ?? DEFAULT_TEXT_BACKGROUND_COLOR;
220
+ const textBackgroundOpacity = theme?.textBackgroundOpacity;
177
221
  const textFontSize = annotationDifferenceLine.textFontSize ?? theme?.textFontSize ?? DEFAULT_TEXT_FONT_SIZE;
178
222
  const differenceType = annotationDifferenceLine.differenceType ?? 'absolute';
179
223
  const startMeasureId = resolveDifferenceMeasureId(start, annotationDifferenceLine.start.selector, measureIds);
@@ -208,6 +252,7 @@ const annotationDifferenceLine_annotationDifferenceLine = (spec, context)=>{
208
252
  visible: true,
209
253
  padding: DEFAULT_LABEL_PADDING,
210
254
  style: {
255
+ opacity: textBackgroundOpacity ?? 0.95,
211
256
  fill: textBackgroundColor,
212
257
  fillOpacity: 1,
213
258
  stroke: lineColor,
@@ -228,6 +273,7 @@ const annotationDifferenceLine_annotationDifferenceLine = (spec, context)=>{
228
273
  visible: true,
229
274
  padding: DEFAULT_LABEL_PADDING,
230
275
  style: {
276
+ opacity: textBackgroundOpacity ?? 0.95,
231
277
  fill: textBackgroundColor,
232
278
  fillOpacity: 1,
233
279
  stroke: lineColor,
@@ -271,18 +317,21 @@ const annotationDifferenceLine_annotationDifferenceLine = (spec, context)=>{
271
317
  visible: true,
272
318
  stroke: lineColor,
273
319
  lineWidth: DEFAULT_LINE_WIDTH,
274
- lineDash: DEFAULT_BRACKET_LINE_DASH
320
+ lineDash: configuredLineDash ?? DEFAULT_BRACKET_LINE_DASH
275
321
  },
276
322
  {
277
323
  visible: true,
278
324
  stroke: lineColor,
279
- lineWidth: DEFAULT_LINE_WIDTH
325
+ lineWidth: DEFAULT_LINE_WIDTH,
326
+ ...configuredLineDash ? {
327
+ lineDash: configuredLineDash
328
+ } : {}
280
329
  },
281
330
  {
282
331
  visible: true,
283
332
  stroke: lineColor,
284
333
  lineWidth: DEFAULT_LINE_WIDTH,
285
- lineDash: DEFAULT_BRACKET_LINE_DASH
334
+ lineDash: configuredLineDash ?? DEFAULT_BRACKET_LINE_DASH
286
335
  }
287
336
  ]
288
337
  } : {
@@ -290,7 +339,7 @@ const annotationDifferenceLine_annotationDifferenceLine = (spec, context)=>{
290
339
  visible: true,
291
340
  stroke: lineColor,
292
341
  lineWidth: DEFAULT_LINE_WIDTH,
293
- lineDash: [
342
+ lineDash: configuredLineDash ?? [
294
343
  0
295
344
  ],
296
345
  cornerRadius: DEFAULT_CORNER_RADIUS
@@ -323,11 +372,7 @@ const annotationDifferenceLine_annotationDifferenceLine = (spec, context)=>{
323
372
  ]
324
373
  };
325
374
  if (0 === markLine.length) return nextSpec;
326
- return mergeDifferenceLineRegionPadding(nextSpec, isHorizontalChart ? {
327
- top: DEFAULT_GUTTER_TOP_PADDING
328
- } : {
329
- right: DEFAULT_GUTTER_RIGHT_PADDING
330
- });
375
+ return mergeDifferenceLineRegionPadding(nextSpec, paddingPatch);
331
376
  };
332
377
  export { annotationDifferenceLine_annotationDifferenceLine as annotationDifferenceLine };
333
378
 
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/spec/chart/pipes/annotation/annotationDifferenceLine.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/annotation/annotationDifferenceLine.ts"],"sourcesContent":["import type { IAreaChartSpec, IBarChartSpec, ICartesianSeries, ILineChartSpec, IMarkLineSpec } from '@visactor/vchart'\nimport type { AnnotationDifferenceLine, Measure, RegionPadding, VChartSpecPipe } from 'src/types'\nimport { createFormatter, findAllMeasures, autoFormatter } from '../../../../utils'\nimport {\n isDimensionSelector,\n isFieldSelector,\n isMeasureSelector,\n isPartialDatumSelector,\n} from '../../../../../dataSelector'\nimport { isEmpty } from 'remeda'\nimport { ANNOTATION_Z_INDEX } from '../../../../utils/constant'\nimport {\n buildDifferenceCoordinateDatum,\n buildDifferenceText,\n getDifferenceLineStackResolveMode,\n getRuntimeDifferenceValue,\n type ResolvedDifferenceAnchor,\n usesDifferenceLineElementStackEnd,\n resolveDifferenceAnchor,\n} from './annotationDifferenceLineCommon'\n\nconst DEFAULT_LINE_COLOR = '#BCC1CB'\nconst DEFAULT_TEXT_COLOR = '#ffffff'\nconst DEFAULT_TEXT_BACKGROUND_COLOR = '#BCC1CB'\nconst DEFAULT_TEXT_FONT_SIZE = 12\nconst DEFAULT_LINE_WIDTH = 2\nconst DEFAULT_CORNER_RADIUS = 4\nconst DEFAULT_LABEL_PADDING = 4\nconst DEFAULT_END_SYMBOL_SIZE = 12\nconst DEFAULT_END_SYMBOL_REF_X = -4\nconst DEFAULT_GUTTER_BASE_OFFSET = 20\nconst DEFAULT_GUTTER_RIGHT_PADDING = 44\nconst DEFAULT_GUTTER_TOP_PADDING = 36\nconst DEFAULT_BRACKET_LINE_DASH: [number, number] = [2, 2]\nconst DEFAULT_PERCENT_DIFFERENCE_FORMAT = {\n type: 'percent' as const,\n fractionDigits: 2,\n}\n\ntype RegionPaddingObject = Required<Exclude<RegionPadding, number>>\n\nconst getDifferenceLinePath = (index: number, total: number) =>\n total === 1 ? 'annotationDifferenceLine' : `annotationDifferenceLine[${index}]`\n\nconst toArray = <T>(value: T | T[] | undefined | null): T[] => {\n if (Array.isArray(value)) {\n return value\n }\n\n return value === undefined || value === null ? [] : [value]\n}\n\nconst normalizeRegionPadding = (padding?: RegionPadding): RegionPaddingObject => {\n if (typeof padding === 'number') {\n return {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding,\n }\n }\n\n return {\n top: padding?.top ?? 0,\n right: padding?.right ?? 0,\n bottom: padding?.bottom ?? 0,\n left: padding?.left ?? 0,\n }\n}\n\nconst mergeDifferenceLineRegionPadding = (\n spec: IBarChartSpec | ILineChartSpec | IAreaChartSpec,\n paddingPatch: Partial<RegionPaddingObject>,\n) => {\n const region = (spec as { region?: Array<Record<string, unknown>> }).region\n\n if (!Array.isArray(region) || region.length === 0) {\n return spec\n }\n\n const mergedPadding = normalizeRegionPadding(region[0].padding as RegionPadding | undefined)\n\n if (paddingPatch.top !== undefined) {\n mergedPadding.top = Math.max(mergedPadding.top, paddingPatch.top)\n }\n\n if (paddingPatch.right !== undefined) {\n mergedPadding.right = Math.max(mergedPadding.right, paddingPatch.right)\n }\n\n if (paddingPatch.bottom !== undefined) {\n mergedPadding.bottom = Math.max(mergedPadding.bottom, paddingPatch.bottom)\n }\n\n if (paddingPatch.left !== undefined) {\n mergedPadding.left = Math.max(mergedPadding.left, paddingPatch.left)\n }\n\n return {\n ...spec,\n region: [\n {\n ...region[0],\n padding: mergedPadding,\n },\n ...region.slice(1),\n ],\n }\n}\n\nconst buildFixedGutterExpandDistance = (isHorizontalChart: boolean) => {\n return (_markerData: unknown, context: any) => {\n const region = context?.region\n const coordinatePoints = Array.isArray(context?.coordinatePoints) ? context.coordinatePoints : []\n\n if (!region || coordinatePoints.length === 0) {\n return 0\n }\n\n const { x: regionStartX, y: regionStartY } = region.getLayoutStartPoint()\n const { width } = region.getLayoutRect()\n\n if (isHorizontalChart) {\n const targetY = regionStartY - DEFAULT_GUTTER_BASE_OFFSET\n const minY = Math.min(...coordinatePoints.map((point: { y: number }) => point.y))\n\n return Math.max(0, minY - targetY)\n }\n\n const targetX = regionStartX + width + DEFAULT_GUTTER_BASE_OFFSET\n const maxX = Math.max(...coordinatePoints.map((point: { x: number }) => point.x))\n\n return Math.max(0, targetX - maxX)\n }\n}\n\nconst getAxisFormatter = (spec: IBarChartSpec | ILineChartSpec | IAreaChartSpec) => {\n const valueAxisOrient = spec.direction === 'horizontal' ? 'bottom' : 'left'\n const formatMethod = spec.axes?.find((axis) => axis.orient === valueAxisOrient)?.label?.formatMethod\n\n return typeof formatMethod === 'function'\n ? (value: number) => String(formatMethod(value as never) ?? value)\n : undefined\n}\n\nconst getExplicitMeasureFormat = (measure?: Measure) => {\n if (measure?.numFormat && !isEmpty(measure.numFormat)) {\n return measure.numFormat\n }\n\n if (measure?.format && !isEmpty(measure.format)) {\n return measure.format\n }\n\n return undefined\n}\n\nconst inferMeasureIdFromDatum = (anchor: ResolvedDifferenceAnchor, measureIds: string[]) => {\n const candidateValues = [anchor.matchedDatum, anchor.coordinateDatum]\n\n for (const datum of candidateValues) {\n if (!datum) {\n continue\n }\n\n const candidates = measureIds.filter((measureId) => Number(datum[measureId]) === anchor.value)\n\n if (candidates.length === 1) {\n return candidates[0]\n }\n }\n\n return undefined\n}\n\nconst inferMeasureIdFromSelector = (\n selectorValue: AnnotationDifferenceLine['start']['selector'],\n measureIdSet: Set<string>,\n) => {\n const matchedMeasureIds = new Set<string>()\n\n for (const currentSelector of toArray(selectorValue)) {\n if (isMeasureSelector(currentSelector)) {\n if (measureIdSet.has(currentSelector.field)) {\n matchedMeasureIds.add(currentSelector.field)\n }\n continue\n }\n\n if (isFieldSelector(currentSelector) || isDimensionSelector(currentSelector)) {\n continue\n }\n\n if (isPartialDatumSelector(currentSelector)) {\n Object.keys(currentSelector).forEach((field) => {\n if (measureIdSet.has(field)) {\n matchedMeasureIds.add(field)\n }\n })\n }\n }\n\n return matchedMeasureIds.size === 1 ? Array.from(matchedMeasureIds)[0] : undefined\n}\n\nconst resolveDifferenceMeasureId = (\n anchor: ResolvedDifferenceAnchor,\n selectorValue: AnnotationDifferenceLine['start']['selector'],\n measureIds: string[],\n) => {\n if (anchor.mode !== 'element') {\n return undefined\n }\n\n if (measureIds.length === 1) {\n return measureIds[0]\n }\n\n const measureIdSet = new Set(measureIds)\n return inferMeasureIdFromSelector(selectorValue, measureIdSet) ?? inferMeasureIdFromDatum(anchor, measureIds)\n}\n\nconst assertDifferenceLineConfig: (value: unknown, path: string) => asserts value is AnnotationDifferenceLine = (\n value,\n path,\n) => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(`${path} must be an object`)\n }\n\n const start = (value as Record<string, unknown>).start\n if (typeof start !== 'object' || start === null || Array.isArray(start)) {\n throw new Error(`${path}.start is required`)\n }\n if ((start as Record<string, unknown>).selector == null) {\n throw new Error(`${path}.start.selector is required`)\n }\n\n const end = (value as Record<string, unknown>).end\n if (typeof end !== 'object' || end === null || Array.isArray(end)) {\n throw new Error(`${path}.end is required`)\n }\n if ((end as Record<string, unknown>).selector == null) {\n throw new Error(`${path}.end.selector is required`)\n }\n}\n\nexport const annotationDifferenceLine: VChartSpecPipe = (spec, context) => {\n const { advancedVSeed, vseed } = context\n const annotationDifferenceLine = advancedVSeed.annotation?.annotationDifferenceLine\n\n if (!annotationDifferenceLine) {\n return spec\n }\n\n const theme = advancedVSeed.config?.[vseed.chartType as 'column']?.annotation?.annotationDifferenceLine\n const annotationDifferenceLineList = Array.isArray(annotationDifferenceLine)\n ? annotationDifferenceLine\n : [annotationDifferenceLine]\n const dataset = advancedVSeed.dataset.flat()\n const chartSpec = spec as IBarChartSpec | ILineChartSpec | IAreaChartSpec\n const stackResolveMode = getDifferenceLineStackResolveMode(vseed, advancedVSeed)\n const useElementStackEnd = usesDifferenceLineElementStackEnd(vseed, advancedVSeed)\n const isBracketChart = vseed.chartType === 'line' || vseed.chartType === 'area'\n const measures = findAllMeasures(advancedVSeed.measures)\n const measureIds = measures.map((measure) => measure.id)\n const axisFormatter = getAxisFormatter(chartSpec)\n const percentFormatter = createFormatter(DEFAULT_PERCENT_DIFFERENCE_FORMAT)\n const isHorizontalChart = chartSpec.direction === 'horizontal'\n\n const markLine = annotationDifferenceLineList.flatMap((annotationDifferenceLine, index) => {\n try {\n assertDifferenceLineConfig(\n annotationDifferenceLine,\n getDifferenceLinePath(index, annotationDifferenceLineList.length),\n )\n\n const start = resolveDifferenceAnchor({\n dataset,\n selectorLabel: 'start',\n selectorValue: annotationDifferenceLine.start.selector,\n spec: chartSpec,\n stackResolveMode,\n allowSelectorFallback: !useElementStackEnd,\n })\n const end = resolveDifferenceAnchor({\n dataset,\n selectorLabel: 'end',\n selectorValue: annotationDifferenceLine.end.selector,\n spec: chartSpec,\n stackResolveMode,\n allowSelectorFallback: !useElementStackEnd,\n })\n\n if (!start || !end) {\n return []\n }\n\n if (start.mode !== end.mode) {\n return []\n }\n\n const usesRuntimeStackEnd =\n useElementStackEnd ||\n ((vseed.chartType === 'column' || vseed.chartType === 'bar') &&\n start.mode === 'element' &&\n stackResolveMode === 'auto')\n const useBracketStyle =\n isBracketChart ||\n ((vseed.chartType === 'column' || vseed.chartType === 'bar') &&\n start.mode === 'element' &&\n stackResolveMode === 'auto')\n const connectDirection = isHorizontalChart ? 'top' : 'right'\n const expandDistance = buildFixedGutterExpandDistance(isHorizontalChart)\n\n const lineColor = annotationDifferenceLine.lineColor ?? theme?.lineColor ?? DEFAULT_LINE_COLOR\n const textColor = annotationDifferenceLine.textColor ?? theme?.textColor ?? DEFAULT_TEXT_COLOR\n const textBackgroundColor =\n annotationDifferenceLine.textBackgroundColor ?? theme?.textBackgroundColor ?? DEFAULT_TEXT_BACKGROUND_COLOR\n const textFontSize = annotationDifferenceLine.textFontSize ?? theme?.textFontSize ?? DEFAULT_TEXT_FONT_SIZE\n const differenceType = annotationDifferenceLine.differenceType ?? 'absolute'\n const startMeasureId = resolveDifferenceMeasureId(start, annotationDifferenceLine.start.selector, measureIds)\n const endMeasureId = resolveDifferenceMeasureId(end, annotationDifferenceLine.end.selector, measureIds)\n const sameMeasure = startMeasureId !== undefined && startMeasureId === endMeasureId\n const explicitMeasureFormat = sameMeasure\n ? getExplicitMeasureFormat(measures.find((measure) => measure.id === startMeasureId))\n : undefined\n const differenceFormatter =\n differenceType === 'percent'\n ? percentFormatter\n : explicitMeasureFormat\n ? createFormatter(explicitMeasureFormat)\n : (axisFormatter ?? autoFormatter)\n\n const label = usesRuntimeStackEnd\n ? {\n visible: true,\n position: 'middle',\n refY: 0,\n formatMethod: (_markData: any[], seriesData: any[]) => {\n try {\n return buildDifferenceText(\n getRuntimeDifferenceValue({\n anchor: start,\n seriesData,\n useElementStackEnd: usesRuntimeStackEnd,\n }),\n getRuntimeDifferenceValue({\n anchor: end,\n seriesData,\n useElementStackEnd: usesRuntimeStackEnd,\n }),\n differenceType,\n differenceFormatter,\n )\n } catch {\n return ''\n }\n },\n style: {\n fill: textColor,\n fontSize: textFontSize,\n },\n labelBackground: {\n visible: true,\n padding: DEFAULT_LABEL_PADDING,\n style: {\n fill: textBackgroundColor,\n fillOpacity: 1,\n stroke: lineColor,\n lineWidth: 1,\n cornerRadius: DEFAULT_CORNER_RADIUS,\n },\n },\n }\n : {\n visible: true,\n position: 'middle',\n refY: 0,\n text: buildDifferenceText(start.value, end.value, differenceType, differenceFormatter),\n style: {\n fill: textColor,\n fontSize: textFontSize,\n },\n labelBackground: {\n visible: true,\n padding: DEFAULT_LABEL_PADDING,\n style: {\n fill: textBackgroundColor,\n fillOpacity: 1,\n stroke: lineColor,\n lineWidth: 1,\n cornerRadius: DEFAULT_CORNER_RADIUS,\n },\n },\n }\n\n return [\n {\n type: 'type-step',\n autoRange: true,\n zIndex: ANNOTATION_Z_INDEX,\n connectDirection,\n expandDistance,\n coordinates: (seriesData: any[], relativeSeries: ICartesianSeries) => {\n try {\n return [\n buildDifferenceCoordinateDatum({\n anchor: start,\n seriesData,\n relativeSeries,\n useElementStackEnd: usesRuntimeStackEnd,\n }),\n buildDifferenceCoordinateDatum({\n anchor: end,\n seriesData,\n relativeSeries,\n useElementStackEnd: usesRuntimeStackEnd,\n }),\n ]\n } catch {\n return []\n }\n },\n line: useBracketStyle\n ? {\n multiSegment: true,\n mainSegmentIndex: 1,\n style: [\n {\n visible: true,\n stroke: lineColor,\n lineWidth: DEFAULT_LINE_WIDTH,\n lineDash: DEFAULT_BRACKET_LINE_DASH,\n },\n {\n visible: true,\n stroke: lineColor,\n lineWidth: DEFAULT_LINE_WIDTH,\n },\n {\n visible: true,\n stroke: lineColor,\n lineWidth: DEFAULT_LINE_WIDTH,\n lineDash: DEFAULT_BRACKET_LINE_DASH,\n },\n ],\n }\n : {\n style: {\n visible: true,\n stroke: lineColor,\n lineWidth: DEFAULT_LINE_WIDTH,\n lineDash: [0],\n cornerRadius: DEFAULT_CORNER_RADIUS,\n },\n },\n label,\n startSymbol: {\n visible: false,\n },\n endSymbol: {\n visible: true,\n size: DEFAULT_END_SYMBOL_SIZE,\n refX: DEFAULT_END_SYMBOL_REF_X,\n style: {\n fill: lineColor,\n },\n },\n } as IMarkLineSpec,\n ]\n } catch {\n return []\n }\n })\n\n const specMarkLine = (chartSpec.markLine as IMarkLineSpec[]) || []\n const nextSpec = {\n ...spec,\n markLine: [...specMarkLine, ...markLine],\n }\n\n if (markLine.length === 0) {\n return nextSpec\n }\n\n return mergeDifferenceLineRegionPadding(\n nextSpec as IBarChartSpec | ILineChartSpec | IAreaChartSpec,\n isHorizontalChart ? { top: DEFAULT_GUTTER_TOP_PADDING } : { right: DEFAULT_GUTTER_RIGHT_PADDING },\n )\n}\n"],"names":["DEFAULT_LINE_COLOR","DEFAULT_TEXT_COLOR","DEFAULT_TEXT_BACKGROUND_COLOR","DEFAULT_TEXT_FONT_SIZE","DEFAULT_LINE_WIDTH","DEFAULT_CORNER_RADIUS","DEFAULT_LABEL_PADDING","DEFAULT_END_SYMBOL_SIZE","DEFAULT_END_SYMBOL_REF_X","DEFAULT_GUTTER_BASE_OFFSET","DEFAULT_GUTTER_RIGHT_PADDING","DEFAULT_GUTTER_TOP_PADDING","DEFAULT_BRACKET_LINE_DASH","DEFAULT_PERCENT_DIFFERENCE_FORMAT","getDifferenceLinePath","index","total","toArray","value","Array","normalizeRegionPadding","padding","mergeDifferenceLineRegionPadding","spec","paddingPatch","region","mergedPadding","undefined","Math","buildFixedGutterExpandDistance","isHorizontalChart","_markerData","context","coordinatePoints","regionStartX","regionStartY","width","targetY","minY","point","targetX","maxX","getAxisFormatter","valueAxisOrient","formatMethod","axis","String","getExplicitMeasureFormat","measure","isEmpty","inferMeasureIdFromDatum","anchor","measureIds","candidateValues","datum","candidates","measureId","Number","inferMeasureIdFromSelector","selectorValue","measureIdSet","matchedMeasureIds","Set","currentSelector","isMeasureSelector","isFieldSelector","isDimensionSelector","isPartialDatumSelector","Object","field","resolveDifferenceMeasureId","assertDifferenceLineConfig","path","Error","start","end","annotationDifferenceLine","advancedVSeed","vseed","theme","annotationDifferenceLineList","dataset","chartSpec","stackResolveMode","getDifferenceLineStackResolveMode","useElementStackEnd","usesDifferenceLineElementStackEnd","isBracketChart","measures","findAllMeasures","axisFormatter","percentFormatter","createFormatter","markLine","resolveDifferenceAnchor","usesRuntimeStackEnd","useBracketStyle","connectDirection","expandDistance","lineColor","textColor","textBackgroundColor","textFontSize","differenceType","startMeasureId","endMeasureId","sameMeasure","explicitMeasureFormat","differenceFormatter","autoFormatter","label","_markData","seriesData","buildDifferenceText","getRuntimeDifferenceValue","ANNOTATION_Z_INDEX","relativeSeries","buildDifferenceCoordinateDatum","specMarkLine","nextSpec"],"mappings":"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"}
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/annotation/annotationDifferenceLine.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/annotation/annotationDifferenceLine.ts"],"sourcesContent":["import type { IAreaChartSpec, IBarChartSpec, ICartesianSeries, ILineChartSpec, IMarkLineSpec } from '@visactor/vchart'\nimport type { AnnotationDifferenceLine, Measure, RegionPadding, VChartSpecPipe } from 'src/types'\nimport { createFormatter, findAllMeasures, autoFormatter } from '../../../../utils'\nimport {\n isDimensionSelector,\n isFieldSelector,\n isMeasureSelector,\n isPartialDatumSelector,\n} from '../../../../../dataSelector'\nimport { isEmpty } from 'remeda'\nimport { ANNOTATION_Z_INDEX } from '../../../../utils/constant'\nimport { getAnnotationLineDash } from './utils'\nimport {\n buildDifferenceCoordinateDatum,\n buildDifferenceText,\n getDifferenceLineStackResolveMode,\n getRuntimeDifferenceValue,\n inferDifferenceConnectDirection,\n type ResolvedDifferenceAnchor,\n usesDifferenceLineElementStackEnd,\n resolveDifferenceAnchor,\n} from './annotationDifferenceLineCommon'\n\nconst DEFAULT_LINE_COLOR = '#BCC1CB'\nconst DEFAULT_TEXT_COLOR = '#ffffff'\nconst DEFAULT_TEXT_BACKGROUND_COLOR = '#BCC1CB'\nconst DEFAULT_TEXT_FONT_SIZE = 12\nconst DEFAULT_LINE_WIDTH = 1\nconst DEFAULT_CORNER_RADIUS = 3\nconst DEFAULT_LABEL_PADDING = 4\nconst DEFAULT_END_SYMBOL_SIZE = 6\nconst DEFAULT_END_SYMBOL_REF_X = -4\nconst DEFAULT_GUTTER_BASE_OFFSET = 20\nconst DEFAULT_GUTTER_RIGHT_PADDING = 44\nconst DEFAULT_GUTTER_TOP_PADDING = 36\nconst DEFAULT_BRACKET_LINE_DASH: [number, number] = [2, 2]\nconst DEFAULT_PERCENT_DIFFERENCE_FORMAT = {\n type: 'percent' as const,\n fractionDigits: 2,\n}\n\ntype RegionPaddingObject = Required<Exclude<RegionPadding, number>>\ntype DifferenceConnectDirection = 'top' | 'right' | 'bottom' | 'left'\n\nconst shouldInferDifferenceConnectDirection = (chartType: string) =>\n chartType === 'column' || chartType === 'bar' || chartType === 'columnParallel' || chartType === 'barParallel'\n\nconst getDifferenceLinePath = (index: number, total: number) =>\n total === 1 ? 'annotationDifferenceLine' : `annotationDifferenceLine[${index}]`\n\nconst toArray = <T>(value: T | T[] | undefined | null): T[] => {\n if (Array.isArray(value)) {\n return value\n }\n\n return value === undefined || value === null ? [] : [value]\n}\n\nconst normalizeRegionPadding = (padding?: RegionPadding): RegionPaddingObject => {\n if (typeof padding === 'number') {\n return {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding,\n }\n }\n\n return {\n top: padding?.top ?? 0,\n right: padding?.right ?? 0,\n bottom: padding?.bottom ?? 0,\n left: padding?.left ?? 0,\n }\n}\n\nconst mergeDifferenceLineRegionPadding = (\n spec: IBarChartSpec | ILineChartSpec | IAreaChartSpec,\n paddingPatch: Partial<RegionPaddingObject>,\n) => {\n const region = (spec as { region?: Array<Record<string, unknown>> }).region\n\n if (!Array.isArray(region) || region.length === 0) {\n return spec\n }\n\n const mergedPadding = normalizeRegionPadding(region[0].padding as RegionPadding | undefined)\n\n if (paddingPatch.top !== undefined) {\n mergedPadding.top = Math.max(mergedPadding.top, paddingPatch.top)\n }\n\n if (paddingPatch.right !== undefined) {\n mergedPadding.right = Math.max(mergedPadding.right, paddingPatch.right)\n }\n\n if (paddingPatch.bottom !== undefined) {\n mergedPadding.bottom = Math.max(mergedPadding.bottom, paddingPatch.bottom)\n }\n\n if (paddingPatch.left !== undefined) {\n mergedPadding.left = Math.max(mergedPadding.left, paddingPatch.left)\n }\n\n return {\n ...spec,\n region: [\n {\n ...region[0],\n padding: mergedPadding,\n },\n ...region.slice(1),\n ],\n }\n}\n\nconst buildFixedGutterExpandDistance = (connectDirection: DifferenceConnectDirection) => {\n return (_markerData: unknown, context: any) => {\n const region = context?.region\n const coordinatePoints = Array.isArray(context?.coordinatePoints) ? context.coordinatePoints : []\n\n if (!region || coordinatePoints.length === 0) {\n return 0\n }\n\n const { x: regionStartX, y: regionStartY } = region.getLayoutStartPoint()\n const { width, height } = region.getLayoutRect()\n\n if (connectDirection === 'top') {\n const targetY = regionStartY - DEFAULT_GUTTER_BASE_OFFSET\n const minY = Math.min(...coordinatePoints.map((point: { y: number }) => point.y))\n\n return Math.max(0, minY - targetY)\n }\n\n if (connectDirection === 'bottom') {\n const targetY = regionStartY + height + DEFAULT_GUTTER_BASE_OFFSET\n const maxY = Math.max(...coordinatePoints.map((point: { y: number }) => point.y))\n\n return Math.max(0, targetY - maxY)\n }\n\n if (connectDirection === 'left') {\n const targetX = regionStartX - DEFAULT_GUTTER_BASE_OFFSET\n const minX = Math.min(...coordinatePoints.map((point: { x: number }) => point.x))\n\n return Math.max(0, minX - targetX)\n }\n\n const targetX = regionStartX + width + DEFAULT_GUTTER_BASE_OFFSET\n const maxX = Math.max(...coordinatePoints.map((point: { x: number }) => point.x))\n\n return Math.max(0, targetX - maxX)\n }\n}\n\nconst getDifferenceLinePaddingPatch = (connectDirection: DifferenceConnectDirection): Partial<RegionPaddingObject> => {\n if (connectDirection === 'top') {\n return { top: DEFAULT_GUTTER_TOP_PADDING }\n }\n\n if (connectDirection === 'bottom') {\n return { bottom: DEFAULT_GUTTER_TOP_PADDING }\n }\n\n if (connectDirection === 'left') {\n return { left: DEFAULT_GUTTER_RIGHT_PADDING }\n }\n\n return { right: DEFAULT_GUTTER_RIGHT_PADDING }\n}\n\nconst getAxisFormatter = (spec: IBarChartSpec | ILineChartSpec | IAreaChartSpec) => {\n const valueAxisOrient = spec.direction === 'horizontal' ? 'bottom' : 'left'\n const formatMethod = spec.axes?.find((axis) => axis.orient === valueAxisOrient)?.label?.formatMethod\n\n return typeof formatMethod === 'function'\n ? (value: number) => String(formatMethod(value as never) ?? value)\n : undefined\n}\n\nconst getExplicitMeasureFormat = (measure?: Measure) => {\n if (measure?.numFormat && !isEmpty(measure.numFormat)) {\n return measure.numFormat\n }\n\n if (measure?.format && !isEmpty(measure.format)) {\n return measure.format\n }\n\n return undefined\n}\n\nconst inferMeasureIdFromDatum = (anchor: ResolvedDifferenceAnchor, measureIds: string[]) => {\n const candidateValues = [anchor.matchedDatum, anchor.coordinateDatum]\n\n for (const datum of candidateValues) {\n if (!datum) {\n continue\n }\n\n const candidates = measureIds.filter((measureId) => Number(datum[measureId]) === anchor.value)\n\n if (candidates.length === 1) {\n return candidates[0]\n }\n }\n\n return undefined\n}\n\nconst inferMeasureIdFromSelector = (\n selectorValue: AnnotationDifferenceLine['start']['selector'],\n measureIdSet: Set<string>,\n) => {\n const matchedMeasureIds = new Set<string>()\n\n for (const currentSelector of toArray(selectorValue)) {\n if (isMeasureSelector(currentSelector)) {\n if (measureIdSet.has(currentSelector.field)) {\n matchedMeasureIds.add(currentSelector.field)\n }\n continue\n }\n\n if (isFieldSelector(currentSelector) || isDimensionSelector(currentSelector)) {\n continue\n }\n\n if (isPartialDatumSelector(currentSelector)) {\n Object.keys(currentSelector).forEach((field) => {\n if (measureIdSet.has(field)) {\n matchedMeasureIds.add(field)\n }\n })\n }\n }\n\n return matchedMeasureIds.size === 1 ? Array.from(matchedMeasureIds)[0] : undefined\n}\n\nconst resolveDifferenceMeasureId = (\n anchor: ResolvedDifferenceAnchor,\n selectorValue: AnnotationDifferenceLine['start']['selector'],\n measureIds: string[],\n) => {\n if (anchor.mode !== 'element') {\n return undefined\n }\n\n if (measureIds.length === 1) {\n return measureIds[0]\n }\n\n const measureIdSet = new Set(measureIds)\n return inferMeasureIdFromSelector(selectorValue, measureIdSet) ?? inferMeasureIdFromDatum(anchor, measureIds)\n}\n\nconst assertDifferenceLineConfig: (value: unknown, path: string) => asserts value is AnnotationDifferenceLine = (\n value,\n path,\n) => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(`${path} must be an object`)\n }\n\n const start = (value as Record<string, unknown>).start\n if (typeof start !== 'object' || start === null || Array.isArray(start)) {\n throw new Error(`${path}.start is required`)\n }\n if ((start as Record<string, unknown>).selector == null) {\n throw new Error(`${path}.start.selector is required`)\n }\n\n const end = (value as Record<string, unknown>).end\n if (typeof end !== 'object' || end === null || Array.isArray(end)) {\n throw new Error(`${path}.end is required`)\n }\n if ((end as Record<string, unknown>).selector == null) {\n throw new Error(`${path}.end.selector is required`)\n }\n}\n\nexport const annotationDifferenceLine: VChartSpecPipe = (spec, context) => {\n const { advancedVSeed, vseed } = context\n const annotationDifferenceLine = advancedVSeed.annotation?.annotationDifferenceLine\n\n if (!annotationDifferenceLine) {\n return spec\n }\n\n const theme = advancedVSeed.config?.[vseed.chartType as 'column']?.annotation?.annotationDifferenceLine\n const annotationDifferenceLineList = Array.isArray(annotationDifferenceLine)\n ? annotationDifferenceLine\n : [annotationDifferenceLine]\n const dataset = advancedVSeed.dataset.flat()\n const chartSpec = spec as IBarChartSpec | ILineChartSpec | IAreaChartSpec\n const stackResolveMode = getDifferenceLineStackResolveMode(vseed, advancedVSeed)\n const useElementStackEnd = usesDifferenceLineElementStackEnd(vseed, advancedVSeed)\n const isBracketChart = vseed.chartType === 'line' || vseed.chartType === 'area'\n const measures = findAllMeasures(advancedVSeed.measures)\n const measureIds = measures.map((measure) => measure.id)\n const axisFormatter = getAxisFormatter(chartSpec)\n const percentFormatter = createFormatter(DEFAULT_PERCENT_DIFFERENCE_FORMAT)\n const isHorizontalChart = chartSpec.direction === 'horizontal'\n\n const paddingPatch = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n }\n\n const markLine = annotationDifferenceLineList.flatMap((annotationDifferenceLine, index) => {\n try {\n assertDifferenceLineConfig(\n annotationDifferenceLine,\n getDifferenceLinePath(index, annotationDifferenceLineList.length),\n )\n\n const start = resolveDifferenceAnchor({\n dataset,\n selectorLabel: 'start',\n selectorValue: annotationDifferenceLine.start.selector,\n spec: chartSpec,\n stackResolveMode,\n allowSelectorFallback: !useElementStackEnd,\n })\n const end = resolveDifferenceAnchor({\n dataset,\n selectorLabel: 'end',\n selectorValue: annotationDifferenceLine.end.selector,\n spec: chartSpec,\n stackResolveMode,\n allowSelectorFallback: !useElementStackEnd,\n })\n\n if (!start || !end) {\n return []\n }\n\n if (start.mode !== end.mode) {\n return []\n }\n\n const usesRuntimeStackEnd =\n useElementStackEnd ||\n ((vseed.chartType === 'column' || vseed.chartType === 'bar') &&\n start.mode === 'element' &&\n stackResolveMode === 'auto')\n const useBracketStyle =\n isBracketChart ||\n ((vseed.chartType === 'column' || vseed.chartType === 'bar') &&\n start.mode === 'element' &&\n stackResolveMode === 'auto')\n const connectDirection: DifferenceConnectDirection = shouldInferDifferenceConnectDirection(vseed.chartType)\n ? inferDifferenceConnectDirection(vseed, [start.value, end.value])\n : isHorizontalChart\n ? 'top'\n : 'right'\n const expandDistance = buildFixedGutterExpandDistance(connectDirection)\n const currentPaddingPatch = getDifferenceLinePaddingPatch(connectDirection)\n\n paddingPatch.top = Math.max(paddingPatch.top, currentPaddingPatch.top ?? 0)\n paddingPatch.right = Math.max(paddingPatch.right, currentPaddingPatch.right ?? 0)\n paddingPatch.bottom = Math.max(paddingPatch.bottom, currentPaddingPatch.bottom ?? 0)\n paddingPatch.left = Math.max(paddingPatch.left, currentPaddingPatch.left ?? 0)\n\n const lineColor = annotationDifferenceLine.lineColor ?? theme?.lineColor ?? DEFAULT_LINE_COLOR\n const lineStyle = annotationDifferenceLine.lineStyle\n const themeLineStyle = theme?.lineStyle\n const configuredLineDash = lineStyle\n ? getAnnotationLineDash(lineStyle)\n : (theme?.lineDash ?? (themeLineStyle ? getAnnotationLineDash(themeLineStyle) : undefined))\n const textColor = annotationDifferenceLine.textColor ?? theme?.textColor ?? DEFAULT_TEXT_COLOR\n const textBackgroundColor =\n annotationDifferenceLine.textBackgroundColor ?? theme?.textBackgroundColor ?? DEFAULT_TEXT_BACKGROUND_COLOR\n const textBackgroundOpacity = theme?.textBackgroundOpacity\n const textFontSize = annotationDifferenceLine.textFontSize ?? theme?.textFontSize ?? DEFAULT_TEXT_FONT_SIZE\n const differenceType = annotationDifferenceLine.differenceType ?? 'absolute'\n const startMeasureId = resolveDifferenceMeasureId(start, annotationDifferenceLine.start.selector, measureIds)\n const endMeasureId = resolveDifferenceMeasureId(end, annotationDifferenceLine.end.selector, measureIds)\n const sameMeasure = startMeasureId !== undefined && startMeasureId === endMeasureId\n const explicitMeasureFormat = sameMeasure\n ? getExplicitMeasureFormat(measures.find((measure) => measure.id === startMeasureId))\n : undefined\n const differenceFormatter =\n differenceType === 'percent'\n ? percentFormatter\n : explicitMeasureFormat\n ? createFormatter(explicitMeasureFormat)\n : (axisFormatter ?? autoFormatter)\n\n const label = usesRuntimeStackEnd\n ? {\n visible: true,\n position: 'middle',\n refY: 0,\n formatMethod: (_markData: any[], seriesData: any[]) => {\n try {\n return buildDifferenceText(\n getRuntimeDifferenceValue({\n anchor: start,\n seriesData,\n useElementStackEnd: usesRuntimeStackEnd,\n }),\n getRuntimeDifferenceValue({\n anchor: end,\n seriesData,\n useElementStackEnd: usesRuntimeStackEnd,\n }),\n differenceType,\n differenceFormatter,\n )\n } catch {\n return ''\n }\n },\n style: {\n fill: textColor,\n fontSize: textFontSize,\n },\n labelBackground: {\n visible: true,\n padding: DEFAULT_LABEL_PADDING,\n style: {\n opacity: textBackgroundOpacity ?? 0.95,\n fill: textBackgroundColor,\n fillOpacity: 1,\n stroke: lineColor,\n lineWidth: 1,\n cornerRadius: DEFAULT_CORNER_RADIUS,\n },\n },\n }\n : {\n visible: true,\n position: 'middle',\n refY: 0,\n text: buildDifferenceText(start.value, end.value, differenceType, differenceFormatter),\n style: {\n fill: textColor,\n fontSize: textFontSize,\n },\n labelBackground: {\n visible: true,\n padding: DEFAULT_LABEL_PADDING,\n style: {\n opacity: textBackgroundOpacity ?? 0.95,\n fill: textBackgroundColor,\n fillOpacity: 1,\n stroke: lineColor,\n lineWidth: 1,\n cornerRadius: DEFAULT_CORNER_RADIUS,\n },\n },\n }\n\n return [\n {\n type: 'type-step',\n autoRange: true,\n zIndex: ANNOTATION_Z_INDEX,\n connectDirection,\n expandDistance,\n coordinates: (seriesData: any[], relativeSeries: ICartesianSeries) => {\n try {\n return [\n buildDifferenceCoordinateDatum({\n anchor: start,\n seriesData,\n relativeSeries,\n useElementStackEnd: usesRuntimeStackEnd,\n }),\n buildDifferenceCoordinateDatum({\n anchor: end,\n seriesData,\n relativeSeries,\n useElementStackEnd: usesRuntimeStackEnd,\n }),\n ]\n } catch {\n return []\n }\n },\n line: useBracketStyle\n ? {\n multiSegment: true,\n mainSegmentIndex: 1,\n style: [\n {\n visible: true,\n stroke: lineColor,\n lineWidth: DEFAULT_LINE_WIDTH,\n lineDash: configuredLineDash ?? DEFAULT_BRACKET_LINE_DASH,\n },\n {\n visible: true,\n stroke: lineColor,\n lineWidth: DEFAULT_LINE_WIDTH,\n ...(configuredLineDash ? { lineDash: configuredLineDash } : {}),\n },\n {\n visible: true,\n stroke: lineColor,\n lineWidth: DEFAULT_LINE_WIDTH,\n lineDash: configuredLineDash ?? DEFAULT_BRACKET_LINE_DASH,\n },\n ],\n }\n : {\n style: {\n visible: true,\n stroke: lineColor,\n lineWidth: DEFAULT_LINE_WIDTH,\n lineDash: configuredLineDash ?? [0],\n cornerRadius: DEFAULT_CORNER_RADIUS,\n },\n },\n label,\n startSymbol: {\n visible: false,\n },\n endSymbol: {\n visible: true,\n size: DEFAULT_END_SYMBOL_SIZE,\n refX: DEFAULT_END_SYMBOL_REF_X,\n style: {\n fill: lineColor,\n },\n },\n } as IMarkLineSpec,\n ]\n } catch {\n return []\n }\n })\n\n const specMarkLine = (chartSpec.markLine as IMarkLineSpec[]) || []\n const nextSpec = {\n ...spec,\n markLine: [...specMarkLine, ...markLine],\n }\n\n if (markLine.length === 0) {\n return nextSpec\n }\n\n return mergeDifferenceLineRegionPadding(nextSpec as IBarChartSpec | ILineChartSpec | IAreaChartSpec, paddingPatch)\n}\n"],"names":["DEFAULT_LINE_COLOR","DEFAULT_TEXT_COLOR","DEFAULT_TEXT_BACKGROUND_COLOR","DEFAULT_TEXT_FONT_SIZE","DEFAULT_LINE_WIDTH","DEFAULT_CORNER_RADIUS","DEFAULT_LABEL_PADDING","DEFAULT_END_SYMBOL_SIZE","DEFAULT_END_SYMBOL_REF_X","DEFAULT_GUTTER_BASE_OFFSET","DEFAULT_GUTTER_RIGHT_PADDING","DEFAULT_GUTTER_TOP_PADDING","DEFAULT_BRACKET_LINE_DASH","DEFAULT_PERCENT_DIFFERENCE_FORMAT","shouldInferDifferenceConnectDirection","chartType","getDifferenceLinePath","index","total","toArray","value","Array","normalizeRegionPadding","padding","mergeDifferenceLineRegionPadding","spec","paddingPatch","region","mergedPadding","undefined","Math","buildFixedGutterExpandDistance","connectDirection","_markerData","context","coordinatePoints","regionStartX","regionStartY","width","height","targetY","minY","point","maxY","targetX","minX","maxX","getDifferenceLinePaddingPatch","getAxisFormatter","valueAxisOrient","formatMethod","axis","String","getExplicitMeasureFormat","measure","isEmpty","inferMeasureIdFromDatum","anchor","measureIds","candidateValues","datum","candidates","measureId","Number","inferMeasureIdFromSelector","selectorValue","measureIdSet","matchedMeasureIds","Set","currentSelector","isMeasureSelector","isFieldSelector","isDimensionSelector","isPartialDatumSelector","Object","field","resolveDifferenceMeasureId","assertDifferenceLineConfig","path","Error","start","end","annotationDifferenceLine","advancedVSeed","vseed","theme","annotationDifferenceLineList","dataset","chartSpec","stackResolveMode","getDifferenceLineStackResolveMode","useElementStackEnd","usesDifferenceLineElementStackEnd","isBracketChart","measures","findAllMeasures","axisFormatter","percentFormatter","createFormatter","isHorizontalChart","markLine","resolveDifferenceAnchor","usesRuntimeStackEnd","useBracketStyle","inferDifferenceConnectDirection","expandDistance","currentPaddingPatch","lineColor","lineStyle","themeLineStyle","configuredLineDash","getAnnotationLineDash","textColor","textBackgroundColor","textBackgroundOpacity","textFontSize","differenceType","startMeasureId","endMeasureId","sameMeasure","explicitMeasureFormat","differenceFormatter","autoFormatter","label","_markData","seriesData","buildDifferenceText","getRuntimeDifferenceValue","ANNOTATION_Z_INDEX","relativeSeries","buildDifferenceCoordinateDatum","specMarkLine","nextSpec"],"mappings":"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"}