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

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 (189) hide show
  1. package/build/index.js +526 -489
  2. package/build/index.min.js +2 -2
  3. package/cjs/charts/axis-3d/index.js +2 -1
  4. package/cjs/charts/axis-3d/linear-axis.js +1 -2
  5. package/cjs/charts/bar-3d/chart-spec-transformer.js +1 -1
  6. package/cjs/charts/bar-3d/chart.js +1 -1
  7. package/cjs/charts/bar-3d/constant.js +1 -1
  8. package/cjs/charts/bar-3d/index.js +1 -1
  9. package/cjs/charts/bar-3d/interface.js +1 -1
  10. package/cjs/charts/bar-3d/series-spec-transformer.js +1 -1
  11. package/cjs/charts/bar-3d/series.js +1 -1
  12. package/cjs/charts/bar-3d/theme.js +1 -1
  13. package/cjs/charts/candlestick/candlestick-transformer.js +1 -1
  14. package/cjs/charts/candlestick/candlestick.js +1 -2
  15. package/cjs/charts/candlestick/index.js +1 -1
  16. package/cjs/charts/candlestick/interface.js +1 -1
  17. package/cjs/charts/candlestick/util.js +1 -1
  18. package/cjs/charts/combination-candlestick/combination-candlestick-transformer.js +1 -1
  19. package/cjs/charts/combination-candlestick/combination-candlestick.js +1 -1
  20. package/cjs/charts/combination-candlestick/constant.js +1 -1
  21. package/cjs/charts/combination-candlestick/index.js +1 -1
  22. package/cjs/charts/combination-candlestick/interface.js +1 -1
  23. package/cjs/charts/conversion-funnel/arrow-data-transform.js +1 -1
  24. package/cjs/charts/conversion-funnel/constants.js +1 -1
  25. package/cjs/charts/conversion-funnel/conversion-funnel-transformer.js +1 -1
  26. package/cjs/charts/conversion-funnel/conversion-funnel.js +1 -1
  27. package/cjs/charts/conversion-funnel/index.js +1 -1
  28. package/cjs/charts/conversion-funnel/interface.js +1 -1
  29. package/cjs/charts/conversion-funnel/util.js +1 -1
  30. package/cjs/charts/funnel-3d/chart.js +1 -2
  31. package/cjs/charts/funnel-3d/constant.js +1 -1
  32. package/cjs/charts/funnel-3d/index.js +1 -1
  33. package/cjs/charts/funnel-3d/interface.js +1 -1
  34. package/cjs/charts/funnel-3d/series-spec-transformer.js +1 -1
  35. package/cjs/charts/funnel-3d/series.js +1 -1
  36. package/cjs/charts/funnel-3d/theme.js +1 -1
  37. package/cjs/charts/histogram-3d/chart.js +1 -1
  38. package/cjs/charts/storyline/interface.d.ts +2 -2
  39. package/cjs/charts/storyline/interface.js.map +1 -1
  40. package/cjs/charts/storyline/layouts/arc.d.ts +1 -1
  41. package/cjs/charts/storyline/layouts/arc.js +92 -111
  42. package/cjs/charts/storyline/layouts/arc.js.map +1 -1
  43. package/cjs/charts/storyline/layouts/clock.d.ts +1 -1
  44. package/cjs/charts/storyline/layouts/clock.js +47 -37
  45. package/cjs/charts/storyline/layouts/clock.js.map +1 -1
  46. package/cjs/charts/storyline/layouts/common.d.ts +56 -16
  47. package/cjs/charts/storyline/layouts/common.js +185 -40
  48. package/cjs/charts/storyline/layouts/common.js.map +1 -1
  49. package/cjs/charts/storyline/layouts/default.js +34 -28
  50. package/cjs/charts/storyline/layouts/default.js.map +1 -1
  51. package/cjs/charts/storyline/layouts/ladder.js +35 -28
  52. package/cjs/charts/storyline/layouts/ladder.js.map +1 -1
  53. package/cjs/charts/storyline/layouts/landscape.js +39 -34
  54. package/cjs/charts/storyline/layouts/landscape.js.map +1 -1
  55. package/cjs/charts/storyline/layouts/portrait.d.ts +2 -2
  56. package/cjs/charts/storyline/layouts/portrait.js +78 -65
  57. package/cjs/charts/storyline/layouts/portrait.js.map +1 -1
  58. package/cjs/charts/storyline/layouts/wing.d.ts +1 -0
  59. package/cjs/charts/storyline/layouts/wing.js +103 -54
  60. package/cjs/charts/storyline/layouts/wing.js.map +1 -1
  61. package/cjs/charts/storyline/storyline-transformer.js +18 -14
  62. package/cjs/charts/storyline/storyline-transformer.js.map +1 -1
  63. package/cjs/components/bar-link/bar-link.js +1 -1
  64. package/cjs/components/bar-link/constant.js +1 -1
  65. package/cjs/components/bar-link/index.js +1 -1
  66. package/cjs/components/bar-link/type.js +1 -1
  67. package/cjs/components/bar-link/util.js +1 -1
  68. package/cjs/components/bar-regression-line/index.js +1 -1
  69. package/cjs/components/bar-regression-line/type.js +1 -1
  70. package/cjs/components/extension-mark-sync-state/extension-mark-sync-state.js +1 -1
  71. package/cjs/components/extension-mark-sync-state/index.js +1 -1
  72. package/cjs/components/extension-mark-sync-state/type.js +1 -1
  73. package/cjs/components/histogram-regression-line/index.js +1 -1
  74. package/cjs/components/histogram-regression-line/type.js +2 -1
  75. package/cjs/components/map-label/index.js +1 -1
  76. package/cjs/components/map-label/layout.js +1 -1
  77. package/cjs/components/map-label/map-label-transformer.js +1 -1
  78. package/cjs/components/map-label/map-label.js +1 -1
  79. package/cjs/components/map-label/theme.js +1 -1
  80. package/cjs/components/map-label/type.js +1 -1
  81. package/cjs/components/regression-line/index.js +1 -1
  82. package/cjs/components/regression-line/regression-line.js +1 -1
  83. package/cjs/components/regression-line/type.js +1 -1
  84. package/cjs/components/scatter-regression-line/index.js +1 -1
  85. package/cjs/components/scatter-regression-line/type.js +1 -1
  86. package/cjs/components/series-break/constant.js +1 -1
  87. package/cjs/components/series-break/index.js +1 -1
  88. package/cjs/components/series-break/series-break.js +1 -1
  89. package/cjs/components/series-break/type.js +1 -1
  90. package/cjs/components/series-break/util.js +2 -1
  91. package/cjs/components/series-label/constant.js +1 -1
  92. package/cjs/components/series-label/index.js +1 -1
  93. package/cjs/components/series-label/series-label.js +1 -1
  94. package/cjs/components/series-label/type.js +1 -1
  95. package/cjs/components/series-label/util.js +1 -1
  96. package/esm/charts/axis-3d/index.js +2 -1
  97. package/esm/charts/axis-3d/linear-axis.js +1 -2
  98. package/esm/charts/bar-3d/chart-spec-transformer.js +1 -1
  99. package/esm/charts/bar-3d/chart.js +1 -1
  100. package/esm/charts/bar-3d/constant.js +1 -1
  101. package/esm/charts/bar-3d/index.js +1 -1
  102. package/esm/charts/bar-3d/interface.js +1 -1
  103. package/esm/charts/bar-3d/series-spec-transformer.js +1 -1
  104. package/esm/charts/bar-3d/series.js +1 -1
  105. package/esm/charts/bar-3d/theme.js +1 -1
  106. package/esm/charts/candlestick/candlestick-transformer.js +1 -1
  107. package/esm/charts/candlestick/candlestick.js +1 -2
  108. package/esm/charts/candlestick/index.js +1 -1
  109. package/esm/charts/candlestick/interface.js +1 -1
  110. package/esm/charts/candlestick/util.js +1 -1
  111. package/esm/charts/combination-candlestick/combination-candlestick-transformer.js +1 -1
  112. package/esm/charts/combination-candlestick/combination-candlestick.js +1 -1
  113. package/esm/charts/combination-candlestick/constant.js +1 -1
  114. package/esm/charts/combination-candlestick/index.js +1 -1
  115. package/esm/charts/combination-candlestick/interface.js +1 -1
  116. package/esm/charts/conversion-funnel/arrow-data-transform.js +1 -1
  117. package/esm/charts/conversion-funnel/constants.js +1 -1
  118. package/esm/charts/conversion-funnel/conversion-funnel-transformer.js +1 -1
  119. package/esm/charts/conversion-funnel/conversion-funnel.js +1 -1
  120. package/esm/charts/conversion-funnel/index.js +1 -1
  121. package/esm/charts/conversion-funnel/interface.js +1 -1
  122. package/esm/charts/conversion-funnel/util.js +1 -1
  123. package/esm/charts/funnel-3d/chart.js +1 -2
  124. package/esm/charts/funnel-3d/constant.js +1 -1
  125. package/esm/charts/funnel-3d/index.js +1 -1
  126. package/esm/charts/funnel-3d/interface.js +1 -1
  127. package/esm/charts/funnel-3d/series-spec-transformer.js +1 -1
  128. package/esm/charts/funnel-3d/series.js +1 -1
  129. package/esm/charts/funnel-3d/theme.js +1 -1
  130. package/esm/charts/histogram-3d/chart.js +1 -1
  131. package/esm/charts/storyline/interface.d.ts +2 -2
  132. package/esm/charts/storyline/interface.js.map +1 -1
  133. package/esm/charts/storyline/layouts/arc.d.ts +1 -1
  134. package/esm/charts/storyline/layouts/arc.js +86 -109
  135. package/esm/charts/storyline/layouts/arc.js.map +1 -1
  136. package/esm/charts/storyline/layouts/clock.d.ts +1 -1
  137. package/esm/charts/storyline/layouts/clock.js +45 -36
  138. package/esm/charts/storyline/layouts/clock.js.map +1 -1
  139. package/esm/charts/storyline/layouts/common.d.ts +56 -16
  140. package/esm/charts/storyline/layouts/common.js +168 -35
  141. package/esm/charts/storyline/layouts/common.js.map +1 -1
  142. package/esm/charts/storyline/layouts/default.js +30 -26
  143. package/esm/charts/storyline/layouts/default.js.map +1 -1
  144. package/esm/charts/storyline/layouts/ladder.js +30 -26
  145. package/esm/charts/storyline/layouts/ladder.js.map +1 -1
  146. package/esm/charts/storyline/layouts/landscape.js +35 -34
  147. package/esm/charts/storyline/layouts/landscape.js.map +1 -1
  148. package/esm/charts/storyline/layouts/portrait.d.ts +2 -2
  149. package/esm/charts/storyline/layouts/portrait.js +75 -68
  150. package/esm/charts/storyline/layouts/portrait.js.map +1 -1
  151. package/esm/charts/storyline/layouts/wing.d.ts +1 -0
  152. package/esm/charts/storyline/layouts/wing.js +97 -54
  153. package/esm/charts/storyline/layouts/wing.js.map +1 -1
  154. package/esm/charts/storyline/storyline-transformer.js +20 -18
  155. package/esm/charts/storyline/storyline-transformer.js.map +1 -1
  156. package/esm/components/bar-link/bar-link.js +1 -1
  157. package/esm/components/bar-link/constant.js +1 -1
  158. package/esm/components/bar-link/index.js +1 -1
  159. package/esm/components/bar-link/type.js +1 -1
  160. package/esm/components/bar-link/util.js +1 -1
  161. package/esm/components/bar-regression-line/index.js +1 -1
  162. package/esm/components/bar-regression-line/type.js +1 -1
  163. package/esm/components/extension-mark-sync-state/extension-mark-sync-state.js +1 -1
  164. package/esm/components/extension-mark-sync-state/index.js +1 -1
  165. package/esm/components/extension-mark-sync-state/type.js +1 -1
  166. package/esm/components/histogram-regression-line/index.js +1 -1
  167. package/esm/components/histogram-regression-line/type.js +2 -1
  168. package/esm/components/map-label/index.js +1 -1
  169. package/esm/components/map-label/layout.js +1 -1
  170. package/esm/components/map-label/map-label-transformer.js +1 -1
  171. package/esm/components/map-label/map-label.js +1 -1
  172. package/esm/components/map-label/theme.js +1 -1
  173. package/esm/components/map-label/type.js +1 -1
  174. package/esm/components/regression-line/index.js +1 -1
  175. package/esm/components/regression-line/regression-line.js +1 -1
  176. package/esm/components/regression-line/type.js +1 -1
  177. package/esm/components/scatter-regression-line/index.js +1 -1
  178. package/esm/components/scatter-regression-line/type.js +1 -1
  179. package/esm/components/series-break/constant.js +1 -1
  180. package/esm/components/series-break/index.js +1 -1
  181. package/esm/components/series-break/series-break.js +1 -1
  182. package/esm/components/series-break/type.js +1 -1
  183. package/esm/components/series-break/util.js +2 -1
  184. package/esm/components/series-label/constant.js +1 -1
  185. package/esm/components/series-label/index.js +1 -1
  186. package/esm/components/series-label/series-label.js +1 -1
  187. package/esm/components/series-label/type.js +1 -1
  188. package/esm/components/series-label/util.js +1 -1
  189. package/package.json +2 -2
@@ -8,6 +8,8 @@ var __rest = this && this.__rest || function(s, e) {
8
8
  return t;
9
9
  };
10
10
 
11
+ import { LayoutZIndex } from "@visactor/vchart";
12
+
11
13
  import { computeStorylineLayout, normalizeLayout, normalizePadding } from "../layout";
12
14
 
13
15
  export const DEFAULT_BLOCK_WIDTH = 180;
@@ -26,6 +28,10 @@ export const DEFAULT_IMAGE_GAP = 10;
26
28
 
27
29
  export const DEFAULT_THEME_COLOR = "#e8543d";
28
30
 
31
+ export const BLOCK_TITLE_MAX_LINES = 2;
32
+
33
+ const DEFAULT_TITLE_IMAGE_WIDTH_RATIO = .52, DEFAULT_TITLE_IMAGE_MAX_WIDTH = 720, DEFAULT_TITLE_IMAGE_HEIGHT_RATIO = .36, DEFAULT_TITLE_IMAGE_TOP = 12, DEFAULT_TITLE_IMAGE_BOTTOM = 24;
34
+
29
35
  export const isLandscape = spec => "landscape" === normalizeLayout(spec.layout).type;
30
36
 
31
37
  export const isPortrait = spec => "portrait" === normalizeLayout(spec.layout).type;
@@ -48,6 +54,147 @@ export const shouldShowImageBackground = spec => {
48
54
  return null !== (_b = null === (_a = spec.image) || void 0 === _a ? void 0 : _a.showBackground) && void 0 !== _b ? _b : !(isPortrait(spec) || isLandscape(spec));
49
55
  };
50
56
 
57
+ const TITLE_FONT_SCALE_ID = "storylineTitleFontSize", MARKER_FONT_SCALE_ID = "storylineMarkerFontSize", clamp = (value, min, max) => Math.max(min, Math.min(max, value)), getTextWeight = text => text ? Math.max(Array.from(text).reduce(((sum, char) => 0 === char.trim().length ? sum + .32 : sum + (char.charCodeAt(0) > 255 ? 1.05 : .62)), 0), 1) : 4, getScaleRange = (spec, scaleId, fallback) => {
58
+ var _a;
59
+ const scales = spec.scales, range = null === (_a = null == scales ? void 0 : scales.find((scale => scale.id === scaleId || scale.type === scaleId))) || void 0 === _a ? void 0 : _a.range;
60
+ return Array.isArray(range) && range.length >= 2 && "number" == typeof range[0] && "number" == typeof range[1] ? [ Math.min(range[0], range[1]), Math.max(range[0], range[1]) ] : fallback;
61
+ }, getSpecGeometry = (spec, ctx) => {
62
+ var _a, _b;
63
+ return ctx ? getRegionGeometry(ctx, spec) : {
64
+ width: Math.max(Number(null !== (_a = spec.width) && void 0 !== _a ? _a : 0), 1),
65
+ height: Math.max(Number(null !== (_b = spec.height) && void 0 !== _b ? _b : 0), 1),
66
+ startX: 0,
67
+ startY: 0
68
+ };
69
+ }, resolveAdaptiveFontSize = (spec, ctx, text, options) => {
70
+ var _a;
71
+ const configuredFontSize = null === (_a = options.style) || void 0 === _a ? void 0 : _a.fontSize;
72
+ if (null != configuredFontSize) return Number(configuredFontSize);
73
+ const [minFontSize, maxFontSize] = getScaleRange(spec, options.scaleId, options.range), {width: width, height: height} = getSpecGeometry(spec, ctx), textWeight = getTextWeight(text), canvasSize = Math.sqrt(width * height) * options.canvasRatio, lengthFactor = Math.sqrt(8 / Math.max(textWeight, 4)), adaptiveSize = width <= 1 && height <= 1 ? options.fallback : canvasSize * lengthFactor, boxWidthLimit = options.boxWidth && options.boxWidth > 0 ? 2 * options.boxWidth / textWeight * .96 : Number.POSITIVE_INFINITY, boxHeightLimit = options.boxHeight && options.boxHeight > 0 ? options.boxHeight / Math.max(textWeight, 1) : Number.POSITIVE_INFINITY;
74
+ return Math.floor((value = Math.min(adaptiveSize, boxWidthLimit, boxHeightLimit),
75
+ min = minFontSize, max = maxFontSize, Math.max(min, Math.min(max, value))));
76
+ var value, min, max;
77
+ };
78
+
79
+ export const resolveAdaptiveLineHeight = (fontSize, style, fallback, ratio = 1.35) => {
80
+ var _a;
81
+ return Number(null !== (_a = null == style ? void 0 : style.lineHeight) && void 0 !== _a ? _a : Math.round((Number.isFinite(fontSize) ? fontSize : fallback) * ratio));
82
+ };
83
+
84
+ export const resolveTitleFontSize = (spec, ctx, title, boxWidth, fallback, range = [ 16, 34 ]) => {
85
+ var _a;
86
+ return resolveAdaptiveFontSize(spec, ctx, title, {
87
+ style: null === (_a = spec.title) || void 0 === _a ? void 0 : _a.style,
88
+ scaleId: TITLE_FONT_SCALE_ID,
89
+ fallback: fallback,
90
+ range: range,
91
+ canvasRatio: .038,
92
+ boxWidth: boxWidth
93
+ });
94
+ };
95
+
96
+ export const resolveMarkerFontSize = (spec, ctx, marker, boxHeight, fallback, range = [ 18, 46 ]) => {
97
+ var _a;
98
+ return resolveAdaptiveFontSize(spec, ctx, marker, {
99
+ style: null === (_a = spec.marker) || void 0 === _a ? void 0 : _a.style,
100
+ scaleId: MARKER_FONT_SCALE_ID,
101
+ fallback: fallback,
102
+ range: range,
103
+ canvasRatio: .052,
104
+ boxHeight: boxHeight
105
+ });
106
+ };
107
+
108
+ export const getImageBackgroundStyle = spec => {
109
+ const themeColor = getThemeColor(spec);
110
+ return {
111
+ fill: {
112
+ gradient: "linear",
113
+ x0: 0,
114
+ y0: 0,
115
+ x1: 1,
116
+ y1: 1,
117
+ stops: [ {
118
+ offset: 0,
119
+ color: "#ffffff"
120
+ }, {
121
+ offset: .58,
122
+ color: withAlpha(themeColor, .12)
123
+ }, {
124
+ offset: 1,
125
+ color: withAlpha(themeColor, .32)
126
+ } ]
127
+ },
128
+ stroke: withAlpha(themeColor, .78),
129
+ lineWidth: 2,
130
+ shadowColor: withAlpha(themeColor, .18),
131
+ shadowBlur: 10,
132
+ shadowOffsetX: 0,
133
+ shadowOffsetY: 4
134
+ };
135
+ };
136
+
137
+ export const getTitleImageSize = (spec, width, height, options) => {
138
+ var _a, _b, _c, _e, _f, _g, _h;
139
+ const defaultWidth = Math.min(Math.max(width * (null !== (_a = null == options ? void 0 : options.widthRatio) && void 0 !== _a ? _a : .52), 1), null !== (_b = null == options ? void 0 : options.maxWidth) && void 0 !== _b ? _b : 720), imageWidth = Math.max(Number(null !== (_e = null === (_c = spec.titleImage) || void 0 === _c ? void 0 : _c.width) && void 0 !== _e ? _e : defaultWidth), 1);
140
+ return {
141
+ width: imageWidth,
142
+ height: Math.max(Number(null !== (_g = null === (_f = spec.titleImage) || void 0 === _f ? void 0 : _f.height) && void 0 !== _g ? _g : Math.min(height, imageWidth * (null !== (_h = null == options ? void 0 : options.heightRatio) && void 0 !== _h ? _h : .36))), 1)
143
+ };
144
+ };
145
+
146
+ export const getTitleImageReservedHeight = (spec, width, height, options) => {
147
+ var _a, _b, _c;
148
+ if (!(null === (_a = spec.titleImage) || void 0 === _a ? void 0 : _a.image) || !1 === spec.titleImage.visible) return 0;
149
+ const size = getTitleImageSize(spec, width, height, options);
150
+ return Math.ceil((null !== (_b = null == options ? void 0 : options.y) && void 0 !== _b ? _b : 12) + size.height + (null !== (_c = null == options ? void 0 : options.bottom) && void 0 !== _c ? _c : 24));
151
+ };
152
+
153
+ export const getChartGeometry = (ctx, spec) => {
154
+ var _a, _b, _c, _e, _f, _g, _h, _j, _k, _l, _m;
155
+ const chartRect = null === (_b = null === (_a = ctx.chart) || void 0 === _a ? void 0 : _a.getLayoutRect) || void 0 === _b ? void 0 : _b.call(_a), bounds = null === (_c = ctx.getLayoutBounds) || void 0 === _c ? void 0 : _c.call(ctx);
156
+ return {
157
+ width: Math.max(null !== (_h = null !== (_g = null !== (_e = null == chartRect ? void 0 : chartRect.width) && void 0 !== _e ? _e : null === (_f = null == bounds ? void 0 : bounds.width) || void 0 === _f ? void 0 : _f.call(bounds)) && void 0 !== _g ? _g : null == spec ? void 0 : spec.width) && void 0 !== _h ? _h : 0, 1),
158
+ height: Math.max(null !== (_m = null !== (_l = null !== (_j = null == chartRect ? void 0 : chartRect.height) && void 0 !== _j ? _j : null === (_k = null == bounds ? void 0 : bounds.height) || void 0 === _k ? void 0 : _k.call(bounds)) && void 0 !== _l ? _l : null == spec ? void 0 : spec.height) && void 0 !== _m ? _m : 0, 1),
159
+ startX: 0,
160
+ startY: 0
161
+ };
162
+ };
163
+
164
+ export const buildTopTitleImageMark = (spec, options) => {
165
+ var _a;
166
+ return (null === (_a = spec.titleImage) || void 0 === _a ? void 0 : _a.image) && !1 !== spec.titleImage.visible ? Object.assign(Object.assign({
167
+ type: "image",
168
+ name: "storyline-title-image",
169
+ interactive: !1,
170
+ zIndex: LayoutZIndex.Mark + 8
171
+ }, spec.titleImage), {
172
+ style: Object.assign({
173
+ x: (_d, ctx) => {
174
+ const {width: width, height: height, startX: startX} = getChartGeometry(ctx, spec);
175
+ return startX + (width - getTitleImageSize(spec, width, height, options).width) / 2;
176
+ },
177
+ y: (_d, ctx) => {
178
+ var _a;
179
+ return getChartGeometry(ctx, spec).startY + (null !== (_a = null == options ? void 0 : options.y) && void 0 !== _a ? _a : 12);
180
+ },
181
+ width: (_d, ctx) => {
182
+ const {width: width, height: height} = getChartGeometry(ctx, spec);
183
+ return getTitleImageSize(spec, width, height, options).width;
184
+ },
185
+ height: (_d, ctx) => {
186
+ const {width: width, height: height} = getChartGeometry(ctx, spec);
187
+ return getTitleImageSize(spec, width, height, options).height;
188
+ },
189
+ image: spec.titleImage.image,
190
+ repeatX: "no-repeat",
191
+ repeatY: "no-repeat",
192
+ imageMode: "contain",
193
+ imagePosition: "center"
194
+ }, spec.titleImage.style)
195
+ }) : null;
196
+ };
197
+
51
198
  export const withAlpha = (color, alpha) => {
52
199
  const safeAlpha = Math.max(0, Math.min(1, alpha));
53
200
  if (!color) return `rgba(0, 0, 0, ${safeAlpha})`;
@@ -64,42 +211,42 @@ export const withAlpha = (color, alpha) => {
64
211
  };
65
212
 
66
213
  export const resolveBlockWidth = (spec, viewWidth) => {
67
- var _a, _b, _c, _d, _e, _f, _g;
214
+ var _a, _b, _c, _e, _f, _g, _h;
68
215
  if (null === (_a = spec.block) || void 0 === _a ? void 0 : _a.width) return spec.block.width;
69
- const ratio = null !== (_c = null === (_b = spec.block) || void 0 === _b ? void 0 : _b.widthRatio) && void 0 !== _c ? _c : .24, minWidth = null !== (_e = null === (_d = spec.block) || void 0 === _d ? void 0 : _d.minWidth) && void 0 !== _e ? _e : 180, maxWidth = null !== (_g = null === (_f = spec.block) || void 0 === _f ? void 0 : _f.maxWidth) && void 0 !== _g ? _g : Math.max(minWidth, 320);
216
+ const ratio = null !== (_c = null === (_b = spec.block) || void 0 === _b ? void 0 : _b.widthRatio) && void 0 !== _c ? _c : .24, minWidth = null !== (_f = null === (_e = spec.block) || void 0 === _e ? void 0 : _e.minWidth) && void 0 !== _f ? _f : 180, maxWidth = null !== (_h = null === (_g = spec.block) || void 0 === _g ? void 0 : _g.maxWidth) && void 0 !== _h ? _h : Math.max(minWidth, 320);
70
217
  return Math.max(minWidth, Math.min(maxWidth, Math.round(viewWidth * ratio)));
71
218
  };
72
219
 
73
220
  export const getRegionGeometry = (ctx, spec) => {
74
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
75
- const region = null === (_c = null === (_b = null === (_a = ctx.chart) || void 0 === _a ? void 0 : _a.getAllRegions) || void 0 === _b ? void 0 : _b.call(_a)) || void 0 === _c ? void 0 : _c[0], regionRect = null === (_d = null == region ? void 0 : region.getLayoutRect) || void 0 === _d ? void 0 : _d.call(region), regionStart = null === (_e = null == region ? void 0 : region.getLayoutStartPoint) || void 0 === _e ? void 0 : _e.call(region), chartRect = null === (_g = null === (_f = ctx.chart) || void 0 === _f ? void 0 : _f.getLayoutRect) || void 0 === _g ? void 0 : _g.call(_f), bounds = null === (_h = ctx.getLayoutBounds) || void 0 === _h ? void 0 : _h.call(ctx);
221
+ var _a, _b, _c, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
222
+ const region = null === (_c = null === (_b = null === (_a = ctx.chart) || void 0 === _a ? void 0 : _a.getAllRegions) || void 0 === _b ? void 0 : _b.call(_a)) || void 0 === _c ? void 0 : _c[0], regionRect = null === (_e = null == region ? void 0 : region.getLayoutRect) || void 0 === _e ? void 0 : _e.call(region), regionStart = null === (_f = null == region ? void 0 : region.getLayoutStartPoint) || void 0 === _f ? void 0 : _f.call(region), chartRect = null === (_h = null === (_g = ctx.chart) || void 0 === _g ? void 0 : _g.getLayoutRect) || void 0 === _h ? void 0 : _h.call(_g), bounds = null === (_j = ctx.getLayoutBounds) || void 0 === _j ? void 0 : _j.call(ctx);
76
223
  return {
77
- width: Math.max(null !== (_o = null !== (_m = null !== (_k = null !== (_j = null == regionRect ? void 0 : regionRect.width) && void 0 !== _j ? _j : null == chartRect ? void 0 : chartRect.width) && void 0 !== _k ? _k : null === (_l = null == bounds ? void 0 : bounds.width) || void 0 === _l ? void 0 : _l.call(bounds)) && void 0 !== _m ? _m : null == spec ? void 0 : spec.width) && void 0 !== _o ? _o : 0, 1),
78
- height: Math.max(null !== (_t = null !== (_s = null !== (_q = null !== (_p = null == regionRect ? void 0 : regionRect.height) && void 0 !== _p ? _p : null == chartRect ? void 0 : chartRect.height) && void 0 !== _q ? _q : null === (_r = null == bounds ? void 0 : bounds.height) || void 0 === _r ? void 0 : _r.call(bounds)) && void 0 !== _s ? _s : null == spec ? void 0 : spec.height) && void 0 !== _t ? _t : 0, 1),
79
- startX: null !== (_u = null == regionStart ? void 0 : regionStart.x) && void 0 !== _u ? _u : 0,
80
- startY: null !== (_v = null == regionStart ? void 0 : regionStart.y) && void 0 !== _v ? _v : 0
224
+ width: Math.max(null !== (_p = null !== (_o = null !== (_l = null !== (_k = null == regionRect ? void 0 : regionRect.width) && void 0 !== _k ? _k : null == chartRect ? void 0 : chartRect.width) && void 0 !== _l ? _l : null === (_m = null == bounds ? void 0 : bounds.width) || void 0 === _m ? void 0 : _m.call(bounds)) && void 0 !== _o ? _o : null == spec ? void 0 : spec.width) && void 0 !== _p ? _p : 0, 1),
225
+ height: Math.max(null !== (_u = null !== (_t = null !== (_r = null !== (_q = null == regionRect ? void 0 : regionRect.height) && void 0 !== _q ? _q : null == chartRect ? void 0 : chartRect.height) && void 0 !== _r ? _r : null === (_s = null == bounds ? void 0 : bounds.height) || void 0 === _s ? void 0 : _s.call(bounds)) && void 0 !== _t ? _t : null == spec ? void 0 : spec.height) && void 0 !== _u ? _u : 0, 1),
226
+ startX: null !== (_v = null == regionStart ? void 0 : regionStart.x) && void 0 !== _v ? _v : 0,
227
+ startY: null !== (_w = null == regionStart ? void 0 : regionStart.y) && void 0 !== _w ? _w : 0
81
228
  };
82
229
  };
83
230
 
84
231
  export const getLayout = (spec, ctx) => {
85
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
232
+ var _a, _b, _c, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
86
233
  const {width: width, height: height, startX: startX, startY: startY} = getRegionGeometry(ctx, spec);
87
234
  let blockWidth = resolveBlockWidth(spec, width), blockHeight = null !== (_b = null === (_a = spec.block) || void 0 === _a ? void 0 : _a.height) && void 0 !== _b ? _b : isLandscape(spec) ? 320 : 400;
88
235
  if (isLandscape(spec) && !(null === (_c = spec.block) || void 0 === _c ? void 0 : _c.width)) {
89
- const count = null !== (_e = null === (_d = spec.data) || void 0 === _d ? void 0 : _d.length) && void 0 !== _e ? _e : 0;
236
+ const count = null !== (_f = null === (_e = spec.data) || void 0 === _e ? void 0 : _e.length) && void 0 !== _f ? _f : 0;
90
237
  if (count > 0) {
91
- const padding = normalizePadding(null === (_f = spec.block) || void 0 === _f ? void 0 : _f.padding), LANDSCAPE_IMAGE_MIN_WIDTH = 80, adaptive = (Math.max(width - padding.left - padding.right, 1) - 40 * Math.max(count - 1, 0)) / count;
238
+ const padding = normalizePadding(null === (_g = spec.block) || void 0 === _g ? void 0 : _g.padding), LANDSCAPE_IMAGE_MIN_WIDTH = 80, adaptive = (Math.max(width - padding.left - padding.right, 1) - 40 * Math.max(count - 1, 0)) / count;
92
239
  blockWidth = Math.max(LANDSCAPE_IMAGE_MIN_WIDTH, Math.floor(adaptive));
93
240
  }
94
241
  }
95
- if (isPortrait(spec) && !(null === (_g = spec.block) || void 0 === _g ? void 0 : _g.height)) {
96
- const count = null !== (_j = null === (_h = spec.data) || void 0 === _h ? void 0 : _h.length) && void 0 !== _j ? _j : 0;
242
+ if (isPortrait(spec) && !(null === (_h = spec.block) || void 0 === _h ? void 0 : _h.height)) {
243
+ const count = null !== (_k = null === (_j = spec.data) || void 0 === _j ? void 0 : _j.length) && void 0 !== _k ? _k : 0;
97
244
  if (count > 0) {
98
- const padding = normalizePadding(null !== (_l = null === (_k = spec.layout) || void 0 === _k ? void 0 : _k.padding) && void 0 !== _l ? _l : null === (_m = spec.block) || void 0 === _m ? void 0 : _m.padding), innerHeight = Math.max(height - padding.top - padding.bottom, 1);
245
+ const layoutPadding = "object" == typeof spec.layout ? spec.layout.padding : void 0, padding = normalizePadding(null != layoutPadding ? layoutPadding : null === (_l = spec.block) || void 0 === _l ? void 0 : _l.padding), innerHeight = Math.max(height - padding.top - padding.bottom, 1);
99
246
  blockHeight = Math.max(120, Math.floor(innerHeight / (count + 1)));
100
247
  }
101
248
  }
102
- const result = computeStorylineLayout(null !== (_o = spec.data) && void 0 !== _o ? _o : [], {
249
+ const result = computeStorylineLayout(null !== (_m = spec.data) && void 0 !== _m ? _m : [], {
103
250
  layout: spec.layout,
104
251
  viewBox: {
105
252
  width: width,
@@ -109,9 +256,9 @@ export const getLayout = (spec, ctx) => {
109
256
  width: blockWidth,
110
257
  height: blockHeight
111
258
  },
112
- gap: null !== (_q = null === (_p = spec.block) || void 0 === _p ? void 0 : _p.gap) && void 0 !== _q ? _q : 36,
113
- padding: null === (_r = spec.block) || void 0 === _r ? void 0 : _r.padding,
114
- lineDistance: null === (_s = spec.line) || void 0 === _s ? void 0 : _s.distance
259
+ gap: null !== (_p = null === (_o = spec.block) || void 0 === _o ? void 0 : _o.gap) && void 0 !== _p ? _p : 36,
260
+ padding: null === (_q = spec.block) || void 0 === _q ? void 0 : _q.padding,
261
+ lineDistance: null === (_r = spec.line) || void 0 === _r ? void 0 : _r.distance
115
262
  });
116
263
  return startX || startY ? Object.assign(Object.assign({}, result), {
117
264
  blocks: result.blocks.map((block => Object.assign(Object.assign({}, block), {
@@ -139,23 +286,9 @@ export const getLayout = (spec, ctx) => {
139
286
  }) : result;
140
287
  };
141
288
 
142
- export const buildRichContent = (contentText, spec, overrides) => {
143
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
144
- const fontSize = Number(null !== (_d = null !== (_a = null == overrides ? void 0 : overrides.fontSize) && void 0 !== _a ? _a : null === (_c = null === (_b = spec.content) || void 0 === _b ? void 0 : _b.style) || void 0 === _c ? void 0 : _c.fontSize) && void 0 !== _d ? _d : 18), lineHeight = Number(null !== (_h = null !== (_e = null == overrides ? void 0 : overrides.lineHeight) && void 0 !== _e ? _e : null === (_g = null === (_f = spec.content) || void 0 === _f ? void 0 : _f.style) || void 0 === _g ? void 0 : _g.lineHeight) && void 0 !== _h ? _h : 26), fill = null !== (_m = null !== (_j = null == overrides ? void 0 : overrides.fill) && void 0 !== _j ? _j : null === (_l = null === (_k = spec.content) || void 0 === _k ? void 0 : _k.style) || void 0 === _l ? void 0 : _l.fill) && void 0 !== _m ? _m : "#596173", align = null !== (_o = null == overrides ? void 0 : overrides.align) && void 0 !== _o ? _o : "left";
145
- return {
146
- type: "rich",
147
- text: contentText.reduce(((result, paragraph, index) => {
148
- const suffix = index === contentText.length - 1 ? "" : "\n";
149
- return result.push({
150
- text: `${paragraph}${suffix}`,
151
- fontSize: fontSize,
152
- lineHeight: lineHeight,
153
- fill: fill,
154
- align: align
155
- }), result;
156
- }), [])
157
- };
158
- };
289
+ export const buildPlainContent = contentText => contentText.join("\n");
290
+
291
+ export const getBlockTitleHeight = (lineHeight, title) => title ? 2 * lineHeight : 0;
159
292
 
160
293
  export const omitImageLayoutSpec = imageSpec => {
161
294
  if (!imageSpec) return {};
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/charts/storyline/layouts/common.ts"],"names":[],"mappings":"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","file":"common.js","sourcesContent":["import type { ICustomMarkSpec } from '@visactor/vchart';\nimport type { IStorylineBlock, IStorylineSpec, StorylineImagePosition } from '../interface';\nimport {\n computeStorylineLayout,\n normalizeLayout,\n normalizePadding,\n type StorylineLayoutResult,\n type StorylinePoint\n} from '../layout';\n\n// ===== 布局通用类型 =====\n\nexport type LayoutContext = {\n chart?: {\n getAllRegions?: () => {\n getLayoutRect?: () => { width?: number; height?: number };\n getLayoutStartPoint?: () => { x?: number; y?: number };\n }[];\n getLayoutRect?: () => { width?: number; height?: number };\n };\n getLayoutBounds?: () => { width?: () => number; height?: () => number };\n};\n\n// ===== 通用默认值 =====\n\nexport const DEFAULT_BLOCK_WIDTH = 180;\nexport const DEFAULT_BLOCK_HEIGHT = 400;\nexport const DEFAULT_BLOCK_WIDTH_RATIO = 0.24;\nexport const DEFAULT_BLOCK_GAP = 36;\nexport const DEFAULT_IMAGE_WIDTH = 48;\nexport const DEFAULT_IMAGE_HEIGHT = 48;\nexport const DEFAULT_IMAGE_GAP = 10;\nexport const DEFAULT_THEME_COLOR = '#e8543d';\n\n// ===== 布局判定 =====\n\nexport const isLandscape = (spec: IStorylineSpec) => normalizeLayout(spec.layout).type === 'landscape';\nexport const isPortrait = (spec: IStorylineSpec) => normalizeLayout(spec.layout).type === 'portrait';\nexport const isClock = (spec: IStorylineSpec) => normalizeLayout(spec.layout).type === 'clock';\nexport const isArc = (spec: IStorylineSpec) => normalizeLayout(spec.layout).type === 'arc';\nexport const isWing = (spec: IStorylineSpec) => normalizeLayout(spec.layout).type === 'wing';\nexport const isLadder = (spec: IStorylineSpec) => normalizeLayout(spec.layout).type === 'ladder';\n\nexport const getThemeColor = (spec: IStorylineSpec) => spec.themeColor ?? DEFAULT_THEME_COLOR;\n\nexport const shouldShowImageBackground = (spec: IStorylineSpec) =>\n spec.image?.showBackground ?? !(isPortrait(spec) || isLandscape(spec));\n\n// ===== 颜色工具 =====\n\n/**\n * 给颜色(#hex / rgb / rgba / hsl / 颜色关键字)追加/替换 alpha 通道,返回 rgba(...) 字符串\n */\nexport const withAlpha = (color: string, alpha: number): string => {\n const safeAlpha = Math.max(0, Math.min(1, alpha));\n if (!color) {\n return `rgba(0, 0, 0, ${safeAlpha})`;\n }\n const trimmed = color.trim();\n if (trimmed.startsWith('#')) {\n let hex = trimmed.slice(1);\n if (hex.length === 3 || hex.length === 4) {\n hex = hex\n .split('')\n .map(ch => ch + ch)\n .join('');\n }\n if (hex.length === 6 || hex.length === 8) {\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${safeAlpha})`;\n }\n }\n const rgbMatch = trimmed.match(/^rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/i);\n if (rgbMatch) {\n return `rgba(${rgbMatch[1]}, ${rgbMatch[2]}, ${rgbMatch[3]}, ${safeAlpha})`;\n }\n return trimmed;\n};\n\n// ===== 块宽度解析 =====\n\nexport const resolveBlockWidth = (spec: IStorylineSpec, viewWidth: number) => {\n if (spec.block?.width) {\n return spec.block.width;\n }\n const ratio = spec.block?.widthRatio ?? DEFAULT_BLOCK_WIDTH_RATIO;\n const minWidth = spec.block?.minWidth ?? DEFAULT_BLOCK_WIDTH;\n const maxWidth = spec.block?.maxWidth ?? Math.max(minWidth, 320);\n return Math.max(minWidth, Math.min(maxWidth, Math.round(viewWidth * ratio)));\n};\n\n// ===== 容器几何信息(chart region rect)=====\n\nexport const getRegionGeometry = (ctx: LayoutContext, spec?: { width?: number; height?: number }) => {\n const region = ctx.chart?.getAllRegions?.()?.[0];\n const regionRect = region?.getLayoutRect?.();\n const regionStart = region?.getLayoutStartPoint?.();\n const chartRect = ctx.chart?.getLayoutRect?.();\n const bounds = ctx.getLayoutBounds?.();\n const width = Math.max(regionRect?.width ?? chartRect?.width ?? bounds?.width?.() ?? spec?.width ?? 0, 1);\n const height = Math.max(regionRect?.height ?? chartRect?.height ?? bounds?.height?.() ?? spec?.height ?? 0, 1);\n return {\n width,\n height,\n startX: regionStart?.x ?? 0,\n startY: regionStart?.y ?? 0\n };\n};\n\n// ===== 布局计算(layout.ts 的封装,附加 startX/startY 平移)=====\n\nexport const getLayout = (spec: IStorylineSpec, ctx: LayoutContext): StorylineLayoutResult => {\n const { width, height, startX, startY } = getRegionGeometry(ctx, spec);\n let blockWidth = resolveBlockWidth(spec, width);\n let blockHeight = spec.block?.height ?? (isLandscape(spec) ? 320 : DEFAULT_BLOCK_HEIGHT);\n // landscape:图片间距固定 40,根据 block 数量自适应单个 image 宽度\n if (isLandscape(spec) && !spec.block?.width) {\n const count = spec.data?.length ?? 0;\n if (count > 0) {\n const padding = normalizePadding(spec.block?.padding);\n const innerWidth = Math.max(width - padding.left - padding.right, 1);\n const LANDSCAPE_IMAGE_GAP = 40;\n const LANDSCAPE_IMAGE_MIN_WIDTH = 80;\n const totalGap = LANDSCAPE_IMAGE_GAP * Math.max(count - 1, 0);\n const adaptive = (innerWidth - totalGap) / count;\n blockWidth = Math.max(LANDSCAPE_IMAGE_MIN_WIDTH, Math.floor(adaptive));\n }\n }\n // portrait:每个 block 在垂直方向需要容纳 image + text,整体根据 region 高度均分\n // blockHeight = regionHeight / (count + 1)(即每个 block 的\"槽位\"高度),后续 portrait.ts 中:\n // imageHeight = blockHeight * 0.6\n // contentHeight = blockHeight\n if (isPortrait(spec) && !spec.block?.height) {\n const count = spec.data?.length ?? 0;\n if (count > 0) {\n const padding = normalizePadding(spec.layout?.padding ?? spec.block?.padding);\n const innerHeight = Math.max(height - padding.top - padding.bottom, 1);\n blockHeight = Math.max(120, Math.floor(innerHeight / (count + 1)));\n }\n }\n const result = computeStorylineLayout(spec.data ?? [], {\n layout: spec.layout,\n viewBox: { width, height },\n block: {\n width: blockWidth,\n height: blockHeight\n },\n gap: spec.block?.gap ?? DEFAULT_BLOCK_GAP,\n padding: spec.block?.padding,\n lineDistance: spec.line?.distance\n });\n if (!startX && !startY) {\n return result;\n }\n return {\n ...result,\n blocks: result.blocks.map(block => ({\n ...block,\n x: block.x + startX,\n y: block.y + startY,\n center: {\n x: block.center.x + startX,\n y: block.center.y + startY\n }\n })),\n links: result.links.map(link => ({\n ...link,\n start: { x: link.start.x + startX, y: link.start.y + startY },\n end: { x: link.end.x + startX, y: link.end.y + startY },\n points: link.points.map(point => ({ x: point.x + startX, y: point.y + startY }))\n }))\n };\n};\n\n// ===== 文本 / 图像通用工具 =====\n\nexport const buildRichContent = (\n contentText: string[],\n spec: IStorylineSpec,\n overrides?: { fontSize?: number; lineHeight?: number; fill?: string; align?: 'left' | 'center' | 'right' }\n) => {\n const fontSize = Number(overrides?.fontSize ?? (spec.content?.style as any)?.fontSize ?? 18);\n const lineHeight = Number(overrides?.lineHeight ?? (spec.content?.style as any)?.lineHeight ?? 26);\n const fill = overrides?.fill ?? (spec.content?.style as any)?.fill ?? '#596173';\n const align = overrides?.align ?? 'left';\n\n return {\n type: 'rich' as const,\n text: contentText.reduce<{ text: string; fontSize: number; lineHeight: number; fill: string; align: string }[]>(\n (result, paragraph, index) => {\n const suffix = index === contentText.length - 1 ? '' : '\\n';\n result.push({\n text: `${paragraph}${suffix}`,\n fontSize,\n lineHeight,\n fill,\n align\n });\n return result;\n },\n []\n )\n };\n};\n\nexport const omitImageLayoutSpec = (imageSpec: IStorylineSpec['image']) => {\n if (!imageSpec) {\n return {};\n }\n const { width: _width, height: _height, position: _position, gap: _gap, ...rest } = imageSpec;\n return rest;\n};\n\n// ===== 默认 image / text 盒计算(用于通用 block)=====\n\nexport const getImageBox = (\n position: StorylineImagePosition,\n blockWidth: number,\n blockHeight: number,\n padding: ReturnType<typeof normalizePadding>,\n width: number,\n height: number,\n _gap: number,\n visible: boolean\n) => {\n if (!visible) {\n return { x: padding.left, y: padding.top, width: 0, height: 0 };\n }\n switch (position) {\n case 'left':\n return { x: padding.left, y: (blockHeight - height) / 2, width, height };\n case 'right':\n return { x: blockWidth - padding.right - width, y: (blockHeight - height) / 2, width, height };\n case 'bottom':\n return { x: (blockWidth - width) / 2, y: blockHeight - padding.bottom - height, width, height };\n case 'top':\n default:\n return { x: (blockWidth - width) / 2, y: padding.top, width, height };\n }\n};\n\nexport const getTextBox = (\n position: StorylineImagePosition,\n blockWidth: number,\n blockHeight: number,\n padding: ReturnType<typeof normalizePadding>,\n imageWidth: number,\n imageHeight: number,\n imageGap: number,\n hasImage: boolean\n) => {\n if (!hasImage) {\n return {\n x: padding.left,\n y: padding.top,\n width: blockWidth - padding.left - padding.right,\n height: blockHeight - padding.top - padding.bottom\n };\n }\n switch (position) {\n case 'left':\n return {\n x: padding.left + imageWidth + imageGap,\n y: padding.top,\n width: blockWidth - padding.left - padding.right - imageWidth - imageGap,\n height: blockHeight - padding.top - padding.bottom\n };\n case 'right':\n return {\n x: padding.left,\n y: padding.top,\n width: blockWidth - padding.left - padding.right - imageWidth - imageGap,\n height: blockHeight - padding.top - padding.bottom\n };\n case 'bottom':\n return {\n x: padding.left,\n y: padding.top,\n width: blockWidth - padding.left - padding.right,\n height: blockHeight - padding.top - padding.bottom - imageHeight - imageGap\n };\n case 'top':\n default:\n return {\n x: padding.left,\n y: padding.top + imageHeight + imageGap,\n width: blockWidth - padding.left - padding.right,\n height: blockHeight - padding.top - padding.bottom - imageHeight - imageGap\n };\n }\n};\n\n// ===== Catmull-Rom 平滑曲线 =====\n\n/**\n * 用 Catmull-Rom 转 cubic Bezier 生成平滑曲线 path(贯穿所有点)。\n */\nexport const buildSmoothCurvePath = (points: StorylinePoint[]): string => {\n if (points.length < 2) {\n return '';\n }\n if (points.length === 2) {\n return `M ${points[0].x} ${points[0].y} L ${points[1].x} ${points[1].y}`;\n }\n let d = `M ${points[0].x} ${points[0].y}`;\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[i - 1] ?? points[i];\n const p1 = points[i];\n const p2 = points[i + 1];\n const p3 = points[i + 2] ?? p2;\n const c1x = p1.x + (p2.x - p0.x) / 6;\n const c1y = p1.y + (p2.y - p0.y) / 6;\n const c2x = p2.x - (p3.x - p1.x) / 6;\n const c2y = p2.y - (p3.y - p1.y) / 6;\n d += ` C ${c1x} ${c1y}, ${c2x} ${c2y}, ${p2.x} ${p2.y}`;\n }\n return d;\n};\n\n// 重导出常用的 layout helper(避免外部再 import layout.ts)\nexport { normalizeLayout, normalizePadding };\nexport type { IStorylineBlock, ICustomMarkSpec, StorylinePoint };\n"]}
1
+ {"version":3,"sources":["../src/charts/storyline/layouts/common.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,YAAY,EAAwB,MAAM,kBAAkB,CAAC;AAEtE,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAGjB,MAAM,WAAW,CAAC;AAiBnB,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AACvC,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACxC,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAC9C,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AACtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,mBAAmB,GAAG,SAAS,CAAC;AAC7C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,+BAA+B,GAAG,IAAI,CAAC;AAC7C,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAC1C,MAAM,gCAAgC,GAAG,IAAI,CAAC;AAC9C,MAAM,uBAAuB,GAAG,EAAE,CAAC;AACnC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAItC,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAoB,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;AACvG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAoB,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;AACrG,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAoB,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;AAC/F,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,IAAoB,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC;AAC3F,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAoB,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;AAC7F,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAoB,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;AAEjG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAoB,EAAE,EAAE,WAAC,OAAA,MAAA,IAAI,CAAC,UAAU,mCAAI,mBAAmB,CAAA,EAAA,CAAC;AAE9F,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,IAAoB,EAAE,EAAE,eAChE,OAAA,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,cAAc,mCAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAA,EAAA,CAAC;AAIzE,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AACrD,MAAM,oBAAoB,GAAG,yBAAyB,CAAC;AAEvD,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAE/F,MAAM,aAAa,GAAG,CAAC,IAAa,EAAE,EAAE;IACtC,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,CAAC,CAAC;KACV;IACD,OAAO,IAAI,CAAC,GAAG,CACb,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACpC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;YAC5B,OAAO,GAAG,GAAG,IAAI,CAAC;SACnB;QACD,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC,EAAE,CAAC,CAAC,EACL,CAAC,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAoB,EAAE,OAAe,EAAE,QAA0B,EAAE,EAAE;;IAC1F,MAAM,MAAM,GAAI,IAAuE,CAAC,MAAM,CAAC;IAC/F,MAAM,KAAK,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,0CAAE,KAAK,CAAC;IAC3F,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;QAC7G,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAqB,CAAC;KACzF;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,IAAoB,EAAE,GAAmB,EAAE,EAAE;;IACpE,IAAI,GAAG,EAAE;QACP,OAAO,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;KACrC;IACD,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAA,IAAI,CAAC,KAAK,mCAAI,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAA,IAAI,CAAC,MAAM,mCAAI,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,EAAE,CAAC;QACT,MAAM,EAAE,CAAC;KACV,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAC9B,IAAoB,EACpB,GAA8B,EAC9B,IAAwB,EACxB,OAQC,EACD,EAAE;;IACF,MAAM,kBAAkB,GAAG,MAAA,OAAO,CAAC,KAAK,0CAAE,QAAQ,CAAC;IACnD,IAAI,kBAAkB,IAAI,IAAI,EAAE;QAC9B,OAAO,MAAM,CAAC,kBAAkB,CAAC,CAAC;KACnC;IACD,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACvF,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IACnE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,GAAG,YAAY,CAAC;IAC9F,MAAM,aAAa,GACjB,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,GAAG,CAAC;QACtC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,GAAG,qBAAqB,CAAC,GAAG,UAAU,CAAC,GAAG,IAAI;QAClE,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;IAC/B,MAAM,cAAc,GAClB,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;IACtH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;AAC5G,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,QAAgB,EAChB,KAA0C,EAC1C,QAAgB,EAChB,KAAK,GAAG,IAAI,EACZ,EAAE,WAAC,OAAA,MAAM,CAAC,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,UAAU,mCAAI,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA,EAAA,CAAC;AAExG,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,IAAoB,EACpB,GAA8B,EAC9B,KAAyB,EACzB,QAA4B,EAC5B,QAAgB,EAChB,QAA0B,CAAC,EAAE,EAAE,EAAE,CAAC,EAClC,EAAE;;IACF,OAAA,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE;QACxC,KAAK,EAAE,MAAA,IAAI,CAAC,KAAK,0CAAE,KAA4C;QAC/D,OAAO,EAAE,mBAAmB;QAC5B,QAAQ;QACR,KAAK;QACL,WAAW,EAAE,KAAK;QAClB,QAAQ;KACT,CAAC,CAAA;CAAA,CAAC;AAEL,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,IAAoB,EACpB,GAAkB,EAClB,MAA0B,EAC1B,SAA6B,EAC7B,QAAgB,EAChB,QAA0B,CAAC,EAAE,EAAE,EAAE,CAAC,EAClC,EAAE;;IACF,OAAA,uBAAuB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE;QACzC,KAAK,EAAE,MAAA,IAAI,CAAC,MAAM,0CAAE,KAA4C;QAChE,OAAO,EAAE,oBAAoB;QAC7B,QAAQ;QACR,KAAK;QACL,WAAW,EAAE,KAAK;QAClB,SAAS;KACV,CAAC,CAAA;CAAA,CAAC;AAEL,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,IAAoB,EAAE,EAAE;IAC9D,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO;QACL,IAAI,EAAE;YACJ,QAAQ,EAAE,QAAQ;YAClB,EAAE,EAAE,CAAC;YACL,EAAE,EAAE,CAAC;YACL,EAAE,EAAE,CAAC;YACL,EAAE,EAAE,CAAC;YACL,KAAK,EAAE;gBACL,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;gBAC/B,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE;gBACpD,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE;aAClD;SACF;QACD,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC;QACnC,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC;QACxC,UAAU,EAAE,EAAE;QACd,aAAa,EAAE,CAAC;QAChB,aAAa,EAAE,CAAC;KACjB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAAoB,EACpB,KAAa,EACb,MAAc,EACd,OAA0E,EAC1E,EAAE;;IACF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAC3B,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,mCAAI,+BAA+B,CAAC,EAAE,CAAC,CAAC,EAC7E,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,mCAAI,6BAA6B,CACnD,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,KAAK,mCAAI,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC1B,MAAM,CACJ,MAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,MAAM,mCACrB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,mCAAI,gCAAgC,CAAC,CAAC,CAC5F,EACD,CAAC,CACF,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,IAAoB,EACpB,KAAa,EACb,MAAc,EACd,OAAuG,EACvG,EAAE;;IACF,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,KAAK,CAAA,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,KAAK,KAAK,EAAE;QAChE,OAAO,CAAC,CAAC;KACV;IACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,IAAI,CACd,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,CAAC,mCAAI,uBAAuB,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,mCAAI,0BAA0B,CAAC,CACxG,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAkB,EAAE,IAA0C,EAAE,EAAE;;IACjG,MAAM,SAAS,GAAG,MAAA,MAAA,GAAG,CAAC,KAAK,0CAAE,aAAa,kDAAI,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAA,GAAG,CAAC,eAAe,mDAAI,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAA,MAAA,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,mCAAI,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,sDAAI,mCAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,mCAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAA,MAAA,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,MAAM,mCAAI,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,sDAAI,mCAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,mCAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACzF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,IAAoB,EACpB,OAAsF,EACrD,EAAE;;IACnC,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,KAAK,CAAA,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,KAAK,KAAK,EAAE;QAChE,OAAO,IAAI,CAAC;KACb;IACD,OAAO,8BACL,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,uBAAuB,EAC7B,WAAW,EAAE,KAAK,EAClB,MAAM,EAAE,YAAY,CAAC,IAAI,GAAG,CAAC,IAC1B,IAAI,CAAC,UAAU,KAClB,KAAK,kBACH,CAAC,EAAE,CAAC,EAAW,EAAE,GAAkB,EAAE,EAAE;gBACrC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC9D,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC7D,OAAO,MAAM,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC3C,CAAC,EACD,CAAC,EAAE,CAAC,EAAW,EAAE,GAAkB,EAAE,EAAE,WACrC,OAAA,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,CAAC,mCAAI,uBAAuB,CAAC,CAAA,EAAA,EAC9E,KAAK,EAAE,CAAC,EAAW,EAAE,GAAkB,EAAE,EAAE;gBACzC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACtD,OAAO,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC;YAC/D,CAAC,EACD,MAAM,EAAE,CAAC,EAAW,EAAE,GAAkB,EAAE,EAAE;gBAC1C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACtD,OAAO,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC;YAChE,CAAC,EACD,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,EAC5B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,QAAQ,IACpB,IAAI,CAAC,UAAU,CAAC,KAAK,IAEC,CAAC;AAChC,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,KAAa,EAAU,EAAE;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK,EAAE;QACV,OAAO,iBAAiB,SAAS,GAAG,CAAC;KACtC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;QAC3B,IAAI,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;YACxC,GAAG,GAAG,GAAG;iBACN,KAAK,CAAC,EAAE,CAAC;iBACT,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;iBAClB,IAAI,CAAC,EAAE,CAAC,CAAC;SACb;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;YACxC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS,GAAG,CAAC;SAC/C;KACF;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACrF,IAAI,QAAQ,EAAE;QACZ,OAAO,QAAQ,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS,GAAG,CAAC;KAC7E;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAoB,EAAE,SAAiB,EAAE,EAAE;;IAC3E,IAAI,MAAA,IAAI,CAAC,KAAK,0CAAE,KAAK,EAAE;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;KACzB;IACD,MAAM,KAAK,GAAG,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,UAAU,mCAAI,yBAAyB,CAAC;IAClE,MAAM,QAAQ,GAAG,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,QAAQ,mCAAI,mBAAmB,CAAC;IAC7D,MAAM,QAAQ,GAAG,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,QAAQ,mCAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAC/E,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAkB,EAAE,IAA0C,EAAE,EAAE;;IAClG,MAAM,MAAM,GAAG,MAAA,MAAA,MAAA,GAAG,CAAC,KAAK,0CAAE,aAAa,kDAAI,0CAAG,CAAC,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,aAAa,sDAAI,CAAC;IAC7C,MAAM,WAAW,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,mBAAmB,sDAAI,CAAC;IACpD,MAAM,SAAS,GAAG,MAAA,MAAA,GAAG,CAAC,KAAK,0CAAE,aAAa,kDAAI,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAA,GAAG,CAAC,eAAe,mDAAI,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAA,MAAA,MAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,mCAAI,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,mCAAI,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,sDAAI,mCAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,mCAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1G,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAA,MAAA,MAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,mCAAI,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,MAAM,mCAAI,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,sDAAI,mCAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,mCAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/G,OAAO;QACL,KAAK;QACL,MAAM;QACN,MAAM,EAAE,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,CAAC,mCAAI,CAAC;QAC3B,MAAM,EAAE,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,CAAC,mCAAI,CAAC;KAC5B,CAAC;AACJ,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAoB,EAAE,GAAkB,EAAyB,EAAE;;IAC3F,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvE,IAAI,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAChD,IAAI,WAAW,GAAG,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,MAAM,mCAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAEzF,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,KAAK,CAAA,EAAE;QAC3C,MAAM,KAAK,GAAG,MAAA,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,mCAAI,CAAC,CAAC;QACrC,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAA,IAAI,CAAC,KAAK,0CAAE,OAAO,CAAC,CAAC;YACtD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACrE,MAAM,mBAAmB,GAAG,EAAE,CAAC;YAC/B,MAAM,yBAAyB,GAAG,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9D,MAAM,QAAQ,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC,GAAG,KAAK,CAAC;YACjD,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;SACxE;KACF;IAKD,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,MAAM,CAAA,EAAE;QAC3C,MAAM,KAAK,GAAG,MAAA,MAAA,IAAI,CAAC,IAAI,0CAAE,MAAM,mCAAI,CAAC,CAAC;QACrC,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,MAAM,aAAa,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YACxF,MAAM,OAAO,GAAG,gBAAgB,CAAC,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,MAAA,IAAI,CAAC,KAAK,0CAAE,OAAO,CAAC,CAAC;YACvE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACvE,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SACpE;KACF;IACD,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAA,IAAI,CAAC,IAAI,mCAAI,EAAE,EAAE;QACrD,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;QAC1B,KAAK,EAAE;YACL,KAAK,EAAE,UAAU;YACjB,MAAM,EAAE,WAAW;SACpB;QACD,GAAG,EAAE,MAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,GAAG,mCAAI,iBAAiB;QACzC,OAAO,EAAE,MAAA,IAAI,CAAC,KAAK,0CAAE,OAAO;QAC5B,YAAY,EAAE,MAAA,IAAI,CAAC,IAAI,0CAAE,QAAQ;KAClC,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE;QACtB,OAAO,MAAM,CAAC;KACf;IACD,uCACK,MAAM,KACT,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,iCAC9B,KAAK,KACR,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,EACnB,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,EACnB,MAAM,EAAE;gBACN,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM;gBAC1B,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM;aAC3B,IACD,CAAC,EACH,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,iCAC3B,IAAI,KACP,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,EAAE,EAC7D,GAAG,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,EACvD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,IAChF,CAAC,IACH;AACJ,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,WAAqB,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEnF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,UAAkB,EAAE,KAAc,EAAE,EAAE,CACxE,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAkC,EAAE,EAAE;IACxE,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,EAAE,CAAC;KACX;IACD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,KAAc,SAAS,EAAlB,IAAI,UAAK,SAAS,EAAvF,sCAA2E,CAAY,CAAC;IAC9F,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,QAAgC,EAChC,UAAkB,EAClB,WAAmB,EACnB,OAA4C,EAC5C,KAAa,EACb,MAAc,EACd,IAAY,EACZ,OAAgB,EAChB,EAAE;IACF,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;KACjE;IACD,QAAQ,QAAQ,EAAE;QAChB,KAAK,MAAM;YACT,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC3E,KAAK,OAAO;YACV,OAAO,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACjG,KAAK,QAAQ;YACX,OAAO,EAAE,CAAC,EAAE,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAClG,KAAK,KAAK,CAAC;QACX;YACE,OAAO,EAAE,CAAC,EAAE,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;KACzE;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,QAAgC,EAChC,UAAkB,EAClB,WAAmB,EACnB,OAA4C,EAC5C,UAAkB,EAClB,WAAmB,EACnB,QAAgB,EAChB,QAAiB,EACjB,EAAE;IACF,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO;YACL,CAAC,EAAE,OAAO,CAAC,IAAI;YACf,CAAC,EAAE,OAAO,CAAC,GAAG;YACd,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK;YAChD,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM;SACnD,CAAC;KACH;IACD,QAAQ,QAAQ,EAAE;QAChB,KAAK,MAAM;YACT,OAAO;gBACL,CAAC,EAAE,OAAO,CAAC,IAAI,GAAG,UAAU,GAAG,QAAQ;gBACvC,CAAC,EAAE,OAAO,CAAC,GAAG;gBACd,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,GAAG,UAAU,GAAG,QAAQ;gBACxE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM;aACnD,CAAC;QACJ,KAAK,OAAO;YACV,OAAO;gBACL,CAAC,EAAE,OAAO,CAAC,IAAI;gBACf,CAAC,EAAE,OAAO,CAAC,GAAG;gBACd,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,GAAG,UAAU,GAAG,QAAQ;gBACxE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM;aACnD,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO;gBACL,CAAC,EAAE,OAAO,CAAC,IAAI;gBACf,CAAC,EAAE,OAAO,CAAC,GAAG;gBACd,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK;gBAChD,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,WAAW,GAAG,QAAQ;aAC5E,CAAC;QACJ,KAAK,KAAK,CAAC;QACX;YACE,OAAO;gBACL,CAAC,EAAE,OAAO,CAAC,IAAI;gBACf,CAAC,EAAE,OAAO,CAAC,GAAG,GAAG,WAAW,GAAG,QAAQ;gBACvC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK;gBAChD,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,WAAW,GAAG,QAAQ;aAC5E,CAAC;KACL;AACH,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAwB,EAAU,EAAE;;IACvE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;QACrB,OAAO,EAAE,CAAC;KACX;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;QACvB,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1E;IACD,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1C,MAAM,EAAE,GAAG,MAAA,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,mCAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,MAAM,EAAE,GAAG,MAAA,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,mCAAI,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC,IAAI,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KACzD;IACD,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAGF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC","file":"common.js","sourcesContent":["import { LayoutZIndex, type ICustomMarkSpec } from '@visactor/vchart';\nimport type { IStorylineBlock, IStorylineSpec, StorylineImagePosition } from '../interface';\nimport {\n computeStorylineLayout,\n normalizeLayout,\n normalizePadding,\n type StorylineLayoutResult,\n type StorylinePoint\n} from '../layout';\n\n// ===== 布局通用类型 =====\n\nexport type LayoutContext = {\n chart?: {\n getAllRegions?: () => {\n getLayoutRect?: () => { width?: number; height?: number };\n getLayoutStartPoint?: () => { x?: number; y?: number };\n }[];\n getLayoutRect?: () => { width?: number; height?: number };\n };\n getLayoutBounds?: () => { width?: () => number; height?: () => number };\n};\n\n// ===== 通用默认值 =====\n\nexport const DEFAULT_BLOCK_WIDTH = 180;\nexport const DEFAULT_BLOCK_HEIGHT = 400;\nexport const DEFAULT_BLOCK_WIDTH_RATIO = 0.24;\nexport const DEFAULT_BLOCK_GAP = 36;\nexport const DEFAULT_IMAGE_WIDTH = 48;\nexport const DEFAULT_IMAGE_HEIGHT = 48;\nexport const DEFAULT_IMAGE_GAP = 10;\nexport const DEFAULT_THEME_COLOR = '#e8543d';\nexport const BLOCK_TITLE_MAX_LINES = 2;\nconst DEFAULT_TITLE_IMAGE_WIDTH_RATIO = 0.52;\nconst DEFAULT_TITLE_IMAGE_MAX_WIDTH = 720;\nconst DEFAULT_TITLE_IMAGE_HEIGHT_RATIO = 0.36;\nconst DEFAULT_TITLE_IMAGE_TOP = 12;\nconst DEFAULT_TITLE_IMAGE_BOTTOM = 24;\n\n// ===== 布局判定 =====\n\nexport const isLandscape = (spec: IStorylineSpec) => normalizeLayout(spec.layout).type === 'landscape';\nexport const isPortrait = (spec: IStorylineSpec) => normalizeLayout(spec.layout).type === 'portrait';\nexport const isClock = (spec: IStorylineSpec) => normalizeLayout(spec.layout).type === 'clock';\nexport const isArc = (spec: IStorylineSpec) => normalizeLayout(spec.layout).type === 'arc';\nexport const isWing = (spec: IStorylineSpec) => normalizeLayout(spec.layout).type === 'wing';\nexport const isLadder = (spec: IStorylineSpec) => normalizeLayout(spec.layout).type === 'ladder';\n\nexport const getThemeColor = (spec: IStorylineSpec) => spec.themeColor ?? DEFAULT_THEME_COLOR;\n\nexport const shouldShowImageBackground = (spec: IStorylineSpec) =>\n spec.image?.showBackground ?? !(isPortrait(spec) || isLandscape(spec));\n\n// ===== 默认样式工具 =====\n\nconst TITLE_FONT_SCALE_ID = 'storylineTitleFontSize';\nconst MARKER_FONT_SCALE_ID = 'storylineMarkerFontSize';\n\nconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(max, value));\n\nconst getTextWeight = (text?: string) => {\n if (!text) {\n return 4;\n }\n return Math.max(\n Array.from(text).reduce((sum, char) => {\n if (char.trim().length === 0) {\n return sum + 0.32;\n }\n return sum + (char.charCodeAt(0) > 255 ? 1.05 : 0.62);\n }, 0),\n 1\n );\n};\n\nconst getScaleRange = (spec: IStorylineSpec, scaleId: string, fallback: [number, number]) => {\n const scales = (spec as { scales?: { id?: string; type?: string; range?: unknown }[] }).scales;\n const range = scales?.find(scale => scale.id === scaleId || scale.type === scaleId)?.range;\n if (Array.isArray(range) && range.length >= 2 && typeof range[0] === 'number' && typeof range[1] === 'number') {\n return [Math.min(range[0], range[1]), Math.max(range[0], range[1])] as [number, number];\n }\n return fallback;\n};\n\nconst getSpecGeometry = (spec: IStorylineSpec, ctx?: LayoutContext) => {\n if (ctx) {\n return getRegionGeometry(ctx, spec);\n }\n return {\n width: Math.max(Number(spec.width ?? 0), 1),\n height: Math.max(Number(spec.height ?? 0), 1),\n startX: 0,\n startY: 0\n };\n};\n\nconst resolveAdaptiveFontSize = (\n spec: IStorylineSpec,\n ctx: LayoutContext | undefined,\n text: string | undefined,\n options: {\n style?: Record<string, unknown>;\n scaleId: string;\n fallback: number;\n range: [number, number];\n canvasRatio: number;\n boxWidth?: number;\n boxHeight?: number;\n }\n) => {\n const configuredFontSize = options.style?.fontSize;\n if (configuredFontSize != null) {\n return Number(configuredFontSize);\n }\n const [minFontSize, maxFontSize] = getScaleRange(spec, options.scaleId, options.range);\n const { width, height } = getSpecGeometry(spec, ctx);\n const textWeight = getTextWeight(text);\n const canvasSize = Math.sqrt(width * height) * options.canvasRatio;\n const lengthFactor = Math.sqrt(8 / Math.max(textWeight, 4));\n const adaptiveSize = width <= 1 && height <= 1 ? options.fallback : canvasSize * lengthFactor;\n const boxWidthLimit =\n options.boxWidth && options.boxWidth > 0\n ? ((options.boxWidth * BLOCK_TITLE_MAX_LINES) / textWeight) * 0.96\n : Number.POSITIVE_INFINITY;\n const boxHeightLimit =\n options.boxHeight && options.boxHeight > 0 ? options.boxHeight / Math.max(textWeight, 1) : Number.POSITIVE_INFINITY;\n return Math.floor(clamp(Math.min(adaptiveSize, boxWidthLimit, boxHeightLimit), minFontSize, maxFontSize));\n};\n\nexport const resolveAdaptiveLineHeight = (\n fontSize: number,\n style: Record<string, unknown> | undefined,\n fallback: number,\n ratio = 1.35\n) => Number(style?.lineHeight ?? Math.round((Number.isFinite(fontSize) ? fontSize : fallback) * ratio));\n\nexport const resolveTitleFontSize = (\n spec: IStorylineSpec,\n ctx: LayoutContext | undefined,\n title: string | undefined,\n boxWidth: number | undefined,\n fallback: number,\n range: [number, number] = [16, 34]\n) =>\n resolveAdaptiveFontSize(spec, ctx, title, {\n style: spec.title?.style as Record<string, unknown> | undefined,\n scaleId: TITLE_FONT_SCALE_ID,\n fallback,\n range,\n canvasRatio: 0.038,\n boxWidth\n });\n\nexport const resolveMarkerFontSize = (\n spec: IStorylineSpec,\n ctx: LayoutContext,\n marker: string | undefined,\n boxHeight: number | undefined,\n fallback: number,\n range: [number, number] = [18, 46]\n) =>\n resolveAdaptiveFontSize(spec, ctx, marker, {\n style: spec.marker?.style as Record<string, unknown> | undefined,\n scaleId: MARKER_FONT_SCALE_ID,\n fallback,\n range,\n canvasRatio: 0.052,\n boxHeight\n });\n\nexport const getImageBackgroundStyle = (spec: IStorylineSpec) => {\n const themeColor = getThemeColor(spec);\n return {\n fill: {\n gradient: 'linear',\n x0: 0,\n y0: 0,\n x1: 1,\n y1: 1,\n stops: [\n { offset: 0, color: '#ffffff' },\n { offset: 0.58, color: withAlpha(themeColor, 0.12) },\n { offset: 1, color: withAlpha(themeColor, 0.32) }\n ]\n },\n stroke: withAlpha(themeColor, 0.78),\n lineWidth: 2,\n shadowColor: withAlpha(themeColor, 0.18),\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowOffsetY: 4\n };\n};\n\nexport const getTitleImageSize = (\n spec: IStorylineSpec,\n width: number,\n height: number,\n options?: { widthRatio?: number; maxWidth?: number; heightRatio?: number }\n) => {\n const defaultWidth = Math.min(\n Math.max(width * (options?.widthRatio ?? DEFAULT_TITLE_IMAGE_WIDTH_RATIO), 1),\n options?.maxWidth ?? DEFAULT_TITLE_IMAGE_MAX_WIDTH\n );\n const imageWidth = Math.max(Number(spec.titleImage?.width ?? defaultWidth), 1);\n const imageHeight = Math.max(\n Number(\n spec.titleImage?.height ??\n Math.min(height, imageWidth * (options?.heightRatio ?? DEFAULT_TITLE_IMAGE_HEIGHT_RATIO))\n ),\n 1\n );\n return { width: imageWidth, height: imageHeight };\n};\n\nexport const getTitleImageReservedHeight = (\n spec: IStorylineSpec,\n width: number,\n height: number,\n options?: { y?: number; widthRatio?: number; maxWidth?: number; heightRatio?: number; bottom?: number }\n) => {\n if (!spec.titleImage?.image || spec.titleImage.visible === false) {\n return 0;\n }\n const size = getTitleImageSize(spec, width, height, options);\n return Math.ceil(\n (options?.y ?? DEFAULT_TITLE_IMAGE_TOP) + size.height + (options?.bottom ?? DEFAULT_TITLE_IMAGE_BOTTOM)\n );\n};\n\nexport const getChartGeometry = (ctx: LayoutContext, spec?: { width?: number; height?: number }) => {\n const chartRect = ctx.chart?.getLayoutRect?.();\n const bounds = ctx.getLayoutBounds?.();\n const width = Math.max(chartRect?.width ?? bounds?.width?.() ?? spec?.width ?? 0, 1);\n const height = Math.max(chartRect?.height ?? bounds?.height?.() ?? spec?.height ?? 0, 1);\n return { width, height, startX: 0, startY: 0 };\n};\n\nexport const buildTopTitleImageMark = (\n spec: IStorylineSpec,\n options?: { y?: number; widthRatio?: number; maxWidth?: number; heightRatio?: number }\n): ICustomMarkSpec<'image'> | null => {\n if (!spec.titleImage?.image || spec.titleImage.visible === false) {\n return null;\n }\n return {\n type: 'image',\n name: 'storyline-title-image',\n interactive: false,\n zIndex: LayoutZIndex.Mark + 8,\n ...spec.titleImage,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => {\n const { width, height, startX } = getChartGeometry(ctx, spec);\n const size = getTitleImageSize(spec, width, height, options);\n return startX + (width - size.width) / 2;\n },\n y: (_d: unknown, ctx: LayoutContext) =>\n getChartGeometry(ctx, spec).startY + (options?.y ?? DEFAULT_TITLE_IMAGE_TOP),\n width: (_d: unknown, ctx: LayoutContext) => {\n const { width, height } = getChartGeometry(ctx, spec);\n return getTitleImageSize(spec, width, height, options).width;\n },\n height: (_d: unknown, ctx: LayoutContext) => {\n const { width, height } = getChartGeometry(ctx, spec);\n return getTitleImageSize(spec, width, height, options).height;\n },\n image: spec.titleImage.image,\n repeatX: 'no-repeat',\n repeatY: 'no-repeat',\n imageMode: 'contain',\n imagePosition: 'center',\n ...spec.titleImage.style\n }\n } as ICustomMarkSpec<'image'>;\n};\n\n// ===== 颜色工具 =====\n\n/**\n * 给颜色(#hex / rgb / rgba / hsl / 颜色关键字)追加/替换 alpha 通道,返回 rgba(...) 字符串\n */\nexport const withAlpha = (color: string, alpha: number): string => {\n const safeAlpha = Math.max(0, Math.min(1, alpha));\n if (!color) {\n return `rgba(0, 0, 0, ${safeAlpha})`;\n }\n const trimmed = color.trim();\n if (trimmed.startsWith('#')) {\n let hex = trimmed.slice(1);\n if (hex.length === 3 || hex.length === 4) {\n hex = hex\n .split('')\n .map(ch => ch + ch)\n .join('');\n }\n if (hex.length === 6 || hex.length === 8) {\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${safeAlpha})`;\n }\n }\n const rgbMatch = trimmed.match(/^rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/i);\n if (rgbMatch) {\n return `rgba(${rgbMatch[1]}, ${rgbMatch[2]}, ${rgbMatch[3]}, ${safeAlpha})`;\n }\n return trimmed;\n};\n\n// ===== 块宽度解析 =====\n\nexport const resolveBlockWidth = (spec: IStorylineSpec, viewWidth: number) => {\n if (spec.block?.width) {\n return spec.block.width;\n }\n const ratio = spec.block?.widthRatio ?? DEFAULT_BLOCK_WIDTH_RATIO;\n const minWidth = spec.block?.minWidth ?? DEFAULT_BLOCK_WIDTH;\n const maxWidth = spec.block?.maxWidth ?? Math.max(minWidth, 320);\n return Math.max(minWidth, Math.min(maxWidth, Math.round(viewWidth * ratio)));\n};\n\n// ===== 容器几何信息(chart region rect)=====\n\nexport const getRegionGeometry = (ctx: LayoutContext, spec?: { width?: number; height?: number }) => {\n const region = ctx.chart?.getAllRegions?.()?.[0];\n const regionRect = region?.getLayoutRect?.();\n const regionStart = region?.getLayoutStartPoint?.();\n const chartRect = ctx.chart?.getLayoutRect?.();\n const bounds = ctx.getLayoutBounds?.();\n const width = Math.max(regionRect?.width ?? chartRect?.width ?? bounds?.width?.() ?? spec?.width ?? 0, 1);\n const height = Math.max(regionRect?.height ?? chartRect?.height ?? bounds?.height?.() ?? spec?.height ?? 0, 1);\n return {\n width,\n height,\n startX: regionStart?.x ?? 0,\n startY: regionStart?.y ?? 0\n };\n};\n\n// ===== 布局计算(layout.ts 的封装,附加 startX/startY 平移)=====\n\nexport const getLayout = (spec: IStorylineSpec, ctx: LayoutContext): StorylineLayoutResult => {\n const { width, height, startX, startY } = getRegionGeometry(ctx, spec);\n let blockWidth = resolveBlockWidth(spec, width);\n let blockHeight = spec.block?.height ?? (isLandscape(spec) ? 320 : DEFAULT_BLOCK_HEIGHT);\n // landscape:图片间距固定 40,根据 block 数量自适应单个 image 宽度\n if (isLandscape(spec) && !spec.block?.width) {\n const count = spec.data?.length ?? 0;\n if (count > 0) {\n const padding = normalizePadding(spec.block?.padding);\n const innerWidth = Math.max(width - padding.left - padding.right, 1);\n const LANDSCAPE_IMAGE_GAP = 40;\n const LANDSCAPE_IMAGE_MIN_WIDTH = 80;\n const totalGap = LANDSCAPE_IMAGE_GAP * Math.max(count - 1, 0);\n const adaptive = (innerWidth - totalGap) / count;\n blockWidth = Math.max(LANDSCAPE_IMAGE_MIN_WIDTH, Math.floor(adaptive));\n }\n }\n // portrait:每个 block 在垂直方向需要容纳 image + text,整体根据 region 高度均分\n // blockHeight = regionHeight / (count + 1)(即每个 block 的\"槽位\"高度),后续 portrait.ts 中:\n // imageHeight = blockHeight * 0.6\n // contentHeight = blockHeight\n if (isPortrait(spec) && !spec.block?.height) {\n const count = spec.data?.length ?? 0;\n if (count > 0) {\n const layoutPadding = typeof spec.layout === 'object' ? spec.layout.padding : undefined;\n const padding = normalizePadding(layoutPadding ?? spec.block?.padding);\n const innerHeight = Math.max(height - padding.top - padding.bottom, 1);\n blockHeight = Math.max(120, Math.floor(innerHeight / (count + 1)));\n }\n }\n const result = computeStorylineLayout(spec.data ?? [], {\n layout: spec.layout,\n viewBox: { width, height },\n block: {\n width: blockWidth,\n height: blockHeight\n },\n gap: spec.block?.gap ?? DEFAULT_BLOCK_GAP,\n padding: spec.block?.padding,\n lineDistance: spec.line?.distance\n });\n if (!startX && !startY) {\n return result;\n }\n return {\n ...result,\n blocks: result.blocks.map(block => ({\n ...block,\n x: block.x + startX,\n y: block.y + startY,\n center: {\n x: block.center.x + startX,\n y: block.center.y + startY\n }\n })),\n links: result.links.map(link => ({\n ...link,\n start: { x: link.start.x + startX, y: link.start.y + startY },\n end: { x: link.end.x + startX, y: link.end.y + startY },\n points: link.points.map(point => ({ x: point.x + startX, y: point.y + startY }))\n }))\n };\n};\n\n// ===== 文本 / 图像通用工具 =====\n\nexport const buildPlainContent = (contentText: string[]) => contentText.join('\\n');\n\nexport const getBlockTitleHeight = (lineHeight: number, title?: string) =>\n title ? lineHeight * BLOCK_TITLE_MAX_LINES : 0;\n\nexport const omitImageLayoutSpec = (imageSpec: IStorylineSpec['image']) => {\n if (!imageSpec) {\n return {};\n }\n const { width: _width, height: _height, position: _position, gap: _gap, ...rest } = imageSpec;\n return rest;\n};\n\n// ===== 默认 image / text 盒计算(用于通用 block)=====\n\nexport const getImageBox = (\n position: StorylineImagePosition,\n blockWidth: number,\n blockHeight: number,\n padding: ReturnType<typeof normalizePadding>,\n width: number,\n height: number,\n _gap: number,\n visible: boolean\n) => {\n if (!visible) {\n return { x: padding.left, y: padding.top, width: 0, height: 0 };\n }\n switch (position) {\n case 'left':\n return { x: padding.left, y: (blockHeight - height) / 2, width, height };\n case 'right':\n return { x: blockWidth - padding.right - width, y: (blockHeight - height) / 2, width, height };\n case 'bottom':\n return { x: (blockWidth - width) / 2, y: blockHeight - padding.bottom - height, width, height };\n case 'top':\n default:\n return { x: (blockWidth - width) / 2, y: padding.top, width, height };\n }\n};\n\nexport const getTextBox = (\n position: StorylineImagePosition,\n blockWidth: number,\n blockHeight: number,\n padding: ReturnType<typeof normalizePadding>,\n imageWidth: number,\n imageHeight: number,\n imageGap: number,\n hasImage: boolean\n) => {\n if (!hasImage) {\n return {\n x: padding.left,\n y: padding.top,\n width: blockWidth - padding.left - padding.right,\n height: blockHeight - padding.top - padding.bottom\n };\n }\n switch (position) {\n case 'left':\n return {\n x: padding.left + imageWidth + imageGap,\n y: padding.top,\n width: blockWidth - padding.left - padding.right - imageWidth - imageGap,\n height: blockHeight - padding.top - padding.bottom\n };\n case 'right':\n return {\n x: padding.left,\n y: padding.top,\n width: blockWidth - padding.left - padding.right - imageWidth - imageGap,\n height: blockHeight - padding.top - padding.bottom\n };\n case 'bottom':\n return {\n x: padding.left,\n y: padding.top,\n width: blockWidth - padding.left - padding.right,\n height: blockHeight - padding.top - padding.bottom - imageHeight - imageGap\n };\n case 'top':\n default:\n return {\n x: padding.left,\n y: padding.top + imageHeight + imageGap,\n width: blockWidth - padding.left - padding.right,\n height: blockHeight - padding.top - padding.bottom - imageHeight - imageGap\n };\n }\n};\n\n// ===== Catmull-Rom 平滑曲线 =====\n\n/**\n * 用 Catmull-Rom 转 cubic Bezier 生成平滑曲线 path(贯穿所有点)。\n */\nexport const buildSmoothCurvePath = (points: StorylinePoint[]): string => {\n if (points.length < 2) {\n return '';\n }\n if (points.length === 2) {\n return `M ${points[0].x} ${points[0].y} L ${points[1].x} ${points[1].y}`;\n }\n let d = `M ${points[0].x} ${points[0].y}`;\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[i - 1] ?? points[i];\n const p1 = points[i];\n const p2 = points[i + 1];\n const p3 = points[i + 2] ?? p2;\n const c1x = p1.x + (p2.x - p0.x) / 6;\n const c1y = p1.y + (p2.y - p0.y) / 6;\n const c2x = p2.x - (p3.x - p1.x) / 6;\n const c2y = p2.y - (p3.y - p1.y) / 6;\n d += ` C ${c1x} ${c1y}, ${c2x} ${c2y}, ${p2.x} ${p2.y}`;\n }\n return d;\n};\n\n// 重导出常用的 layout helper(避免外部再 import layout.ts)\nexport { normalizeLayout, normalizePadding };\nexport type { IStorylineBlock, ICustomMarkSpec, StorylinePoint };\n"]}
@@ -10,7 +10,7 @@ var __rest = this && this.__rest || function(s, e) {
10
10
 
11
11
  import { LayoutZIndex } from "@visactor/vchart";
12
12
 
13
- import { DEFAULT_BLOCK_HEIGHT, DEFAULT_IMAGE_WIDTH, DEFAULT_IMAGE_HEIGHT, DEFAULT_IMAGE_GAP, buildRichContent, getImageBox, getLayout, getTextBox, getThemeColor, normalizePadding, omitImageLayoutSpec, resolveBlockWidth, shouldShowImageBackground } from "./common";
13
+ import { DEFAULT_BLOCK_HEIGHT, DEFAULT_IMAGE_WIDTH, DEFAULT_IMAGE_HEIGHT, DEFAULT_IMAGE_GAP, BLOCK_TITLE_MAX_LINES, buildPlainContent, getBlockTitleHeight, getImageBackgroundStyle, getImageBox, getLayout, getTextBox, normalizePadding, omitImageLayoutSpec, resolveBlockWidth, resolveAdaptiveLineHeight, resolveTitleFontSize, shouldShowImageBackground } from "./common";
14
14
 
15
15
  export const buildDefaultLineMark = spec => {
16
16
  var _a, _b, _c, _d;
@@ -43,13 +43,15 @@ export const buildDefaultLineMark = spec => {
43
43
  };
44
44
 
45
45
  const getDefaultBlockMetrics = (spec, ctx, index) => {
46
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1;
47
- const block = getLayout(spec, ctx).blocks[index], padding = normalizePadding(null !== (_b = null === (_a = spec.block) || void 0 === _a ? void 0 : _a.padding) && void 0 !== _b ? _b : 12), imagePosition = null !== (_d = null === (_c = spec.image) || void 0 === _c ? void 0 : _c.position) && void 0 !== _d ? _d : "top", imageWidth = null !== (_f = null === (_e = spec.image) || void 0 === _e ? void 0 : _e.width) && void 0 !== _f ? _f : DEFAULT_IMAGE_WIDTH, imageHeight = null !== (_h = null === (_g = spec.image) || void 0 === _g ? void 0 : _g.height) && void 0 !== _h ? _h : DEFAULT_IMAGE_HEIGHT, imageGap = null !== (_k = null === (_j = spec.image) || void 0 === _j ? void 0 : _j.gap) && void 0 !== _k ? _k : DEFAULT_IMAGE_GAP, hasImage = !!(null === (_m = null === (_l = spec.data) || void 0 === _l ? void 0 : _l[index]) || void 0 === _m ? void 0 : _m.image), titleFontSize = Number(null !== (_q = null === (_p = null === (_o = spec.title) || void 0 === _o ? void 0 : _o.style) || void 0 === _p ? void 0 : _p.fontSize) && void 0 !== _q ? _q : 18), titleLineHeight = Number(null !== (_t = null === (_s = null === (_r = spec.title) || void 0 === _r ? void 0 : _r.style) || void 0 === _s ? void 0 : _s.lineHeight) && void 0 !== _t ? _t : Math.round(1.35 * titleFontSize)), titleHeight = (null === (_v = null === (_u = spec.data) || void 0 === _u ? void 0 : _u[index]) || void 0 === _v ? void 0 : _v.title) ? titleLineHeight : 0, blockWidth = null !== (_w = null == block ? void 0 : block.width) && void 0 !== _w ? _w : resolveBlockWidth(spec, 0), blockHeight = null !== (_z = null !== (_x = null == block ? void 0 : block.height) && void 0 !== _x ? _x : null === (_y = spec.block) || void 0 === _y ? void 0 : _y.height) && void 0 !== _z ? _z : DEFAULT_BLOCK_HEIGHT, imageBox = getImageBox(imagePosition, blockWidth, blockHeight, padding, imageWidth, imageHeight, imageGap, hasImage), textBox = getTextBox(imagePosition, blockWidth, blockHeight, padding, imageWidth, imageHeight, imageGap, hasImage), contentGap = (null === (_1 = null === (_0 = spec.data) || void 0 === _0 ? void 0 : _0[index]) || void 0 === _1 ? void 0 : _1.title) ? 8 : 0;
46
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y;
47
+ const block = getLayout(spec, ctx).blocks[index], padding = normalizePadding(null !== (_b = null === (_a = spec.block) || void 0 === _a ? void 0 : _a.padding) && void 0 !== _b ? _b : 12), imagePosition = null !== (_d = null === (_c = spec.image) || void 0 === _c ? void 0 : _c.position) && void 0 !== _d ? _d : "top", imageWidth = null !== (_f = null === (_e = spec.image) || void 0 === _e ? void 0 : _e.width) && void 0 !== _f ? _f : DEFAULT_IMAGE_WIDTH, imageHeight = null !== (_h = null === (_g = spec.image) || void 0 === _g ? void 0 : _g.height) && void 0 !== _h ? _h : DEFAULT_IMAGE_HEIGHT, imageGap = null !== (_k = null === (_j = spec.image) || void 0 === _j ? void 0 : _j.gap) && void 0 !== _k ? _k : DEFAULT_IMAGE_GAP, hasImage = !!(null === (_m = null === (_l = spec.data) || void 0 === _l ? void 0 : _l[index]) || void 0 === _m ? void 0 : _m.image), blockWidth = null !== (_o = null == block ? void 0 : block.width) && void 0 !== _o ? _o : resolveBlockWidth(spec, 0), blockHeight = null !== (_r = null !== (_p = null == block ? void 0 : block.height) && void 0 !== _p ? _p : null === (_q = spec.block) || void 0 === _q ? void 0 : _q.height) && void 0 !== _r ? _r : DEFAULT_BLOCK_HEIGHT, imageBox = getImageBox(imagePosition, blockWidth, blockHeight, padding, imageWidth, imageHeight, imageGap, hasImage), textBox = getTextBox(imagePosition, blockWidth, blockHeight, padding, imageWidth, imageHeight, imageGap, hasImage), titleFontSize = resolveTitleFontSize(spec, ctx, null === (_t = null === (_s = spec.data) || void 0 === _s ? void 0 : _s[index]) || void 0 === _t ? void 0 : _t.title, textBox.width, 18, [ 8, 28 ]), titleLineHeight = resolveAdaptiveLineHeight(titleFontSize, null === (_u = spec.title) || void 0 === _u ? void 0 : _u.style, Math.round(24.3)), titleHeight = getBlockTitleHeight(titleLineHeight, null === (_w = null === (_v = spec.data) || void 0 === _v ? void 0 : _v[index]) || void 0 === _w ? void 0 : _w.title), contentGap = (null === (_y = null === (_x = spec.data) || void 0 === _x ? void 0 : _x[index]) || void 0 === _y ? void 0 : _y.title) ? 8 : 0;
48
48
  return {
49
49
  block: {
50
50
  width: blockWidth,
51
51
  height: blockHeight
52
52
  },
53
+ titleFontSize: titleFontSize,
54
+ titleLineHeight: titleLineHeight,
53
55
  imageBox: imageBox,
54
56
  textBox: textBox,
55
57
  contentBox: {
@@ -60,11 +62,11 @@ const getDefaultBlockMetrics = (spec, ctx, index) => {
60
62
  };
61
63
 
62
64
  export const buildDefaultBlockMark = (spec, block, index) => {
63
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
64
- const hasImage = !!block.image, contentText = Array.isArray(block.content) ? block.content : block.content ? [ block.content ] : [], titleFontSize = Number(null !== (_c = null === (_b = null === (_a = spec.title) || void 0 === _a ? void 0 : _a.style) || void 0 === _b ? void 0 : _b.fontSize) && void 0 !== _c ? _c : 18), titleLineHeight = Number(null !== (_f = null === (_e = null === (_d = spec.title) || void 0 === _d ? void 0 : _d.style) || void 0 === _e ? void 0 : _e.lineHeight) && void 0 !== _f ? _f : Math.round(1.35 * titleFontSize)), themeColor = getThemeColor(spec);
65
+ var _a, _b, _c, _d, _e, _f, _g;
66
+ const hasImage = !!block.image, contentText = Array.isArray(block.content) ? block.content : block.content ? [ block.content ] : [];
65
67
  return {
66
68
  type: "group",
67
- id: `storyline-block-${null !== (_g = block.id) && void 0 !== _g ? _g : index}`,
69
+ id: `storyline-block-${null !== (_a = block.id) && void 0 !== _a ? _a : index}`,
68
70
  name: `storyline-block-${index}`,
69
71
  zIndex: LayoutZIndex.Mark + 1,
70
72
  style: {
@@ -79,7 +81,7 @@ export const buildDefaultBlockMark = (spec, block, index) => {
79
81
  width: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).block.width,
80
82
  height: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).block.height
81
83
  },
82
- children: [ !0 === (null === (_h = spec.block) || void 0 === _h ? void 0 : _h.showBackground) ? {
84
+ children: [ !0 === (null === (_b = spec.block) || void 0 === _b ? void 0 : _b.showBackground) ? {
83
85
  type: "rect",
84
86
  name: `storyline-block-bg-${index}`,
85
87
  interactive: !1,
@@ -94,21 +96,18 @@ export const buildDefaultBlockMark = (spec, block, index) => {
94
96
  lineWidth: 1,
95
97
  shadowBlur: 6,
96
98
  shadowColor: "rgba(0, 0, 0, 0.08)"
97
- }, null === (_j = spec.block) || void 0 === _j ? void 0 : _j.style)
99
+ }, null === (_c = spec.block) || void 0 === _c ? void 0 : _c.style)
98
100
  } : null, shouldShowImageBackground(spec) ? {
99
101
  type: "rect",
100
102
  name: `storyline-block-image-bg-${index}`,
101
103
  interactive: !1,
102
- style: Object.assign({
104
+ style: Object.assign(Object.assign({
103
105
  x: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).imageBox.x,
104
106
  y: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).imageBox.y,
105
107
  width: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).imageBox.width,
106
108
  height: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).imageBox.height,
107
- cornerRadius: 8,
108
- fill: "#ffffff",
109
- stroke: themeColor,
110
- lineWidth: 2
111
- }, null === (_k = spec.block) || void 0 === _k ? void 0 : _k.style)
109
+ cornerRadius: 8
110
+ }, getImageBackgroundStyle(spec)), null === (_d = spec.block) || void 0 === _d ? void 0 : _d.style)
112
111
  } : null, hasImage ? Object.assign(Object.assign({
113
112
  type: "image",
114
113
  name: `storyline-block-image-${index}`,
@@ -120,7 +119,7 @@ export const buildDefaultBlockMark = (spec, block, index) => {
120
119
  width: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).imageBox.width,
121
120
  height: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).imageBox.height,
122
121
  image: block.image
123
- }, null === (_l = spec.image) || void 0 === _l ? void 0 : _l.style)
122
+ }, null === (_e = spec.image) || void 0 === _e ? void 0 : _e.style)
124
123
  }) : null, block.title ? Object.assign(Object.assign({
125
124
  type: "text",
126
125
  name: `storyline-block-title-${index}`,
@@ -131,39 +130,44 @@ export const buildDefaultBlockMark = (spec, block, index) => {
131
130
  y: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).textBox.y,
132
131
  text: block.title,
133
132
  maxLineWidth: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).textBox.width,
134
- fontSize: titleFontSize,
135
- lineHeight: titleLineHeight,
133
+ height: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).titleLineHeight * BLOCK_TITLE_MAX_LINES,
134
+ heightLimit: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).titleLineHeight * BLOCK_TITLE_MAX_LINES,
135
+ lineClamp: BLOCK_TITLE_MAX_LINES,
136
+ fontSize: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).titleFontSize,
137
+ lineHeight: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).titleLineHeight,
136
138
  fontWeight: "bold",
137
139
  fill: "#1f2430",
138
140
  stroke: "#fff",
139
141
  lineWidth: 5,
140
142
  lineJoin: "round",
141
143
  textAlign: "left",
142
- textBaseline: "top"
143
- }, null === (_m = spec.title) || void 0 === _m ? void 0 : _m.style)
144
+ textBaseline: "top",
145
+ whiteSpace: "normal",
146
+ wordBreak: "break-word",
147
+ ellipsis: "..."
148
+ }, null === (_f = spec.title) || void 0 === _f ? void 0 : _f.style)
144
149
  }) : null, contentText.length ? Object.assign(Object.assign({
145
150
  type: "text",
146
151
  name: `storyline-block-content-${index}`,
147
152
  interactive: !1
148
153
  }, spec.content), {
149
- textType: "rich",
150
154
  style: Object.assign({
151
155
  x: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).textBox.x,
152
156
  y: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).contentBox.y,
153
157
  width: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).textBox.width,
154
- text: buildRichContent(contentText, spec, {
155
- fontSize: 18,
156
- lineHeight: 26,
157
- fill: "#596173"
158
- }),
158
+ height: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).contentBox.height,
159
+ text: buildPlainContent(contentText),
159
160
  maxLineWidth: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).textBox.width,
160
161
  heightLimit: (_datum, ctx) => getDefaultBlockMetrics(spec, ctx, index).contentBox.height,
162
+ fontSize: 16,
163
+ lineHeight: 23,
161
164
  textAlign: "left",
162
165
  textBaseline: "top",
166
+ whiteSpace: "normal",
163
167
  wordBreak: "break-word",
164
168
  ellipsis: "...",
165
169
  fill: "#596173"
166
- }, null === (_o = spec.content) || void 0 === _o ? void 0 : _o.style)
170
+ }, null === (_g = spec.content) || void 0 === _g ? void 0 : _g.style)
167
171
  }) : null ].filter(Boolean)
168
172
  };
169
173
  };