@visactor/vchart-extension 2.1.0-alpha.23 → 2.1.0-alpha.25

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 (185) hide show
  1. package/build/index.js +229 -379
  2. package/build/index.min.js +2 -2
  3. package/cjs/charts/3d/plugin.js +1 -1
  4. package/cjs/charts/3d/pyramid-3d.js +1 -1
  5. package/cjs/charts/3d/rect-3d.js +1 -1
  6. package/cjs/charts/3d/util.js +1 -1
  7. package/cjs/charts/axis-3d/axis-3d-mixin.js +1 -1
  8. package/cjs/charts/axis-3d/band-axis.js +1 -1
  9. package/cjs/charts/axis-3d/index.js +1 -1
  10. package/cjs/charts/axis-3d/linear-axis.js +2 -1
  11. package/cjs/charts/axis-3d/log-axis.js +1 -1
  12. package/cjs/charts/axis-3d/symlog-axis.js +1 -1
  13. package/cjs/charts/axis-3d/theme.js +1 -1
  14. package/cjs/charts/axis-3d/time-axis.js +1 -1
  15. package/cjs/charts/axis-3d/util.js +1 -1
  16. package/cjs/charts/combination-candlestick/combination-candlestick-transformer.js +1 -1
  17. package/cjs/charts/combination-candlestick/combination-candlestick.js +1 -1
  18. package/cjs/charts/combination-candlestick/constant.js +1 -1
  19. package/cjs/charts/combination-candlestick/index.js +1 -1
  20. package/cjs/charts/combination-candlestick/interface.js +1 -1
  21. package/cjs/charts/conversion-funnel/arrow-data-transform.js +1 -1
  22. package/cjs/charts/conversion-funnel/constants.js +1 -1
  23. package/cjs/charts/conversion-funnel/conversion-funnel-transformer.js +1 -1
  24. package/cjs/charts/conversion-funnel/conversion-funnel.js +1 -1
  25. package/cjs/charts/conversion-funnel/index.js +1 -1
  26. package/cjs/charts/conversion-funnel/interface.js +1 -1
  27. package/cjs/charts/conversion-funnel/util.js +1 -1
  28. package/cjs/charts/funnel-3d/chart.js +2 -1
  29. package/cjs/charts/funnel-3d/constant.js +1 -1
  30. package/cjs/charts/funnel-3d/index.js +1 -1
  31. package/cjs/charts/funnel-3d/interface.js +1 -1
  32. package/cjs/charts/funnel-3d/series-spec-transformer.js +1 -1
  33. package/cjs/charts/funnel-3d/series.js +1 -1
  34. package/cjs/charts/funnel-3d/theme.js +1 -1
  35. package/cjs/charts/histogram-3d/chart.js +1 -1
  36. package/cjs/charts/storyline/interface.d.ts +2 -4
  37. package/cjs/charts/storyline/interface.js.map +1 -1
  38. package/cjs/charts/storyline/layout.d.ts +0 -1
  39. package/cjs/charts/storyline/layout.js +4 -27
  40. package/cjs/charts/storyline/layout.js.map +1 -1
  41. package/cjs/charts/storyline/layouts/arc.js +56 -48
  42. package/cjs/charts/storyline/layouts/arc.js.map +1 -1
  43. package/cjs/charts/storyline/layouts/clock.js +3 -4
  44. package/cjs/charts/storyline/layouts/clock.js.map +1 -1
  45. package/cjs/charts/storyline/layouts/common.d.ts +2 -3
  46. package/cjs/charts/storyline/layouts/common.js +17 -12
  47. package/cjs/charts/storyline/layouts/common.js.map +1 -1
  48. package/cjs/charts/storyline/layouts/default.js +3 -3
  49. package/cjs/charts/storyline/layouts/default.js.map +1 -1
  50. package/cjs/charts/storyline/layouts/landscape.js +35 -24
  51. package/cjs/charts/storyline/layouts/landscape.js.map +1 -1
  52. package/cjs/charts/storyline/layouts/portrait.js +3 -3
  53. package/cjs/charts/storyline/layouts/portrait.js.map +1 -1
  54. package/cjs/charts/storyline/layouts/wing.js +53 -11
  55. package/cjs/charts/storyline/layouts/wing.js.map +1 -1
  56. package/cjs/charts/storyline/storyline-transformer.js +6 -22
  57. package/cjs/charts/storyline/storyline-transformer.js.map +1 -1
  58. package/cjs/components/bar-link/bar-link.js +1 -1
  59. package/cjs/components/bar-link/constant.js +1 -1
  60. package/cjs/components/bar-link/index.js +1 -1
  61. package/cjs/components/bar-link/type.js +1 -1
  62. package/cjs/components/bar-link/util.js +1 -1
  63. package/cjs/components/bar-regression-line/index.js +1 -1
  64. package/cjs/components/bar-regression-line/type.js +1 -2
  65. package/cjs/components/extension-mark-sync-state/extension-mark-sync-state.js +1 -1
  66. package/cjs/components/extension-mark-sync-state/index.js +1 -1
  67. package/cjs/components/extension-mark-sync-state/type.js +1 -1
  68. package/cjs/components/histogram-regression-line/index.js +1 -1
  69. package/cjs/components/histogram-regression-line/type.js +1 -1
  70. package/cjs/components/map-label/index.js +1 -1
  71. package/cjs/components/map-label/layout.js +1 -1
  72. package/cjs/components/map-label/map-label-transformer.js +1 -1
  73. package/cjs/components/map-label/map-label.js +1 -1
  74. package/cjs/components/map-label/theme.js +1 -1
  75. package/cjs/components/map-label/type.js +1 -1
  76. package/cjs/components/regression-line/index.js +1 -1
  77. package/cjs/components/regression-line/regression-line.js +1 -1
  78. package/cjs/components/regression-line/type.js +1 -1
  79. package/cjs/components/scatter-regression-line/index.js +1 -1
  80. package/cjs/components/scatter-regression-line/type.js +1 -1
  81. package/cjs/components/series-break/constant.js +1 -1
  82. package/cjs/components/series-break/index.js +1 -1
  83. package/cjs/components/series-break/series-break.js +1 -1
  84. package/cjs/components/series-break/type.js +1 -1
  85. package/cjs/components/series-break/util.js +1 -1
  86. package/cjs/components/series-label/constant.js +1 -1
  87. package/cjs/components/series-label/index.js +1 -2
  88. package/cjs/components/series-label/series-label.js +1 -1
  89. package/cjs/components/series-label/type.js +1 -1
  90. package/cjs/components/series-label/util.js +1 -1
  91. package/esm/charts/3d/plugin.js +1 -1
  92. package/esm/charts/3d/pyramid-3d.js +1 -1
  93. package/esm/charts/3d/rect-3d.js +1 -1
  94. package/esm/charts/3d/util.js +1 -1
  95. package/esm/charts/axis-3d/axis-3d-mixin.js +1 -1
  96. package/esm/charts/axis-3d/band-axis.js +1 -1
  97. package/esm/charts/axis-3d/index.js +1 -1
  98. package/esm/charts/axis-3d/linear-axis.js +2 -1
  99. package/esm/charts/axis-3d/log-axis.js +1 -1
  100. package/esm/charts/axis-3d/symlog-axis.js +1 -1
  101. package/esm/charts/axis-3d/theme.js +1 -1
  102. package/esm/charts/axis-3d/time-axis.js +1 -1
  103. package/esm/charts/axis-3d/util.js +1 -1
  104. package/esm/charts/combination-candlestick/combination-candlestick-transformer.js +1 -1
  105. package/esm/charts/combination-candlestick/combination-candlestick.js +1 -1
  106. package/esm/charts/combination-candlestick/constant.js +1 -1
  107. package/esm/charts/combination-candlestick/index.js +1 -1
  108. package/esm/charts/combination-candlestick/interface.js +1 -1
  109. package/esm/charts/conversion-funnel/arrow-data-transform.js +1 -1
  110. package/esm/charts/conversion-funnel/constants.js +1 -1
  111. package/esm/charts/conversion-funnel/conversion-funnel-transformer.js +1 -1
  112. package/esm/charts/conversion-funnel/conversion-funnel.js +1 -1
  113. package/esm/charts/conversion-funnel/index.js +1 -1
  114. package/esm/charts/conversion-funnel/interface.js +1 -1
  115. package/esm/charts/conversion-funnel/util.js +1 -1
  116. package/esm/charts/funnel-3d/chart.js +2 -1
  117. package/esm/charts/funnel-3d/constant.js +1 -1
  118. package/esm/charts/funnel-3d/index.js +1 -1
  119. package/esm/charts/funnel-3d/interface.js +1 -1
  120. package/esm/charts/funnel-3d/series-spec-transformer.js +1 -1
  121. package/esm/charts/funnel-3d/series.js +1 -1
  122. package/esm/charts/funnel-3d/theme.js +1 -1
  123. package/esm/charts/histogram-3d/chart.js +1 -1
  124. package/esm/charts/storyline/interface.d.ts +2 -4
  125. package/esm/charts/storyline/interface.js.map +1 -1
  126. package/esm/charts/storyline/layout.d.ts +0 -1
  127. package/esm/charts/storyline/layout.js +4 -27
  128. package/esm/charts/storyline/layout.js.map +1 -1
  129. package/esm/charts/storyline/layouts/arc.js +54 -46
  130. package/esm/charts/storyline/layouts/arc.js.map +1 -1
  131. package/esm/charts/storyline/layouts/clock.js +4 -5
  132. package/esm/charts/storyline/layouts/clock.js.map +1 -1
  133. package/esm/charts/storyline/layouts/common.d.ts +2 -3
  134. package/esm/charts/storyline/layouts/common.js +11 -9
  135. package/esm/charts/storyline/layouts/common.js.map +1 -1
  136. package/esm/charts/storyline/layouts/default.js +3 -3
  137. package/esm/charts/storyline/layouts/default.js.map +1 -1
  138. package/esm/charts/storyline/layouts/landscape.js +33 -22
  139. package/esm/charts/storyline/layouts/landscape.js.map +1 -1
  140. package/esm/charts/storyline/layouts/portrait.js +3 -3
  141. package/esm/charts/storyline/layouts/portrait.js.map +1 -1
  142. package/esm/charts/storyline/layouts/wing.js +52 -10
  143. package/esm/charts/storyline/layouts/wing.js.map +1 -1
  144. package/esm/charts/storyline/storyline-transformer.js +6 -21
  145. package/esm/charts/storyline/storyline-transformer.js.map +1 -1
  146. package/esm/components/bar-link/bar-link.js +1 -1
  147. package/esm/components/bar-link/constant.js +1 -1
  148. package/esm/components/bar-link/index.js +1 -1
  149. package/esm/components/bar-link/type.js +1 -1
  150. package/esm/components/bar-link/util.js +1 -1
  151. package/esm/components/bar-regression-line/index.js +1 -1
  152. package/esm/components/bar-regression-line/type.js +1 -2
  153. package/esm/components/extension-mark-sync-state/extension-mark-sync-state.js +1 -1
  154. package/esm/components/extension-mark-sync-state/index.js +1 -1
  155. package/esm/components/extension-mark-sync-state/type.js +1 -1
  156. package/esm/components/histogram-regression-line/index.js +1 -1
  157. package/esm/components/histogram-regression-line/type.js +1 -1
  158. package/esm/components/map-label/index.js +1 -1
  159. package/esm/components/map-label/layout.js +1 -1
  160. package/esm/components/map-label/map-label-transformer.js +1 -1
  161. package/esm/components/map-label/map-label.js +1 -1
  162. package/esm/components/map-label/theme.js +1 -1
  163. package/esm/components/map-label/type.js +1 -1
  164. package/esm/components/regression-line/index.js +1 -1
  165. package/esm/components/regression-line/regression-line.js +1 -1
  166. package/esm/components/regression-line/type.js +1 -1
  167. package/esm/components/scatter-regression-line/index.js +1 -1
  168. package/esm/components/scatter-regression-line/type.js +1 -1
  169. package/esm/components/series-break/constant.js +1 -1
  170. package/esm/components/series-break/index.js +1 -1
  171. package/esm/components/series-break/series-break.js +1 -1
  172. package/esm/components/series-break/type.js +1 -1
  173. package/esm/components/series-break/util.js +1 -1
  174. package/esm/components/series-label/constant.js +1 -1
  175. package/esm/components/series-label/index.js +1 -2
  176. package/esm/components/series-label/series-label.js +1 -1
  177. package/esm/components/series-label/type.js +1 -1
  178. package/esm/components/series-label/util.js +1 -1
  179. package/package.json +4 -4
  180. package/cjs/charts/storyline/layouts/ladder.d.ts +0 -5
  181. package/cjs/charts/storyline/layouts/ladder.js +0 -229
  182. package/cjs/charts/storyline/layouts/ladder.js.map +0 -1
  183. package/esm/charts/storyline/layouts/ladder.d.ts +0 -5
  184. package/esm/charts/storyline/layouts/ladder.js +0 -216
  185. package/esm/charts/storyline/layouts/ladder.js.map +0 -1
@@ -4,13 +4,13 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: !0
5
5
  }), exports.buildLandscapeBlockMark = exports.buildLandscapeConnectingCurve = void 0;
6
6
 
7
- const vchart_1 = require("@visactor/vchart"), common_1 = require("./common"), LANDSCAPE_IMAGE_HEIGHT_RATIO = .42, LANDSCAPE_DETACHED_GAP = 64, LANDSCAPE_CONNECTOR_ARROW_SIZE = 9, LANDSCAPE_CONNECTOR_X_RATIO = .2, LANDSCAPE_TEXT_GAP_FROM_CONNECTOR = 12, LANDSCAPE_CONTENT_LINES = 10, LANDSCAPE_TITLE_LINE_HEIGHT = 34, LANDSCAPE_CONTENT_LINE_HEIGHT = 23, LANDSCAPE_CONTENT_FONT_SIZE = 16, LANDSCAPE_TITLE_TO_CONTENT_GAP = 4, getLandscapeImageCenter = (spec, ctx, index) => {
8
- var _a, _b, _c, _e;
7
+ const vchart_1 = require("@visactor/vchart"), common_1 = require("./common"), LANDSCAPE_IMAGE_HEIGHT_RATIO = .42, LANDSCAPE_CONNECTOR_GAP = 8, LANDSCAPE_CONNECTOR_X_RATIO = .2, LANDSCAPE_TEXT_GAP_FROM_CONNECTOR = 12, LANDSCAPE_TITLE_LINE_HEIGHT = 34, LANDSCAPE_CONTENT_LINE_HEIGHT = 23, LANDSCAPE_CONTENT_FONT_SIZE = 16, LANDSCAPE_TITLE_TO_CONTENT_GAP = 4, LANDSCAPE_BODY_MARGIN = 8, LANDSCAPE_IMAGE_BAND_RATIO = .28, LANDSCAPE_IMAGE_BAND_MAX_RATIO = .42, getLandscapeImageCenter = (spec, ctx, index) => {
9
8
  const lb = (0, common_1.getLayout)(spec, ctx).blocks[index];
10
9
  if (!lb) return null;
10
+ const m = getLandscapeMetrics(spec, lb.width, lb.height, index, ctx);
11
11
  return {
12
- x: null !== (_b = null === (_a = lb.center) || void 0 === _a ? void 0 : _a.x) && void 0 !== _b ? _b : lb.x + lb.width / 2,
13
- y: (null !== (_e = null === (_c = lb.center) || void 0 === _c ? void 0 : _c.y) && void 0 !== _e ? _e : lb.y + lb.height / 2) + (index % 2 == 0 ? -1 : 1) * lb.height * .1
12
+ x: lb.x + m.imageBox.x + m.imageBox.width / 2,
13
+ y: m.bodyOriginY + m.imageBox.y + m.imageBox.height / 2
14
14
  };
15
15
  }, buildLandscapeConnectingCurve = spec => {
16
16
  var _a, _b, _c, _e, _f, _g, _h;
@@ -70,13 +70,13 @@ const getLandscapeMetrics = (spec, blockWidth, blockHeight, index, ctx) => {
70
70
  var _a, _b, _c, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
71
71
  const padding = (0, common_1.normalizePadding)(null !== (_b = null === (_a = spec.block) || void 0 === _a ? void 0 : _a.padding) && void 0 !== _b ? _b : 12), titleFontSize = (0,
72
72
  common_1.resolveTitleFontSize)(spec, ctx, null === (_e = null === (_c = spec.data) || void 0 === _c ? void 0 : _c[index]) || void 0 === _e ? void 0 : _e.title, blockWidth, 26, [ 8, 34 ]), titleLineHeight = (0,
73
- common_1.resolveAdaptiveLineHeight)(titleFontSize, null === (_f = spec.title) || void 0 === _f ? void 0 : _f.style, 34), titleHeight = (0,
74
- common_1.getBlockTitleHeight)(titleLineHeight, null === (_h = null === (_g = spec.data) || void 0 === _g ? void 0 : _g[index]) || void 0 === _h ? void 0 : _h.title), contentFontSize = Number(null !== (_l = null === (_k = null === (_j = spec.content) || void 0 === _j ? void 0 : _j.style) || void 0 === _k ? void 0 : _k.fontSize) && void 0 !== _l ? _l : 16), contentLineHeight = Number(null !== (_p = null === (_o = null === (_m = spec.content) || void 0 === _m ? void 0 : _m.style) || void 0 === _o ? void 0 : _o.lineHeight) && void 0 !== _p ? _p : 23), imageHeight = Math.max(null !== (_r = null === (_q = spec.image) || void 0 === _q ? void 0 : _q.height) && void 0 !== _r ? _r : Math.round(.42 * blockHeight), titleLineHeight + padding.top + padding.bottom), canvasHeight = spec.height, contentHeight = canvasHeight ? Math.max(2 * contentLineHeight, Math.round(canvasHeight / 4)) : 10 * contentLineHeight, textHeight = titleHeight + 4 + contentHeight, textOnTop = index % 2 == 0;
73
+ common_1.resolveAdaptiveLineHeight)(titleFontSize, null === (_f = spec.title) || void 0 === _f ? void 0 : _f.style, 34), contentFontSize = Number(null !== (_j = null === (_h = null === (_g = spec.content) || void 0 === _g ? void 0 : _g.style) || void 0 === _h ? void 0 : _h.fontSize) && void 0 !== _j ? _j : 16), contentLineHeight = Number(null !== (_m = null === (_l = null === (_k = spec.content) || void 0 === _k ? void 0 : _k.style) || void 0 === _l ? void 0 : _l.lineHeight) && void 0 !== _m ? _m : 23), {width: regionWidth} = (0,
74
+ common_1.getRegionGeometry)(ctx, spec), blockCount = Math.max(null !== (_p = null === (_o = spec.data) || void 0 === _o ? void 0 : _o.length) && void 0 !== _p ? _p : 1, 1), textWidth = Math.max(regionWidth / blockCount, 1), titleHeight = (0,
75
+ common_1.getBlockTitleHeight)(titleLineHeight, null === (_r = null === (_q = spec.data) || void 0 === _q ? void 0 : _q[index]) || void 0 === _r ? void 0 : _r.title, textWidth, titleFontSize), rawImageHeight = Math.max(null !== (_t = null === (_s = spec.image) || void 0 === _s ? void 0 : _s.height) && void 0 !== _t ? _t : Math.round(.42 * blockHeight), titleLineHeight + padding.top + padding.bottom), minTextBandHeight = titleHeight + 4 + 2 * contentLineHeight, body = getLandscapeBodyGeometry(ctx, spec, rawImageHeight, blockHeight, minTextBandHeight), imageHeight = body.imageHeight, textBandHeight = body.textBandHeight, contentHeight = Math.max(0, textBandHeight - titleHeight - 4), textHeight = titleHeight + 4 + contentHeight, textOnTop = index % 2 == 0;
75
76
  let textBox, contentBox, imageBox, connector, groupTop, groupHeight;
76
- const connectorX = 0 + .2 * blockWidth, textX = connectorX + 12, {width: regionWidth} = (0,
77
- common_1.getRegionGeometry)(ctx, spec), blockCount = Math.max(null !== (_t = null === (_s = spec.data) || void 0 === _s ? void 0 : _s.length) && void 0 !== _t ? _t : 1, 1), textWidth = Math.max(regionWidth / blockCount, 1);
77
+ const connectorX = 0 + .2 * blockWidth, textX = connectorX + 12, waveOffset = (textOnTop ? -1 : 1) * body.waveAmplitude, imageY = body.imageBandTop + body.imageBandHeight / 2 + waveOffset - imageHeight / 2;
78
78
  if (textOnTop) {
79
- const imageY = 0, textY = imageY - 64 - textHeight;
79
+ const textY = body.upperTextTop;
80
80
  imageBox = {
81
81
  x: 0,
82
82
  y: imageY,
@@ -94,12 +94,12 @@ const getLandscapeMetrics = (spec, blockWidth, blockHeight, index, ctx) => {
94
94
  height: contentHeight
95
95
  }, connector = {
96
96
  x1: connectorX,
97
- y1: imageY,
97
+ y1: Math.max(imageY - 8, body.upperTextTop),
98
98
  x2: connectorX,
99
99
  y2: textY + Math.max(titleHeight, titleLineHeight) / 2
100
- }, groupTop = textY, groupHeight = imageHeight - groupTop;
100
+ }, groupTop = 0, groupHeight = body.height;
101
101
  } else {
102
- const imageY = 0, textY = imageY + imageHeight + 64;
102
+ const textY = body.lowerTextTop;
103
103
  imageBox = {
104
104
  x: 0,
105
105
  y: imageY,
@@ -117,18 +117,21 @@ const getLandscapeMetrics = (spec, blockWidth, blockHeight, index, ctx) => {
117
117
  height: contentHeight
118
118
  }, connector = {
119
119
  x1: connectorX,
120
- y1: imageY + imageHeight,
120
+ y1: Math.min(imageY + imageHeight + 8, body.height),
121
121
  x2: connectorX,
122
122
  y2: textY + textHeight
123
- }, groupTop = imageY, groupHeight = textY + textHeight - imageY;
123
+ }, groupTop = 0, groupHeight = body.height;
124
124
  }
125
125
  return {
126
126
  padding: padding,
127
127
  titleFontSize: titleFontSize,
128
128
  titleLineHeight: titleLineHeight,
129
+ titleHeight: titleHeight,
129
130
  contentFontSize: contentFontSize,
130
131
  contentLineHeight: contentLineHeight,
131
132
  contentHeight: contentHeight,
133
+ minTextBandHeight: minTextBandHeight,
134
+ bodyOriginY: body.originY,
132
135
  blockWidth: Math.max(blockWidth, textX + textWidth),
133
136
  imageBox: imageBox,
134
137
  textBox: textBox,
@@ -138,6 +141,19 @@ const getLandscapeMetrics = (spec, blockWidth, blockHeight, index, ctx) => {
138
141
  groupTop: groupTop,
139
142
  groupHeight: groupHeight
140
143
  };
144
+ }, getLandscapeBodyGeometry = (ctx, spec, rawImageHeight, blockHeight, minTextBandHeight) => {
145
+ const region = (0, common_1.getRegionGeometry)(ctx, spec), margin = Math.min(8, Math.max(.04 * region.height, 0)), height = Math.max(region.height - 2 * margin, 1), textBandReserve = Math.min(minTextBandHeight, Math.max((height - 48) / 2, 0)), maxImageBandHeight = Math.max(height - 2 * textBandReserve, .18 * height), imageBandHeight = Math.min(Math.max(rawImageHeight + 24, .28 * height), Math.max(1, Math.min(maxImageBandHeight, .42 * height))), imageHeight = Math.min(rawImageHeight, Math.max(imageBandHeight - 16, 1)), textBandHeight = Math.max((height - imageBandHeight) / 2, 1), imageBandTop = textBandHeight;
146
+ return {
147
+ originY: region.startY + margin,
148
+ height: height,
149
+ textBandHeight: textBandHeight,
150
+ imageBandTop: imageBandTop,
151
+ imageBandHeight: imageBandHeight,
152
+ imageHeight: imageHeight,
153
+ upperTextTop: 0,
154
+ lowerTextTop: imageBandTop + imageBandHeight,
155
+ waveAmplitude: Math.min(.18 * imageBandHeight, .1 * blockHeight)
156
+ };
141
157
  }, buildLandscapeBlockMark = (spec, block, index) => {
142
158
  var _a, _b, _c, _e, _f, _g, _h, _j, _k, _l, _m;
143
159
  const hasImage = !!block.image, contentText = Array.isArray(block.content) ? block.content : block.content ? [ block.content ] : [], getMetrics = ctx => {
@@ -158,11 +174,7 @@ const getLandscapeMetrics = (spec, blockWidth, blockHeight, index, ctx) => {
158
174
  const lb = (0, common_1.getLayout)(spec, ctx).blocks[index];
159
175
  return null !== (_a = null == lb ? void 0 : lb.x) && void 0 !== _a ? _a : 0;
160
176
  },
161
- y: (_d, ctx) => {
162
- var _a, _b, _c, _e, _f, _g, _h;
163
- const lb = (0, common_1.getLayout)(spec, ctx).blocks[index], m = getMetrics(ctx), cy = null !== (_b = null === (_a = null == lb ? void 0 : lb.center) || void 0 === _a ? void 0 : _a.y) && void 0 !== _b ? _b : (null !== (_c = null == lb ? void 0 : lb.y) && void 0 !== _c ? _c : 0) + (null !== (_e = null == lb ? void 0 : lb.height) && void 0 !== _e ? _e : 0) / 2, blockH = null !== (_h = null !== (_f = null == lb ? void 0 : lb.height) && void 0 !== _f ? _f : null === (_g = spec.block) || void 0 === _g ? void 0 : _g.height) && void 0 !== _h ? _h : common_1.DEFAULT_BLOCK_HEIGHT, stagger = m.textOnTop ? .1 * blockH : .1 * -blockH;
164
- return cy - m.imageBox.height / 2 + stagger;
165
- },
177
+ y: (_d, ctx) => getMetrics(ctx).bodyOriginY,
166
178
  width: (_d, ctx) => getMetrics(ctx).blockWidth,
167
179
  height: (_d, ctx) => getMetrics(ctx).groupHeight
168
180
  },
@@ -201,10 +213,10 @@ const getLandscapeMetrics = (spec, blockWidth, blockHeight, index, ctx) => {
201
213
  stroke: connectorStroke,
202
214
  lineWidth: connectorLineWidth,
203
215
  lineDash: connectorDash,
204
- fill: connectorStroke,
216
+ fill: !1,
205
217
  path: (_d, ctx) => {
206
- const m = getMetrics(ctx), x = m.connector.x1, y0 = m.connector.y1, y1 = m.connector.y2, baseY = y1 - 9 * (y1 < y0 ? -1 : 1);
207
- return `${`M ${x} ${y0} L ${x} ${baseY}`} ${`M ${x - 4.5} ${baseY} L ${x + 4.5} ${baseY} L ${x} ${y1} Z`}`;
218
+ const m = getMetrics(ctx), x = m.connector.x1;
219
+ return `M ${x} ${m.connector.y1} L ${x} ${m.connector.y2}`;
208
220
  }
209
221
  }
210
222
  }, block.title ? Object.assign(Object.assign({
@@ -216,8 +228,7 @@ const getLandscapeMetrics = (spec, blockWidth, blockHeight, index, ctx) => {
216
228
  x: (_d, ctx) => getMetrics(ctx).textBox.x,
217
229
  y: (_d, ctx) => getMetrics(ctx).textBox.y,
218
230
  text: block.title,
219
- maxLineWidth: (_d, ctx) => getMetrics(ctx).textBox.width,
220
- height: (_d, ctx) => getMetrics(ctx).titleLineHeight * common_1.BLOCK_TITLE_MAX_LINES,
231
+ height: (_d, ctx) => getMetrics(ctx).titleHeight,
221
232
  heightLimit: (_d, ctx) => getMetrics(ctx).titleLineHeight * common_1.BLOCK_TITLE_MAX_LINES,
222
233
  lineClamp: common_1.BLOCK_TITLE_MAX_LINES,
223
234
  fontSize: (_d, ctx) => getMetrics(ctx).titleFontSize,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/charts/storyline/layouts/landscape.ts"],"names":[],"mappings":"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","file":"landscape.js","sourcesContent":["import type { IExtensionGroupMarkSpec } from '@visactor/vchart';\nimport { LayoutZIndex } from '@visactor/vchart';\nimport type { IStorylineBlock, IStorylineSpec } from '../interface';\nimport {\n type ICustomMarkSpec,\n type LayoutContext,\n type StorylinePoint,\n DEFAULT_BLOCK_HEIGHT,\n BLOCK_TITLE_MAX_LINES,\n buildPlainContent,\n buildSmoothCurvePath,\n getBlockTitleHeight,\n getImageBackgroundStyle,\n getLayout,\n getRegionGeometry,\n getThemeColor,\n normalizePadding,\n omitImageLayoutSpec,\n resolveAdaptiveLineHeight,\n resolveBlockWidth,\n resolveTitleFontSize,\n shouldShowImageBackground\n} from './common';\n\n// landscape 布局下,image rect 与 text rect 分离展示\nconst LANDSCAPE_IMAGE_HEIGHT_RATIO = 0.42;\nconst LANDSCAPE_DETACHED_GAP = 64;\nconst LANDSCAPE_CONNECTOR_ARROW_SIZE = 9;\nconst LANDSCAPE_CONNECTOR_X_RATIO = 0.2; // 引导线 x 位于 image 左侧 20% 处\nconst LANDSCAPE_TEXT_GAP_FROM_CONNECTOR = 12; // 文字距离引导线的水平间距\n// content 区固定为 10 行,整体 textHeight = titleLineHeight + titleGap + contentLines * contentLineHeight\nconst LANDSCAPE_CONTENT_LINES = 10;\nconst LANDSCAPE_TITLE_LINE_HEIGHT = 34;\nconst LANDSCAPE_CONTENT_LINE_HEIGHT = 23;\nconst LANDSCAPE_CONTENT_FONT_SIZE = 16;\nconst LANDSCAPE_TITLE_TO_CONTENT_GAP = 4;\n\n/**\n * 计算第 index 个 block 在 landscape 布局下的 image 中心点(含 stagger 错落偏移)。\n */\nconst getLandscapeImageCenter = (spec: IStorylineSpec, ctx: LayoutContext, index: number): StorylinePoint | null => {\n const lb = getLayout(spec, ctx).blocks[index];\n if (!lb) {\n return null;\n }\n const cx = lb.center?.x ?? lb.x + lb.width / 2;\n const cy = lb.center?.y ?? lb.y + lb.height / 2;\n // 与 buildLandscapeBlockMark 中 group y 的 stagger 偏移保持一致\n const stagger = (index % 2 === 0 ? -1 : 1) * lb.height * 0.1;\n return { x: cx, y: cy + stagger };\n};\n\n/**\n * landscape 下绘制一条贯穿所有 image 中心的平滑虚线曲线,并在每个节点位置画 symbol,\n * 颜色跟随主题色。\n */\nexport const buildLandscapeConnectingCurve = (spec: IStorylineSpec): IExtensionGroupMarkSpec | null => {\n const themeColor = getThemeColor(spec);\n const lineStyle = spec.line?.style ?? {};\n const count = spec.data?.length ?? 0;\n const symbolSize = 14;\n const symbolChildren: ICustomMarkSpec<'symbol'>[] = [];\n for (let i = 0; i < count; i++) {\n const idx = i;\n symbolChildren.push({\n type: 'symbol',\n name: `storyline-landscape-curve-symbol-${idx}`,\n interactive: false,\n style: {\n symbolType: 'circle',\n size: symbolSize,\n fill: themeColor,\n x: (_d: unknown, ctx: LayoutContext) => getLandscapeImageCenter(spec, ctx, idx)?.x ?? 0,\n y: (_d: unknown, ctx: LayoutContext) => getLandscapeImageCenter(spec, ctx, idx)?.y ?? 0\n }\n } as ICustomMarkSpec<'symbol'>);\n }\n return {\n type: 'group' as any,\n name: 'storyline-landscape-curve',\n zIndex: LayoutZIndex.Mark + 2,\n children: [\n {\n type: 'path',\n name: 'storyline-landscape-curve-path',\n interactive: false,\n style: {\n stroke: (lineStyle as any).stroke ?? themeColor,\n lineWidth: (lineStyle as any).lineWidth ?? 4,\n lineDash: (lineStyle as any).lineDash ?? [6, 5],\n lineCap: 'round',\n fill: 'transparent',\n fillOpacity: 0,\n path: (_d: unknown, ctx: LayoutContext) => {\n const points: StorylinePoint[] = [];\n for (let i = 0; i < count; i++) {\n const center = getLandscapeImageCenter(spec, ctx, i);\n if (center) {\n points.push(center);\n }\n }\n return buildSmoothCurvePath(points);\n }\n }\n } as ICustomMarkSpec<'path'>,\n ...symbolChildren\n ]\n };\n};\n\n/**\n * landscape 布局下,每个 block 拆分为 image rect 与 text rect 两个独立卡片,\n * 中间用主题色虚线箭头连接;title+content 在 image 上方/下方交替错落摆放。\n */\nconst getLandscapeMetrics = (\n spec: IStorylineSpec,\n blockWidth: number,\n blockHeight: number,\n index: number,\n ctx: LayoutContext\n) => {\n const padding = normalizePadding(spec.block?.padding ?? 12);\n const titleFontSize = resolveTitleFontSize(spec, ctx, spec.data?.[index]?.title, blockWidth, 26, [8, 34]);\n const titleLineHeight = resolveAdaptiveLineHeight(\n titleFontSize,\n spec.title?.style as any,\n LANDSCAPE_TITLE_LINE_HEIGHT\n );\n const titleHeight = getBlockTitleHeight(titleLineHeight, spec.data?.[index]?.title);\n const contentFontSize = Number((spec.content?.style as any)?.fontSize ?? LANDSCAPE_CONTENT_FONT_SIZE);\n const contentLineHeight = Number((spec.content?.style as any)?.lineHeight ?? LANDSCAPE_CONTENT_LINE_HEIGHT);\n\n const imageHeight = Math.max(\n spec.image?.height ?? Math.round(blockHeight * LANDSCAPE_IMAGE_HEIGHT_RATIO),\n titleLineHeight + padding.top + padding.bottom\n );\n const connectorGap = LANDSCAPE_DETACHED_GAP;\n // landscape:content 默认高度 = 图表高度 / 2,没有传 spec.height 时回退到固定行数\n const canvasHeight = spec.height as number | undefined;\n const contentHeight = canvasHeight\n ? Math.max(contentLineHeight * 2, Math.round(canvasHeight / 4))\n : LANDSCAPE_CONTENT_LINES * contentLineHeight;\n const titleToContentGap = LANDSCAPE_TITLE_TO_CONTENT_GAP;\n const textHeight = titleHeight + titleToContentGap + contentHeight;\n\n const textOnTop = index % 2 === 0;\n\n let textBox: { x: number; y: number; width: number; height: number };\n let contentBox: { x: number; y: number; width: number; height: number };\n let imageBox: { x: number; y: number; width: number; height: number };\n let connector: { x1: number; y1: number; x2: number; y2: number };\n let groupTop: number;\n let groupHeight: number;\n\n const imageX = 0;\n const connectorX = imageX + blockWidth * LANDSCAPE_CONNECTOR_X_RATIO;\n const textX = connectorX + LANDSCAPE_TEXT_GAP_FROM_CONNECTOR;\n const { width: regionWidth } = getRegionGeometry(ctx, spec);\n const blockCount = Math.max(spec.data?.length ?? 1, 1);\n const textWidth = Math.max(regionWidth / blockCount, 1);\n\n if (textOnTop) {\n const imageY = 0;\n const textY = imageY - connectorGap - textHeight;\n const connectorY1 = imageY;\n const connectorY2 = textY + Math.max(titleHeight, titleLineHeight) / 2;\n\n imageBox = { x: imageX, y: imageY, width: blockWidth, height: imageHeight };\n textBox = { x: textX, y: textY, width: textWidth, height: textHeight };\n contentBox = {\n x: textX,\n y: textY + titleHeight + titleToContentGap,\n width: textWidth,\n height: contentHeight\n };\n connector = { x1: connectorX, y1: connectorY1, x2: connectorX, y2: connectorY2 };\n groupTop = textY;\n groupHeight = imageHeight - groupTop;\n } else {\n const imageY = 0;\n const textY = imageY + imageHeight + connectorGap;\n const connectorY1 = imageY + imageHeight;\n const connectorY2 = textY + textHeight;\n\n imageBox = { x: imageX, y: imageY, width: blockWidth, height: imageHeight };\n textBox = { x: textX, y: textY, width: textWidth, height: textHeight };\n contentBox = {\n x: textX,\n y: textY + titleHeight + titleToContentGap,\n width: textWidth,\n height: contentHeight\n };\n connector = { x1: connectorX, y1: connectorY1, x2: connectorX, y2: connectorY2 };\n groupTop = imageY;\n groupHeight = textY + textHeight - imageY;\n }\n\n return {\n padding,\n titleFontSize,\n titleLineHeight,\n contentFontSize,\n contentLineHeight,\n contentHeight,\n blockWidth: Math.max(blockWidth, textX + textWidth),\n imageBox,\n textBox,\n contentBox,\n connector,\n textOnTop,\n groupTop,\n groupHeight\n };\n};\n\nexport const buildLandscapeBlockMark = (\n spec: IStorylineSpec,\n block: IStorylineBlock,\n index: number\n): IExtensionGroupMarkSpec => {\n const hasImage = !!block.image;\n const contentText = Array.isArray(block.content) ? block.content : block.content ? [block.content] : [];\n\n const getMetrics = (ctx: LayoutContext) => {\n const layoutBlock = getLayout(spec, ctx).blocks[index];\n const w = layoutBlock?.width ?? resolveBlockWidth(spec, 0);\n const h = layoutBlock?.height ?? spec.block?.height ?? DEFAULT_BLOCK_HEIGHT;\n return getLandscapeMetrics(spec, w, h, index, ctx);\n };\n\n const blockStyle = spec.block?.style ?? {};\n const lineStyle = spec.line?.style ?? {};\n const themeColor = getThemeColor(spec);\n const connectorStroke = (lineStyle as any).stroke ?? themeColor;\n const connectorLineWidth = (lineStyle as any).lineWidth ?? 2;\n const connectorDash = (lineStyle as any).lineDash ?? [4, 4];\n\n return {\n type: 'group' as any,\n id: `storyline-block-${block.id ?? index}`,\n name: `storyline-block-${index}`,\n zIndex: LayoutZIndex.Mark + 1,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => {\n const lb = getLayout(spec, ctx).blocks[index];\n return lb?.x ?? 0;\n },\n y: (_d: unknown, ctx: LayoutContext) => {\n const lb = getLayout(spec, ctx).blocks[index];\n const m = getMetrics(ctx);\n const cy = lb?.center?.y ?? (lb?.y ?? 0) + (lb?.height ?? 0) / 2;\n const blockH = lb?.height ?? spec.block?.height ?? DEFAULT_BLOCK_HEIGHT;\n // text 在上方时 group 往下偏移,text 在下方时 group 往上偏移\n const stagger = m.textOnTop ? blockH * 0.1 : -blockH * 0.1;\n return cy - m.imageBox.height / 2 + stagger;\n },\n width: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).blockWidth,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).groupHeight\n },\n children: [\n shouldShowImageBackground(spec)\n ? ({\n type: 'rect',\n name: `storyline-block-image-bg-${index}`,\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.y,\n width: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.width,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.height,\n cornerRadius: 8,\n ...getImageBackgroundStyle(spec),\n ...blockStyle\n }\n } as ICustomMarkSpec<'rect'>)\n : null,\n hasImage\n ? ({\n type: 'image',\n name: `storyline-block-image-${index}`,\n interactive: false,\n ...omitImageLayoutSpec(spec.image),\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.y,\n width: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.width,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.height,\n image: block.image,\n repeatX: 'no-repeat',\n repeatY: 'no-repeat',\n imageMode: 'contain',\n imagePosition: 'center',\n ...spec.image?.style\n }\n } as ICustomMarkSpec<'image'>)\n : null,\n {\n type: 'path',\n name: `storyline-block-connector-${index}`,\n interactive: false,\n style: {\n stroke: connectorStroke,\n lineWidth: connectorLineWidth,\n lineDash: connectorDash,\n fill: connectorStroke,\n path: (_d: unknown, ctx: LayoutContext) => {\n const m = getMetrics(ctx);\n const tipSize = LANDSCAPE_CONNECTOR_ARROW_SIZE;\n const x = m.connector.x1;\n const y0 = m.connector.y1;\n const y1 = m.connector.y2;\n const tipDir = y1 < y0 ? -1 : 1;\n const baseY = y1 - tipDir * tipSize;\n const dashLine = `M ${x} ${y0} L ${x} ${baseY}`;\n const triangle = `M ${x - tipSize / 2} ${baseY} L ${x + tipSize / 2} ${baseY} L ${x} ${y1} Z`;\n return `${dashLine} ${triangle}`;\n }\n }\n } as ICustomMarkSpec<'path'>,\n block.title\n ? ({\n type: 'text',\n name: `storyline-block-title-${index}`,\n interactive: false,\n ...spec.title,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).textBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).textBox.y,\n text: block.title,\n maxLineWidth: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).textBox.width,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).titleLineHeight * BLOCK_TITLE_MAX_LINES,\n heightLimit: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).titleLineHeight * BLOCK_TITLE_MAX_LINES,\n lineClamp: BLOCK_TITLE_MAX_LINES,\n fontSize: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).titleFontSize,\n lineHeight: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).titleLineHeight,\n fontWeight: 'bold',\n fill: '#1f2430',\n stroke: '#fff',\n lineWidth: 5,\n lineJoin: 'round',\n textAlign: 'left',\n textBaseline: 'top',\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n ellipsis: '...',\n ...spec.title?.style\n }\n } as ICustomMarkSpec<'text'>)\n : null,\n contentText.length\n ? ({\n type: 'text',\n name: `storyline-block-content-${index}`,\n interactive: false,\n ...spec.content,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.y,\n width: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.width,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.height,\n maxLineWidth: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.width,\n heightLimit: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.height,\n text: buildPlainContent(contentText),\n fontSize: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentFontSize,\n lineHeight: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentLineHeight,\n textAlign: 'left',\n textBaseline: 'top',\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n ellipsis: '...',\n fill: '#596173',\n ...spec.content?.style\n }\n } as ICustomMarkSpec<'text'>)\n : null\n ].filter(Boolean) as ICustomMarkSpec<any>[]\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/charts/storyline/layouts/landscape.ts"],"names":[],"mappings":"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","file":"landscape.js","sourcesContent":["import type { IExtensionGroupMarkSpec } from '@visactor/vchart';\nimport { LayoutZIndex } from '@visactor/vchart';\nimport type { IStorylineBlock, IStorylineSpec } from '../interface';\nimport {\n type ICustomMarkSpec,\n type LayoutContext,\n type StorylinePoint,\n DEFAULT_BLOCK_HEIGHT,\n BLOCK_TITLE_MAX_LINES,\n buildPlainContent,\n buildSmoothCurvePath,\n getBlockTitleHeight,\n getImageBackgroundStyle,\n getLayout,\n getRegionGeometry,\n getThemeColor,\n normalizePadding,\n omitImageLayoutSpec,\n resolveAdaptiveLineHeight,\n resolveBlockWidth,\n resolveTitleFontSize,\n shouldShowImageBackground\n} from './common';\n\n// landscape 布局下,image rect 与 text rect 分离展示\nconst LANDSCAPE_IMAGE_HEIGHT_RATIO = 0.42;\nconst LANDSCAPE_CONNECTOR_GAP = 8;\nconst LANDSCAPE_CONNECTOR_X_RATIO = 0.2; // 引导线 x 位于 image 左侧 20% 处\nconst LANDSCAPE_TEXT_GAP_FROM_CONNECTOR = 12; // 文字距离引导线的水平间距\nconst LANDSCAPE_TITLE_LINE_HEIGHT = 34;\nconst LANDSCAPE_CONTENT_LINE_HEIGHT = 23;\nconst LANDSCAPE_CONTENT_FONT_SIZE = 16;\nconst LANDSCAPE_TITLE_TO_CONTENT_GAP = 4;\nconst LANDSCAPE_BODY_MARGIN = 8;\nconst LANDSCAPE_IMAGE_BAND_RATIO = 0.28;\nconst LANDSCAPE_IMAGE_BAND_MAX_RATIO = 0.42;\n\n/**\n * 计算第 index 个 block 在 landscape 布局下的 image 中心点(含 stagger 错落偏移)。\n */\nconst getLandscapeImageCenter = (spec: IStorylineSpec, ctx: LayoutContext, index: number): StorylinePoint | null => {\n const lb = getLayout(spec, ctx).blocks[index];\n if (!lb) {\n return null;\n }\n const m = getLandscapeMetrics(spec, lb.width, lb.height, index, ctx);\n return {\n x: lb.x + m.imageBox.x + m.imageBox.width / 2,\n y: m.bodyOriginY + m.imageBox.y + m.imageBox.height / 2\n };\n};\n\n/**\n * landscape 下绘制一条贯穿所有 image 中心的平滑虚线曲线,并在每个节点位置画 symbol,\n * 颜色跟随主题色。\n */\nexport const buildLandscapeConnectingCurve = (spec: IStorylineSpec): IExtensionGroupMarkSpec | null => {\n const themeColor = getThemeColor(spec);\n const lineStyle = spec.line?.style ?? {};\n const count = spec.data?.length ?? 0;\n const symbolSize = 14;\n const symbolChildren: ICustomMarkSpec<'symbol'>[] = [];\n for (let i = 0; i < count; i++) {\n const idx = i;\n symbolChildren.push({\n type: 'symbol',\n name: `storyline-landscape-curve-symbol-${idx}`,\n interactive: false,\n style: {\n symbolType: 'circle',\n size: symbolSize,\n fill: themeColor,\n x: (_d: unknown, ctx: LayoutContext) => getLandscapeImageCenter(spec, ctx, idx)?.x ?? 0,\n y: (_d: unknown, ctx: LayoutContext) => getLandscapeImageCenter(spec, ctx, idx)?.y ?? 0\n }\n } as ICustomMarkSpec<'symbol'>);\n }\n return {\n type: 'group' as any,\n name: 'storyline-landscape-curve',\n zIndex: LayoutZIndex.Mark + 2,\n children: [\n {\n type: 'path',\n name: 'storyline-landscape-curve-path',\n interactive: false,\n style: {\n stroke: (lineStyle as any).stroke ?? themeColor,\n lineWidth: (lineStyle as any).lineWidth ?? 4,\n lineDash: (lineStyle as any).lineDash ?? [6, 5],\n lineCap: 'round',\n fill: 'transparent',\n fillOpacity: 0,\n path: (_d: unknown, ctx: LayoutContext) => {\n const points: StorylinePoint[] = [];\n for (let i = 0; i < count; i++) {\n const center = getLandscapeImageCenter(spec, ctx, i);\n if (center) {\n points.push(center);\n }\n }\n return buildSmoothCurvePath(points);\n }\n }\n } as ICustomMarkSpec<'path'>,\n ...symbolChildren\n ]\n };\n};\n\n/**\n * landscape 布局下,每个 block 拆分为 image rect 与 text rect 两个独立卡片,\n * 中间用主题色虚线箭头连接;title+content 在 image 上方/下方交替错落摆放。\n */\nconst getLandscapeMetrics = (\n spec: IStorylineSpec,\n blockWidth: number,\n blockHeight: number,\n index: number,\n ctx: LayoutContext\n) => {\n const padding = normalizePadding(spec.block?.padding ?? 12);\n const titleFontSize = resolveTitleFontSize(spec, ctx, spec.data?.[index]?.title, blockWidth, 26, [8, 34]);\n const titleLineHeight = resolveAdaptiveLineHeight(\n titleFontSize,\n spec.title?.style as any,\n LANDSCAPE_TITLE_LINE_HEIGHT\n );\n const contentFontSize = Number((spec.content?.style as any)?.fontSize ?? LANDSCAPE_CONTENT_FONT_SIZE);\n const contentLineHeight = Number((spec.content?.style as any)?.lineHeight ?? LANDSCAPE_CONTENT_LINE_HEIGHT);\n const { width: regionWidth } = getRegionGeometry(ctx, spec);\n const blockCount = Math.max(spec.data?.length ?? 1, 1);\n const textWidth = Math.max(regionWidth / blockCount, 1);\n const titleHeight = getBlockTitleHeight(titleLineHeight, spec.data?.[index]?.title, textWidth, titleFontSize);\n\n const rawImageHeight = Math.max(\n spec.image?.height ?? Math.round(blockHeight * LANDSCAPE_IMAGE_HEIGHT_RATIO),\n titleLineHeight + padding.top + padding.bottom\n );\n const titleToContentGap = LANDSCAPE_TITLE_TO_CONTENT_GAP;\n const minTextBandHeight = titleHeight + titleToContentGap + contentLineHeight * 2;\n const body = getLandscapeBodyGeometry(ctx, spec, rawImageHeight, blockHeight, minTextBandHeight);\n const imageHeight = body.imageHeight;\n const textBandHeight = body.textBandHeight;\n const contentHeight = Math.max(0, textBandHeight - titleHeight - titleToContentGap);\n const textHeight = titleHeight + titleToContentGap + contentHeight;\n\n const textOnTop = index % 2 === 0;\n\n let textBox: { x: number; y: number; width: number; height: number };\n let contentBox: { x: number; y: number; width: number; height: number };\n let imageBox: { x: number; y: number; width: number; height: number };\n let connector: { x1: number; y1: number; x2: number; y2: number };\n let groupTop: number;\n let groupHeight: number;\n\n const imageX = 0;\n const connectorX = imageX + blockWidth * LANDSCAPE_CONNECTOR_X_RATIO;\n const textX = connectorX + LANDSCAPE_TEXT_GAP_FROM_CONNECTOR;\n const waveOffset = (textOnTop ? -1 : 1) * body.waveAmplitude;\n const imageY = body.imageBandTop + body.imageBandHeight / 2 + waveOffset - imageHeight / 2;\n\n if (textOnTop) {\n const textY = body.upperTextTop;\n const connectorY1 = Math.max(imageY - LANDSCAPE_CONNECTOR_GAP, body.upperTextTop);\n const connectorY2 = textY + Math.max(titleHeight, titleLineHeight) / 2;\n\n imageBox = { x: imageX, y: imageY, width: blockWidth, height: imageHeight };\n textBox = { x: textX, y: textY, width: textWidth, height: textHeight };\n contentBox = {\n x: textX,\n y: textY + titleHeight + titleToContentGap,\n width: textWidth,\n height: contentHeight\n };\n connector = { x1: connectorX, y1: connectorY1, x2: connectorX, y2: connectorY2 };\n groupTop = 0;\n groupHeight = body.height;\n } else {\n const textY = body.lowerTextTop;\n const connectorY1 = Math.min(imageY + imageHeight + LANDSCAPE_CONNECTOR_GAP, body.height);\n const connectorY2 = textY + textHeight;\n\n imageBox = { x: imageX, y: imageY, width: blockWidth, height: imageHeight };\n textBox = { x: textX, y: textY, width: textWidth, height: textHeight };\n contentBox = {\n x: textX,\n y: textY + titleHeight + titleToContentGap,\n width: textWidth,\n height: contentHeight\n };\n connector = { x1: connectorX, y1: connectorY1, x2: connectorX, y2: connectorY2 };\n groupTop = 0;\n groupHeight = body.height;\n }\n\n return {\n padding,\n titleFontSize,\n titleLineHeight,\n titleHeight,\n contentFontSize,\n contentLineHeight,\n contentHeight,\n minTextBandHeight,\n bodyOriginY: body.originY,\n blockWidth: Math.max(blockWidth, textX + textWidth),\n imageBox,\n textBox,\n contentBox,\n connector,\n textOnTop,\n groupTop,\n groupHeight\n };\n};\n\nconst getLandscapeBodyGeometry = (\n ctx: LayoutContext,\n spec: IStorylineSpec,\n rawImageHeight: number,\n blockHeight: number,\n minTextBandHeight: number\n) => {\n const region = getRegionGeometry(ctx, spec);\n const margin = Math.min(LANDSCAPE_BODY_MARGIN, Math.max(region.height * 0.04, 0));\n const height = Math.max(region.height - margin * 2, 1);\n const textBandReserve = Math.min(minTextBandHeight, Math.max((height - 48) / 2, 0));\n const maxImageBandHeight = Math.max(height - textBandReserve * 2, height * 0.18);\n const imageBandHeight = Math.min(\n Math.max(rawImageHeight + 24, height * LANDSCAPE_IMAGE_BAND_RATIO),\n Math.max(1, Math.min(maxImageBandHeight, height * LANDSCAPE_IMAGE_BAND_MAX_RATIO))\n );\n const imageHeight = Math.min(rawImageHeight, Math.max(imageBandHeight - 16, 1));\n const textBandHeight = Math.max((height - imageBandHeight) / 2, 1);\n const imageBandTop = textBandHeight;\n\n return {\n originY: region.startY + margin,\n height,\n textBandHeight,\n imageBandTop,\n imageBandHeight,\n imageHeight,\n upperTextTop: 0,\n lowerTextTop: imageBandTop + imageBandHeight,\n waveAmplitude: Math.min(imageBandHeight * 0.18, blockHeight * 0.1)\n };\n};\n\nexport const buildLandscapeBlockMark = (\n spec: IStorylineSpec,\n block: IStorylineBlock,\n index: number\n): IExtensionGroupMarkSpec => {\n const hasImage = !!block.image;\n const contentText = Array.isArray(block.content) ? block.content : block.content ? [block.content] : [];\n\n const getMetrics = (ctx: LayoutContext) => {\n const layoutBlock = getLayout(spec, ctx).blocks[index];\n const w = layoutBlock?.width ?? resolveBlockWidth(spec, 0);\n const h = layoutBlock?.height ?? spec.block?.height ?? DEFAULT_BLOCK_HEIGHT;\n return getLandscapeMetrics(spec, w, h, index, ctx);\n };\n\n const blockStyle = spec.block?.style ?? {};\n const lineStyle = spec.line?.style ?? {};\n const themeColor = getThemeColor(spec);\n const connectorStroke = (lineStyle as any).stroke ?? themeColor;\n const connectorLineWidth = (lineStyle as any).lineWidth ?? 2;\n const connectorDash = (lineStyle as any).lineDash ?? [4, 4];\n\n return {\n type: 'group' as any,\n id: `storyline-block-${block.id ?? index}`,\n name: `storyline-block-${index}`,\n zIndex: LayoutZIndex.Mark + 1,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => {\n const lb = getLayout(spec, ctx).blocks[index];\n return lb?.x ?? 0;\n },\n y: (_d: unknown, ctx: LayoutContext) => {\n const m = getMetrics(ctx);\n return m.bodyOriginY;\n },\n width: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).blockWidth,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).groupHeight\n },\n children: [\n shouldShowImageBackground(spec)\n ? ({\n type: 'rect',\n name: `storyline-block-image-bg-${index}`,\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.y,\n width: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.width,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.height,\n cornerRadius: 8,\n ...getImageBackgroundStyle(spec),\n ...blockStyle\n }\n } as ICustomMarkSpec<'rect'>)\n : null,\n hasImage\n ? ({\n type: 'image',\n name: `storyline-block-image-${index}`,\n interactive: false,\n ...omitImageLayoutSpec(spec.image),\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.y,\n width: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.width,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.height,\n image: block.image,\n repeatX: 'no-repeat',\n repeatY: 'no-repeat',\n imageMode: 'contain',\n imagePosition: 'center',\n ...spec.image?.style\n }\n } as ICustomMarkSpec<'image'>)\n : null,\n {\n type: 'path',\n name: `storyline-block-connector-${index}`,\n interactive: false,\n style: {\n stroke: connectorStroke,\n lineWidth: connectorLineWidth,\n lineDash: connectorDash,\n fill: false,\n path: (_d: unknown, ctx: LayoutContext) => {\n const m = getMetrics(ctx);\n const x = m.connector.x1;\n const y0 = m.connector.y1;\n const y1 = m.connector.y2;\n return `M ${x} ${y0} L ${x} ${y1}`;\n }\n }\n } as ICustomMarkSpec<'path'>,\n block.title\n ? ({\n type: 'text',\n name: `storyline-block-title-${index}`,\n interactive: false,\n ...spec.title,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).textBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).textBox.y,\n text: block.title,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).titleHeight,\n heightLimit: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).titleLineHeight * BLOCK_TITLE_MAX_LINES,\n lineClamp: BLOCK_TITLE_MAX_LINES,\n fontSize: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).titleFontSize,\n lineHeight: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).titleLineHeight,\n fontWeight: 'bold',\n fill: '#1f2430',\n stroke: '#fff',\n lineWidth: 5,\n lineJoin: 'round',\n textAlign: 'left',\n textBaseline: 'top',\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n ellipsis: '...',\n ...spec.title?.style\n }\n } as ICustomMarkSpec<'text'>)\n : null,\n contentText.length\n ? ({\n type: 'text',\n name: `storyline-block-content-${index}`,\n interactive: false,\n ...spec.content,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.y,\n width: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.width,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.height,\n maxLineWidth: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.width,\n heightLimit: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.height,\n text: buildPlainContent(contentText),\n fontSize: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentFontSize,\n lineHeight: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentLineHeight,\n textAlign: 'left',\n textBaseline: 'top',\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n ellipsis: '...',\n fill: '#596173',\n ...spec.content?.style\n }\n } as ICustomMarkSpec<'text'>)\n : null\n ].filter(Boolean) as ICustomMarkSpec<any>[]\n };\n};\n"]}
@@ -108,11 +108,12 @@ const getPortraitMetrics = (spec, blockWidth, blockHeight, index, ctx) => {
108
108
  const contentFontSize = Number(null !== (_c = null === (_b = null === (_a = spec.content) || void 0 === _a ? void 0 : _a.style) || void 0 === _b ? void 0 : _b.fontSize) && void 0 !== _c ? _c : 16), contentLineHeight = Number(null !== (_g = null === (_f = null === (_e = spec.content) || void 0 === _e ? void 0 : _e.style) || void 0 === _f ? void 0 : _f.lineHeight) && void 0 !== _g ? _g : exports.PORTRAIT_CONTENT_LINE_HEIGHT), titleToContentGap = exports.PORTRAIT_TITLE_TO_CONTENT_GAP, imageWidth = null !== (_j = null === (_h = spec.image) || void 0 === _h ? void 0 : _h.width) && void 0 !== _j ? _j : Math.max(blockWidth, 80), imageHeight = null !== (_l = null === (_k = spec.image) || void 0 === _k ? void 0 : _k.height) && void 0 !== _l ? _l : Math.round(blockHeight * exports.PORTRAIT_IMAGE_HEIGHT_RATIO), titleFontSize = (0,
109
109
  common_1.resolveTitleFontSize)(spec, ctx, null === (_o = null === (_m = spec.data) || void 0 === _m ? void 0 : _m[index]) || void 0 === _o ? void 0 : _o.title, imageWidth, 26, [ 8, 34 ]), titleLineHeight = (0,
110
110
  common_1.resolveAdaptiveLineHeight)(titleFontSize, null === (_p = spec.title) || void 0 === _p ? void 0 : _p.style, exports.PORTRAIT_TITLE_LINE_HEIGHT), titleHeight = (0,
111
- common_1.getBlockTitleHeight)(titleLineHeight, null === (_r = null === (_q = spec.data) || void 0 === _q ? void 0 : _q[index]) || void 0 === _r ? void 0 : _r.title), minContentHeight = exports.PORTRAIT_CONTENT_LINES * contentLineHeight, contentHeight = Math.max(minContentHeight, Math.round(blockHeight * exports.PORTRAIT_CONTENT_HEIGHT_RATIO)), textHeight = titleHeight + titleToContentGap + contentHeight, onLeft = index % 2 == 0, imageX = onLeft ? -72 - imageWidth : 72, imageY = -imageHeight / 2, textX = imageX, textY = imageY + imageHeight + exports.PORTRAIT_TEXT_GAP_FROM_IMAGE, shadowWidth = 1 * imageWidth, shadowHeight = 1 * imageHeight;
111
+ common_1.getBlockTitleHeight)(titleLineHeight, null === (_r = null === (_q = spec.data) || void 0 === _q ? void 0 : _q[index]) || void 0 === _r ? void 0 : _r.title, imageWidth, titleFontSize), minContentHeight = exports.PORTRAIT_CONTENT_LINES * contentLineHeight, contentHeight = Math.max(minContentHeight, Math.round(blockHeight * exports.PORTRAIT_CONTENT_HEIGHT_RATIO)), textHeight = titleHeight + titleToContentGap + contentHeight, onLeft = index % 2 == 0, imageX = onLeft ? -72 - imageWidth : 72, imageY = -imageHeight / 2, textX = imageX, textY = imageY + imageHeight + exports.PORTRAIT_TEXT_GAP_FROM_IMAGE, shadowWidth = 1 * imageWidth, shadowHeight = 1 * imageHeight;
112
112
  return {
113
113
  onLeft: onLeft,
114
114
  titleFontSize: titleFontSize,
115
115
  titleLineHeight: titleLineHeight,
116
+ titleHeight: titleHeight,
116
117
  contentFontSize: contentFontSize,
117
118
  contentLineHeight: contentLineHeight,
118
119
  blockWidth: blockWidth,
@@ -236,8 +237,7 @@ const getPortraitMetrics = (spec, blockWidth, blockHeight, index, ctx) => {
236
237
  x: (_d, ctx) => getMetrics(ctx).textBox.x,
237
238
  y: (_d, ctx) => getMetrics(ctx).textBox.y,
238
239
  text: block.title,
239
- maxLineWidth: (_d, ctx) => getMetrics(ctx).textBox.width,
240
- height: (_d, ctx) => getMetrics(ctx).titleLineHeight * common_1.BLOCK_TITLE_MAX_LINES,
240
+ height: (_d, ctx) => getMetrics(ctx).titleHeight,
241
241
  heightLimit: (_d, ctx) => getMetrics(ctx).titleLineHeight * common_1.BLOCK_TITLE_MAX_LINES,
242
242
  lineClamp: common_1.BLOCK_TITLE_MAX_LINES,
243
243
  fontSize: (_d, ctx) => getMetrics(ctx).titleFontSize,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/charts/storyline/layouts/portrait.ts"],"names":[],"mappings":"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","file":"portrait.js","sourcesContent":["import type { IExtensionGroupMarkSpec } from '@visactor/vchart';\nimport { LayoutZIndex } from '@visactor/vchart';\nimport type { IStorylineBlock, IStorylineSpec } from '../interface';\nimport {\n type ICustomMarkSpec,\n type LayoutContext,\n DEFAULT_BLOCK_HEIGHT,\n BLOCK_TITLE_MAX_LINES,\n buildPlainContent,\n getBlockTitleHeight,\n getImageBackgroundStyle,\n getLayout,\n omitImageLayoutSpec,\n resolveAdaptiveLineHeight,\n resolveMarkerFontSize,\n resolveBlockWidth,\n resolveTitleFontSize,\n shouldShowImageBackground,\n withAlpha\n} from './common';\n\n// portrait 布局:中轴 rect + 左右交替的 image + image 下方 title/content\n// 中轴默认加宽,便于在轴上叠放 block.marker 时间节点文字(纵向逐字排列)\nconst PORTRAIT_AXIS_WIDTH = 96;\nconst PORTRAIT_AXIS_PADDING = 120; // 中轴上下两端的留白\n// marker 时间节点文字的默认样式(fontSize 30、白色字、贴轴对应一侧边缘)\nconst PORTRAIT_MARKER_FONT_SIZE = 34;\nconst PORTRAIT_MARKER_LINE_HEIGHT = 24;\nconst PORTRAIT_MARKER_AXIS_PADDING = 6; // marker 距离轴边缘的水平内边距\n// image 默认尺寸的占比规则(基于 region 平均槽位):\n// - image 高度 = slotHeight * 0.6\n// - content 高度 = slotHeight * (0.6 + 0.4)\n// 其中 slotHeight = regionHeight / (blockCount + 1),由 getLayout 计算。\nexport const PORTRAIT_IMAGE_HEIGHT_RATIO = 0.6;\nexport const PORTRAIT_CONTENT_HEIGHT_RATIO = 1.25;\nconst PORTRAIT_IMAGE_GAP_FROM_AXIS = 24; // image 与中轴之间的水平间距\nconst PORTRAIT_SHADOW_OFFSET_X = 24; // subImage 相对主 image 的水平错位量\nconst PORTRAIT_SHADOW_OFFSET_Y = 16; // subImage 相对主 image 的垂直错位量\nconst PORTRAIT_SHADOW_SCALE = 1; // subImage 与主 image 同尺寸,仅做错位偏移\nexport const PORTRAIT_TEXT_GAP_FROM_IMAGE = 8;\nexport const PORTRAIT_CONTENT_LINES = 3;\nexport const PORTRAIT_TITLE_LINE_HEIGHT = 34;\nexport const PORTRAIT_CONTENT_LINE_HEIGHT = 23;\nconst PORTRAIT_CONTENT_FONT_SIZE = 16;\nexport const PORTRAIT_TITLE_TO_CONTENT_GAP = 4;\n\nexport const buildPortraitAxisMark = (spec: IStorylineSpec): IExtensionGroupMarkSpec => {\n const themeColor = spec.themeColor ?? '#e8543d';\n const lineStyle = spec.line?.style ?? {};\n const defaultFill = {\n gradient: 'linear',\n x0: 0,\n y0: 0,\n x1: 0,\n y1: 1,\n stops: [\n { offset: 0, color: withAlpha(themeColor, 0.2) },\n { offset: 1, color: withAlpha(themeColor, 1) }\n ]\n };\n // marker 时间节点文字:垂直方向逐字排列(每字符换行)\n const markerVisible = spec.marker?.visible !== false;\n\n const markerMarks = markerVisible\n ? (spec.data ?? [])\n .map((block, index) => {\n if (!block.marker) {\n return null;\n }\n // image 在 block 左侧时(index 偶数),marker 贴轴左边缘 + 左对齐;\n // image 在 block 右侧时(index 奇数),marker 贴轴右边缘 + 右对齐。\n const onLeft = index % 2 === 0;\n const axisHalf = PORTRAIT_AXIS_WIDTH / 2;\n const markerOffsetX = onLeft\n ? -axisHalf + PORTRAIT_MARKER_AXIS_PADDING\n : axisHalf - PORTRAIT_MARKER_AXIS_PADDING;\n const markerTextAlign: 'left' | 'right' = onLeft ? 'left' : 'right';\n return {\n type: 'text',\n textType: 'rich',\n name: `storyline-portrait-marker-${index}`,\n interactive: false,\n ...spec.marker,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => {\n const lb = getLayout(spec, ctx).blocks[index];\n return (lb?.center?.x ?? 0) + markerOffsetX;\n },\n y: (_d: unknown, ctx: LayoutContext) => {\n const lb = getLayout(spec, ctx).blocks[index];\n return lb?.center?.y ?? 0;\n },\n text: (_d: unknown, ctx: LayoutContext) => {\n const axis = getPortraitAxisRect(spec, ctx);\n const markerFontSize = resolveMarkerFontSize(\n spec,\n ctx,\n block.marker,\n axis.height / Math.max(spec.data?.length ?? 1, 1),\n PORTRAIT_MARKER_FONT_SIZE,\n [16, 38]\n );\n const markerLineHeight = resolveAdaptiveLineHeight(\n markerFontSize,\n spec.marker?.style as any,\n PORTRAIT_MARKER_LINE_HEIGHT,\n 0.9\n );\n return {\n type: 'rich',\n text: block.marker.split('').map((char, i, arr) => ({\n text: char + (i < arr.length - 1 ? '\\n' : ''),\n fontSize: markerFontSize,\n lineHeight: markerLineHeight,\n fill: '#fff',\n align: markerTextAlign\n }))\n };\n },\n fontWeight: 'bold',\n lineJoin: 'round',\n shadowColor: 'rgba(0, 0, 0, 0.3)',\n shadowBlur: 8,\n shadowOffsetX: 0,\n shadowOffsetY: 5,\n textAlign: markerTextAlign,\n textBaseline: 'middle',\n ...(spec.marker?.style as any)\n }\n } as ICustomMarkSpec<'text'>;\n })\n .filter(Boolean)\n : [];\n\n return {\n type: 'group' as any,\n name: 'storyline-portrait-axis',\n zIndex: LayoutZIndex.Mark,\n children: [\n {\n type: 'rect',\n name: 'storyline-portrait-axis-rect',\n interactive: false,\n style: {\n fill: (lineStyle as any).fill ?? defaultFill,\n stroke: (lineStyle as any).stroke ?? false,\n lineWidth: (lineStyle as any).lineWidth ?? 0,\n cornerRadius: (lineStyle as any).cornerRadius ?? 0,\n x: (_d: unknown, ctx: LayoutContext) => getPortraitAxisRect(spec, ctx).x,\n y: (_d: unknown, ctx: LayoutContext) => getPortraitAxisRect(spec, ctx).y,\n width: (_d: unknown, ctx: LayoutContext) => getPortraitAxisRect(spec, ctx).width,\n height: (_d: unknown, ctx: LayoutContext) => getPortraitAxisRect(spec, ctx).height\n }\n } as ICustomMarkSpec<'rect'>,\n ...(markerMarks as ICustomMarkSpec<any>[])\n ]\n };\n};\n\nconst getPortraitMetrics = (\n spec: IStorylineSpec,\n blockWidth: number,\n blockHeight: number,\n index: number,\n ctx: LayoutContext\n) => {\n const contentFontSize = Number((spec.content?.style as any)?.fontSize ?? PORTRAIT_CONTENT_FONT_SIZE);\n const contentLineHeight = Number((spec.content?.style as any)?.lineHeight ?? PORTRAIT_CONTENT_LINE_HEIGHT);\n const titleToContentGap = PORTRAIT_TITLE_TO_CONTENT_GAP;\n\n // 默认 image 高度 = blockHeight * 0.4(blockHeight = regionHeight / count,由 getLayout 计算);\n // 默认 image 宽度 = blockWidth,让 image 横向自适应单个 block 槽位宽度\n const imageWidth = spec.image?.width ?? Math.max(blockWidth, 80);\n const imageHeight = spec.image?.height ?? Math.round(blockHeight * PORTRAIT_IMAGE_HEIGHT_RATIO);\n const titleFontSize = resolveTitleFontSize(spec, ctx, spec.data?.[index]?.title, imageWidth, 26, [8, 34]);\n const titleLineHeight = resolveAdaptiveLineHeight(\n titleFontSize,\n spec.title?.style as any,\n PORTRAIT_TITLE_LINE_HEIGHT\n );\n const titleHeight = getBlockTitleHeight(titleLineHeight, spec.data?.[index]?.title);\n const minContentHeight = PORTRAIT_CONTENT_LINES * contentLineHeight;\n // 默认 content 高度 = blockHeight * 0.4\n const contentHeight = Math.max(minContentHeight, Math.round(blockHeight * PORTRAIT_CONTENT_HEIGHT_RATIO));\n\n const textHeight = titleHeight + titleToContentGap + contentHeight;\n\n const onLeft = index % 2 === 0;\n\n const axisHalf = PORTRAIT_AXIS_WIDTH / 2;\n const imageX = onLeft\n ? -axisHalf - PORTRAIT_IMAGE_GAP_FROM_AXIS - imageWidth\n : axisHalf + PORTRAIT_IMAGE_GAP_FROM_AXIS;\n const imageY = -imageHeight / 2;\n\n const textX = imageX;\n const textY = imageY + imageHeight + PORTRAIT_TEXT_GAP_FROM_IMAGE;\n const textWidth = imageWidth;\n\n const contentBox = {\n x: textX,\n y: textY + titleHeight + titleToContentGap,\n width: textWidth,\n height: contentHeight\n };\n\n const shadowOffsetX = PORTRAIT_SHADOW_OFFSET_X;\n const shadowOffsetY = PORTRAIT_SHADOW_OFFSET_Y;\n const shadowWidth = imageWidth * PORTRAIT_SHADOW_SCALE;\n const shadowHeight = imageHeight * PORTRAIT_SHADOW_SCALE;\n const baseShadowX = imageX - (shadowWidth - imageWidth) / 2;\n const baseShadowY = imageY - (shadowHeight - imageHeight) / 2;\n const shadowBox = {\n x: baseShadowX + (onLeft ? -shadowOffsetX : shadowOffsetX),\n y: baseShadowY + shadowOffsetY,\n width: shadowWidth,\n height: shadowHeight\n };\n\n return {\n onLeft,\n titleFontSize,\n titleLineHeight,\n contentFontSize,\n contentLineHeight,\n blockWidth,\n imageBox: { x: imageX, y: imageY, width: imageWidth, height: imageHeight },\n shadowBox,\n textBox: { x: textX, y: textY, width: textWidth, height: textHeight },\n contentBox\n };\n};\n\n/**\n * 获取 portrait 布局的中轴 rect 尺寸:宽度固定,高度覆盖首尾 block 的完整内容范围。\n */\nconst getPortraitAxisRect = (spec: IStorylineSpec, ctx: LayoutContext) => {\n const blocks = getLayout(spec, ctx).blocks;\n if (!blocks.length) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n let top = Number.POSITIVE_INFINITY;\n let bottom = Number.NEGATIVE_INFINITY;\n blocks.forEach((block, index) => {\n const metrics = getPortraitMetrics(spec, block.width, block.height, index, ctx);\n const localTop = Math.min(metrics.imageBox.y, metrics.shadowBox.y, metrics.textBox.y, metrics.contentBox.y);\n const localBottom = Math.max(\n metrics.imageBox.y + metrics.imageBox.height,\n metrics.shadowBox.y + metrics.shadowBox.height,\n metrics.textBox.y + metrics.textBox.height,\n metrics.contentBox.y + metrics.contentBox.height\n );\n top = Math.min(top, block.center.y + localTop);\n bottom = Math.max(bottom, block.center.y + localBottom);\n });\n const cx = blocks[0].center.x;\n return {\n x: cx - PORTRAIT_AXIS_WIDTH / 2,\n y: top - PORTRAIT_AXIS_PADDING,\n width: PORTRAIT_AXIS_WIDTH,\n height: bottom - top + PORTRAIT_AXIS_PADDING * 2\n };\n};\n\nexport const buildPortraitBlockMark = (\n spec: IStorylineSpec,\n block: IStorylineBlock,\n index: number\n): IExtensionGroupMarkSpec => {\n const hasImage = !!block.image;\n const hasSubImage = !!block.subImage;\n const contentText = Array.isArray(block.content) ? block.content : block.content ? [block.content] : [];\n\n const getMetrics = (ctx: LayoutContext) => {\n const lb = getLayout(spec, ctx).blocks[index];\n const w = lb?.width ?? resolveBlockWidth(spec, 0);\n const h = lb?.height ?? spec.block?.height ?? DEFAULT_BLOCK_HEIGHT;\n return getPortraitMetrics(spec, w, h, index, ctx);\n };\n const blockStyle = spec.block?.style ?? {};\n\n return {\n type: 'group' as any,\n id: `storyline-block-${block.id ?? index}`,\n name: `storyline-block-${index}`,\n zIndex: LayoutZIndex.Mark + 1,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => {\n const lb = getLayout(spec, ctx).blocks[index];\n return lb?.center?.x ?? 0;\n },\n y: (_d: unknown, ctx: LayoutContext) => {\n const lb = getLayout(spec, ctx).blocks[index];\n return lb?.center?.y ?? 0;\n }\n },\n children: [\n hasSubImage\n ? ({\n type: 'image',\n name: `storyline-block-shadow-image-${index}`,\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).shadowBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).shadowBox.y,\n width: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).shadowBox.width,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).shadowBox.height,\n image: block.subImage,\n repeatX: 'no-repeat',\n repeatY: 'no-repeat',\n imageMode: 'contain',\n imagePosition: 'center'\n }\n } as ICustomMarkSpec<'image'>)\n : null,\n shouldShowImageBackground(spec)\n ? ({\n type: 'rect',\n name: `storyline-block-image-bg-${index}`,\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.y,\n width: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.width,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.height,\n cornerRadius: 8,\n ...getImageBackgroundStyle(spec),\n ...blockStyle\n }\n } as ICustomMarkSpec<'rect'>)\n : null,\n hasImage\n ? ({\n type: 'image',\n name: `storyline-block-image-${index}`,\n interactive: false,\n ...omitImageLayoutSpec(spec.image),\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.y,\n width: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.width,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.height,\n image: block.image,\n repeatX: 'no-repeat',\n repeatY: 'no-repeat',\n imageMode: 'contain',\n imagePosition: 'center',\n ...spec.image?.style\n }\n } as ICustomMarkSpec<'image'>)\n : null,\n block.title\n ? ({\n type: 'text',\n name: `storyline-block-title-${index}`,\n interactive: false,\n ...spec.title,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).textBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).textBox.y,\n text: block.title,\n maxLineWidth: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).textBox.width,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).titleLineHeight * BLOCK_TITLE_MAX_LINES,\n heightLimit: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).titleLineHeight * BLOCK_TITLE_MAX_LINES,\n lineClamp: BLOCK_TITLE_MAX_LINES,\n fontSize: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).titleFontSize,\n lineHeight: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).titleLineHeight,\n fontWeight: 'bold',\n fill: '#1f2430',\n stroke: '#fff',\n lineWidth: 5,\n lineJoin: 'round',\n textAlign: 'left',\n textBaseline: 'top',\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n ellipsis: '...',\n ...spec.title?.style\n }\n } as ICustomMarkSpec<'text'>)\n : null,\n contentText.length\n ? ({\n type: 'text',\n name: `storyline-block-content-${index}`,\n interactive: false,\n ...spec.content,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.y,\n width: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.width,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.height,\n maxLineWidth: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.width,\n heightLimit: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.height,\n text: buildPlainContent(contentText),\n fontSize: PORTRAIT_CONTENT_FONT_SIZE,\n lineHeight: PORTRAIT_CONTENT_LINE_HEIGHT,\n textAlign: 'left',\n textBaseline: 'top',\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n ellipsis: '...',\n fill: '#596173',\n ...spec.content?.style\n }\n } as ICustomMarkSpec<'text'>)\n : null\n ].filter(Boolean) as ICustomMarkSpec<any>[]\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/charts/storyline/layouts/portrait.ts"],"names":[],"mappings":"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","file":"portrait.js","sourcesContent":["import type { IExtensionGroupMarkSpec } from '@visactor/vchart';\nimport { LayoutZIndex } from '@visactor/vchart';\nimport type { IStorylineBlock, IStorylineSpec } from '../interface';\nimport {\n type ICustomMarkSpec,\n type LayoutContext,\n DEFAULT_BLOCK_HEIGHT,\n BLOCK_TITLE_MAX_LINES,\n buildPlainContent,\n getBlockTitleHeight,\n getImageBackgroundStyle,\n getLayout,\n omitImageLayoutSpec,\n resolveAdaptiveLineHeight,\n resolveMarkerFontSize,\n resolveBlockWidth,\n resolveTitleFontSize,\n shouldShowImageBackground,\n withAlpha\n} from './common';\n\n// portrait 布局:中轴 rect + 左右交替的 image + image 下方 title/content\n// 中轴默认加宽,便于在轴上叠放 block.marker 时间节点文字(纵向逐字排列)\nconst PORTRAIT_AXIS_WIDTH = 96;\nconst PORTRAIT_AXIS_PADDING = 120; // 中轴上下两端的留白\n// marker 时间节点文字的默认样式(fontSize 30、白色字、贴轴对应一侧边缘)\nconst PORTRAIT_MARKER_FONT_SIZE = 34;\nconst PORTRAIT_MARKER_LINE_HEIGHT = 24;\nconst PORTRAIT_MARKER_AXIS_PADDING = 6; // marker 距离轴边缘的水平内边距\n// image 默认尺寸的占比规则(基于 region 平均槽位):\n// - image 高度 = slotHeight * 0.6\n// - content 高度 = slotHeight * (0.6 + 0.4)\n// 其中 slotHeight = regionHeight / (blockCount + 1),由 getLayout 计算。\nexport const PORTRAIT_IMAGE_HEIGHT_RATIO = 0.6;\nexport const PORTRAIT_CONTENT_HEIGHT_RATIO = 1.25;\nconst PORTRAIT_IMAGE_GAP_FROM_AXIS = 24; // image 与中轴之间的水平间距\nconst PORTRAIT_SHADOW_OFFSET_X = 24; // subImage 相对主 image 的水平错位量\nconst PORTRAIT_SHADOW_OFFSET_Y = 16; // subImage 相对主 image 的垂直错位量\nconst PORTRAIT_SHADOW_SCALE = 1; // subImage 与主 image 同尺寸,仅做错位偏移\nexport const PORTRAIT_TEXT_GAP_FROM_IMAGE = 8;\nexport const PORTRAIT_CONTENT_LINES = 3;\nexport const PORTRAIT_TITLE_LINE_HEIGHT = 34;\nexport const PORTRAIT_CONTENT_LINE_HEIGHT = 23;\nconst PORTRAIT_CONTENT_FONT_SIZE = 16;\nexport const PORTRAIT_TITLE_TO_CONTENT_GAP = 4;\n\nexport const buildPortraitAxisMark = (spec: IStorylineSpec): IExtensionGroupMarkSpec => {\n const themeColor = spec.themeColor ?? '#e8543d';\n const lineStyle = spec.line?.style ?? {};\n const defaultFill = {\n gradient: 'linear',\n x0: 0,\n y0: 0,\n x1: 0,\n y1: 1,\n stops: [\n { offset: 0, color: withAlpha(themeColor, 0.2) },\n { offset: 1, color: withAlpha(themeColor, 1) }\n ]\n };\n // marker 时间节点文字:垂直方向逐字排列(每字符换行)\n const markerVisible = spec.marker?.visible !== false;\n\n const markerMarks = markerVisible\n ? (spec.data ?? [])\n .map((block, index) => {\n if (!block.marker) {\n return null;\n }\n // image 在 block 左侧时(index 偶数),marker 贴轴左边缘 + 左对齐;\n // image 在 block 右侧时(index 奇数),marker 贴轴右边缘 + 右对齐。\n const onLeft = index % 2 === 0;\n const axisHalf = PORTRAIT_AXIS_WIDTH / 2;\n const markerOffsetX = onLeft\n ? -axisHalf + PORTRAIT_MARKER_AXIS_PADDING\n : axisHalf - PORTRAIT_MARKER_AXIS_PADDING;\n const markerTextAlign: 'left' | 'right' = onLeft ? 'left' : 'right';\n return {\n type: 'text',\n textType: 'rich',\n name: `storyline-portrait-marker-${index}`,\n interactive: false,\n ...spec.marker,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => {\n const lb = getLayout(spec, ctx).blocks[index];\n return (lb?.center?.x ?? 0) + markerOffsetX;\n },\n y: (_d: unknown, ctx: LayoutContext) => {\n const lb = getLayout(spec, ctx).blocks[index];\n return lb?.center?.y ?? 0;\n },\n text: (_d: unknown, ctx: LayoutContext) => {\n const axis = getPortraitAxisRect(spec, ctx);\n const markerFontSize = resolveMarkerFontSize(\n spec,\n ctx,\n block.marker,\n axis.height / Math.max(spec.data?.length ?? 1, 1),\n PORTRAIT_MARKER_FONT_SIZE,\n [16, 38]\n );\n const markerLineHeight = resolveAdaptiveLineHeight(\n markerFontSize,\n spec.marker?.style as any,\n PORTRAIT_MARKER_LINE_HEIGHT,\n 0.9\n );\n return {\n type: 'rich',\n text: block.marker.split('').map((char, i, arr) => ({\n text: char + (i < arr.length - 1 ? '\\n' : ''),\n fontSize: markerFontSize,\n lineHeight: markerLineHeight,\n fill: '#fff',\n align: markerTextAlign\n }))\n };\n },\n fontWeight: 'bold',\n lineJoin: 'round',\n shadowColor: 'rgba(0, 0, 0, 0.3)',\n shadowBlur: 8,\n shadowOffsetX: 0,\n shadowOffsetY: 5,\n textAlign: markerTextAlign,\n textBaseline: 'middle',\n ...(spec.marker?.style as any)\n }\n } as ICustomMarkSpec<'text'>;\n })\n .filter(Boolean)\n : [];\n\n return {\n type: 'group' as any,\n name: 'storyline-portrait-axis',\n zIndex: LayoutZIndex.Mark,\n children: [\n {\n type: 'rect',\n name: 'storyline-portrait-axis-rect',\n interactive: false,\n style: {\n fill: (lineStyle as any).fill ?? defaultFill,\n stroke: (lineStyle as any).stroke ?? false,\n lineWidth: (lineStyle as any).lineWidth ?? 0,\n cornerRadius: (lineStyle as any).cornerRadius ?? 0,\n x: (_d: unknown, ctx: LayoutContext) => getPortraitAxisRect(spec, ctx).x,\n y: (_d: unknown, ctx: LayoutContext) => getPortraitAxisRect(spec, ctx).y,\n width: (_d: unknown, ctx: LayoutContext) => getPortraitAxisRect(spec, ctx).width,\n height: (_d: unknown, ctx: LayoutContext) => getPortraitAxisRect(spec, ctx).height\n }\n } as ICustomMarkSpec<'rect'>,\n ...(markerMarks as ICustomMarkSpec<any>[])\n ]\n };\n};\n\nconst getPortraitMetrics = (\n spec: IStorylineSpec,\n blockWidth: number,\n blockHeight: number,\n index: number,\n ctx: LayoutContext\n) => {\n const contentFontSize = Number((spec.content?.style as any)?.fontSize ?? PORTRAIT_CONTENT_FONT_SIZE);\n const contentLineHeight = Number((spec.content?.style as any)?.lineHeight ?? PORTRAIT_CONTENT_LINE_HEIGHT);\n const titleToContentGap = PORTRAIT_TITLE_TO_CONTENT_GAP;\n\n // 默认 image 高度 = blockHeight * 0.4(blockHeight = regionHeight / count,由 getLayout 计算);\n // 默认 image 宽度 = blockWidth,让 image 横向自适应单个 block 槽位宽度\n const imageWidth = spec.image?.width ?? Math.max(blockWidth, 80);\n const imageHeight = spec.image?.height ?? Math.round(blockHeight * PORTRAIT_IMAGE_HEIGHT_RATIO);\n const titleFontSize = resolveTitleFontSize(spec, ctx, spec.data?.[index]?.title, imageWidth, 26, [8, 34]);\n const titleLineHeight = resolveAdaptiveLineHeight(\n titleFontSize,\n spec.title?.style as any,\n PORTRAIT_TITLE_LINE_HEIGHT\n );\n const titleHeight = getBlockTitleHeight(titleLineHeight, spec.data?.[index]?.title, imageWidth, titleFontSize);\n const minContentHeight = PORTRAIT_CONTENT_LINES * contentLineHeight;\n // 默认 content 高度 = blockHeight * 0.4\n const contentHeight = Math.max(minContentHeight, Math.round(blockHeight * PORTRAIT_CONTENT_HEIGHT_RATIO));\n\n const textHeight = titleHeight + titleToContentGap + contentHeight;\n\n const onLeft = index % 2 === 0;\n\n const axisHalf = PORTRAIT_AXIS_WIDTH / 2;\n const imageX = onLeft\n ? -axisHalf - PORTRAIT_IMAGE_GAP_FROM_AXIS - imageWidth\n : axisHalf + PORTRAIT_IMAGE_GAP_FROM_AXIS;\n const imageY = -imageHeight / 2;\n\n const textX = imageX;\n const textY = imageY + imageHeight + PORTRAIT_TEXT_GAP_FROM_IMAGE;\n const textWidth = imageWidth;\n\n const contentBox = {\n x: textX,\n y: textY + titleHeight + titleToContentGap,\n width: textWidth,\n height: contentHeight\n };\n\n const shadowOffsetX = PORTRAIT_SHADOW_OFFSET_X;\n const shadowOffsetY = PORTRAIT_SHADOW_OFFSET_Y;\n const shadowWidth = imageWidth * PORTRAIT_SHADOW_SCALE;\n const shadowHeight = imageHeight * PORTRAIT_SHADOW_SCALE;\n const baseShadowX = imageX - (shadowWidth - imageWidth) / 2;\n const baseShadowY = imageY - (shadowHeight - imageHeight) / 2;\n const shadowBox = {\n x: baseShadowX + (onLeft ? -shadowOffsetX : shadowOffsetX),\n y: baseShadowY + shadowOffsetY,\n width: shadowWidth,\n height: shadowHeight\n };\n\n return {\n onLeft,\n titleFontSize,\n titleLineHeight,\n titleHeight,\n contentFontSize,\n contentLineHeight,\n blockWidth,\n imageBox: { x: imageX, y: imageY, width: imageWidth, height: imageHeight },\n shadowBox,\n textBox: { x: textX, y: textY, width: textWidth, height: textHeight },\n contentBox\n };\n};\n\n/**\n * 获取 portrait 布局的中轴 rect 尺寸:宽度固定,高度覆盖首尾 block 的完整内容范围。\n */\nconst getPortraitAxisRect = (spec: IStorylineSpec, ctx: LayoutContext) => {\n const blocks = getLayout(spec, ctx).blocks;\n if (!blocks.length) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n let top = Number.POSITIVE_INFINITY;\n let bottom = Number.NEGATIVE_INFINITY;\n blocks.forEach((block, index) => {\n const metrics = getPortraitMetrics(spec, block.width, block.height, index, ctx);\n const localTop = Math.min(metrics.imageBox.y, metrics.shadowBox.y, metrics.textBox.y, metrics.contentBox.y);\n const localBottom = Math.max(\n metrics.imageBox.y + metrics.imageBox.height,\n metrics.shadowBox.y + metrics.shadowBox.height,\n metrics.textBox.y + metrics.textBox.height,\n metrics.contentBox.y + metrics.contentBox.height\n );\n top = Math.min(top, block.center.y + localTop);\n bottom = Math.max(bottom, block.center.y + localBottom);\n });\n const cx = blocks[0].center.x;\n return {\n x: cx - PORTRAIT_AXIS_WIDTH / 2,\n y: top - PORTRAIT_AXIS_PADDING,\n width: PORTRAIT_AXIS_WIDTH,\n height: bottom - top + PORTRAIT_AXIS_PADDING * 2\n };\n};\n\nexport const buildPortraitBlockMark = (\n spec: IStorylineSpec,\n block: IStorylineBlock,\n index: number\n): IExtensionGroupMarkSpec => {\n const hasImage = !!block.image;\n const hasSubImage = !!block.subImage;\n const contentText = Array.isArray(block.content) ? block.content : block.content ? [block.content] : [];\n\n const getMetrics = (ctx: LayoutContext) => {\n const lb = getLayout(spec, ctx).blocks[index];\n const w = lb?.width ?? resolveBlockWidth(spec, 0);\n const h = lb?.height ?? spec.block?.height ?? DEFAULT_BLOCK_HEIGHT;\n return getPortraitMetrics(spec, w, h, index, ctx);\n };\n const blockStyle = spec.block?.style ?? {};\n\n return {\n type: 'group' as any,\n id: `storyline-block-${block.id ?? index}`,\n name: `storyline-block-${index}`,\n zIndex: LayoutZIndex.Mark + 1,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => {\n const lb = getLayout(spec, ctx).blocks[index];\n return lb?.center?.x ?? 0;\n },\n y: (_d: unknown, ctx: LayoutContext) => {\n const lb = getLayout(spec, ctx).blocks[index];\n return lb?.center?.y ?? 0;\n }\n },\n children: [\n hasSubImage\n ? ({\n type: 'image',\n name: `storyline-block-shadow-image-${index}`,\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).shadowBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).shadowBox.y,\n width: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).shadowBox.width,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).shadowBox.height,\n image: block.subImage,\n repeatX: 'no-repeat',\n repeatY: 'no-repeat',\n imageMode: 'contain',\n imagePosition: 'center'\n }\n } as ICustomMarkSpec<'image'>)\n : null,\n shouldShowImageBackground(spec)\n ? ({\n type: 'rect',\n name: `storyline-block-image-bg-${index}`,\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.y,\n width: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.width,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.height,\n cornerRadius: 8,\n ...getImageBackgroundStyle(spec),\n ...blockStyle\n }\n } as ICustomMarkSpec<'rect'>)\n : null,\n hasImage\n ? ({\n type: 'image',\n name: `storyline-block-image-${index}`,\n interactive: false,\n ...omitImageLayoutSpec(spec.image),\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.y,\n width: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.width,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).imageBox.height,\n image: block.image,\n repeatX: 'no-repeat',\n repeatY: 'no-repeat',\n imageMode: 'contain',\n imagePosition: 'center',\n ...spec.image?.style\n }\n } as ICustomMarkSpec<'image'>)\n : null,\n block.title\n ? ({\n type: 'text',\n name: `storyline-block-title-${index}`,\n interactive: false,\n ...spec.title,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).textBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).textBox.y,\n text: block.title,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).titleHeight,\n heightLimit: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).titleLineHeight * BLOCK_TITLE_MAX_LINES,\n lineClamp: BLOCK_TITLE_MAX_LINES,\n fontSize: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).titleFontSize,\n lineHeight: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).titleLineHeight,\n fontWeight: 'bold',\n fill: '#1f2430',\n stroke: '#fff',\n lineWidth: 5,\n lineJoin: 'round',\n textAlign: 'left',\n textBaseline: 'top',\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n ellipsis: '...',\n ...spec.title?.style\n }\n } as ICustomMarkSpec<'text'>)\n : null,\n contentText.length\n ? ({\n type: 'text',\n name: `storyline-block-content-${index}`,\n interactive: false,\n ...spec.content,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.x,\n y: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.y,\n width: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.width,\n height: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.height,\n maxLineWidth: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.width,\n heightLimit: (_d: unknown, ctx: LayoutContext) => getMetrics(ctx).contentBox.height,\n text: buildPlainContent(contentText),\n fontSize: PORTRAIT_CONTENT_FONT_SIZE,\n lineHeight: PORTRAIT_CONTENT_LINE_HEIGHT,\n textAlign: 'left',\n textBaseline: 'top',\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n ellipsis: '...',\n fill: '#596173',\n ...spec.content?.style\n }\n } as ICustomMarkSpec<'text'>)\n : null\n ].filter(Boolean) as ICustomMarkSpec<any>[]\n };\n};\n"]}
@@ -4,8 +4,22 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: !0
5
5
  }), exports.buildWingBlockMark = exports.buildWingTitleImageMark = exports.buildWingArcMark = void 0;
6
6
 
7
- const vchart_1 = require("@visactor/vchart"), common_1 = require("./common"), WING_BLOCK_IMAGE_SIZE = 160, WING_TEXT_GAP_FROM_IMAGE = 14, WING_TITLE_LINE_HEIGHT = 30, WING_TITLE_FONT_SIZE = 22, WING_CONTENT_LINE_HEIGHT = 17, WING_CONTENT_FONT_SIZE = 12, WING_TEXT_BOX_WIDTH = 240, WING_TEXT_BOX_HEIGHT = 110, WING_TITLE_TO_CONTENT_GAP = 4, WING_TITLE_IMAGE_WIDTH_RATIO = .6, WING_TITLE_IMAGE_MAX_WIDTH = 820, getWingDirection = spec => "right" === (0,
8
- common_1.normalizeLayout)(spec.layout).direction ? "right" : "left", getWingArcGeometry = (spec, ctx) => {
7
+ const vchart_1 = require("@visactor/vchart"), common_1 = require("./common"), WING_BLOCK_IMAGE_SIZE = 160, WING_TEXT_GAP_FROM_IMAGE = 14, WING_TITLE_LINE_HEIGHT = 30, WING_TITLE_FONT_SIZE = 22, WING_CONTENT_LINE_HEIGHT = 17, WING_CONTENT_FONT_SIZE = 12, WING_TEXT_BOX_WIDTH = 240, WING_TEXT_BOX_HEIGHT = 110, WING_TITLE_TO_CONTENT_GAP = 4, WING_TITLE_IMAGE_WIDTH_RATIO = .6, WING_TITLE_IMAGE_MAX_WIDTH = 820, WING_DEFAULT_PATH_END_WIDTH = 350, WING_IMAGE_MIN_SCALE = .52, WING_IMAGE_MAX_SCALE = 1.2, WING_BOTTOM_TEXT_IMAGE_GAP_RATIO = 1.35, clamp = (value, min, max) => Math.max(min, Math.min(max, value)), getWingDirection = spec => "right" === (0,
8
+ common_1.normalizeLayout)(spec.layout).direction ? "right" : "left", getWingPathWidthRange = spec => {
9
+ var _a, _b, _c, _e, _f;
10
+ const lineStyle = null !== (_b = null === (_a = spec.line) || void 0 === _a ? void 0 : _a.style) && void 0 !== _b ? _b : {}, startWidth = Math.max(Number(null !== (_c = lineStyle.startWidth) && void 0 !== _c ? _c : 50), .5);
11
+ return {
12
+ startWidth: startWidth,
13
+ endWidth: Math.max(Number(null !== (_f = null !== (_e = lineStyle.endWidth) && void 0 !== _e ? _e : lineStyle.lineWidth) && void 0 !== _f ? _f : 350), startWidth)
14
+ };
15
+ }, getWingBlockPathRatio = (spec, index) => {
16
+ var _a, _b;
17
+ const count = null !== (_b = null === (_a = spec.data) || void 0 === _a ? void 0 : _a.length) && void 0 !== _b ? _b : 0;
18
+ return count <= 1 ? .5 : index / (count - 1);
19
+ }, getWingBlockImageScale = (spec, index) => {
20
+ const {startWidth: startWidth, endWidth: endWidth} = getWingPathWidthRange(spec), startScale = clamp(startWidth / 350, .52, 1.2);
21
+ return startScale + (clamp(endWidth / 350, .52, 1.2) - startScale) * getWingBlockPathRatio(spec, index);
22
+ }, getWingArcGeometry = (spec, ctx) => {
9
23
  var _a, _b, _c;
10
24
  const {width: width, height: height, startX: startX, startY: startY} = (0, common_1.getRegionGeometry)(ctx), innerWidth = Math.max(width, 1), innerHeight = Math.max(height, 1), layoutOpt = (0,
11
25
  common_1.normalizeLayout)(spec.layout), direction = getWingDirection(spec), defaultStart = "right" === direction ? 110 : -70, defaultEnd = "right" === direction ? 250 : 70, startAngle = null !== (_a = layoutOpt.startAngle) && void 0 !== _a ? _a : defaultStart, endAngle = null !== (_b = layoutOpt.endAngle) && void 0 !== _b ? _b : defaultEnd, ratio = null !== (_c = layoutOpt.radiusRatio) && void 0 !== _c ? _c : .92, rx = .6 * innerWidth * ratio;
@@ -29,10 +43,20 @@ common_1.normalizeLayout)(spec.layout).direction ? "right" : "left", getWingArcG
29
43
  x: arc.cx + Math.cos(angle) * arc.rx,
30
44
  y: arc.cy + Math.sin(angle) * arc.ry
31
45
  };
32
- }, isTextOnLeft = (spec, index) => "right" === getWingDirection(spec) ? index % 2 == 1 : index % 2 == 0, buildWingArcMark = spec => {
33
- var _a, _b, _c, _e, _f, _g, _h, _j;
46
+ }, isTextOnLeft = (spec, index) => "right" === getWingDirection(spec) ? index % 2 == 1 : index % 2 == 0, isWingBottomBlock = (spec, ctx, index) => {
47
+ var _a, _b;
48
+ const count = null !== (_b = null === (_a = spec.data) || void 0 === _a ? void 0 : _a.length) && void 0 !== _b ? _b : 0;
49
+ if (count <= 0) return !1;
50
+ let bottomIndex = 0, bottomY = Number.NEGATIVE_INFINITY;
51
+ for (let i = 0; i < count; i++) {
52
+ const center = getWingBlockCenter(spec, ctx, i);
53
+ center.y > bottomY && (bottomY = center.y, bottomIndex = i);
54
+ }
55
+ return index === bottomIndex;
56
+ }, buildWingArcMark = spec => {
57
+ var _a, _b, _c, _e, _f;
34
58
  if (!1 === (null === (_a = spec.line) || void 0 === _a ? void 0 : _a.visible)) return null;
35
- const themeColor = (0, common_1.getThemeColor)(spec), lineStyle = null !== (_c = null === (_b = spec.line) || void 0 === _b ? void 0 : _b.style) && void 0 !== _c ? _c : {}, startWidth = Math.max(Number(null !== (_e = lineStyle.startWidth) && void 0 !== _e ? _e : 50), .5), endWidth = Math.max(Number(null !== (_g = null !== (_f = lineStyle.endWidth) && void 0 !== _f ? _f : lineStyle.lineWidth) && void 0 !== _g ? _g : 350), startWidth);
59
+ const themeColor = (0, common_1.getThemeColor)(spec), lineStyle = null !== (_c = null === (_b = spec.line) || void 0 === _b ? void 0 : _b.style) && void 0 !== _c ? _c : {}, {startWidth: startWidth, endWidth: endWidth} = getWingPathWidthRange(spec);
36
60
  return {
37
61
  type: "group",
38
62
  name: "storyline-wing-arc",
@@ -44,7 +68,7 @@ common_1.normalizeLayout)(spec.layout).direction ? "right" : "left", getWingArcG
44
68
  style: {
45
69
  stroke: !1,
46
70
  lineWidth: 0,
47
- fill: null !== (_j = null !== (_h = lineStyle.fill) && void 0 !== _h ? _h : lineStyle.stroke) && void 0 !== _j ? _j : themeColor,
71
+ fill: null !== (_f = null !== (_e = lineStyle.fill) && void 0 !== _e ? _e : lineStyle.stroke) && void 0 !== _f ? _f : themeColor,
48
72
  opacity: .95,
49
73
  path: (_d, ctx) => {
50
74
  const arc = getWingArcGeometry(spec, ctx), span = arc.endAngle - arc.startAngle, pts = [];
@@ -127,14 +151,32 @@ const WING_TEXT_IMAGE_GAP = 120, getWingBlockMetrics = (spec, ctx, index) => {
127
151
  var _a, _b, _c, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
128
152
  const titleFontSize = (0, common_1.resolveTitleFontSize)(spec, ctx, null === (_b = null === (_a = spec.data) || void 0 === _a ? void 0 : _a[index]) || void 0 === _b ? void 0 : _b.title, 240, 22, [ 8, 30 ]), titleLineHeight = (0,
129
153
  common_1.resolveAdaptiveLineHeight)(titleFontSize, null === (_c = spec.title) || void 0 === _c ? void 0 : _c.style, 30, 1.3), titleHeight = (0,
130
- common_1.getBlockTitleHeight)(titleLineHeight, null === (_f = null === (_e = spec.data) || void 0 === _e ? void 0 : _e[index]) || void 0 === _f ? void 0 : _f.title), contentFontSize = Number(null !== (_j = null === (_h = null === (_g = spec.content) || void 0 === _g ? void 0 : _g.style) || void 0 === _h ? void 0 : _h.fontSize) && void 0 !== _j ? _j : 12), contentLineHeight = Number(null !== (_m = null === (_l = null === (_k = spec.content) || void 0 === _k ? void 0 : _k.style) || void 0 === _l ? void 0 : _l.lineHeight) && void 0 !== _m ? _m : 17), imageWidth = Number(null !== (_p = null === (_o = spec.image) || void 0 === _o ? void 0 : _o.width) && void 0 !== _p ? _p : 160), imageHeight = Number(null !== (_r = null === (_q = spec.image) || void 0 === _q ? void 0 : _q.height) && void 0 !== _r ? _r : 160), imageBox = {
154
+ common_1.getBlockTitleHeight)(titleLineHeight, null === (_f = null === (_e = spec.data) || void 0 === _e ? void 0 : _e[index]) || void 0 === _f ? void 0 : _f.title, 240, titleFontSize), contentFontSize = Number(null !== (_j = null === (_h = null === (_g = spec.content) || void 0 === _g ? void 0 : _g.style) || void 0 === _h ? void 0 : _h.fontSize) && void 0 !== _j ? _j : 12), contentLineHeight = Number(null !== (_m = null === (_l = null === (_k = spec.content) || void 0 === _k ? void 0 : _k.style) || void 0 === _l ? void 0 : _l.lineHeight) && void 0 !== _m ? _m : 17), imageScale = getWingBlockImageScale(spec, index), imageWidth = Math.round(Number(null !== (_p = null === (_o = spec.image) || void 0 === _o ? void 0 : _o.width) && void 0 !== _p ? _p : 160) * imageScale), imageHeight = Math.round(Number(null !== (_r = null === (_q = spec.image) || void 0 === _q ? void 0 : _q.height) && void 0 !== _r ? _r : 160) * imageScale), imageBox = {
131
155
  x: -imageWidth / 2,
132
156
  y: -imageHeight / 2,
133
157
  width: imageWidth,
134
158
  height: imageHeight
135
- }, direction = getWingDirection(spec), count = null !== (_t = null === (_s = spec.data) || void 0 === _s ? void 0 : _s.length) && void 0 !== _t ? _t : 0;
159
+ }, direction = getWingDirection(spec), count = null !== (_t = null === (_s = spec.data) || void 0 === _s ? void 0 : _s.length) && void 0 !== _t ? _t : 0, isSpecialBelow = "right" === direction && count > 0 && index === count - 1 || "left" === direction && 0 === index, isBottomAbove = isWingBottomBlock(spec, ctx, index), isVerticalLayout = isBottomAbove || isSpecialBelow;
136
160
  let textBox, contentBox, connectorBox, onLeft, verticalAlign;
137
- if ("right" === direction && count > 0 && index === count - 1 || "left" === direction && 0 === index) {
161
+ if (isBottomAbove) {
162
+ const bottomTextImageGap = Math.round(162), textX = -120, textY = -imageHeight / 2 - bottomTextImageGap - 110;
163
+ textBox = {
164
+ x: textX,
165
+ y: textY,
166
+ width: 240,
167
+ height: 110
168
+ }, contentBox = {
169
+ x: textX,
170
+ y: textY + titleHeight + 4,
171
+ width: 240,
172
+ height: 1e5
173
+ }, connectorBox = {
174
+ x: -1,
175
+ y: textY + 110,
176
+ width: 2,
177
+ height: bottomTextImageGap
178
+ }, onLeft = !1, verticalAlign = "above";
179
+ } else if (isVerticalLayout) {
138
180
  const textX = -120, textY = imageHeight / 2 + 120;
139
181
  textBox = {
140
182
  x: textX,
@@ -178,6 +220,7 @@ const WING_TEXT_IMAGE_GAP = 120, getWingBlockMetrics = (spec, ctx, index) => {
178
220
  verticalAlign: verticalAlign,
179
221
  titleFontSize: titleFontSize,
180
222
  titleLineHeight: titleLineHeight,
223
+ titleHeight: titleHeight,
181
224
  contentFontSize: contentFontSize,
182
225
  contentLineHeight: contentLineHeight,
183
226
  imageBox: imageBox,
@@ -264,8 +307,7 @@ const WING_TEXT_IMAGE_GAP = 120, getWingBlockMetrics = (spec, ctx, index) => {
264
307
  },
265
308
  y: (_d, ctx) => getWingBlockMetrics(spec, ctx, index).textBox.y,
266
309
  text: block.title,
267
- maxLineWidth: (_d, ctx) => getWingBlockMetrics(spec, ctx, index).textBox.width,
268
- height: (_d, ctx) => getWingBlockMetrics(spec, ctx, index).titleLineHeight * common_1.BLOCK_TITLE_MAX_LINES,
310
+ height: (_d, ctx) => getWingBlockMetrics(spec, ctx, index).titleHeight,
269
311
  heightLimit: (_d, ctx) => getWingBlockMetrics(spec, ctx, index).titleLineHeight * common_1.BLOCK_TITLE_MAX_LINES,
270
312
  lineClamp: common_1.BLOCK_TITLE_MAX_LINES,
271
313
  fontSize: (_d, ctx) => getWingBlockMetrics(spec, ctx, index).titleFontSize,