@visactor/vchart-extension 2.1.0-alpha.14 → 2.1.0-alpha.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/build/index.js +2216 -0
  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/histogram-3d/chart.js +1 -2
  31. package/cjs/charts/histogram-3d/index.js +1 -1
  32. package/cjs/charts/histogram-3d/interface.js +1 -1
  33. package/cjs/charts/image-cloud/image-cloud-transformer.js +1 -1
  34. package/cjs/charts/image-cloud/image-cloud.js +1 -1
  35. package/cjs/charts/image-cloud/index.js +1 -1
  36. package/cjs/charts/image-cloud/interface.js +1 -1
  37. package/cjs/charts/image-cloud/series/image-cloud.d.ts +138 -0
  38. package/cjs/charts/pictogram/element-highlight-by-graphic-name.js +1 -1
  39. package/cjs/charts/storyline/index.d.ts +4 -0
  40. package/cjs/charts/storyline/index.js +22 -0
  41. package/cjs/charts/storyline/index.js.map +1 -0
  42. package/cjs/charts/storyline/interface.d.ts +61 -0
  43. package/cjs/charts/storyline/interface.js +6 -0
  44. package/cjs/charts/storyline/interface.js.map +1 -0
  45. package/cjs/charts/storyline/layout.d.ts +53 -0
  46. package/cjs/charts/storyline/layout.js +214 -0
  47. package/cjs/charts/storyline/layout.js.map +1 -0
  48. package/cjs/charts/storyline/layouts/bowl.d.ts +5 -0
  49. package/cjs/charts/storyline/layouts/bowl.js +285 -0
  50. package/cjs/charts/storyline/layouts/bowl.js.map +1 -0
  51. package/cjs/charts/storyline/layouts/clock.d.ts +5 -0
  52. package/cjs/charts/storyline/layouts/clock.js +247 -0
  53. package/cjs/charts/storyline/layouts/clock.js.map +1 -0
  54. package/cjs/charts/storyline/layouts/common.d.ts +88 -0
  55. package/cjs/charts/storyline/layouts/common.js +291 -0
  56. package/cjs/charts/storyline/layouts/common.js.map +1 -0
  57. package/cjs/charts/storyline/layouts/default.d.ts +4 -0
  58. package/cjs/charts/storyline/layouts/default.js +179 -0
  59. package/cjs/charts/storyline/layouts/default.js.map +1 -0
  60. package/cjs/charts/storyline/layouts/dome.d.ts +5 -0
  61. package/cjs/charts/storyline/layouts/dome.js +300 -0
  62. package/cjs/charts/storyline/layouts/dome.js.map +1 -0
  63. package/cjs/charts/storyline/layouts/landscape.d.ts +4 -0
  64. package/cjs/charts/storyline/layouts/landscape.js +254 -0
  65. package/cjs/charts/storyline/layouts/landscape.js.map +1 -0
  66. package/cjs/charts/storyline/layouts/portrait.d.ts +4 -0
  67. package/cjs/charts/storyline/layouts/portrait.js +241 -0
  68. package/cjs/charts/storyline/layouts/portrait.js.map +1 -0
  69. package/cjs/charts/storyline/layouts/wing.d.ts +4 -0
  70. package/cjs/charts/storyline/layouts/wing.js +215 -0
  71. package/cjs/charts/storyline/layouts/wing.js.map +1 -0
  72. package/cjs/charts/storyline/storyline-transformer.d.ts +4 -0
  73. package/cjs/charts/storyline/storyline-transformer.js +66 -0
  74. package/cjs/charts/storyline/storyline-transformer.js.map +1 -0
  75. package/cjs/charts/storyline/storyline.d.ts +16 -0
  76. package/cjs/charts/storyline/storyline.js +36 -0
  77. package/cjs/charts/storyline/storyline.js.map +1 -0
  78. package/cjs/components/bar-link/bar-link.js +1 -1
  79. package/cjs/components/bar-link/constant.js +1 -1
  80. package/cjs/components/bar-link/index.js +1 -1
  81. package/cjs/components/bar-link/type.js +1 -1
  82. package/cjs/components/bar-link/util.js +1 -1
  83. package/cjs/components/bar-regression-line/index.js +1 -1
  84. package/cjs/components/bar-regression-line/type.js +1 -1
  85. package/cjs/components/extension-mark-sync-state/extension-mark-sync-state.js +1 -1
  86. package/cjs/components/extension-mark-sync-state/index.js +1 -1
  87. package/cjs/components/extension-mark-sync-state/type.js +1 -1
  88. package/cjs/components/histogram-regression-line/index.js +1 -1
  89. package/cjs/components/histogram-regression-line/type.js +2 -1
  90. package/cjs/components/map-label/index.js +1 -1
  91. package/cjs/components/map-label/layout.js +1 -1
  92. package/cjs/components/map-label/map-label-transformer.js +1 -1
  93. package/cjs/components/map-label/map-label.d.ts +52 -0
  94. package/cjs/components/map-label/map-label.js +1 -1
  95. package/cjs/components/map-label/theme.js +1 -1
  96. package/cjs/components/map-label/type.js +1 -1
  97. package/cjs/components/regression-line/index.js +1 -1
  98. package/cjs/components/regression-line/regression-line.js +1 -1
  99. package/cjs/components/regression-line/type.js +1 -1
  100. package/cjs/components/scatter-regression-line/index.js +1 -1
  101. package/cjs/components/scatter-regression-line/type.js +1 -1
  102. package/cjs/components/series-break/constant.js +1 -1
  103. package/cjs/components/series-break/index.js +1 -1
  104. package/cjs/components/series-break/series-break.js +1 -1
  105. package/cjs/components/series-break/type.js +1 -1
  106. package/cjs/components/series-break/util.js +2 -1
  107. package/cjs/components/series-label/constant.js +1 -1
  108. package/cjs/components/series-label/index.js +1 -1
  109. package/cjs/components/series-label/series-label.js +1 -1
  110. package/cjs/components/series-label/type.js +1 -1
  111. package/cjs/components/series-label/util.js +1 -1
  112. package/cjs/index.d.ts +1 -0
  113. package/cjs/index.js +5 -5
  114. package/cjs/index.js.map +1 -1
  115. package/esm/charts/axis-3d/index.js +2 -1
  116. package/esm/charts/axis-3d/linear-axis.js +1 -2
  117. package/esm/charts/bar-3d/chart-spec-transformer.js +1 -1
  118. package/esm/charts/bar-3d/chart.js +1 -1
  119. package/esm/charts/bar-3d/constant.js +1 -1
  120. package/esm/charts/bar-3d/index.js +1 -1
  121. package/esm/charts/bar-3d/interface.js +1 -1
  122. package/esm/charts/bar-3d/series-spec-transformer.js +1 -1
  123. package/esm/charts/bar-3d/series.js +1 -1
  124. package/esm/charts/bar-3d/theme.js +1 -1
  125. package/esm/charts/candlestick/candlestick-transformer.js +1 -1
  126. package/esm/charts/candlestick/candlestick.js +1 -2
  127. package/esm/charts/candlestick/index.js +1 -1
  128. package/esm/charts/candlestick/interface.js +1 -1
  129. package/esm/charts/candlestick/util.js +1 -1
  130. package/esm/charts/combination-candlestick/combination-candlestick-transformer.js +1 -1
  131. package/esm/charts/combination-candlestick/combination-candlestick.js +1 -1
  132. package/esm/charts/combination-candlestick/constant.js +1 -1
  133. package/esm/charts/combination-candlestick/index.js +1 -1
  134. package/esm/charts/combination-candlestick/interface.js +1 -1
  135. package/esm/charts/conversion-funnel/arrow-data-transform.js +1 -1
  136. package/esm/charts/conversion-funnel/constants.js +1 -1
  137. package/esm/charts/conversion-funnel/conversion-funnel-transformer.js +1 -1
  138. package/esm/charts/conversion-funnel/conversion-funnel.js +1 -1
  139. package/esm/charts/conversion-funnel/index.js +1 -1
  140. package/esm/charts/conversion-funnel/interface.js +1 -1
  141. package/esm/charts/conversion-funnel/util.js +1 -1
  142. package/esm/charts/histogram-3d/chart.js +1 -2
  143. package/esm/charts/histogram-3d/index.js +1 -1
  144. package/esm/charts/histogram-3d/interface.js +1 -1
  145. package/esm/charts/image-cloud/image-cloud-transformer.js +1 -1
  146. package/esm/charts/image-cloud/image-cloud.js +1 -1
  147. package/esm/charts/image-cloud/index.js +1 -1
  148. package/esm/charts/image-cloud/interface.js +1 -1
  149. package/esm/charts/image-cloud/series/image-cloud.d.ts +138 -0
  150. package/esm/charts/pictogram/element-highlight-by-graphic-name.js +1 -1
  151. package/esm/charts/storyline/index.d.ts +4 -0
  152. package/esm/charts/storyline/index.js +8 -0
  153. package/esm/charts/storyline/index.js.map +1 -0
  154. package/esm/charts/storyline/interface.d.ts +61 -0
  155. package/esm/charts/storyline/interface.js +2 -0
  156. package/esm/charts/storyline/interface.js.map +1 -0
  157. package/esm/charts/storyline/layout.d.ts +53 -0
  158. package/esm/charts/storyline/layout.js +204 -0
  159. package/esm/charts/storyline/layout.js.map +1 -0
  160. package/esm/charts/storyline/layouts/bowl.d.ts +5 -0
  161. package/esm/charts/storyline/layouts/bowl.js +277 -0
  162. package/esm/charts/storyline/layouts/bowl.js.map +1 -0
  163. package/esm/charts/storyline/layouts/clock.d.ts +5 -0
  164. package/esm/charts/storyline/layouts/clock.js +241 -0
  165. package/esm/charts/storyline/layouts/clock.js.map +1 -0
  166. package/esm/charts/storyline/layouts/common.d.ts +88 -0
  167. package/esm/charts/storyline/layouts/common.js +257 -0
  168. package/esm/charts/storyline/layouts/common.js.map +1 -0
  169. package/esm/charts/storyline/layouts/default.d.ts +4 -0
  170. package/esm/charts/storyline/layouts/default.js +172 -0
  171. package/esm/charts/storyline/layouts/default.js.map +1 -0
  172. package/esm/charts/storyline/layouts/dome.d.ts +5 -0
  173. package/esm/charts/storyline/layouts/dome.js +292 -0
  174. package/esm/charts/storyline/layouts/dome.js.map +1 -0
  175. package/esm/charts/storyline/layouts/landscape.d.ts +4 -0
  176. package/esm/charts/storyline/layouts/landscape.js +250 -0
  177. package/esm/charts/storyline/layouts/landscape.js.map +1 -0
  178. package/esm/charts/storyline/layouts/portrait.d.ts +4 -0
  179. package/esm/charts/storyline/layouts/portrait.js +238 -0
  180. package/esm/charts/storyline/layouts/portrait.js.map +1 -0
  181. package/esm/charts/storyline/layouts/wing.d.ts +4 -0
  182. package/esm/charts/storyline/layouts/wing.js +210 -0
  183. package/esm/charts/storyline/layouts/wing.js.map +1 -0
  184. package/esm/charts/storyline/storyline-transformer.d.ts +4 -0
  185. package/esm/charts/storyline/storyline-transformer.js +66 -0
  186. package/esm/charts/storyline/storyline-transformer.js.map +1 -0
  187. package/esm/charts/storyline/storyline.d.ts +16 -0
  188. package/esm/charts/storyline/storyline.js +29 -0
  189. package/esm/charts/storyline/storyline.js.map +1 -0
  190. package/esm/components/bar-link/bar-link.js +1 -1
  191. package/esm/components/bar-link/constant.js +1 -1
  192. package/esm/components/bar-link/index.js +1 -1
  193. package/esm/components/bar-link/type.js +1 -1
  194. package/esm/components/bar-link/util.js +1 -1
  195. package/esm/components/bar-regression-line/index.js +1 -1
  196. package/esm/components/bar-regression-line/type.js +1 -1
  197. package/esm/components/extension-mark-sync-state/extension-mark-sync-state.js +1 -1
  198. package/esm/components/extension-mark-sync-state/index.js +1 -1
  199. package/esm/components/extension-mark-sync-state/type.js +1 -1
  200. package/esm/components/histogram-regression-line/index.js +1 -1
  201. package/esm/components/histogram-regression-line/type.js +2 -1
  202. package/esm/components/map-label/index.js +1 -1
  203. package/esm/components/map-label/layout.js +1 -1
  204. package/esm/components/map-label/map-label-transformer.js +1 -1
  205. package/esm/components/map-label/map-label.d.ts +52 -0
  206. package/esm/components/map-label/map-label.js +1 -1
  207. package/esm/components/map-label/theme.js +1 -1
  208. package/esm/components/map-label/type.js +1 -1
  209. package/esm/components/regression-line/index.js +1 -1
  210. package/esm/components/regression-line/regression-line.js +1 -1
  211. package/esm/components/regression-line/type.js +1 -1
  212. package/esm/components/scatter-regression-line/index.js +1 -1
  213. package/esm/components/scatter-regression-line/type.js +1 -1
  214. package/esm/components/series-break/constant.js +1 -1
  215. package/esm/components/series-break/index.js +1 -1
  216. package/esm/components/series-break/series-break.js +1 -1
  217. package/esm/components/series-break/type.js +1 -1
  218. package/esm/components/series-break/util.js +2 -1
  219. package/esm/components/series-label/constant.js +1 -1
  220. package/esm/components/series-label/index.js +1 -1
  221. package/esm/components/series-label/series-label.js +1 -1
  222. package/esm/components/series-label/type.js +1 -1
  223. package/esm/components/series-label/util.js +1 -1
  224. package/esm/index.d.ts +1 -0
  225. package/esm/index.js +2 -0
  226. package/esm/index.js.map +1 -1
  227. package/package.json +8 -8
@@ -0,0 +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 buildRichContent,\n getLayout,\n getThemeColor,\n omitImageLayoutSpec,\n resolveBlockWidth,\n withAlpha\n} from './common';\n\n// portrait 布局:中轴 rect + 左右交替的 image + image 下方 title/content\nconst PORTRAIT_AXIS_WIDTH = 64;\nconst PORTRAIT_AXIS_PADDING = 50; // 中轴上下两端的留白\nconst PORTRAIT_IMAGE_WIDTH = 180;\nconst PORTRAIT_IMAGE_HEIGHT = 110;\nconst PORTRAIT_IMAGE_GAP_FROM_AXIS = 24; // image 与中轴之间的水平间距\nconst PORTRAIT_SHADOW_OFFSET_X = 36;\nconst PORTRAIT_SHADOW_OFFSET_Y = 20;\nconst PORTRAIT_SHADOW_SCALE = 1.12;\nconst PORTRAIT_TEXT_GAP_FROM_IMAGE = 8;\nconst PORTRAIT_CONTENT_LINES = 3;\nconst PORTRAIT_TITLE_LINE_HEIGHT = 19;\nconst PORTRAIT_CONTENT_LINE_HEIGHT = 18;\nconst PORTRAIT_CONTENT_FONT_SIZE = 12;\nconst PORTRAIT_TITLE_TO_CONTENT_GAP = 4;\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 const firstCy = blocks[0].center.y;\n const lastCy = blocks[blocks.length - 1].center.y;\n const top = Math.min(firstCy, lastCy);\n const bottom = Math.max(firstCy, lastCy);\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 buildPortraitAxisMark = (spec: IStorylineSpec): IExtensionGroupMarkSpec => {\n const themeColor = getThemeColor(spec);\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 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 ]\n };\n};\n\nconst getPortraitMetrics = (spec: IStorylineSpec, blockWidth: number, _blockHeight: number, index: number) => {\n const titleFontSize = Number((spec.title?.style as any)?.fontSize ?? 14);\n const titleLineHeight = Number(\n (spec.title?.style as any)?.lineHeight ?? Math.max(PORTRAIT_TITLE_LINE_HEIGHT, Math.round(titleFontSize * 1.35))\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 contentHeight = PORTRAIT_CONTENT_LINES * contentLineHeight;\n const titleToContentGap = PORTRAIT_TITLE_TO_CONTENT_GAP;\n const textHeight = titleLineHeight + titleToContentGap + contentHeight;\n\n const imageWidth = spec.image?.width ?? PORTRAIT_IMAGE_WIDTH;\n const imageHeight = spec.image?.height ?? PORTRAIT_IMAGE_HEIGHT;\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 + titleLineHeight + 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\nexport const buildPortraitBlockMark = (\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 const titleFontSize = Number((spec.title?.style as any)?.fontSize ?? 14);\n const titleLineHeight = Number(\n (spec.title?.style as any)?.lineHeight ?? Math.max(PORTRAIT_TITLE_LINE_HEIGHT, Math.round(titleFontSize * 1.35))\n );\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);\n };\n const themeColor = getThemeColor(spec);\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 hasImage\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.image,\n cornerRadius: 8,\n repeatX: 'no-repeat',\n repeatY: 'no-repeat',\n imageMode: 'cover',\n imagePosition: 'center'\n }\n } as ICustomMarkSpec<'image'>)\n : null,\n hasImage\n ? ({\n type: 'rect',\n name: `storyline-block-shadow-mask-${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 cornerRadius: 8,\n stroke: false,\n lineWidth: 0,\n fill: {\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 }\n } as ICustomMarkSpec<'rect'>)\n : null,\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 fill: '#ffffff',\n stroke: themeColor,\n lineWidth: 2,\n ...blockStyle\n }\n } as ICustomMarkSpec<'rect'>,\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 cornerRadius: 8,\n repeatX: 'no-repeat',\n repeatY: 'no-repeat',\n imageMode: 'cover',\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 fontSize: titleFontSize,\n lineHeight: titleLineHeight,\n fontWeight: 'bold',\n fill: '#1f2430',\n textAlign: 'left',\n textBaseline: 'top',\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 textType: 'rich',\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: buildRichContent(contentText, spec),\n fontSize: PORTRAIT_CONTENT_FONT_SIZE,\n lineHeight: PORTRAIT_CONTENT_LINE_HEIGHT,\n textAlign: 'left',\n textBaseline: 'top',\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"]}
@@ -0,0 +1,4 @@
1
+ import type { IExtensionGroupMarkSpec } from '@visactor/vchart';
2
+ import type { IStorylineBlock, IStorylineSpec } from '../interface';
3
+ export declare const buildWingArcMark: (spec: IStorylineSpec) => IExtensionGroupMarkSpec | null;
4
+ export declare const buildWingBlockMark: (spec: IStorylineSpec, block: IStorylineBlock, index: number) => IExtensionGroupMarkSpec;
@@ -0,0 +1,210 @@
1
+ import { LayoutZIndex } from "@visactor/vchart";
2
+
3
+ import { buildRichContent, getRegionGeometry, getThemeColor, normalizeLayout, normalizePadding, omitImageLayoutSpec, withAlpha } from "./common";
4
+
5
+ const WING_BLOCK_IMAGE_SIZE = 96, WING_TEXT_GAP_FROM_IMAGE = 14, WING_TITLE_LINE_HEIGHT = 26, WING_TITLE_FONT_SIZE = 20, 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, getWingDirection = spec => {
6
+ var _a;
7
+ return null !== (_a = normalizeLayout(spec.layout).direction) && void 0 !== _a ? _a : "left";
8
+ }, getWingArcGeometry = (spec, ctx) => {
9
+ var _a, _b, _c, _e;
10
+ const {width: width, height: height, startX: startX, startY: startY} = getRegionGeometry(ctx), padding = normalizePadding(null === (_a = spec.block) || void 0 === _a ? void 0 : _a.padding), innerWidth = Math.max(width - padding.left - padding.right, 1), innerHeight = Math.max(height - padding.top - padding.bottom, 1), layoutOpt = normalizeLayout(spec.layout), direction = getWingDirection(spec), defaultStart = "right" === direction ? 110 : -70, defaultEnd = "right" === direction ? 250 : 70, startAngle = null !== (_b = layoutOpt.startAngle) && void 0 !== _b ? _b : defaultStart, endAngle = null !== (_c = layoutOpt.endAngle) && void 0 !== _c ? _c : defaultEnd, ratio = null !== (_e = layoutOpt.radiusRatio) && void 0 !== _e ? _e : .92, ry = innerHeight / 2 * ratio, rx = .6 * innerWidth * ratio;
11
+ return {
12
+ cx: "right" === direction ? startX + padding.left + innerWidth - .1 * rx : startX + padding.left + .1 * rx,
13
+ cy: startY + padding.top + innerHeight / 2,
14
+ rx: rx,
15
+ ry: ry,
16
+ startAngle: startAngle,
17
+ endAngle: endAngle
18
+ };
19
+ }, getWingBlockCenter = (spec, ctx, index) => {
20
+ var _a, _b;
21
+ const arc = getWingArcGeometry(spec, ctx), count = null !== (_b = null === (_a = spec.data) || void 0 === _a ? void 0 : _a.length) && void 0 !== _b ? _b : 0;
22
+ if (count <= 0) return {
23
+ x: arc.cx,
24
+ y: arc.cy
25
+ };
26
+ const t = 1 === count ? .5 : index / (count - 1), angle = (arc.startAngle + (arc.endAngle - arc.startAngle) * t) / 180 * Math.PI;
27
+ return {
28
+ x: arc.cx + Math.cos(angle) * arc.rx,
29
+ y: arc.cy + Math.sin(angle) * arc.ry
30
+ };
31
+ }, isTextOnLeft = (spec, index) => "right" === getWingDirection(spec) ? index % 2 == 1 : index % 2 == 0;
32
+
33
+ export const buildWingArcMark = spec => {
34
+ var _a, _b, _c, _e, _f, _g, _h, _j;
35
+ if (!1 === (null === (_a = spec.line) || void 0 === _a ? void 0 : _a.visible)) return null;
36
+ const themeColor = 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 : 2), .5), endWidth = Math.max(Number(null !== (_g = null !== (_f = lineStyle.endWidth) && void 0 !== _f ? _f : lineStyle.lineWidth) && void 0 !== _g ? _g : 18), startWidth);
37
+ return {
38
+ type: "group",
39
+ name: "storyline-wing-arc",
40
+ zIndex: LayoutZIndex.Mark,
41
+ children: [ {
42
+ type: "path",
43
+ name: "storyline-wing-arc-path",
44
+ interactive: !1,
45
+ style: {
46
+ stroke: !1,
47
+ lineWidth: 0,
48
+ fill: null !== (_j = null !== (_h = lineStyle.fill) && void 0 !== _h ? _h : lineStyle.stroke) && void 0 !== _j ? _j : themeColor,
49
+ opacity: .95,
50
+ path: (_d, ctx) => {
51
+ const arc = getWingArcGeometry(spec, ctx), span = arc.endAngle - arc.startAngle, pts = [];
52
+ for (let i = 0; i <= 96; i++) {
53
+ const t = i / 96, angle = (arc.startAngle + span * t) / 180 * Math.PI, cx = arc.cx + Math.cos(angle) * arc.rx, cy = arc.cy + Math.sin(angle) * arc.ry, nxRaw = Math.cos(angle) / arc.rx, nyRaw = Math.sin(angle) / arc.ry, nLen = Math.hypot(nxRaw, nyRaw) || 1;
54
+ pts.push({
55
+ x: cx,
56
+ y: cy,
57
+ nx: nxRaw / nLen,
58
+ ny: nyRaw / nLen,
59
+ w: startWidth + (endWidth - startWidth) * t
60
+ });
61
+ }
62
+ const segments = [];
63
+ for (let i = 0; i < pts.length; i++) {
64
+ const p = pts[i], x = p.x + p.nx * (p.w / 2), y = p.y + p.ny * (p.w / 2);
65
+ segments.push(`${0 === i ? "M" : "L"} ${x.toFixed(2)} ${y.toFixed(2)}`);
66
+ }
67
+ for (let i = pts.length - 1; i >= 0; i--) {
68
+ const p = pts[i], x = p.x - p.nx * (p.w / 2), y = p.y - p.ny * (p.w / 2);
69
+ segments.push(`L ${x.toFixed(2)} ${y.toFixed(2)}`);
70
+ }
71
+ return segments.push("Z"), segments.join(" ");
72
+ }
73
+ }
74
+ } ]
75
+ };
76
+ };
77
+
78
+ const getWingBlockMetrics = (spec, index) => {
79
+ var _a, _b, _c, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
80
+ const 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 : 20), titleLineHeight = Number(null !== (_g = null === (_f = null === (_e = spec.title) || void 0 === _e ? void 0 : _e.style) || void 0 === _f ? void 0 : _f.lineHeight) && void 0 !== _g ? _g : Math.max(26, Math.round(1.3 * titleFontSize))), contentFontSize = Number(null !== (_k = null === (_j = null === (_h = spec.content) || void 0 === _h ? void 0 : _h.style) || void 0 === _j ? void 0 : _j.fontSize) && void 0 !== _k ? _k : 12), contentLineHeight = Number(null !== (_o = null === (_m = null === (_l = spec.content) || void 0 === _l ? void 0 : _l.style) || void 0 === _m ? void 0 : _m.lineHeight) && void 0 !== _o ? _o : 17), contentHeight = Math.max(110 - titleLineHeight - 4, contentLineHeight), imageWidth = null !== (_q = null === (_p = spec.image) || void 0 === _p ? void 0 : _p.width) && void 0 !== _q ? _q : 96, imageHeight = null !== (_s = null === (_r = spec.image) || void 0 === _r ? void 0 : _r.height) && void 0 !== _s ? _s : 96, imageBox = {
81
+ x: -imageWidth / 2,
82
+ y: -imageHeight / 2,
83
+ width: imageWidth,
84
+ height: imageHeight
85
+ }, onLeft = isTextOnLeft(spec, index), textX = onLeft ? -imageWidth / 2 - 14 - 240 : imageWidth / 2 + 14;
86
+ return {
87
+ onLeft: onLeft,
88
+ titleFontSize: titleFontSize,
89
+ titleLineHeight: titleLineHeight,
90
+ contentFontSize: contentFontSize,
91
+ contentLineHeight: contentLineHeight,
92
+ imageBox: imageBox,
93
+ textBox: {
94
+ x: textX,
95
+ y: -55,
96
+ width: 240,
97
+ height: 110
98
+ },
99
+ contentBox: {
100
+ x: textX,
101
+ y: -55 + titleLineHeight + 4,
102
+ width: 240,
103
+ height: contentHeight
104
+ }
105
+ };
106
+ };
107
+
108
+ export const buildWingBlockMark = (spec, block, index) => {
109
+ var _a, _b, _c, _e;
110
+ const hasImage = !!block.image, contentText = Array.isArray(block.content) ? block.content : block.content ? [ block.content ] : [], themeColor = getThemeColor(spec), metrics = getWingBlockMetrics(spec, index);
111
+ return {
112
+ type: "group",
113
+ id: `storyline-block-${null !== (_a = block.id) && void 0 !== _a ? _a : index}`,
114
+ name: `storyline-block-${index}`,
115
+ zIndex: LayoutZIndex.Mark + 1,
116
+ style: {
117
+ x: (_d, ctx) => getWingBlockCenter(spec, ctx, index).x,
118
+ y: (_d, ctx) => getWingBlockCenter(spec, ctx, index).y
119
+ },
120
+ children: [ {
121
+ type: "symbol",
122
+ name: `storyline-block-image-halo-${index}`,
123
+ interactive: !1,
124
+ style: {
125
+ x: 0,
126
+ y: 0,
127
+ size: Math.max(metrics.imageBox.width, metrics.imageBox.height) + 12,
128
+ symbolType: "circle",
129
+ fill: withAlpha(themeColor, .18),
130
+ stroke: themeColor,
131
+ lineWidth: 1.5
132
+ }
133
+ }, hasImage ? Object.assign(Object.assign({
134
+ type: "image",
135
+ name: `storyline-block-image-${index}`,
136
+ interactive: !1
137
+ }, omitImageLayoutSpec(spec.image)), {
138
+ style: Object.assign({
139
+ x: metrics.imageBox.x,
140
+ y: metrics.imageBox.y,
141
+ width: metrics.imageBox.width,
142
+ height: metrics.imageBox.height,
143
+ image: block.image,
144
+ cornerRadius: Math.min(metrics.imageBox.width, metrics.imageBox.height) / 2,
145
+ repeatX: "no-repeat",
146
+ repeatY: "no-repeat",
147
+ imageMode: "cover",
148
+ imagePosition: "center",
149
+ stroke: "#ffffff",
150
+ lineWidth: 3
151
+ }, null === (_b = spec.image) || void 0 === _b ? void 0 : _b.style)
152
+ }) : {
153
+ type: "rect",
154
+ name: `storyline-block-image-bg-${index}`,
155
+ interactive: !1,
156
+ style: {
157
+ x: metrics.imageBox.x,
158
+ y: metrics.imageBox.y,
159
+ width: metrics.imageBox.width,
160
+ height: metrics.imageBox.height,
161
+ cornerRadius: Math.min(metrics.imageBox.width, metrics.imageBox.height) / 2,
162
+ fill: "#ffffff",
163
+ stroke: themeColor,
164
+ lineWidth: 2
165
+ }
166
+ }, block.title ? Object.assign(Object.assign({
167
+ type: "text",
168
+ name: `storyline-block-title-${index}`,
169
+ interactive: !1,
170
+ zIndex: LayoutZIndex.Mark + 10
171
+ }, spec.title), {
172
+ style: Object.assign({
173
+ x: metrics.onLeft ? metrics.textBox.x + metrics.textBox.width : metrics.textBox.x,
174
+ y: metrics.textBox.y,
175
+ text: block.title,
176
+ maxLineWidth: metrics.textBox.width,
177
+ fontSize: metrics.titleFontSize,
178
+ lineHeight: metrics.titleLineHeight,
179
+ fontWeight: "bold",
180
+ fill: themeColor,
181
+ textAlign: metrics.onLeft ? "right" : "left",
182
+ textBaseline: "top"
183
+ }, null === (_c = spec.title) || void 0 === _c ? void 0 : _c.style)
184
+ }) : null, contentText.length ? Object.assign(Object.assign({
185
+ type: "text",
186
+ name: `storyline-block-content-${index}`,
187
+ interactive: !1,
188
+ zIndex: LayoutZIndex.Mark + 10
189
+ }, spec.content), {
190
+ textType: "rich",
191
+ style: Object.assign({
192
+ x: metrics.onLeft ? metrics.contentBox.x + metrics.contentBox.width : metrics.contentBox.x,
193
+ y: metrics.contentBox.y,
194
+ width: metrics.contentBox.width,
195
+ height: metrics.contentBox.height,
196
+ maxLineWidth: metrics.contentBox.width,
197
+ heightLimit: metrics.contentBox.height,
198
+ text: buildRichContent(contentText, spec),
199
+ fontSize: 12,
200
+ lineHeight: 17,
201
+ textAlign: metrics.onLeft ? "right" : "left",
202
+ textBaseline: "top",
203
+ wordBreak: "break-word",
204
+ ellipsis: "...",
205
+ fill: "#1f2430"
206
+ }, null === (_e = spec.content) || void 0 === _e ? void 0 : _e.style)
207
+ }) : null ].filter(Boolean)
208
+ };
209
+ };
210
+ //# sourceMappingURL=wing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/charts/storyline/layouts/wing.ts"],"names":[],"mappings":"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","file":"wing.js","sourcesContent":["import type { IExtensionGroupMarkSpec } from '@visactor/vchart';\nimport { LayoutZIndex } from '@visactor/vchart';\nimport type { IStorylineBlock, IStorylineSpec, StorylineWingDirection } from '../interface';\nimport {\n type ICustomMarkSpec,\n type LayoutContext,\n type StorylinePoint,\n buildRichContent,\n getRegionGeometry,\n getThemeColor,\n normalizeLayout,\n normalizePadding,\n omitImageLayoutSpec,\n withAlpha\n} from './common';\n\n// wing 布局:参考残奥时间线信息图\n// - 主脉络为椭圆弧的「翅膀」造型,可通过 direction 配置左右朝向\n// - direction: 'left' → 圆心锚在画布左侧,弧凸向右展开(默认)\n// - direction: 'right' → 圆心锚在画布右侧,弧凸向左展开\n// - 圆形 image 嵌在弧线上(中心位于弧线)\n// - title(年份感大字 + 主题色) + content 在 image 一侧水平展开\n// - 左右交替(弧线左侧 / 右侧)让节点错落\nconst WING_BLOCK_IMAGE_SIZE = 96;\nconst WING_TEXT_GAP_FROM_IMAGE = 14;\nconst WING_TITLE_LINE_HEIGHT = 26;\nconst WING_TITLE_FONT_SIZE = 20;\nconst WING_CONTENT_LINE_HEIGHT = 17;\nconst WING_CONTENT_FONT_SIZE = 12;\n// title + content 区域宽度\nconst WING_TEXT_BOX_WIDTH = 240;\n// title + content 区域总高度\nconst WING_TEXT_BOX_HEIGHT = 110;\nconst WING_TITLE_TO_CONTENT_GAP = 4;\n\nconst getWingDirection = (spec: IStorylineSpec): StorylineWingDirection => {\n return normalizeLayout(spec.layout).direction ?? 'left';\n};\n\n/**\n * 计算 wing 弧线的几何参数:\n * - direction='left':圆心位于 inner 左侧,采样区间 -70°→70°(cos>0),弧线点位于圆心右侧;\n * - direction='right':圆心位于 inner 右侧,采样区间 110°→250°(cos<0),弧线点位于圆心左侧。\n */\nconst getWingArcGeometry = (spec: IStorylineSpec, ctx: LayoutContext) => {\n const { width, height, startX, startY } = getRegionGeometry(ctx);\n const padding = normalizePadding(spec.block?.padding);\n const innerWidth = Math.max(width - padding.left - padding.right, 1);\n const innerHeight = Math.max(height - padding.top - padding.bottom, 1);\n const layoutOpt = normalizeLayout(spec.layout);\n const direction = getWingDirection(spec);\n const defaultStart = direction === 'right' ? 110 : -70;\n const defaultEnd = direction === 'right' ? 250 : 70;\n const startAngle = layoutOpt.startAngle ?? defaultStart;\n const endAngle = layoutOpt.endAngle ?? defaultEnd;\n const ratio = layoutOpt.radiusRatio ?? 0.92;\n const ry = (innerHeight / 2) * ratio;\n const rx = innerWidth * 0.6 * ratio;\n // 左翅膀锚画布左侧,右翅膀锚画布右侧\n const cx = direction === 'right' ? startX + padding.left + innerWidth - rx * 0.1 : startX + padding.left + rx * 0.1;\n const cy = startY + padding.top + innerHeight / 2;\n return { cx, cy, rx, ry, startAngle, endAngle };\n};\n\n/**\n * 沿弧采样 block 中心 —— image 的圆心直接在弧线上,与时间线视觉对齐。\n */\nconst getWingBlockCenter = (spec: IStorylineSpec, ctx: LayoutContext, index: number): StorylinePoint => {\n const arc = getWingArcGeometry(spec, ctx);\n const count = spec.data?.length ?? 0;\n if (count <= 0) {\n return { x: arc.cx, y: arc.cy };\n }\n const t = count === 1 ? 0.5 : index / (count - 1);\n const angle = ((arc.startAngle + (arc.endAngle - arc.startAngle) * t) / 180) * Math.PI;\n return {\n x: arc.cx + Math.cos(angle) * arc.rx,\n y: arc.cy + Math.sin(angle) * arc.ry\n };\n};\n\n/**\n * 节点文字侧向:\n * - 左翅膀(弧凸向右):偶数节点的文字排在弧线左侧;\n * - 右翅膀(弧凸向左):偶数节点的文字排在弧线右侧(即镜像)。\n */\nconst isTextOnLeft = (spec: IStorylineSpec, index: number) => {\n const direction = getWingDirection(spec);\n return direction === 'right' ? index % 2 === 1 : index % 2 === 0;\n};\n\n/**\n * 主脉络曲线 mark:贯穿所有 block 的椭圆弧。\n * 用变宽的 filled path 模拟\"丝带\"——起点窄、终点宽,与信息图视觉一致。\n * 默认展示;用户可通过 spec.line.visible = false 关闭。\n */\nexport const buildWingArcMark = (spec: IStorylineSpec): IExtensionGroupMarkSpec | null => {\n if (spec.line?.visible === false) {\n return null;\n }\n const themeColor = getThemeColor(spec);\n const lineStyle = (spec.line?.style ?? {}) as Record<string, unknown>;\n const startWidth = Math.max(Number(lineStyle.startWidth ?? 2), 0.5);\n const endWidth = Math.max(Number(lineStyle.endWidth ?? lineStyle.lineWidth ?? 18), startWidth);\n return {\n type: 'group' as any,\n name: 'storyline-wing-arc',\n zIndex: LayoutZIndex.Mark,\n children: [\n {\n type: 'path',\n name: 'storyline-wing-arc-path',\n interactive: false,\n style: {\n stroke: false,\n lineWidth: 0,\n fill: (lineStyle.fill as string) ?? (lineStyle.stroke as string) ?? themeColor,\n opacity: 0.95,\n path: (_d: unknown, ctx: LayoutContext) => {\n const arc = getWingArcGeometry(spec, ctx);\n const span = arc.endAngle - arc.startAngle;\n const samples = 96;\n const pts: { x: number; y: number; nx: number; ny: number; w: number }[] = [];\n for (let i = 0; i <= samples; i++) {\n const t = i / samples;\n const angle = ((arc.startAngle + span * t) / 180) * Math.PI;\n const cx = arc.cx + Math.cos(angle) * arc.rx;\n const cy = arc.cy + Math.sin(angle) * arc.ry;\n const nxRaw = Math.cos(angle) / arc.rx;\n const nyRaw = Math.sin(angle) / arc.ry;\n const nLen = Math.hypot(nxRaw, nyRaw) || 1;\n pts.push({\n x: cx,\n y: cy,\n nx: nxRaw / nLen,\n ny: nyRaw / nLen,\n w: startWidth + (endWidth - startWidth) * t\n });\n }\n const segments: string[] = [];\n for (let i = 0; i < pts.length; i++) {\n const p = pts[i];\n const x = p.x + p.nx * (p.w / 2);\n const y = p.y + p.ny * (p.w / 2);\n segments.push(`${i === 0 ? 'M' : 'L'} ${x.toFixed(2)} ${y.toFixed(2)}`);\n }\n for (let i = pts.length - 1; i >= 0; i--) {\n const p = pts[i];\n const x = p.x - p.nx * (p.w / 2);\n const y = p.y - p.ny * (p.w / 2);\n segments.push(`L ${x.toFixed(2)} ${y.toFixed(2)}`);\n }\n segments.push('Z');\n return segments.join(' ');\n }\n }\n } as ICustomMarkSpec<'path'>\n ]\n };\n};\n\nconst getWingBlockMetrics = (spec: IStorylineSpec, index: number) => {\n const titleFontSize = Number((spec.title?.style as Record<string, unknown>)?.fontSize ?? WING_TITLE_FONT_SIZE);\n const titleLineHeight = Number(\n (spec.title?.style as Record<string, unknown>)?.lineHeight ??\n Math.max(WING_TITLE_LINE_HEIGHT, Math.round(titleFontSize * 1.3))\n );\n const contentFontSize = Number((spec.content?.style as Record<string, unknown>)?.fontSize ?? WING_CONTENT_FONT_SIZE);\n const contentLineHeight = Number(\n (spec.content?.style as Record<string, unknown>)?.lineHeight ?? WING_CONTENT_LINE_HEIGHT\n );\n const titleToContentGap = WING_TITLE_TO_CONTENT_GAP;\n const textHeight = WING_TEXT_BOX_HEIGHT;\n const contentHeight = Math.max(textHeight - titleLineHeight - titleToContentGap, contentLineHeight);\n\n const imageWidth = spec.image?.width ?? WING_BLOCK_IMAGE_SIZE;\n const imageHeight = spec.image?.height ?? WING_BLOCK_IMAGE_SIZE;\n const imageBox = {\n x: -imageWidth / 2,\n y: -imageHeight / 2,\n width: imageWidth,\n height: imageHeight\n };\n\n const onLeft = isTextOnLeft(spec, index);\n const textWidth = WING_TEXT_BOX_WIDTH;\n const textX = onLeft\n ? -imageWidth / 2 - WING_TEXT_GAP_FROM_IMAGE - textWidth\n : imageWidth / 2 + WING_TEXT_GAP_FROM_IMAGE;\n const textY = -textHeight / 2;\n const textBox = { x: textX, y: textY, width: textWidth, height: textHeight };\n const contentBox = {\n x: textX,\n y: textY + titleLineHeight + titleToContentGap,\n width: textWidth,\n height: contentHeight\n };\n return {\n onLeft,\n titleFontSize,\n titleLineHeight,\n contentFontSize,\n contentLineHeight,\n imageBox,\n textBox,\n contentBox\n };\n};\n\nexport const buildWingBlockMark = (\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 const themeColor = getThemeColor(spec);\n const metrics = getWingBlockMetrics(spec, index);\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) => getWingBlockCenter(spec, ctx, index).x,\n y: (_d: unknown, ctx: LayoutContext) => getWingBlockCenter(spec, ctx, index).y\n },\n children: [\n {\n type: 'symbol',\n name: `storyline-block-image-halo-${index}`,\n interactive: false,\n style: {\n x: 0,\n y: 0,\n size: Math.max(metrics.imageBox.width, metrics.imageBox.height) + 12,\n symbolType: 'circle',\n fill: withAlpha(themeColor, 0.18),\n stroke: themeColor,\n lineWidth: 1.5\n }\n } as ICustomMarkSpec<'symbol'>,\n hasImage\n ? ({\n type: 'image',\n name: `storyline-block-image-${index}`,\n interactive: false,\n ...omitImageLayoutSpec(spec.image),\n style: {\n x: metrics.imageBox.x,\n y: metrics.imageBox.y,\n width: metrics.imageBox.width,\n height: metrics.imageBox.height,\n image: block.image,\n cornerRadius: Math.min(metrics.imageBox.width, metrics.imageBox.height) / 2,\n repeatX: 'no-repeat',\n repeatY: 'no-repeat',\n imageMode: 'cover',\n imagePosition: 'center',\n stroke: '#ffffff',\n lineWidth: 3,\n ...spec.image?.style\n }\n } as ICustomMarkSpec<'image'>)\n : ({\n type: 'rect',\n name: `storyline-block-image-bg-${index}`,\n interactive: false,\n style: {\n x: metrics.imageBox.x,\n y: metrics.imageBox.y,\n width: metrics.imageBox.width,\n height: metrics.imageBox.height,\n cornerRadius: Math.min(metrics.imageBox.width, metrics.imageBox.height) / 2,\n fill: '#ffffff',\n stroke: themeColor,\n lineWidth: 2\n }\n } as ICustomMarkSpec<'rect'>),\n block.title\n ? ({\n type: 'text',\n name: `storyline-block-title-${index}`,\n interactive: false,\n zIndex: LayoutZIndex.Mark + 10,\n ...spec.title,\n style: {\n x: metrics.onLeft ? metrics.textBox.x + metrics.textBox.width : metrics.textBox.x,\n y: metrics.textBox.y,\n text: block.title,\n maxLineWidth: metrics.textBox.width,\n fontSize: metrics.titleFontSize,\n lineHeight: metrics.titleLineHeight,\n fontWeight: 'bold',\n fill: themeColor,\n textAlign: metrics.onLeft ? 'right' : 'left',\n textBaseline: 'top',\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 zIndex: LayoutZIndex.Mark + 10,\n ...spec.content,\n textType: 'rich',\n style: {\n x: metrics.onLeft ? metrics.contentBox.x + metrics.contentBox.width : metrics.contentBox.x,\n y: metrics.contentBox.y,\n width: metrics.contentBox.width,\n height: metrics.contentBox.height,\n maxLineWidth: metrics.contentBox.width,\n heightLimit: metrics.contentBox.height,\n text: buildRichContent(contentText, spec),\n fontSize: WING_CONTENT_FONT_SIZE,\n lineHeight: WING_CONTENT_LINE_HEIGHT,\n textAlign: metrics.onLeft ? 'right' : 'left',\n textBaseline: 'top',\n wordBreak: 'break-word',\n ellipsis: '...',\n fill: '#1f2430',\n ...spec.content?.style\n }\n } as ICustomMarkSpec<'text'>)\n : null\n ].filter(Boolean) as ICustomMarkSpec<any>[]\n };\n};\n"]}
@@ -0,0 +1,4 @@
1
+ import { CommonChartSpecTransformer } from '@visactor/vchart';
2
+ export declare class StorylineChartSpecTransformer extends CommonChartSpecTransformer<any> {
3
+ transformSpec(spec: any): void;
4
+ }
@@ -0,0 +1,66 @@
1
+ import { CommonChartSpecTransformer } from "@visactor/vchart";
2
+
3
+ import { isBowl, isClock, isDome, isLandscape, isPortrait, isWing } from "./layouts/common";
4
+
5
+ import { buildClockArcMark, buildClockBlockMark, buildClockCenterImageMark } from "./layouts/clock";
6
+
7
+ import { buildDefaultBlockMark, buildDefaultLineMark } from "./layouts/default";
8
+
9
+ import { buildLandscapeBlockMark, buildLandscapeConnectingCurve } from "./layouts/landscape";
10
+
11
+ import { buildPortraitAxisMark, buildPortraitBlockMark } from "./layouts/portrait";
12
+
13
+ import { buildDomeArcMark, buildDomeBlockMark, buildDomeCenterImageMark } from "./layouts/dome";
14
+
15
+ import { buildBowlArcMark, buildBowlBlockMark, buildBowlCenterImageMark } from "./layouts/bowl";
16
+
17
+ import { buildWingArcMark, buildWingBlockMark } from "./layouts/wing";
18
+
19
+ export class StorylineChartSpecTransformer extends CommonChartSpecTransformer {
20
+ transformSpec(spec) {
21
+ var _a;
22
+ applyDefaultPadding(spec);
23
+ const storylineSpec = Object.assign(Object.assign({}, spec), {
24
+ data: [ ...null !== (_a = spec.data) && void 0 !== _a ? _a : [] ]
25
+ });
26
+ spec.type = "common", spec.data = [], spec.series = [], spec.axes = [], spec.customMark = buildStorylineMarks(storylineSpec),
27
+ delete spec.layout, delete spec.title, super.transformSpec(spec);
28
+ }
29
+ }
30
+
31
+ const applyDefaultPadding = spec => {
32
+ var _a, _b, _c, _d;
33
+ const SMALL = 20, bowl = isBowl(spec), defaultTop = bowl ? 100 : SMALL, defaultBottom = bowl ? SMALL : 100, p = spec.padding;
34
+ if (null != p) if ("number" != typeof p) if (Array.isArray(p)) {
35
+ const [t, r = SMALL, b, l = SMALL] = p;
36
+ spec.padding = [ null != t ? t : defaultTop, r, null != b ? b : defaultBottom, l ];
37
+ } else "object" == typeof p && (spec.padding = {
38
+ top: null !== (_a = p.top) && void 0 !== _a ? _a : defaultTop,
39
+ right: null !== (_b = p.right) && void 0 !== _b ? _b : SMALL,
40
+ bottom: null !== (_c = p.bottom) && void 0 !== _c ? _c : defaultBottom,
41
+ left: null !== (_d = p.left) && void 0 !== _d ? _d : SMALL
42
+ }); else spec.padding = bowl ? [ Math.max(p, 100), p, p, p ] : [ p, p, Math.max(p, 100), p ]; else spec.padding = [ defaultTop, SMALL, defaultBottom, SMALL ];
43
+ }, buildStorylineMarks = spec => {
44
+ var _a;
45
+ const lineMark = buildLineMark(spec), blockMarks = (null !== (_a = spec.data) && void 0 !== _a ? _a : []).map(((block, index) => buildBlockMark(spec, block, index)));
46
+ if (isLandscape(spec)) return [ ...blockMarks, lineMark ].filter(Boolean);
47
+ if (isPortrait(spec)) return [ lineMark, ...blockMarks ].filter(Boolean);
48
+ if (isDome(spec)) {
49
+ return [ buildDomeCenterImageMark(spec), buildDomeArcMark(spec), ...blockMarks ].filter(Boolean);
50
+ }
51
+ if (isBowl(spec)) {
52
+ return [ buildBowlCenterImageMark(spec), buildBowlArcMark(spec), ...blockMarks ].filter(Boolean);
53
+ }
54
+ if (isClock(spec)) {
55
+ const ringsMark = buildClockArcMark(spec), centerImageMark = buildClockCenterImageMark(spec);
56
+ return [ ringsMark, ...blockMarks, centerImageMark ].filter(Boolean);
57
+ }
58
+ if (isWing(spec)) {
59
+ return [ buildWingArcMark(spec), ...blockMarks ].filter(Boolean);
60
+ }
61
+ return [ lineMark, ...blockMarks ].filter(Boolean);
62
+ }, buildLineMark = spec => {
63
+ var _a, _b, _c;
64
+ return !1 === (null === (_a = spec.line) || void 0 === _a ? void 0 : _a.visible) || (null !== (_c = null === (_b = spec.data) || void 0 === _b ? void 0 : _b.length) && void 0 !== _c ? _c : 0) <= 1 ? null : isLandscape(spec) ? buildLandscapeConnectingCurve(spec) : isPortrait(spec) ? buildPortraitAxisMark(spec) : buildDefaultLineMark(spec);
65
+ }, buildBlockMark = (spec, block, index) => isLandscape(spec) ? buildLandscapeBlockMark(spec, block, index) : isPortrait(spec) ? buildPortraitBlockMark(spec, block, index) : isDome(spec) ? buildDomeBlockMark(spec, block, index) : isBowl(spec) ? buildBowlBlockMark(spec, block, index) : isClock(spec) ? buildClockBlockMark(spec, block, index) : isWing(spec) ? buildWingBlockMark(spec, block, index) : buildDefaultBlockMark(spec, block, index);
66
+ //# sourceMappingURL=storyline-transformer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/charts/storyline/storyline-transformer.ts"],"names":[],"mappings":"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","file":"storyline-transformer.js","sourcesContent":["import { CommonChartSpecTransformer, type IExtensionGroupMarkSpec } from '@visactor/vchart';\nimport type { IStorylineBlock, IStorylineSpec } from './interface';\nimport { isBowl, isClock, isDome, isLandscape, isPortrait, isWing } from './layouts/common';\nimport { buildClockArcMark, buildClockBlockMark, buildClockCenterImageMark } from './layouts/clock';\nimport { buildDefaultBlockMark, buildDefaultLineMark } from './layouts/default';\nimport { buildLandscapeBlockMark, buildLandscapeConnectingCurve } from './layouts/landscape';\nimport { buildPortraitAxisMark, buildPortraitBlockMark } from './layouts/portrait';\nimport { buildDomeArcMark, buildDomeBlockMark, buildDomeCenterImageMark } from './layouts/dome';\nimport { buildBowlArcMark, buildBowlBlockMark, buildBowlCenterImageMark } from './layouts/bowl';\nimport { buildWingArcMark, buildWingBlockMark } from './layouts/wing';\n\nexport class StorylineChartSpecTransformer extends CommonChartSpecTransformer<any> {\n transformSpec(spec: any): void {\n applyDefaultPadding(spec);\n const storylineSpec = {\n ...spec,\n data: [...(spec.data ?? [])]\n } as IStorylineSpec;\n\n spec.type = 'common' as any;\n spec.data = [];\n spec.series = [];\n spec.axes = [];\n spec.customMark = buildStorylineMarks(storylineSpec);\n delete spec.layout;\n delete spec.title;\n super.transformSpec(spec as any);\n }\n}\n\n/**\n * 图表默认 padding:\n * - dome 等大多数布局底部留 100px,给 centerImage / 引导线留呼吸空间;\n * - bowl 是 dome 的上下镜像,centerImage 贴顶,所以默认顶部留 100px、底部 20px;\n * 用户在 spec.padding 中显式指定的值会被保留,仅在缺省时生效。\n */\nconst applyDefaultPadding = (spec: any) => {\n const LARGE = 100;\n const SMALL = 20;\n const bowl = isBowl(spec as IStorylineSpec);\n const defaultTop = bowl ? LARGE : SMALL;\n const defaultBottom = bowl ? SMALL : LARGE;\n const p = spec.padding;\n if (p === undefined || p === null) {\n spec.padding = [defaultTop, SMALL, defaultBottom, SMALL];\n return;\n }\n if (typeof p === 'number') {\n spec.padding = bowl ? [Math.max(p, LARGE), p, p, p] : [p, p, Math.max(p, LARGE), p];\n return;\n }\n if (Array.isArray(p)) {\n const [t, r = SMALL, b, l = SMALL] = p;\n spec.padding = [t ?? defaultTop, r, b ?? defaultBottom, l];\n return;\n }\n if (typeof p === 'object') {\n spec.padding = {\n top: p.top ?? defaultTop,\n right: p.right ?? SMALL,\n bottom: p.bottom ?? defaultBottom,\n left: p.left ?? SMALL\n };\n }\n};\n\nconst buildStorylineMarks = (spec: IStorylineSpec) => {\n const lineMark = buildLineMark(spec);\n const blockMarks = (spec.data ?? []).map((block, index) => buildBlockMark(spec, block, index));\n // landscape:连接曲线绘制在所有 block 之上,避免被 image 遮挡\n if (isLandscape(spec)) {\n return [...blockMarks, lineMark].filter(Boolean) as IExtensionGroupMarkSpec[];\n }\n // portrait:lineMark 是中轴 rect,作为底层背景先绘制\n if (isPortrait(spec)) {\n return [lineMark, ...blockMarks].filter(Boolean) as IExtensionGroupMarkSpec[];\n }\n // dome:先绘制 centerImage(最底层视觉锚点),再绘制贯穿 block 的弧线,最后绘制 block;\n // dome 不绘制 block 之间默认的连接线\n if (isDome(spec)) {\n const centerImageMark = buildDomeCenterImageMark(spec);\n const arcMark = buildDomeArcMark(spec);\n return [centerImageMark, arcMark, ...blockMarks].filter(Boolean) as IExtensionGroupMarkSpec[];\n }\n // bowl:dome 的上下镜像 —— centerImage 贴顶,弧线 + block 在下方\n if (isBowl(spec)) {\n const centerImageMark = buildBowlCenterImageMark(spec);\n const arcMark = buildBowlArcMark(spec);\n return [centerImageMark, arcMark, ...blockMarks].filter(Boolean) as IExtensionGroupMarkSpec[];\n }\n // clock:辐射式信息盘 —— 圆环骨架 + 径向分隔线 → centerImage(盘心)→ blocks(楔形 + 外圈文字)\n if (isClock(spec)) {\n const ringsMark = buildClockArcMark(spec);\n const centerImageMark = buildClockCenterImageMark(spec);\n return [ringsMark, ...blockMarks, centerImageMark].filter(Boolean) as IExtensionGroupMarkSpec[];\n }\n // wing:椭圆弧脉络 + 弧线上的圆形 image + 左右交替排列的 title/content;\n // 通过 layout.direction 控制翅膀朝向('left' | 'right')\n if (isWing(spec)) {\n const arcMark = buildWingArcMark(spec);\n return [arcMark, ...blockMarks].filter(Boolean) as IExtensionGroupMarkSpec[];\n }\n return [lineMark, ...blockMarks].filter(Boolean) as IExtensionGroupMarkSpec[];\n};\n\nconst buildLineMark = (spec: IStorylineSpec): IExtensionGroupMarkSpec | null => {\n if (spec.line?.visible === false || (spec.data?.length ?? 0) <= 1) {\n return null;\n }\n if (isLandscape(spec)) {\n return buildLandscapeConnectingCurve(spec);\n }\n if (isPortrait(spec)) {\n return buildPortraitAxisMark(spec);\n }\n return buildDefaultLineMark(spec);\n};\n\nconst buildBlockMark = (spec: IStorylineSpec, block: IStorylineBlock, index: number): IExtensionGroupMarkSpec => {\n if (isLandscape(spec)) {\n return buildLandscapeBlockMark(spec, block, index);\n }\n if (isPortrait(spec)) {\n return buildPortraitBlockMark(spec, block, index);\n }\n if (isDome(spec)) {\n return buildDomeBlockMark(spec, block, index);\n }\n if (isBowl(spec)) {\n return buildBowlBlockMark(spec, block, index);\n }\n if (isClock(spec)) {\n return buildClockBlockMark(spec, block, index);\n }\n if (isWing(spec)) {\n return buildWingBlockMark(spec, block, index);\n }\n\n return buildDefaultBlockMark(spec, block, index);\n};\n"]}
@@ -0,0 +1,16 @@
1
+ import { BaseChart, VChart } from '@visactor/vchart';
2
+ import type { IStorylineSpec } from './interface';
3
+ import { StorylineChartSpecTransformer } from './storyline-transformer';
4
+ export declare class StorylineChart<T extends IStorylineSpec = IStorylineSpec> extends BaseChart<Omit<T, 'data' | 'title' | 'layout'>> {
5
+ type: string;
6
+ static type: string;
7
+ static readonly view: string;
8
+ _spec: T;
9
+ static readonly transformerConstructor: typeof StorylineChartSpecTransformer;
10
+ readonly transformerConstructor: typeof StorylineChartSpecTransformer;
11
+ init(): void;
12
+ protected isValid(): boolean;
13
+ }
14
+ export declare const registerStorylineChart: (option?: {
15
+ VChart?: typeof VChart;
16
+ }) => void;
@@ -0,0 +1,29 @@
1
+ import { BaseChart, VChart, registerArcMark, registerCommonChart, registerCustomMark, registerGroupMark, registerImageMark, registerLineMark, registerPathMark, registerRectMark, registerTextMark } from "@visactor/vchart";
2
+
3
+ import { StorylineChartSpecTransformer } from "./storyline-transformer";
4
+
5
+ export class StorylineChart extends BaseChart {
6
+ constructor() {
7
+ super(...arguments), this.type = "storyline", this.transformerConstructor = StorylineChartSpecTransformer;
8
+ }
9
+ init() {
10
+ this.isValid() && super.init();
11
+ }
12
+ isValid() {
13
+ var _a, _b;
14
+ const {data: data} = this._spec;
15
+ return !!Array.isArray(data) || (null === (_b = (_a = this._option).onError) || void 0 === _b || _b.call(_a, "Data is required and should be an array for storyline chart"),
16
+ !1);
17
+ }
18
+ }
19
+
20
+ StorylineChart.type = "storyline", StorylineChart.view = "singleDefault", StorylineChart.transformerConstructor = StorylineChartSpecTransformer;
21
+
22
+ export const registerStorylineChart = option => {
23
+ registerCommonChart(), registerCustomMark(), registerGroupMark(), registerRectMark(),
24
+ registerTextMark(), registerImageMark(), registerLineMark(), registerPathMark(),
25
+ registerArcMark();
26
+ const vchartConstructor = (null == option ? void 0 : option.VChart) || VChart;
27
+ vchartConstructor && vchartConstructor.useChart([ StorylineChart ]);
28
+ };
29
+ //# sourceMappingURL=storyline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/charts/storyline/storyline.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,MAAM,EACN,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAExE,MAAM,OAAO,cAA0D,SAAQ,SAE9E;IAFD;;QAGE,SAAI,GAAG,WAAW,CAAC;QAOV,2BAAsB,GAAG,6BAA6B,CAAC;IAiBlE,CAAC;IAfC,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE;YACnB,OAAO;SACR;QACD,KAAK,CAAC,IAAI,EAAE,CAAC;IACf,CAAC;IAES,OAAO;;QACf,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACxB,MAAA,MAAA,IAAI,CAAC,OAAO,EAAC,OAAO,mDAAG,6DAA6D,CAAC,CAAC;YACtF,OAAO,KAAK,CAAC;SACd;QACD,OAAO,IAAI,CAAC;IACd,CAAC;;AAtBM,mBAAI,GAAG,WAAW,CAAC;AACV,mBAAI,GAAW,eAAe,CAAC;AAI/B,qCAAsB,GAAG,6BAA6B,CAAC;AAoBzE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,MAAmC,EAAE,EAAE;IAC5E,mBAAmB,EAAE,CAAC;IACtB,kBAAkB,EAAE,CAAC;IACrB,iBAAiB,EAAE,CAAC;IACpB,gBAAgB,EAAE,CAAC;IACnB,gBAAgB,EAAE,CAAC;IACnB,iBAAiB,EAAE,CAAC;IACpB,gBAAgB,EAAE,CAAC;IACnB,gBAAgB,EAAE,CAAC;IACnB,eAAe,EAAE,CAAC;IAElB,MAAM,iBAAiB,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,KAAI,MAAM,CAAC;IACnD,IAAI,iBAAiB,EAAE;QACrB,iBAAiB,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;KAC9C;AACH,CAAC,CAAC","file":"storyline.js","sourcesContent":["import {\n BaseChart,\n VChart,\n registerArcMark,\n registerCommonChart,\n registerCustomMark,\n registerGroupMark,\n registerImageMark,\n registerLineMark,\n registerPathMark,\n registerRectMark,\n registerTextMark\n} from '@visactor/vchart';\nimport type { IStorylineSpec } from './interface';\nimport { StorylineChartSpecTransformer } from './storyline-transformer';\n\nexport class StorylineChart<T extends IStorylineSpec = IStorylineSpec> extends BaseChart<\n Omit<T, 'data' | 'title' | 'layout'>\n> {\n type = 'storyline';\n static type = 'storyline';\n static readonly view: string = 'singleDefault';\n\n declare _spec: T;\n\n static readonly transformerConstructor = StorylineChartSpecTransformer;\n readonly transformerConstructor = StorylineChartSpecTransformer;\n\n init() {\n if (!this.isValid()) {\n return;\n }\n super.init();\n }\n\n protected isValid() {\n const { data } = this._spec;\n if (!Array.isArray(data)) {\n this._option.onError?.('Data is required and should be an array for storyline chart');\n return false;\n }\n return true;\n }\n}\n\nexport const registerStorylineChart = (option?: { VChart?: typeof VChart }) => {\n registerCommonChart();\n registerCustomMark();\n registerGroupMark();\n registerRectMark();\n registerTextMark();\n registerImageMark();\n registerLineMark();\n registerPathMark();\n registerArcMark();\n\n const vchartConstructor = option?.VChart || VChart;\n if (vchartConstructor) {\n vchartConstructor.useChart([StorylineChart]);\n }\n};\n"]}
@@ -80,4 +80,4 @@ export class BarLinkComponent extends AbstractComponent {
80
80
  export const registerBarLink = () => {
81
81
  Factory.registerGraphicComponent(BAR_LINK, (attrs => new BarLinkComponent(attrs)));
82
82
  };
83
- //# sourceMappingURL=bar-link.js.map
83
+ //# sourceMappingURL=bar-link.js.map
@@ -1,2 +1,2 @@
1
1
  export const BAR_LINK = "barLink";
2
- //# sourceMappingURL=constant.js.map
2
+ //# sourceMappingURL=constant.js.map
@@ -5,4 +5,4 @@ export * from "./type";
5
5
  export { getBarLinkConfig, appendBarLinkConfig } from "./util";
6
6
 
7
7
  export * from "./constant";
8
- //# sourceMappingURL=index.js.map
8
+ //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
1
  export { };
2
- //# sourceMappingURL=type.js.map
2
+ //# sourceMappingURL=type.js.map
@@ -174,4 +174,4 @@ export function appendBarLinkConfig(rawSpec, barLinkSpec) {
174
174
  rawSpec.customMark = array(rawSpec.customMark).filter((obj => obj.componentType !== BAR_LINK)),
175
175
  rawSpec.customMark.push(getBarLinkConfig(barLinkSpec));
176
176
  }
177
- //# sourceMappingURL=util.js.map
177
+ //# sourceMappingURL=util.js.map
@@ -77,4 +77,4 @@ export function appendBarRegressionLineConfig(chartSpec, spec) {
77
77
  }
78
78
  }));
79
79
  }
80
- //# sourceMappingURL=index.js.map
80
+ //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
1
  export { };
2
- //# sourceMappingURL=type.js.map
2
+ //# sourceMappingURL=type.js.map
@@ -70,4 +70,4 @@ ExtensionMarkSyncStatePlugin.pluginType = "chart", ExtensionMarkSyncStatePlugin.
70
70
  export const registerExtensionMarkSyncStatePlugin = () => {
71
71
  registerChartPlugin(ExtensionMarkSyncStatePlugin);
72
72
  };
73
- //# sourceMappingURL=extension-mark-sync-state.js.map
73
+ //# sourceMappingURL=extension-mark-sync-state.js.map
@@ -1,4 +1,4 @@
1
1
  export { ExtensionMarkSyncStatePlugin, registerExtensionMarkSyncStatePlugin } from "./extension-mark-sync-state";
2
2
 
3
3
  export * from "./type";
4
- //# sourceMappingURL=index.js.map
4
+ //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
1
  export { };
2
- //# sourceMappingURL=type.js.map
2
+ //# sourceMappingURL=type.js.map
@@ -72,4 +72,4 @@ export function appendHistogramRegressionLineConfig(chartSpec, spec) {
72
72
  }
73
73
  }));
74
74
  }
75
- //# sourceMappingURL=index.js.map
75
+ //# sourceMappingURL=index.js.map
@@ -1 +1,2 @@
1
- export { };
1
+ export { };
2
+ //# sourceMappingURL=type.js.map
@@ -1,4 +1,4 @@
1
1
  export * from "./map-label";
2
2
 
3
3
  export * from "./type";
4
- //# sourceMappingURL=index.js.map
4
+ //# sourceMappingURL=index.js.map
@@ -140,4 +140,4 @@ export function candidatesByOrient(positions, anchor, rect, offset = 0) {
140
140
  });
141
141
  })), candidates;
142
142
  }
143
- //# sourceMappingURL=layout.js.map
143
+ //# sourceMappingURL=layout.js.map
@@ -7,4 +7,4 @@ export class MapLabelSpecTransformer extends BaseComponentSpecTransformer {
7
7
  return mapLabel;
8
8
  }
9
9
  }
10
- //# sourceMappingURL=map-label-transformer.js.map
10
+ //# sourceMappingURL=map-label-transformer.js.map