@visactor/vchart-extension 2.1.0-alpha.21 → 2.1.0-alpha.22
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.
- package/build/index.js +415 -418
- package/build/index.min.js +2 -2
- package/cjs/charts/storyline/interface.d.ts +2 -2
- package/cjs/charts/storyline/interface.js.map +1 -1
- package/cjs/charts/storyline/layouts/arc.d.ts +1 -1
- package/cjs/charts/storyline/layouts/arc.js +35 -98
- package/cjs/charts/storyline/layouts/arc.js.map +1 -1
- package/cjs/charts/storyline/layouts/clock.d.ts +1 -1
- package/cjs/charts/storyline/layouts/clock.js +32 -30
- package/cjs/charts/storyline/layouts/clock.js.map +1 -1
- package/cjs/charts/storyline/layouts/common.d.ts +53 -1
- package/cjs/charts/storyline/layouts/common.js +180 -23
- package/cjs/charts/storyline/layouts/common.js.map +1 -1
- package/cjs/charts/storyline/layouts/default.js +21 -21
- package/cjs/charts/storyline/layouts/default.js.map +1 -1
- package/cjs/charts/storyline/layouts/ladder.js +21 -20
- package/cjs/charts/storyline/layouts/ladder.js.map +1 -1
- package/cjs/charts/storyline/layouts/landscape.js +20 -21
- package/cjs/charts/storyline/layouts/landscape.js.map +1 -1
- package/cjs/charts/storyline/layouts/portrait.d.ts +1 -1
- package/cjs/charts/storyline/layouts/portrait.js +63 -55
- package/cjs/charts/storyline/layouts/portrait.js.map +1 -1
- package/cjs/charts/storyline/layouts/wing.d.ts +1 -0
- package/cjs/charts/storyline/layouts/wing.js +91 -49
- package/cjs/charts/storyline/layouts/wing.js.map +1 -1
- package/cjs/charts/storyline/storyline-transformer.js +18 -14
- package/cjs/charts/storyline/storyline-transformer.js.map +1 -1
- package/esm/charts/storyline/interface.d.ts +2 -2
- package/esm/charts/storyline/interface.js.map +1 -1
- package/esm/charts/storyline/layouts/arc.d.ts +1 -1
- package/esm/charts/storyline/layouts/arc.js +31 -96
- package/esm/charts/storyline/layouts/arc.js.map +1 -1
- package/esm/charts/storyline/layouts/clock.d.ts +1 -1
- package/esm/charts/storyline/layouts/clock.js +30 -29
- package/esm/charts/storyline/layouts/clock.js.map +1 -1
- package/esm/charts/storyline/layouts/common.d.ts +53 -1
- package/esm/charts/storyline/layouts/common.js +165 -20
- package/esm/charts/storyline/layouts/common.js.map +1 -1
- package/esm/charts/storyline/layouts/default.js +18 -19
- package/esm/charts/storyline/layouts/default.js.map +1 -1
- package/esm/charts/storyline/layouts/ladder.js +17 -18
- package/esm/charts/storyline/layouts/ladder.js.map +1 -1
- package/esm/charts/storyline/layouts/landscape.js +18 -21
- package/esm/charts/storyline/layouts/landscape.js.map +1 -1
- package/esm/charts/storyline/layouts/portrait.d.ts +1 -1
- package/esm/charts/storyline/layouts/portrait.js +60 -57
- package/esm/charts/storyline/layouts/portrait.js.map +1 -1
- package/esm/charts/storyline/layouts/wing.d.ts +1 -0
- package/esm/charts/storyline/layouts/wing.js +86 -49
- package/esm/charts/storyline/layouts/wing.js.map +1 -1
- package/esm/charts/storyline/storyline-transformer.js +20 -18
- package/esm/charts/storyline/storyline-transformer.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/charts/storyline/layouts/arc.ts"],"names":[],"mappings":"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","file":"arc.js","sourcesContent":["import type { IExtensionGroupMarkSpec } from '@visactor/vchart';\nimport { LayoutZIndex } from '@visactor/vchart';\nimport type { IStorylineBlock, IStorylineSpec } from '../interface';\nimport {\n type ICustomMarkSpec,\n type LayoutContext,\n type StorylinePoint,\n buildRichContent,\n getRegionGeometry,\n getThemeColor,\n normalizeLayout,\n omitImageLayoutSpec,\n resolveBlockWidth,\n shouldShowImageBackground,\n withAlpha\n} from './common';\n\n// arc 布局:弧形排列 + centerImage(穹顶 / 碗形二合一)\n// - direction = 'up'(默认):穹顶 —— centerImage 贴底,弧线在 centerImage 上方\n// - direction = 'down':碗形 —— centerImage 贴顶,弧线在 centerImage 下方\n// image 默认为圆形,ARC_BLOCK_IMAGE_SIZE 即圆的直径\nconst ARC_BLOCK_IMAGE_SIZE = 240;\n// 圆形 image 的边框环厚度(圆形描边宽度)\nconst ARC_BLOCK_IMAGE_BORDER = 3;\n// 圆形 image 背景环相对 image 的外扩量(始终渲染一个比 image 略大的圆形 symbol 作为背景环)\nconst ARC_BLOCK_IMAGE_HALO_PADDING = 6;\nconst ARC_TEXT_GAP_FROM_IMAGE = 10;\nconst ARC_TITLE_FONT_SIZE = 32;\nconst ARC_TITLE_LINE_HEIGHT = 34;\nconst ARC_CONTENT_LINE_HEIGHT = 26;\nconst ARC_CONTENT_FONT_SIZE = 20;\n// title + content 区域总高度(默认 240px,溢出由富文本 heightLimit + ellipsis 自动截断)\nconst ARC_TEXT_BOX_HEIGHT = 240;\nconst ARC_TITLE_TO_CONTENT_GAP = 4;\n// 引导线与 title/content 之间的水平间距\nconst ARC_TEXT_PADDING = 20;\n// title/content 区域的最小宽度,确保文字有足够展示空间,不受 image 宽度限制\nconst ARC_TEXT_BOX_MIN_WIDTH = 240;\n// centerImage 边长相对 inner 短边的比例(强制正方形,避免 cover 模式裁切图片)\nconst ARC_CENTER_IMAGE_SIZE_RATIO = 0.55;\n// centerImage 相对 centerSymbol 的比例:image 直径 = symbol 直径 * 这个值(0.8 让 image 略小于 symbol,露出环形背景)\nconst ARC_CENTER_IMAGE_TO_SYMBOL_RATIO = 0.8;\n// 弧线最高/最低点距离 centerImage 顶部/底部的距离\nconst ARC_GAP_FROM_CENTER_IMAGE = 200;\n\nconst isDownArc = (spec: IStorylineSpec) => normalizeLayout(spec.layout).direction === 'down';\n\n/**\n * 计算 arc 布局 centerImage 的 box:水平居中。\n * - up(dome):垂直贴底(位于 inner 区域底部)\n * - down(bowl):垂直贴顶(位于 inner 区域顶部)\n */\nconst getArcCenterImageRect = (spec: IStorylineSpec, ctx: LayoutContext) => {\n const { width, height, startX, startY } = getRegionGeometry(ctx);\n // width/height 已经是 VChart 减去 spec.padding 后的 region 大小\n // 不要再重复减去 padding,直接用 region 几何信息定位\n const innerWidth = Math.max(width, 1);\n const innerHeight = Math.max(height, 1);\n // 取 inner 短边作为基准,使 rect 始终为正方形\n const baseSize = Math.min(innerWidth, innerHeight) * ARC_CENTER_IMAGE_SIZE_RATIO;\n const w = Math.max(spec.centerImage?.width ?? baseSize, 80);\n const h = Math.max(spec.centerImage?.height ?? baseSize, 80);\n const cx = startX + innerWidth / 2;\n const isDown = isDownArc(spec);\n const top = isDown ? startY : startY + innerHeight - h;\n return { x: cx - w / 2, y: top, width: w, height: h };\n};\n\n/**\n * 计算 arc 弧线的几何参数:\n * - cx / rx / startAngle / endAngle 与 layout.ts 中 arcCenters 一致;\n * - cy 与 ry 由两条对齐约束反推,使弧线起/终点 y 与 centerImage 端面对齐,\n * 弧线极值点(顶点 / 底点)距离 centerImage 远端 ARC_GAP_FROM_CENTER_IMAGE。\n *\n * up(dome):startAngle = 200°、endAngle = 340°(弧线在 centerImage 上方)\n * cy + ry * sin(startAngle) = centerImageBottom\n * cy - ry = centerImageTop - GAP\n * → ry = (centerImageHeight + GAP) / (1 + sin(startAngle))\n * cy = centerImageBottom - ry * sin(startAngle)\n *\n * down(bowl):startAngle = 20°、endAngle = 160°(弧线在 centerImage 下方)\n * cy + ry * sin(startAngle) = centerImageTop\n * cy + ry = centerImageBottom + GAP\n * → ry = (GAP + centerImageHeight) / (1 - sin(startAngle))\n * cy = centerImageTop - ry * sin(startAngle)\n */\nconst getArcGeometry = (spec: IStorylineSpec, ctx: LayoutContext) => {\n const { width, startX } = getRegionGeometry(ctx);\n // width 已经是 VChart 减去 spec.padding 后的 region 宽度\n const innerWidth = Math.max(width, 1);\n const blockWidth = resolveBlockWidth(spec, width);\n const layoutOpt = normalizeLayout(spec.layout);\n const isDown = layoutOpt.direction === 'down';\n // 默认弧线起止角与 layout.ts 中一致\n const startAngle = layoutOpt.startAngle ?? (isDown ? 20 : 200);\n const endAngle = layoutOpt.endAngle ?? (isDown ? 160 : 340);\n const ratio = layoutOpt.radiusRatio ?? 0.88;\n const rx = Math.max((innerWidth - blockWidth) / 2, 1) * ratio;\n const centerRect = getArcCenterImageRect(spec, ctx);\n const centerTop = centerRect.y;\n const centerBottom = centerRect.y + centerRect.height;\n const sinStart = Math.sin((startAngle / 180) * Math.PI);\n let cy: number;\n let ry: number;\n if (isDown) {\n // bowl:sinStart 接近 1 时 ry → ∞;这里限制下界以防 startAngle 配置异常\n const denom = Math.max(1 - sinStart, 0.05);\n ry = (centerRect.height + ARC_GAP_FROM_CENTER_IMAGE) / denom;\n cy = centerTop - ry * sinStart;\n } else {\n // dome:sinStart 接近 -1 时 ry → ∞\n const denom = Math.max(1 + sinStart, 0.05);\n ry = (centerRect.height + ARC_GAP_FROM_CENTER_IMAGE) / denom;\n cy = centerBottom - ry * sinStart;\n }\n return {\n cx: startX + innerWidth / 2,\n cy,\n rx,\n ry,\n startAngle,\n endAngle,\n centerTop,\n centerBottom\n };\n};\n\n/**\n * 在 arc 弧线上按 index 采样 block 中心,与 arc 完全同步。\n * 同时让 block 沿弧线径向向外偏移 imageHeight/2,\n * 使 image 内边贴在弧线上,image + text 整体位于弧线外侧。\n */\nconst getArcBlockCenter = (spec: IStorylineSpec, ctx: LayoutContext, index: number): StorylinePoint => {\n const arc = getArcGeometry(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 const px = arc.cx + Math.cos(angle) * arc.rx;\n const py = arc.cy + Math.sin(angle) * arc.ry;\n // 椭圆在 (px,py) 处的外法向量 ∝ (cos(angle)/rx, sin(angle)/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 const nx = nxRaw / nLen;\n const ny = nyRaw / nLen;\n const imageHeight = spec.image?.height ?? ARC_BLOCK_IMAGE_SIZE;\n const offset = imageHeight / 2;\n return { x: px + nx * offset, y: py + ny * offset };\n};\n\n/**\n * 贯穿所有 block 的弧线 mark(path 通过沿椭圆采样实现,与 arc block 的弧形布局完全重合)\n *\n * 默认不展示,仅当用户在 spec.line.visible 显式置为 true 时才渲染。\n */\nexport const buildArcMark = (spec: IStorylineSpec): IExtensionGroupMarkSpec | null => {\n if (spec.line?.visible !== true) {\n return null;\n }\n const themeColor = getThemeColor(spec);\n return {\n type: 'group' as any,\n name: 'storyline-arc',\n zIndex: LayoutZIndex.Mark,\n children: [\n {\n type: 'path',\n name: 'storyline-arc-path',\n interactive: false,\n style: {\n stroke: themeColor,\n lineWidth: 2,\n lineCap: 'round',\n fill: 'transparent',\n fillOpacity: 0,\n path: (_d: unknown, ctx: LayoutContext) => {\n const arc = getArcGeometry(spec, ctx);\n const span = arc.endAngle - arc.startAngle;\n const samples = 64;\n const segments: string[] = [];\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 x = arc.cx + Math.cos(angle) * arc.rx;\n const y = arc.cy + Math.sin(angle) * arc.ry;\n segments.push(`${i === 0 ? 'M' : 'L'} ${x.toFixed(2)} ${y.toFixed(2)}`);\n }\n return segments.join(' ');\n }\n }\n } as ICustomMarkSpec<'path'>\n ]\n };\n};\n\nexport const buildArcCenterImageMark = (spec: IStorylineSpec): IExtensionGroupMarkSpec | null => {\n const visible = spec.centerImage?.visible !== false;\n if (!visible) {\n return null;\n }\n const themeColor = getThemeColor(spec);\n const hasImage = !!spec.centerImage?.image;\n // 主题色生成的线性渐变(顶部偏淡 → 底部主题色),作为 centerImage 位置的 symbol 填充\n const symbolGradient = {\n gradient: 'linear',\n x0: 0.5,\n y0: 0,\n x1: 0.5,\n y1: 1,\n stops: [\n { offset: 0, color: withAlpha(themeColor, 0.15) },\n { offset: 1, color: themeColor }\n ]\n };\n return {\n type: 'group' as any,\n name: 'storyline-arc-center',\n zIndex: LayoutZIndex.Mark,\n children: [\n // centerImage 底层:圆形 symbol(直径 = imageRect 的边长,保证视觉上是真正的圆)\n // - 有图时:浅色渐变底,仅作细微的底色衬托\n // - 无图时:纯白色圆形占位,保持视觉上的圆形轮廓\n {\n type: 'symbol',\n name: 'storyline-arc-center-symbol',\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => {\n const r = getArcCenterImageRect(spec, ctx);\n return r.x + r.width / 2;\n },\n y: (_d: unknown, ctx: LayoutContext) => {\n const r = getArcCenterImageRect(spec, ctx);\n return r.y + r.height / 2;\n },\n size: (_d: unknown, ctx: LayoutContext) => {\n const r = getArcCenterImageRect(spec, ctx);\n return Math.max(r.width, r.height);\n },\n symbolType: 'circle',\n fill: hasImage ? symbolGradient : '#ffffff',\n stroke: themeColor,\n lineWidth: 2\n }\n } as ICustomMarkSpec<'symbol'>,\n hasImage\n ? ({\n type: 'image',\n name: 'storyline-arc-center-image',\n interactive: false,\n ...spec.centerImage,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => {\n const r = getArcCenterImageRect(spec, ctx);\n const userWidth = (spec.centerImage?.style as { width?: number } | undefined)?.width;\n const w =\n typeof userWidth === 'number'\n ? userWidth\n : Math.max(r.width, r.height) * ARC_CENTER_IMAGE_TO_SYMBOL_RATIO;\n return r.x + (r.width - w) / 2;\n },\n y: (_d: unknown, ctx: LayoutContext) => {\n const r = getArcCenterImageRect(spec, ctx);\n const userHeight = (spec.centerImage?.style as { height?: number } | undefined)?.height;\n const h =\n typeof userHeight === 'number'\n ? userHeight\n : Math.max(r.width, r.height) * ARC_CENTER_IMAGE_TO_SYMBOL_RATIO;\n return r.y + (r.height - h) / 2;\n },\n width: (_d: unknown, ctx: LayoutContext) => {\n const r = getArcCenterImageRect(spec, ctx);\n const userWidth = (spec.centerImage?.style as { width?: number } | undefined)?.width;\n return typeof userWidth === 'number'\n ? userWidth\n : Math.max(r.width, r.height) * ARC_CENTER_IMAGE_TO_SYMBOL_RATIO;\n },\n height: (_d: unknown, ctx: LayoutContext) => {\n const r = getArcCenterImageRect(spec, ctx);\n const userHeight = (spec.centerImage?.style as { height?: number } | undefined)?.height;\n return typeof userHeight === 'number'\n ? userHeight\n : Math.max(r.width, r.height) * ARC_CENTER_IMAGE_TO_SYMBOL_RATIO;\n },\n cornerRadius: (_d: unknown, ctx: LayoutContext) => {\n const r = getArcCenterImageRect(spec, ctx);\n const userWidth = (spec.centerImage?.style as { width?: number } | undefined)?.width;\n const userHeight = (spec.centerImage?.style as { height?: number } | undefined)?.height;\n const w =\n typeof userWidth === 'number'\n ? userWidth\n : Math.max(r.width, r.height) * ARC_CENTER_IMAGE_TO_SYMBOL_RATIO;\n const h =\n typeof userHeight === 'number'\n ? userHeight\n : Math.max(r.width, r.height) * ARC_CENTER_IMAGE_TO_SYMBOL_RATIO;\n return Math.max(w, h) / 2;\n },\n image: spec.centerImage?.image,\n repeatX: 'no-repeat',\n repeatY: 'no-repeat',\n imageMode: 'cover',\n imagePosition: 'center',\n // 默认锚点设为 image 中心,让 scaleX/scaleY 从中心缩放\n anchor: (_d: unknown, ctx: LayoutContext) => {\n const r = getArcCenterImageRect(spec, ctx);\n return [r.x + r.width / 2, r.y + r.height / 2];\n },\n ...spec.centerImage?.style\n }\n } as ICustomMarkSpec<'image'>)\n : null\n ].filter(Boolean) as ICustomMarkSpec<any>[]\n };\n};\n\nconst getArcBlockMetrics = (spec: IStorylineSpec, index: number = 0) => {\n const titleFontSize = Number((spec.title?.style as any)?.fontSize ?? ARC_TITLE_FONT_SIZE);\n const titleLineHeight = Number(\n (spec.title?.style as any)?.lineHeight ?? Math.max(ARC_TITLE_LINE_HEIGHT, Math.round(titleFontSize * 1.35))\n );\n const contentFontSize = Number((spec.content?.style as any)?.fontSize ?? ARC_CONTENT_FONT_SIZE);\n const contentLineHeight = Number((spec.content?.style as any)?.lineHeight ?? ARC_CONTENT_LINE_HEIGHT);\n const titleToContentGap = ARC_TITLE_TO_CONTENT_GAP;\n // text 区域总高度固定为 ARC_TEXT_BOX_HEIGHT,content 占除 title 与间距外的全部高度\n const textHeight = ARC_TEXT_BOX_HEIGHT;\n const contentHeight = Math.max(textHeight - titleLineHeight - titleToContentGap, contentLineHeight);\n\n // 强制 image 为正方形(直径),保证圆形裁切有效\n const imageDiameter = Math.max(spec.image?.width ?? ARC_BLOCK_IMAGE_SIZE, spec.image?.height ?? ARC_BLOCK_IMAGE_SIZE);\n const imageWidth = imageDiameter;\n const imageHeight = imageDiameter;\n\n const isDown = isDownArc(spec);\n\n // content 默认宽度 = 图表宽度 / (block 数量 + 1),让内容沿弧线均匀分布;\n // 用户可通过 spec.block?.width 覆盖;同时保留一个下限避免极端情况下不可见。\n const count = Math.max(spec.data?.length ?? 0, 1);\n const canvasWidth = Number((spec.width as number | undefined) ?? imageWidth * count);\n const defaultTextWidth = Math.round(canvasWidth / (count + 1));\n const textBoxWidth = Math.max(\n Number((spec.block as { width?: number } | undefined)?.width ?? defaultTextWidth),\n ARC_TEXT_BOX_MIN_WIDTH\n );\n\n // 前 1/2 为左侧(奇数 count 时中间块也算左侧),右侧为后 1/2;\n // 左侧 title/content 右对齐(贴引导线),右侧 title/content 左对齐(贴引导线)\n const isLeftSide = index < count / 2;\n const textAlign: 'left' | 'right' = isLeftSide ? 'right' : 'left';\n\n // image 位于 block 中心(x=0)\n const imageBox = {\n x: -imageWidth / 2,\n y: -imageHeight / 2,\n width: imageWidth,\n height: imageHeight\n };\n // 左侧:text 右对齐,text 右边缘与引导线(x=0)保持 ARC_TEXT_PADDING 距离\n // 右侧:text 左对齐,text 左边缘与引导线(x=0)保持 ARC_TEXT_PADDING 距离\n // 引导线 rect 固定 center 在 x=0([-1, 1])\n const textBoxX = isLeftSide ? -ARC_TEXT_PADDING : ARC_TEXT_PADDING;\n const textBox = {\n x: textBoxX,\n y: isDown ? imageBox.y + imageHeight + ARC_TEXT_GAP_FROM_IMAGE : imageBox.y - ARC_TEXT_GAP_FROM_IMAGE - textHeight,\n width: textBoxWidth,\n height: textHeight\n };\n const contentBox = {\n x: textBox.x,\n y: textBox.y + titleLineHeight + titleToContentGap,\n width: textBox.width,\n height: contentHeight\n };\n return {\n titleFontSize,\n titleLineHeight,\n contentFontSize,\n contentLineHeight,\n imageBox,\n textBox,\n contentBox,\n isDown,\n textAlign\n };\n};\n\nexport const buildArcBlockMark = (\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 = getArcBlockMetrics(spec, index);\n\n // 引导线 rect:从 image 圆心(group x=0)垂直连接到 text 近端边缘\n // - up(dome):从 image 顶部(imageBox.y)向上到 textBox 顶部(textBox.y)\n // - down(bowl):从 image 底部(imageBox.y + imageBox.height)向下到 textBox 底部(textBox.y + textBox.height)\n const connectorY = metrics.isDown ? metrics.imageBox.y + metrics.imageBox.height : metrics.textBox.y;\n const connectorHeight = metrics.isDown\n ? Math.max(metrics.textBox.y + metrics.textBox.height - (metrics.imageBox.y + metrics.imageBox.height), 0)\n : Math.max(metrics.imageBox.y - metrics.textBox.y, 0);\n // 引导线宽度固定为 2,center 对齐 x=0\n const connectorX = -1;\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) => getArcBlockCenter(spec, ctx, index).x,\n y: (_d: unknown, ctx: LayoutContext) => getArcBlockCenter(spec, ctx, index).y\n },\n children: [\n // title / content 与 image 之间的垂直引导线(zIndex 最低,作为装饰)\n {\n type: 'rect',\n name: `storyline-block-connector-${index}`,\n interactive: false,\n zIndex: LayoutZIndex.Mark + 2,\n style: {\n x: connectorX,\n y: connectorY,\n width: 2,\n height: connectorHeight,\n fill: themeColor,\n fillOpacity: 0.6\n }\n } as ICustomMarkSpec<'rect'>,\n hasImage\n ? ({\n type: 'image',\n name: `storyline-block-image-${index}`,\n interactive: false,\n zIndex: LayoutZIndex.Mark + 3,\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 cornerRadius: Math.min(metrics.imageBox.width, metrics.imageBox.height) / 2,\n image: block.image,\n repeatX: 'no-repeat',\n repeatY: 'no-repeat',\n imageMode: 'cover',\n imagePosition: 'center',\n ...spec.image?.style\n }\n } as ICustomMarkSpec<'image'>)\n : ({\n type: 'symbol',\n name: `storyline-block-image-bg-${index}`,\n interactive: false,\n zIndex: LayoutZIndex.Mark + 3,\n style: {\n x: 0,\n y: 0,\n size: Math.min(metrics.imageBox.width, metrics.imageBox.height),\n symbolType: 'circle',\n fill: '#ffffff',\n stroke: themeColor,\n lineWidth: 2\n }\n } as ICustomMarkSpec<'symbol'>),\n // 圆形 image 的外层装饰环\n shouldShowImageBackground(spec)\n ? ({\n type: 'symbol',\n name: `storyline-block-image-halo-${index}`,\n interactive: false,\n zIndex: LayoutZIndex.Mark + 3,\n style: {\n x: 0,\n y: 0,\n size: Math.min(metrics.imageBox.width, metrics.imageBox.height) + ARC_BLOCK_IMAGE_HALO_PADDING * 2,\n symbolType: 'circle',\n fill: 'transparent',\n stroke: themeColor,\n lineWidth: ARC_BLOCK_IMAGE_BORDER\n }\n } as ICustomMarkSpec<'symbol'>)\n : null,\n block.title\n ? ({\n type: 'text',\n name: `storyline-block-title-${index}`,\n interactive: false,\n zIndex: LayoutZIndex.Mark + 5,\n ...spec.title,\n style: {\n x: 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: '#1f2430',\n stroke: '#fff',\n lineWidth: 5,\n lineJoin: 'round',\n textAlign: metrics.textAlign,\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 + 4,\n ...spec.content,\n textType: 'rich',\n style: {\n x: 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: metrics.contentFontSize,\n lineHeight: metrics.contentLineHeight,\n fill: '#596173',\n align: metrics.textAlign\n }),\n textAlign: metrics.textAlign,\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/charts/storyline/layouts/arc.ts"],"names":[],"mappings":"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","file":"arc.js","sourcesContent":["import type { IExtensionGroupMarkSpec } from '@visactor/vchart';\nimport { LayoutZIndex } from '@visactor/vchart';\nimport type { IStorylineBlock, IStorylineSpec } from '../interface';\nimport {\n type ICustomMarkSpec,\n type LayoutContext,\n type StorylinePoint,\n buildRichContent,\n getImageBackgroundStyle,\n getRegionGeometry,\n getThemeColor,\n normalizeLayout,\n omitImageLayoutSpec,\n resolveAdaptiveLineHeight,\n resolveBlockWidth,\n resolveTitleFontSize,\n shouldShowImageBackground,\n withAlpha\n} from './common';\n\n// arc 布局:弧形排列 + titleImage(穹顶 / 碗形二合一)\n// - direction = 'up'(默认):穹顶 —— titleImage 贴底,弧线在 titleImage 上方\n// - direction = 'down':碗形 —— titleImage 贴顶,弧线在 titleImage 下方\n// image 默认为圆形,ARC_BLOCK_IMAGE_SIZE 即圆的直径\nconst ARC_BLOCK_IMAGE_SIZE = 240;\n// 圆形 image 的边框环厚度(圆形描边宽度)\nconst ARC_BLOCK_IMAGE_BORDER = 3;\n// 圆形 image 背景环相对 image 的外扩量(始终渲染一个比 image 略大的圆形 symbol 作为背景环)\nconst ARC_BLOCK_IMAGE_HALO_PADDING = 6;\nconst ARC_TEXT_GAP_FROM_IMAGE = 10;\nconst ARC_TITLE_FONT_SIZE = 32;\nconst ARC_TITLE_LINE_HEIGHT = 34;\nconst ARC_CONTENT_LINE_HEIGHT = 26;\nconst ARC_CONTENT_FONT_SIZE = 20;\n// title + content 区域总高度(默认 240px,溢出由富文本 heightLimit + ellipsis 自动截断)\nconst ARC_TEXT_BOX_HEIGHT = 240;\nconst ARC_TITLE_TO_CONTENT_GAP = 4;\n// 引导线与 title/content 之间的水平间距\nconst ARC_TEXT_PADDING = 20;\n// title/content 区域的最小宽度,确保文字有足够展示空间,不受 image 宽度限制\nconst ARC_TEXT_BOX_MIN_WIDTH = 240;\n// titleImage 默认尺寸\nconst ARC_TITLE_IMAGE_WIDTH_RATIO = 0.68;\nconst ARC_TITLE_IMAGE_MAX_WIDTH = 900;\nconst ARC_TITLE_IMAGE_HEIGHT_RATIO = 0.34;\n// 弧线最高/最低点距离 titleImage 顶部/底部的距离\nconst ARC_GAP_FROM_TITLE_IMAGE = 200;\n\nconst isDownArc = (spec: IStorylineSpec) => normalizeLayout(spec.layout).direction === 'down';\n\n/**\n * 计算 arc 布局 titleImage 的 box:水平居中。\n * - up(dome):垂直贴底(位于 inner 区域底部)\n * - down(bowl):垂直贴顶(位于 inner 区域顶部)\n */\nconst getArcTitleImageRect = (spec: IStorylineSpec, ctx: LayoutContext) => {\n const { width, height, startX, startY } = getRegionGeometry(ctx);\n const innerWidth = Math.max(width, 1);\n const innerHeight = Math.max(height, 1);\n const baseWidth = Math.min(innerWidth * ARC_TITLE_IMAGE_WIDTH_RATIO, ARC_TITLE_IMAGE_MAX_WIDTH);\n const w = Math.max(spec.titleImage?.width ?? baseWidth, 80);\n const h = Math.max(spec.titleImage?.height ?? w * ARC_TITLE_IMAGE_HEIGHT_RATIO, 40);\n const cx = startX + innerWidth / 2;\n const isDown = isDownArc(spec);\n const top = isDown ? startY : startY + innerHeight - h;\n return { x: cx - w / 2, y: top, width: w, height: h };\n};\n\n/**\n * 计算 arc 弧线的几何参数:\n * - cx / rx / startAngle / endAngle 与 layout.ts 中 arcCenters 一致;\n * - cy 与 ry 由两条对齐约束反推,使弧线起/终点 y 与 titleImage 端面对齐,\n * 弧线极值点(顶点 / 底点)距离 titleImage 远端 ARC_GAP_FROM_TITLE_IMAGE。\n *\n * up(dome):startAngle = 200°、endAngle = 340°(弧线在 titleImage 上方)\n * cy + ry * sin(startAngle) = titleImageBottom\n * cy - ry = titleImageTop - GAP\n * → ry = (titleImageHeight + GAP) / (1 + sin(startAngle))\n * cy = titleImageBottom - ry * sin(startAngle)\n *\n * down(bowl):startAngle = 20°、endAngle = 160°(弧线在 titleImage 下方)\n * cy + ry * sin(startAngle) = titleImageTop\n * cy + ry = titleImageBottom + GAP\n * → ry = (GAP + titleImageHeight) / (1 - sin(startAngle))\n * cy = titleImageTop - ry * sin(startAngle)\n */\nconst getArcGeometry = (spec: IStorylineSpec, ctx: LayoutContext) => {\n const { width, startX } = getRegionGeometry(ctx);\n // width 已经是 VChart 减去 spec.padding 后的 region 宽度\n const innerWidth = Math.max(width, 1);\n const blockWidth = resolveBlockWidth(spec, width);\n const layoutOpt = normalizeLayout(spec.layout);\n const isDown = layoutOpt.direction === 'down';\n // 默认弧线起止角与 layout.ts 中一致\n const startAngle = layoutOpt.startAngle ?? (isDown ? 20 : 200);\n const endAngle = layoutOpt.endAngle ?? (isDown ? 160 : 340);\n const ratio = layoutOpt.radiusRatio ?? 0.88;\n const rx = Math.max((innerWidth - blockWidth) / 2, 1) * ratio;\n const titleImageRect = getArcTitleImageRect(spec, ctx);\n const centerTop = titleImageRect.y;\n const centerBottom = titleImageRect.y + titleImageRect.height;\n const sinStart = Math.sin((startAngle / 180) * Math.PI);\n let cy: number;\n let ry: number;\n if (isDown) {\n // bowl:sinStart 接近 1 时 ry → ∞;这里限制下界以防 startAngle 配置异常\n const denom = Math.max(1 - sinStart, 0.05);\n ry = (titleImageRect.height + ARC_GAP_FROM_TITLE_IMAGE) / denom;\n cy = centerTop - ry * sinStart;\n } else {\n // dome:sinStart 接近 -1 时 ry → ∞\n const denom = Math.max(1 + sinStart, 0.05);\n ry = (titleImageRect.height + ARC_GAP_FROM_TITLE_IMAGE) / denom;\n cy = centerBottom - ry * sinStart;\n }\n return {\n cx: startX + innerWidth / 2,\n cy,\n rx,\n ry,\n startAngle,\n endAngle,\n centerTop,\n centerBottom\n };\n};\n\n/**\n * 在 arc 弧线上按 index 采样 block 中心,与 arc 完全同步。\n * 同时让 block 沿弧线径向向外偏移 imageHeight/2,\n * 使 image 内边贴在弧线上,image + text 整体位于弧线外侧。\n */\nconst getArcBlockCenter = (spec: IStorylineSpec, ctx: LayoutContext, index: number): StorylinePoint => {\n const arc = getArcGeometry(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 const px = arc.cx + Math.cos(angle) * arc.rx;\n const py = arc.cy + Math.sin(angle) * arc.ry;\n // 椭圆在 (px,py) 处的外法向量 ∝ (cos(angle)/rx, sin(angle)/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 const nx = nxRaw / nLen;\n const ny = nyRaw / nLen;\n const imageHeight = spec.image?.height ?? ARC_BLOCK_IMAGE_SIZE;\n const offset = imageHeight / 2;\n return { x: px + nx * offset, y: py + ny * offset };\n};\n\n/**\n * 贯穿所有 block 的弧线 mark(path 通过沿椭圆采样实现,与 arc block 的弧形布局完全重合)\n *\n * 默认不展示,仅当用户在 spec.line.visible 显式置为 true 时才渲染。\n */\nexport const buildArcMark = (spec: IStorylineSpec): IExtensionGroupMarkSpec | null => {\n if (spec.line?.visible !== true) {\n return null;\n }\n const themeColor = getThemeColor(spec);\n return {\n type: 'group' as any,\n name: 'storyline-arc',\n zIndex: LayoutZIndex.Mark,\n children: [\n {\n type: 'path',\n name: 'storyline-arc-path',\n interactive: false,\n style: {\n stroke: themeColor,\n lineWidth: 2,\n lineCap: 'round',\n fill: 'transparent',\n fillOpacity: 0,\n path: (_d: unknown, ctx: LayoutContext) => {\n const arc = getArcGeometry(spec, ctx);\n const span = arc.endAngle - arc.startAngle;\n const samples = 64;\n const segments: string[] = [];\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 x = arc.cx + Math.cos(angle) * arc.rx;\n const y = arc.cy + Math.sin(angle) * arc.ry;\n segments.push(`${i === 0 ? 'M' : 'L'} ${x.toFixed(2)} ${y.toFixed(2)}`);\n }\n return segments.join(' ');\n }\n }\n } as ICustomMarkSpec<'path'>\n ]\n };\n};\n\nexport const buildArcTitleImageMark = (spec: IStorylineSpec): IExtensionGroupMarkSpec | null => {\n if (!spec.titleImage?.image || spec.titleImage.visible === false) {\n return null;\n }\n return {\n type: 'group' as any,\n name: 'storyline-arc-title-image',\n zIndex: LayoutZIndex.Mark + 6,\n children: [\n {\n type: 'image',\n name: 'storyline-arc-title-image-node',\n interactive: false,\n ...spec.titleImage,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => {\n return getArcTitleImageRect(spec, ctx).x;\n },\n y: (_d: unknown, ctx: LayoutContext) => {\n return getArcTitleImageRect(spec, ctx).y;\n },\n width: (_d: unknown, ctx: LayoutContext) => {\n return getArcTitleImageRect(spec, ctx).width;\n },\n height: (_d: unknown, ctx: LayoutContext) => {\n return getArcTitleImageRect(spec, ctx).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\nconst getArcBlockMetrics = (spec: IStorylineSpec, index: number = 0) => {\n const contentFontSize = Number((spec.content?.style as any)?.fontSize ?? ARC_CONTENT_FONT_SIZE);\n const contentLineHeight = Number((spec.content?.style as any)?.lineHeight ?? ARC_CONTENT_LINE_HEIGHT);\n const titleToContentGap = ARC_TITLE_TO_CONTENT_GAP;\n\n // 强制 image 为正方形(直径),保证圆形裁切有效\n const imageDiameter = Math.max(spec.image?.width ?? ARC_BLOCK_IMAGE_SIZE, spec.image?.height ?? ARC_BLOCK_IMAGE_SIZE);\n const imageWidth = imageDiameter;\n const imageHeight = imageDiameter;\n\n const isDown = isDownArc(spec);\n\n // content 默认宽度 = 图表宽度 / (block 数量 + 1),让内容沿弧线均匀分布;\n // 用户可通过 spec.block?.width 覆盖;同时保留一个下限避免极端情况下不可见。\n const count = Math.max(spec.data?.length ?? 0, 1);\n const canvasWidth = Number((spec.width as number | undefined) ?? imageWidth * count);\n const defaultTextWidth = Math.round(canvasWidth / (count + 1));\n const textBoxWidth = Math.max(\n Number((spec.block as { width?: number } | undefined)?.width ?? defaultTextWidth),\n ARC_TEXT_BOX_MIN_WIDTH\n );\n const titleFontSize = resolveTitleFontSize(\n spec,\n undefined,\n spec.data?.[index]?.title,\n textBoxWidth,\n ARC_TITLE_FONT_SIZE,\n [8, 40]\n );\n const titleLineHeight = resolveAdaptiveLineHeight(titleFontSize, spec.title?.style as any, ARC_TITLE_LINE_HEIGHT);\n // text 区域总高度固定为 ARC_TEXT_BOX_HEIGHT,content 占除 title 与间距外的全部高度\n const textHeight = ARC_TEXT_BOX_HEIGHT;\n const contentHeight = Math.max(textHeight - titleLineHeight - titleToContentGap, contentLineHeight);\n\n // 前 1/2 为左侧(奇数 count 时中间块也算左侧),右侧为后 1/2;\n // 左侧 title/content 右对齐(贴引导线),右侧 title/content 左对齐(贴引导线)\n const isLeftSide = index < count / 2;\n const textAlign: 'left' | 'right' = isLeftSide ? 'right' : 'left';\n\n // image 位于 block 中心(x=0)\n const imageBox = {\n x: -imageWidth / 2,\n y: -imageHeight / 2,\n width: imageWidth,\n height: imageHeight\n };\n // 左侧:text 右对齐,text 右边缘与引导线(x=0)保持 ARC_TEXT_PADDING 距离\n // 右侧:text 左对齐,text 左边缘与引导线(x=0)保持 ARC_TEXT_PADDING 距离\n // 引导线 rect 固定 center 在 x=0([-1, 1])\n const textBoxX = isLeftSide ? -ARC_TEXT_PADDING : ARC_TEXT_PADDING;\n const textBox = {\n x: textBoxX,\n y: isDown ? imageBox.y + imageHeight + ARC_TEXT_GAP_FROM_IMAGE : imageBox.y - ARC_TEXT_GAP_FROM_IMAGE - textHeight,\n width: textBoxWidth,\n height: textHeight\n };\n const contentBox = {\n x: textBox.x,\n y: textBox.y + titleLineHeight + titleToContentGap,\n width: textBox.width,\n height: contentHeight\n };\n return {\n titleFontSize,\n titleLineHeight,\n contentFontSize,\n contentLineHeight,\n imageBox,\n textBox,\n contentBox,\n isDown,\n textAlign\n };\n};\n\nexport const buildArcBlockMark = (\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 = getArcBlockMetrics(spec, index);\n\n // 引导线 rect:从 image 圆心(group x=0)垂直连接到 text 近端边缘\n // - up(dome):从 image 顶部(imageBox.y)向上到 textBox 顶部(textBox.y)\n // - down(bowl):从 image 底部(imageBox.y + imageBox.height)向下到 textBox 底部(textBox.y + textBox.height)\n const connectorY = metrics.isDown ? metrics.imageBox.y + metrics.imageBox.height : metrics.textBox.y;\n const connectorHeight = metrics.isDown\n ? Math.max(metrics.textBox.y + metrics.textBox.height - (metrics.imageBox.y + metrics.imageBox.height), 0)\n : Math.max(metrics.imageBox.y - metrics.textBox.y, 0);\n // 引导线宽度固定为 2,center 对齐 x=0\n const connectorX = -1;\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) => getArcBlockCenter(spec, ctx, index).x,\n y: (_d: unknown, ctx: LayoutContext) => getArcBlockCenter(spec, ctx, index).y\n },\n children: [\n // title / content 与 image 之间的垂直引导线(zIndex 最低,作为装饰)\n {\n type: 'rect',\n name: `storyline-block-connector-${index}`,\n interactive: false,\n zIndex: LayoutZIndex.Mark + 2,\n style: {\n x: connectorX,\n y: connectorY,\n width: 2,\n height: connectorHeight,\n fill: themeColor,\n fillOpacity: 0.6\n }\n } as ICustomMarkSpec<'rect'>,\n hasImage\n ? ({\n type: 'image',\n name: `storyline-block-image-${index}`,\n interactive: false,\n zIndex: LayoutZIndex.Mark + 3,\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 cornerRadius: Math.min(metrics.imageBox.width, metrics.imageBox.height) / 2,\n image: block.image,\n repeatX: 'no-repeat',\n repeatY: 'no-repeat',\n imageMode: 'contain',\n imagePosition: 'center',\n ...spec.image?.style\n }\n } as ICustomMarkSpec<'image'>)\n : ({\n type: 'symbol',\n name: `storyline-block-image-bg-${index}`,\n interactive: false,\n zIndex: LayoutZIndex.Mark + 3,\n style: {\n x: 0,\n y: 0,\n size: Math.min(metrics.imageBox.width, metrics.imageBox.height),\n symbolType: 'circle',\n ...getImageBackgroundStyle(spec)\n }\n } as ICustomMarkSpec<'symbol'>),\n // 圆形 image 的外层装饰环\n shouldShowImageBackground(spec)\n ? ({\n type: 'symbol',\n name: `storyline-block-image-halo-${index}`,\n interactive: false,\n zIndex: LayoutZIndex.Mark + 3,\n style: {\n x: 0,\n y: 0,\n size: Math.min(metrics.imageBox.width, metrics.imageBox.height) + ARC_BLOCK_IMAGE_HALO_PADDING * 2,\n symbolType: 'circle',\n fill: 'transparent',\n stroke: withAlpha(themeColor, 0.82),\n lineWidth: ARC_BLOCK_IMAGE_BORDER\n }\n } as ICustomMarkSpec<'symbol'>)\n : null,\n block.title\n ? ({\n type: 'text',\n name: `storyline-block-title-${index}`,\n interactive: false,\n zIndex: LayoutZIndex.Mark + 5,\n ...spec.title,\n style: {\n x: 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: '#1f2430',\n stroke: '#fff',\n lineWidth: 5,\n lineJoin: 'round',\n textAlign: metrics.textAlign,\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 + 4,\n ...spec.content,\n textType: 'rich',\n style: {\n x: 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: metrics.contentFontSize,\n lineHeight: metrics.contentLineHeight,\n fill: '#596173',\n align: metrics.textAlign\n }),\n textAlign: metrics.textAlign,\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"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { IExtensionGroupMarkSpec } from '@visactor/vchart';
|
|
2
2
|
import type { IStorylineBlock, IStorylineSpec } from '../interface';
|
|
3
|
-
export declare const
|
|
3
|
+
export declare const buildClockTitleImageMark: (spec: IStorylineSpec) => IExtensionGroupMarkSpec | null;
|
|
4
4
|
export declare const buildClockArcMark: (spec: IStorylineSpec) => IExtensionGroupMarkSpec | null;
|
|
5
5
|
export declare const buildClockBlockMark: (spec: IStorylineSpec, block: IStorylineBlock, index: number) => IExtensionGroupMarkSpec;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { LayoutZIndex } from "@visactor/vchart";
|
|
2
2
|
|
|
3
|
-
import { buildRichContent, getRegionGeometry, getThemeColor, normalizePadding, shouldShowImageBackground, withAlpha } from "./common";
|
|
3
|
+
import { buildRichContent, getImageBackgroundStyle, getRegionGeometry, getThemeColor, normalizePadding, omitImageLayoutSpec, resolveAdaptiveLineHeight, resolveTitleFontSize, shouldShowImageBackground, withAlpha } from "./common";
|
|
4
4
|
|
|
5
5
|
const CLOCK_CENTER_RADIUS_RATIO = .6, CLOCK_CENTER_IMAGE_INSET_RATIO = .9, CLOCK_ORBIT_RATIO = .68, CLOCK_DOT_RATIO = .68, CLOCK_TEXT_INNER_RATIO = .92, CLOCK_TEXT_MAX_WIDTH = 280, CLOCK_DOT_DIAMETER_RATIO = .32, CLOCK_LEAD_LINE_GAP = 6, CLOCK_TEXT_GAP_FROM_LEAD = 8, CLOCK_ORBIT_DASH = [ 4, 4 ], CLOCK_TITLE_FONT_SIZE = 22, CLOCK_TITLE_LINE_HEIGHT = 28, CLOCK_CONTENT_FONT_SIZE = 16, CLOCK_CONTENT_LINE_HEIGHT = 22, getClockGeometry = (spec, ctx) => {
|
|
6
6
|
var _a, _b, _c;
|
|
@@ -17,10 +17,10 @@ const CLOCK_CENTER_RADIUS_RATIO = .6, CLOCK_CENTER_IMAGE_INSET_RATIO = .9, CLOCK
|
|
|
17
17
|
y: cy + Math.sin(angle) * r
|
|
18
18
|
}), isOnLeftHalf = angle => Math.cos(angle) < 0;
|
|
19
19
|
|
|
20
|
-
export const
|
|
20
|
+
export const buildClockTitleImageMark = spec => {
|
|
21
21
|
var _a, _b, _c, _e;
|
|
22
|
-
if (!1 === (null === (_a = spec.
|
|
23
|
-
const themeColor = getThemeColor(spec), hasImage = !!(null === (_b = spec.
|
|
22
|
+
if (!1 === (null === (_a = spec.titleImage) || void 0 === _a ? void 0 : _a.visible)) return null;
|
|
23
|
+
const themeColor = getThemeColor(spec), hasImage = !!(null === (_b = spec.titleImage) || void 0 === _b ? void 0 : _b.image);
|
|
24
24
|
return {
|
|
25
25
|
type: "group",
|
|
26
26
|
name: "storyline-clock-center",
|
|
@@ -52,10 +52,10 @@ export const buildClockCenterImageMark = spec => {
|
|
|
52
52
|
},
|
|
53
53
|
width: (_d, ctx) => .6 * getClockGeometry(spec, ctx).R * .9 * 2,
|
|
54
54
|
height: (_d, ctx) => .6 * getClockGeometry(spec, ctx).R * .9 * 2,
|
|
55
|
-
image: null === (_c = spec.
|
|
55
|
+
image: null === (_c = spec.titleImage) || void 0 === _c ? void 0 : _c.image,
|
|
56
56
|
repeatX: "no-repeat",
|
|
57
57
|
repeatY: "no-repeat",
|
|
58
|
-
imageMode: "
|
|
58
|
+
imageMode: "contain",
|
|
59
59
|
imagePosition: "center",
|
|
60
60
|
cornerRadius: (_d, ctx) => .6 * getClockGeometry(spec, ctx).R * .9,
|
|
61
61
|
anchor: (_d, ctx) => {
|
|
@@ -64,15 +64,15 @@ export const buildClockCenterImageMark = spec => {
|
|
|
64
64
|
},
|
|
65
65
|
dx: (_d, ctx) => {
|
|
66
66
|
var _a, _b;
|
|
67
|
-
const rectW = .6 * getClockGeometry(spec, ctx).R * .9 * 2, userWidth = null === (_b = null === (_a = spec.
|
|
67
|
+
const rectW = .6 * getClockGeometry(spec, ctx).R * .9 * 2, userWidth = null === (_b = null === (_a = spec.titleImage) || void 0 === _a ? void 0 : _a.style) || void 0 === _b ? void 0 : _b.width;
|
|
68
68
|
return (rectW - ("number" == typeof userWidth ? userWidth : rectW)) / 2;
|
|
69
69
|
},
|
|
70
70
|
dy: (_d, ctx) => {
|
|
71
71
|
var _a, _b;
|
|
72
|
-
const rectH = .6 * getClockGeometry(spec, ctx).R * .9 * 2, userHeight = null === (_b = null === (_a = spec.
|
|
72
|
+
const rectH = .6 * getClockGeometry(spec, ctx).R * .9 * 2, userHeight = null === (_b = null === (_a = spec.titleImage) || void 0 === _a ? void 0 : _a.style) || void 0 === _b ? void 0 : _b.height;
|
|
73
73
|
return (rectH - ("number" == typeof userHeight ? userHeight : rectH)) / 2;
|
|
74
74
|
}
|
|
75
|
-
}, null === (_e = spec.
|
|
75
|
+
}, null === (_e = spec.titleImage) || void 0 === _e ? void 0 : _e.style)
|
|
76
76
|
} : {
|
|
77
77
|
type: "symbol",
|
|
78
78
|
name: "storyline-clock-center-placeholder",
|
|
@@ -140,8 +140,11 @@ const getClockDotCenter = (spec, ctx, index) => {
|
|
|
140
140
|
};
|
|
141
141
|
|
|
142
142
|
export const buildClockBlockMark = (spec, block, index) => {
|
|
143
|
-
var _a, _b, _c;
|
|
144
|
-
const hasImage = !!block.image, themeColor = getThemeColor(spec), showImageBackground = shouldShowImageBackground(spec), contentText = Array.isArray(block.content) ? block.content : block.content ? [ block.content ] : [],
|
|
143
|
+
var _a, _b, _c, _e;
|
|
144
|
+
const hasImage = !!block.image, themeColor = getThemeColor(spec), showImageBackground = shouldShowImageBackground(spec), contentText = Array.isArray(block.content) ? block.content : block.content ? [ block.content ] : [], getTitleFontSize = ctx => resolveTitleFontSize(spec, ctx, block.title, getClockTextRect(spec, ctx, index).width, 22, [ 8, 30 ]), getTitleLineHeight = ctx => {
|
|
145
|
+
var _a;
|
|
146
|
+
return resolveAdaptiveLineHeight(getTitleFontSize(ctx), null === (_a = spec.title) || void 0 === _a ? void 0 : _a.style, 28, 1.28);
|
|
147
|
+
}, children = [ {
|
|
145
148
|
type: "path",
|
|
146
149
|
name: `storyline-clock-lead-${index}`,
|
|
147
150
|
interactive: !1,
|
|
@@ -160,20 +163,18 @@ export const buildClockBlockMark = (spec, block, index) => {
|
|
|
160
163
|
type: "symbol",
|
|
161
164
|
name: `storyline-clock-dot-bg-${index}`,
|
|
162
165
|
interactive: !1,
|
|
163
|
-
style: {
|
|
166
|
+
style: Object.assign({
|
|
164
167
|
x: (_d, ctx) => getClockDotCenter(spec, ctx, index).x,
|
|
165
168
|
y: (_d, ctx) => getClockDotCenter(spec, ctx, index).y,
|
|
166
169
|
size: (_d, ctx) => getClockDotCenter(spec, ctx, index).diameter + 10,
|
|
167
|
-
symbolType: "circle"
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
lineWidth: 2
|
|
171
|
-
}
|
|
172
|
-
} : null, hasImage ? {
|
|
170
|
+
symbolType: "circle"
|
|
171
|
+
}, getImageBackgroundStyle(spec))
|
|
172
|
+
} : null, hasImage ? Object.assign(Object.assign({
|
|
173
173
|
type: "image",
|
|
174
174
|
name: `storyline-clock-dot-${index}`,
|
|
175
|
-
interactive: !1
|
|
176
|
-
|
|
175
|
+
interactive: !1
|
|
176
|
+
}, omitImageLayoutSpec(spec.image)), {
|
|
177
|
+
style: Object.assign({
|
|
177
178
|
x: (_d, ctx) => {
|
|
178
179
|
const dot = getClockDotCenter(spec, ctx, index);
|
|
179
180
|
return dot.x - dot.diameter / 2;
|
|
@@ -187,11 +188,11 @@ export const buildClockBlockMark = (spec, block, index) => {
|
|
|
187
188
|
image: block.image,
|
|
188
189
|
repeatX: "no-repeat",
|
|
189
190
|
repeatY: "no-repeat",
|
|
190
|
-
imageMode: "
|
|
191
|
+
imageMode: "contain",
|
|
191
192
|
imagePosition: "center",
|
|
192
193
|
cornerRadius: (_d, ctx) => getClockDotCenter(spec, ctx, index).diameter / 2
|
|
193
|
-
}
|
|
194
|
-
} : {
|
|
194
|
+
}, null === (_a = spec.image) || void 0 === _a ? void 0 : _a.style)
|
|
195
|
+
}) : {
|
|
195
196
|
type: "symbol",
|
|
196
197
|
name: `storyline-clock-dot-${index}`,
|
|
197
198
|
interactive: !1,
|
|
@@ -211,11 +212,11 @@ export const buildClockBlockMark = (spec, block, index) => {
|
|
|
211
212
|
}, spec.title), {
|
|
212
213
|
style: Object.assign({
|
|
213
214
|
x: (_d, ctx) => getClockTextRect(spec, ctx, index).x,
|
|
214
|
-
y: (_d, ctx) => getClockTextRect(spec, ctx, index).anchorY -
|
|
215
|
+
y: (_d, ctx) => getClockTextRect(spec, ctx, index).anchorY - getTitleLineHeight(ctx),
|
|
215
216
|
text: block.title,
|
|
216
217
|
maxLineWidth: (_d, ctx) => getClockTextRect(spec, ctx, index).width,
|
|
217
|
-
fontSize:
|
|
218
|
-
lineHeight:
|
|
218
|
+
fontSize: (_d, ctx) => getTitleFontSize(ctx),
|
|
219
|
+
lineHeight: (_d, ctx) => getTitleLineHeight(ctx),
|
|
219
220
|
fontWeight: "bold",
|
|
220
221
|
fill: themeColor,
|
|
221
222
|
stroke: "#fff",
|
|
@@ -223,7 +224,7 @@ export const buildClockBlockMark = (spec, block, index) => {
|
|
|
223
224
|
lineJoin: "round",
|
|
224
225
|
textAlign: (_d, ctx) => getClockTextRect(spec, ctx, index).onLeft ? "right" : "left",
|
|
225
226
|
textBaseline: "top"
|
|
226
|
-
}, null === (
|
|
227
|
+
}, null === (_b = spec.title) || void 0 === _b ? void 0 : _b.style)
|
|
227
228
|
}) : null, contentText.length ? Object.assign(Object.assign({
|
|
228
229
|
type: "text",
|
|
229
230
|
name: `storyline-clock-content-${index}`,
|
|
@@ -242,11 +243,11 @@ export const buildClockBlockMark = (spec, block, index) => {
|
|
|
242
243
|
textAlign: (_d, ctx) => getClockTextRect(spec, ctx, index).onLeft ? "right" : "left",
|
|
243
244
|
textBaseline: "top",
|
|
244
245
|
wordBreak: "break-word"
|
|
245
|
-
}, null === (
|
|
246
|
+
}, null === (_c = spec.content) || void 0 === _c ? void 0 : _c.style)
|
|
246
247
|
}) : null ];
|
|
247
248
|
return {
|
|
248
249
|
type: "group",
|
|
249
|
-
id: `storyline-block-${null !== (
|
|
250
|
+
id: `storyline-block-${null !== (_e = block.id) && void 0 !== _e ? _e : index}`,
|
|
250
251
|
name: `storyline-block-${index}`,
|
|
251
252
|
zIndex: LayoutZIndex.Mark + 1,
|
|
252
253
|
children: children.filter(Boolean)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/charts/storyline/layouts/clock.ts"],"names":[],"mappings":"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","file":"clock.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 buildRichContent,\n getRegionGeometry,\n getThemeColor,\n normalizePadding,\n shouldShowImageBackground,\n withAlpha\n} from './common';\n\n/**\n * clock 布局:环绕式时间线(orbit timeline)\n *\n * 视觉结构(参考报刊版式):\n *\n * ┌──────── 外侧文字段(title + content)─────────┐\n * │ │\n * ●●● │ ┌───── 虚线轨道圆环 ─────┐ │\n * 圆形 dot ──────引线──────┤ │\n * │ │ ◎ centerImage │\n * │ │ (大圆人像) │\n * │ └───────────────────────┘\n * └─────────────────────────────────────────────┘\n *\n * - centerImage:圆形大图,位于版面中心\n * - 虚线轨道:紧贴 centerImage 外侧的圆环,提供时间线的视觉骨架\n * - 每个 block 由 1 个圆形小图(dot)压在轨道上,外加一段从 dot 引出的 title + content 文字\n * - block 沿轨道环绕分布(默认 360°);左半圆 block 文字 right-align,右半圆 block 文字 left-align\n */\n\n// ===== 半径配置(按可用半径的比例划分各圈层)=====\nconst CLOCK_CENTER_RADIUS_RATIO = 0.6; // 中心圆半径(更大)\nconst CLOCK_CENTER_IMAGE_INSET_RATIO = 0.9; // centerImage 相对中心圆的尺寸比例(留出环形空隙)\nconst CLOCK_ORBIT_RATIO = 0.68; // 虚线轨道半径\nconst CLOCK_DOT_RATIO = 0.68; // 圆形小图(dot)中心所在半径(与轨道重合)\nconst CLOCK_TEXT_INNER_RATIO = 0.92; // block 文字段起始半径(距离圆心更远)\nconst CLOCK_TEXT_MAX_WIDTH = 280; // 文字段最大宽度\n\n// ===== 元素尺寸 =====\nconst CLOCK_DOT_DIAMETER_RATIO = 0.32; // dot 直径相对 R(更大)\nconst CLOCK_LEAD_LINE_GAP = 6; // dot 到引线起点的间距 px\nconst CLOCK_TEXT_GAP_FROM_LEAD = 8; // 引线到文字的间距 px\nconst CLOCK_ORBIT_DASH = [4, 4];\n\n// ===== 文字 =====\nconst CLOCK_TITLE_FONT_SIZE = 22;\nconst CLOCK_TITLE_LINE_HEIGHT = 28;\nconst CLOCK_CONTENT_FONT_SIZE = 16;\nconst CLOCK_CONTENT_LINE_HEIGHT = 22;\n\n// ===== 几何 =====\n\ntype ClockGeometry = {\n cx: number;\n cy: number;\n R: number; // 整盘外半径\n count: number;\n step: number;\n};\n\nconst getClockGeometry = (spec: IStorylineSpec, ctx: LayoutContext): ClockGeometry => {\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 cx = startX + padding.left + innerWidth / 2;\n const cy = startY + padding.top + innerHeight / 2;\n // R 需要预留 text 向外延伸的空间:\n // - title 在 anchor 朝向圆心一侧(不占用外圈空间)\n // - content 在 anchor 远离圆心一侧,需要预留 content 的高度\n // - 水平方向:text 从 0.92R 向外延伸 CLOCK_TEXT_MAX_WIDTH\n const textReserveX = CLOCK_TEXT_MAX_WIDTH;\n const textReserveY = 4 + CLOCK_CONTENT_LINE_HEIGHT * 4;\n const rMaxX = (innerWidth / 2 - textReserveX) / CLOCK_TEXT_INNER_RATIO;\n const rMaxY = (innerHeight / 2 - textReserveY) / CLOCK_TEXT_INNER_RATIO;\n const R = Math.max(Math.min(rMaxX, rMaxY), 1);\n const count = spec.data?.length ?? 0;\n const step = count > 0 ? (Math.PI * 2) / count : 0;\n return { cx, cy, R, count, step };\n};\n\n/**\n * 第 index 个 block 在轨道上的角度。\n * - 0° = 正上方(12 点钟)\n * - 顺时针递增\n */\nconst getClockBlockAngle = (geom: ClockGeometry, index: number) => -Math.PI / 2 + geom.step * (index + 0.5);\n\nconst polar = (cx: number, cy: number, r: number, angle: number) => ({\n x: cx + Math.cos(angle) * r,\n y: cy + Math.sin(angle) * r\n});\n\n/**\n * 判断 block 在版面左半边还是右半边。\n * 用于决定 block 文字的对齐方向(左半边 right-align,右半边 left-align)。\n */\nconst isOnLeftHalf = (angle: number) => Math.cos(angle) < 0;\n\n// ===== 中心圆 =====\n\nexport const buildClockCenterImageMark = (spec: IStorylineSpec): IExtensionGroupMarkSpec | null => {\n if (spec.centerImage?.visible === false) {\n return null;\n }\n const themeColor = getThemeColor(spec);\n const hasImage = !!spec.centerImage?.image;\n return {\n type: 'group' as any,\n name: 'storyline-clock-center',\n zIndex: LayoutZIndex.Mark + 2,\n children: [\n // centerImage 背后的高亮光晕(主题色透明色,营造\"焦点\"效果)\n {\n type: 'symbol',\n name: 'storyline-clock-center-halo',\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getClockGeometry(spec, ctx).cx,\n y: (_d: unknown, ctx: LayoutContext) => getClockGeometry(spec, ctx).cy,\n size: (_d: unknown, ctx: LayoutContext) => {\n const g = getClockGeometry(spec, ctx);\n return g.R * CLOCK_CENTER_RADIUS_RATIO * 2.16;\n },\n symbolType: 'circle',\n fill: withAlpha(themeColor, 0.28),\n stroke: 'transparent'\n }\n } as ICustomMarkSpec<'symbol'>,\n hasImage\n ? ({\n type: 'image',\n name: 'storyline-clock-center-image',\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => {\n const g = getClockGeometry(spec, ctx);\n return g.cx - g.R * CLOCK_CENTER_RADIUS_RATIO * CLOCK_CENTER_IMAGE_INSET_RATIO;\n },\n y: (_d: unknown, ctx: LayoutContext) => {\n const g = getClockGeometry(spec, ctx);\n return g.cy - g.R * CLOCK_CENTER_RADIUS_RATIO * CLOCK_CENTER_IMAGE_INSET_RATIO;\n },\n width: (_d: unknown, ctx: LayoutContext) =>\n getClockGeometry(spec, ctx).R * CLOCK_CENTER_RADIUS_RATIO * CLOCK_CENTER_IMAGE_INSET_RATIO * 2,\n height: (_d: unknown, ctx: LayoutContext) =>\n getClockGeometry(spec, ctx).R * CLOCK_CENTER_RADIUS_RATIO * CLOCK_CENTER_IMAGE_INSET_RATIO * 2,\n image: spec.centerImage?.image,\n repeatX: 'no-repeat',\n repeatY: 'no-repeat',\n imageMode: 'cover',\n imagePosition: 'center',\n cornerRadius: (_d: unknown, ctx: LayoutContext) =>\n getClockGeometry(spec, ctx).R * CLOCK_CENTER_RADIUS_RATIO * CLOCK_CENTER_IMAGE_INSET_RATIO,\n // 默认锚点设为 image 中心,让 scaleX/scaleY 从中心缩放\n anchor: (_d: unknown, ctx: LayoutContext) => {\n const g = getClockGeometry(spec, ctx);\n return [g.cx, g.cy];\n },\n // 若用户在 style 里覆盖了 width/height,自动追加 dx/dy 让图片仍以 rect 中心为中心\n dx: (_d: unknown, ctx: LayoutContext) => {\n const g = getClockGeometry(spec, ctx);\n const rectW = g.R * CLOCK_CENTER_RADIUS_RATIO * CLOCK_CENTER_IMAGE_INSET_RATIO * 2;\n const userWidth = (spec.centerImage?.style as { width?: number } | undefined)?.width;\n const w = typeof userWidth === 'number' ? userWidth : rectW;\n return (rectW - w) / 2;\n },\n dy: (_d: unknown, ctx: LayoutContext) => {\n const g = getClockGeometry(spec, ctx);\n const rectH = g.R * CLOCK_CENTER_RADIUS_RATIO * CLOCK_CENTER_IMAGE_INSET_RATIO * 2;\n const userHeight = (spec.centerImage?.style as { height?: number } | undefined)?.height;\n const h = typeof userHeight === 'number' ? userHeight : rectH;\n return (rectH - h) / 2;\n },\n ...spec.centerImage?.style\n }\n } as ICustomMarkSpec<'image'>)\n : ({\n type: 'symbol',\n name: 'storyline-clock-center-placeholder',\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getClockGeometry(spec, ctx).cx,\n y: (_d: unknown, ctx: LayoutContext) => getClockGeometry(spec, ctx).cy,\n size: (_d: unknown, ctx: LayoutContext) => getClockGeometry(spec, ctx).R * CLOCK_CENTER_RADIUS_RATIO * 2,\n symbolType: 'circle',\n fill: '#ffffff',\n stroke: themeColor,\n lineWidth: 2\n }\n } as ICustomMarkSpec<'symbol'>)\n ].filter(Boolean) as ICustomMarkSpec<any>[]\n };\n};\n\n// ===== 虚线轨道 =====\n\n/**\n * 紧贴 centerImage 外侧的虚线圆环轨道。\n */\nexport const buildClockArcMark = (spec: IStorylineSpec): IExtensionGroupMarkSpec | null => {\n const themeColor = getThemeColor(spec);\n\n const orbitPath = (_d: unknown, ctx: LayoutContext) => {\n const g = getClockGeometry(spec, ctx);\n const r = g.R * CLOCK_ORBIT_RATIO;\n return [\n `M ${(g.cx + r).toFixed(2)} ${g.cy.toFixed(2)}`,\n `A ${r.toFixed(2)} ${r.toFixed(2)} 0 1 1 ${(g.cx - r).toFixed(2)} ${g.cy.toFixed(2)}`,\n `A ${r.toFixed(2)} ${r.toFixed(2)} 0 1 1 ${(g.cx + r).toFixed(2)} ${g.cy.toFixed(2)}`\n ].join(' ');\n };\n\n return {\n type: 'group' as any,\n name: 'storyline-clock-orbit',\n zIndex: LayoutZIndex.Mark,\n children: [\n {\n type: 'path',\n name: 'storyline-clock-orbit-path',\n interactive: false,\n style: {\n path: orbitPath,\n stroke: withAlpha(themeColor, 0.7),\n lineWidth: 1,\n lineDash: CLOCK_ORBIT_DASH,\n fill: 'transparent',\n fillOpacity: 0\n }\n } as ICustomMarkSpec<'path'>\n ]\n };\n};\n\n// ===== block:dot + 引线 + 文字段 =====\n\nconst getClockDotCenter = (spec: IStorylineSpec, ctx: LayoutContext, index: number) => {\n const g = getClockGeometry(spec, ctx);\n const angle = getClockBlockAngle(g, index);\n const r = g.R * CLOCK_DOT_RATIO;\n return { ...polar(g.cx, g.cy, r, angle), diameter: g.R * CLOCK_DOT_DIAMETER_RATIO, angle };\n};\n\n/**\n * 引线(dot 外缘 → 文字段内边)的两个端点。\n */\nconst getClockLeadLine = (spec: IStorylineSpec, ctx: LayoutContext, index: number) => {\n const g = getClockGeometry(spec, ctx);\n const angle = getClockBlockAngle(g, index);\n const dotR = (g.R * CLOCK_DOT_DIAMETER_RATIO) / 2;\n const start = polar(g.cx, g.cy, g.R * CLOCK_DOT_RATIO + dotR + CLOCK_LEAD_LINE_GAP, angle);\n const end = polar(g.cx, g.cy, g.R * CLOCK_TEXT_INNER_RATIO - CLOCK_TEXT_GAP_FROM_LEAD, angle);\n return { start, end };\n};\n\n/**\n * block 文字段的矩形(中心 + 宽高 + 对齐)。\n * 文字段沿水平方向从 dot 一侧外延:\n * - 左半圆:文字右对齐,向左延伸至画布左边界(含 padding)\n * - 右半圆:文字左对齐,向右延伸至画布右边界(含 padding)\n * 这样所有 block 的可用宽度都是一致的\"画布半宽 - 中心圆半径\",避免出现窄文字。\n */\nconst getClockTextRect = (spec: IStorylineSpec, ctx: LayoutContext, index: number) => {\n const g = getClockGeometry(spec, ctx);\n const { width: regionWidth, startX } = getRegionGeometry(ctx);\n const padding = normalizePadding(spec.block?.padding);\n const angle = getClockBlockAngle(g, index);\n const onLeft = isOnLeftHalf(angle);\n // 文字段从 dot 外侧的 inner ring 处开始水平延展\n const rInner = g.R * CLOCK_TEXT_INNER_RATIO;\n const innerPoint = polar(g.cx, g.cy, rInner, angle);\n // 画布水平边界(含 padding)\n const leftEdge = startX + padding.left;\n const rightEdge = startX + regionWidth - padding.right;\n const width = onLeft\n ? Math.min(Math.max(innerPoint.x - leftEdge, 80), CLOCK_TEXT_MAX_WIDTH)\n : Math.min(Math.max(rightEdge - innerPoint.x, 80), CLOCK_TEXT_MAX_WIDTH);\n return { x: innerPoint.x, y: innerPoint.y, width, onLeft, anchorY: innerPoint.y };\n};\n\nexport const buildClockBlockMark = (\n spec: IStorylineSpec,\n block: IStorylineBlock,\n index: number\n): IExtensionGroupMarkSpec => {\n const hasImage = !!block.image;\n const themeColor = getThemeColor(spec);\n const showImageBackground = shouldShowImageBackground(spec);\n const contentText = Array.isArray(block.content) ? block.content : block.content ? [block.content] : [];\n\n const leadPath = (_d: unknown, ctx: LayoutContext) => {\n const { start, end } = getClockLeadLine(spec, ctx, index);\n return `M ${start.x.toFixed(2)} ${start.y.toFixed(2)} L ${end.x.toFixed(2)} ${end.y.toFixed(2)}`;\n };\n\n const children: (ICustomMarkSpec<any> | null)[] = [\n // 引线:从 dot 外缘到文字段内边\n {\n type: 'path',\n name: `storyline-clock-lead-${index}`,\n interactive: false,\n style: {\n path: leadPath,\n stroke: withAlpha(themeColor, 0.7),\n lineWidth: 1,\n lineDash: [3, 3],\n fill: 'transparent',\n fillOpacity: 0\n }\n } as ICustomMarkSpec<'path'>,\n showImageBackground\n ? ({\n type: 'symbol',\n name: `storyline-clock-dot-bg-${index}`,\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).x,\n y: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).y,\n size: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).diameter + 10,\n symbolType: 'circle',\n fill: '#ffffff',\n stroke: themeColor,\n lineWidth: 2\n }\n } as ICustomMarkSpec<'symbol'>)\n : null,\n // 圆形小图(dot):压在轨道上,作为时间锚点\n hasImage\n ? ({\n type: 'image',\n name: `storyline-clock-dot-${index}`,\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => {\n const dot = getClockDotCenter(spec, ctx, index);\n return dot.x - dot.diameter / 2;\n },\n y: (_d: unknown, ctx: LayoutContext) => {\n const dot = getClockDotCenter(spec, ctx, index);\n return dot.y - dot.diameter / 2;\n },\n width: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).diameter,\n height: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).diameter,\n image: block.image,\n repeatX: 'no-repeat',\n repeatY: 'no-repeat',\n imageMode: 'cover',\n imagePosition: 'center',\n cornerRadius: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).diameter / 2\n }\n } as ICustomMarkSpec<'image'>)\n : ({\n type: 'symbol',\n name: `storyline-clock-dot-${index}`,\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).x,\n y: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).y,\n size: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).diameter,\n symbolType: 'circle',\n fill: themeColor,\n stroke: '#ffffff',\n lineWidth: 1.5\n }\n } as ICustomMarkSpec<'symbol'>),\n // title:文字段的第一行\n block.title\n ? ({\n type: 'text',\n name: `storyline-clock-title-${index}`,\n interactive: false,\n ...spec.title,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getClockTextRect(spec, ctx, index).x,\n y: (_d: unknown, ctx: LayoutContext) =>\n getClockTextRect(spec, ctx, index).anchorY - CLOCK_TITLE_LINE_HEIGHT,\n text: block.title,\n maxLineWidth: (_d: unknown, ctx: LayoutContext) => getClockTextRect(spec, ctx, index).width,\n fontSize: CLOCK_TITLE_FONT_SIZE,\n lineHeight: CLOCK_TITLE_LINE_HEIGHT,\n fontWeight: 'bold',\n fill: themeColor,\n stroke: '#fff',\n lineWidth: 5,\n lineJoin: 'round',\n textAlign: (_d: unknown, ctx: LayoutContext) =>\n getClockTextRect(spec, ctx, index).onLeft ? 'right' : 'left',\n textBaseline: 'top',\n ...spec.title?.style\n }\n } as ICustomMarkSpec<'text'>)\n : null,\n // content:富文本,title 下方\n contentText.length\n ? ({\n type: 'text',\n name: `storyline-clock-content-${index}`,\n interactive: false,\n ...spec.content,\n textType: 'rich',\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getClockTextRect(spec, ctx, index).x,\n y: (_d: unknown, ctx: LayoutContext) => getClockTextRect(spec, ctx, index).anchorY + 4,\n width: (_d: unknown, ctx: LayoutContext) => getClockTextRect(spec, ctx, index).width,\n maxLineWidth: (_d: unknown, ctx: LayoutContext) => getClockTextRect(spec, ctx, index).width,\n text: buildRichContent(contentText, spec),\n fontSize: CLOCK_CONTENT_FONT_SIZE,\n lineHeight: CLOCK_CONTENT_LINE_HEIGHT,\n fill: '#3a3f4d',\n textAlign: (_d: unknown, ctx: LayoutContext) =>\n getClockTextRect(spec, ctx, index).onLeft ? 'right' : 'left',\n textBaseline: 'top',\n wordBreak: 'break-word',\n ...spec.content?.style\n }\n } as ICustomMarkSpec<'text'>)\n : null\n ];\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 children: children.filter(Boolean) as ICustomMarkSpec<any>[]\n };\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/charts/storyline/layouts/clock.ts"],"names":[],"mappings":"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","file":"clock.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 buildRichContent,\n getImageBackgroundStyle,\n getRegionGeometry,\n getThemeColor,\n normalizePadding,\n omitImageLayoutSpec,\n resolveAdaptiveLineHeight,\n resolveTitleFontSize,\n shouldShowImageBackground,\n withAlpha\n} from './common';\n\n/**\n * clock 布局:环绕式时间线(orbit timeline)\n *\n * 视觉结构(参考报刊版式):\n *\n * ┌──────── 外侧文字段(title + content)─────────┐\n * │ │\n * ●●● │ ┌───── 虚线轨道圆环 ─────┐ │\n * 圆形 dot ──────引线──────┤ │\n * │ │ ◎ titleImage │\n * │ │ (大圆人像) │\n * │ └───────────────────────┘\n * └─────────────────────────────────────────────┘\n *\n * - titleImage:可选中心图,位于版面中心\n * - 虚线轨道:紧贴中心区域外侧的圆环,提供时间线的视觉骨架\n * - 每个 block 由 1 个圆形小图(dot)压在轨道上,外加一段从 dot 引出的 title + content 文字\n * - block 沿轨道环绕分布(默认 360°);左半圆 block 文字 right-align,右半圆 block 文字 left-align\n */\n\n// ===== 半径配置(按可用半径的比例划分各圈层)=====\nconst CLOCK_CENTER_RADIUS_RATIO = 0.6; // 中心圆半径(更大)\nconst CLOCK_CENTER_IMAGE_INSET_RATIO = 0.9; // titleImage 相对中心圆的尺寸比例(留出环形空隙)\nconst CLOCK_ORBIT_RATIO = 0.68; // 虚线轨道半径\nconst CLOCK_DOT_RATIO = 0.68; // 圆形小图(dot)中心所在半径(与轨道重合)\nconst CLOCK_TEXT_INNER_RATIO = 0.92; // block 文字段起始半径(距离圆心更远)\nconst CLOCK_TEXT_MAX_WIDTH = 280; // 文字段最大宽度\n\n// ===== 元素尺寸 =====\nconst CLOCK_DOT_DIAMETER_RATIO = 0.32; // dot 直径相对 R(更大)\nconst CLOCK_LEAD_LINE_GAP = 6; // dot 到引线起点的间距 px\nconst CLOCK_TEXT_GAP_FROM_LEAD = 8; // 引线到文字的间距 px\nconst CLOCK_ORBIT_DASH = [4, 4];\n\n// ===== 文字 =====\nconst CLOCK_TITLE_FONT_SIZE = 22;\nconst CLOCK_TITLE_LINE_HEIGHT = 28;\nconst CLOCK_CONTENT_FONT_SIZE = 16;\nconst CLOCK_CONTENT_LINE_HEIGHT = 22;\n\n// ===== 几何 =====\n\ntype ClockGeometry = {\n cx: number;\n cy: number;\n R: number; // 整盘外半径\n count: number;\n step: number;\n};\n\nconst getClockGeometry = (spec: IStorylineSpec, ctx: LayoutContext): ClockGeometry => {\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 cx = startX + padding.left + innerWidth / 2;\n const cy = startY + padding.top + innerHeight / 2;\n // R 需要预留 text 向外延伸的空间:\n // - title 在 anchor 朝向圆心一侧(不占用外圈空间)\n // - content 在 anchor 远离圆心一侧,需要预留 content 的高度\n // - 水平方向:text 从 0.92R 向外延伸 CLOCK_TEXT_MAX_WIDTH\n const textReserveX = CLOCK_TEXT_MAX_WIDTH;\n const textReserveY = 4 + CLOCK_CONTENT_LINE_HEIGHT * 4;\n const rMaxX = (innerWidth / 2 - textReserveX) / CLOCK_TEXT_INNER_RATIO;\n const rMaxY = (innerHeight / 2 - textReserveY) / CLOCK_TEXT_INNER_RATIO;\n const R = Math.max(Math.min(rMaxX, rMaxY), 1);\n const count = spec.data?.length ?? 0;\n const step = count > 0 ? (Math.PI * 2) / count : 0;\n return { cx, cy, R, count, step };\n};\n\n/**\n * 第 index 个 block 在轨道上的角度。\n * - 0° = 正上方(12 点钟)\n * - 顺时针递增\n */\nconst getClockBlockAngle = (geom: ClockGeometry, index: number) => -Math.PI / 2 + geom.step * (index + 0.5);\n\nconst polar = (cx: number, cy: number, r: number, angle: number) => ({\n x: cx + Math.cos(angle) * r,\n y: cy + Math.sin(angle) * r\n});\n\n/**\n * 判断 block 在版面左半边还是右半边。\n * 用于决定 block 文字的对齐方向(左半边 right-align,右半边 left-align)。\n */\nconst isOnLeftHalf = (angle: number) => Math.cos(angle) < 0;\n\n// ===== 中心圆 =====\n\nexport const buildClockTitleImageMark = (spec: IStorylineSpec): IExtensionGroupMarkSpec | null => {\n if (spec.titleImage?.visible === false) {\n return null;\n }\n const themeColor = getThemeColor(spec);\n const hasImage = !!spec.titleImage?.image;\n return {\n type: 'group' as any,\n name: 'storyline-clock-center',\n zIndex: LayoutZIndex.Mark + 2,\n children: [\n // titleImage 背后的高亮光晕(主题色透明色,营造\"焦点\"效果)\n {\n type: 'symbol',\n name: 'storyline-clock-center-halo',\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getClockGeometry(spec, ctx).cx,\n y: (_d: unknown, ctx: LayoutContext) => getClockGeometry(spec, ctx).cy,\n size: (_d: unknown, ctx: LayoutContext) => {\n const g = getClockGeometry(spec, ctx);\n return g.R * CLOCK_CENTER_RADIUS_RATIO * 2.16;\n },\n symbolType: 'circle',\n fill: withAlpha(themeColor, 0.28),\n stroke: 'transparent'\n }\n } as ICustomMarkSpec<'symbol'>,\n hasImage\n ? ({\n type: 'image',\n name: 'storyline-clock-center-image',\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => {\n const g = getClockGeometry(spec, ctx);\n return g.cx - g.R * CLOCK_CENTER_RADIUS_RATIO * CLOCK_CENTER_IMAGE_INSET_RATIO;\n },\n y: (_d: unknown, ctx: LayoutContext) => {\n const g = getClockGeometry(spec, ctx);\n return g.cy - g.R * CLOCK_CENTER_RADIUS_RATIO * CLOCK_CENTER_IMAGE_INSET_RATIO;\n },\n width: (_d: unknown, ctx: LayoutContext) =>\n getClockGeometry(spec, ctx).R * CLOCK_CENTER_RADIUS_RATIO * CLOCK_CENTER_IMAGE_INSET_RATIO * 2,\n height: (_d: unknown, ctx: LayoutContext) =>\n getClockGeometry(spec, ctx).R * CLOCK_CENTER_RADIUS_RATIO * CLOCK_CENTER_IMAGE_INSET_RATIO * 2,\n image: spec.titleImage?.image,\n repeatX: 'no-repeat',\n repeatY: 'no-repeat',\n imageMode: 'contain',\n imagePosition: 'center',\n cornerRadius: (_d: unknown, ctx: LayoutContext) =>\n getClockGeometry(spec, ctx).R * CLOCK_CENTER_RADIUS_RATIO * CLOCK_CENTER_IMAGE_INSET_RATIO,\n // 默认锚点设为 image 中心,让 scaleX/scaleY 从中心缩放\n anchor: (_d: unknown, ctx: LayoutContext) => {\n const g = getClockGeometry(spec, ctx);\n return [g.cx, g.cy];\n },\n // 若用户在 style 里覆盖了 width/height,自动追加 dx/dy 让图片仍以 rect 中心为中心\n dx: (_d: unknown, ctx: LayoutContext) => {\n const g = getClockGeometry(spec, ctx);\n const rectW = g.R * CLOCK_CENTER_RADIUS_RATIO * CLOCK_CENTER_IMAGE_INSET_RATIO * 2;\n const userWidth = (spec.titleImage?.style as { width?: number } | undefined)?.width;\n const w = typeof userWidth === 'number' ? userWidth : rectW;\n return (rectW - w) / 2;\n },\n dy: (_d: unknown, ctx: LayoutContext) => {\n const g = getClockGeometry(spec, ctx);\n const rectH = g.R * CLOCK_CENTER_RADIUS_RATIO * CLOCK_CENTER_IMAGE_INSET_RATIO * 2;\n const userHeight = (spec.titleImage?.style as { height?: number } | undefined)?.height;\n const h = typeof userHeight === 'number' ? userHeight : rectH;\n return (rectH - h) / 2;\n },\n ...spec.titleImage?.style\n }\n } as ICustomMarkSpec<'image'>)\n : ({\n type: 'symbol',\n name: 'storyline-clock-center-placeholder',\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getClockGeometry(spec, ctx).cx,\n y: (_d: unknown, ctx: LayoutContext) => getClockGeometry(spec, ctx).cy,\n size: (_d: unknown, ctx: LayoutContext) => getClockGeometry(spec, ctx).R * CLOCK_CENTER_RADIUS_RATIO * 2,\n symbolType: 'circle',\n fill: '#ffffff',\n stroke: themeColor,\n lineWidth: 2\n }\n } as ICustomMarkSpec<'symbol'>)\n ].filter(Boolean) as ICustomMarkSpec<any>[]\n };\n};\n\n// ===== 虚线轨道 =====\n\n/**\n * 紧贴中心区域外侧的虚线圆环轨道。\n */\nexport const buildClockArcMark = (spec: IStorylineSpec): IExtensionGroupMarkSpec | null => {\n const themeColor = getThemeColor(spec);\n\n const orbitPath = (_d: unknown, ctx: LayoutContext) => {\n const g = getClockGeometry(spec, ctx);\n const r = g.R * CLOCK_ORBIT_RATIO;\n return [\n `M ${(g.cx + r).toFixed(2)} ${g.cy.toFixed(2)}`,\n `A ${r.toFixed(2)} ${r.toFixed(2)} 0 1 1 ${(g.cx - r).toFixed(2)} ${g.cy.toFixed(2)}`,\n `A ${r.toFixed(2)} ${r.toFixed(2)} 0 1 1 ${(g.cx + r).toFixed(2)} ${g.cy.toFixed(2)}`\n ].join(' ');\n };\n\n return {\n type: 'group' as any,\n name: 'storyline-clock-orbit',\n zIndex: LayoutZIndex.Mark,\n children: [\n {\n type: 'path',\n name: 'storyline-clock-orbit-path',\n interactive: false,\n style: {\n path: orbitPath,\n stroke: withAlpha(themeColor, 0.7),\n lineWidth: 1,\n lineDash: CLOCK_ORBIT_DASH,\n fill: 'transparent',\n fillOpacity: 0\n }\n } as ICustomMarkSpec<'path'>\n ]\n };\n};\n\n// ===== block:dot + 引线 + 文字段 =====\n\nconst getClockDotCenter = (spec: IStorylineSpec, ctx: LayoutContext, index: number) => {\n const g = getClockGeometry(spec, ctx);\n const angle = getClockBlockAngle(g, index);\n const r = g.R * CLOCK_DOT_RATIO;\n return { ...polar(g.cx, g.cy, r, angle), diameter: g.R * CLOCK_DOT_DIAMETER_RATIO, angle };\n};\n\n/**\n * 引线(dot 外缘 → 文字段内边)的两个端点。\n */\nconst getClockLeadLine = (spec: IStorylineSpec, ctx: LayoutContext, index: number) => {\n const g = getClockGeometry(spec, ctx);\n const angle = getClockBlockAngle(g, index);\n const dotR = (g.R * CLOCK_DOT_DIAMETER_RATIO) / 2;\n const start = polar(g.cx, g.cy, g.R * CLOCK_DOT_RATIO + dotR + CLOCK_LEAD_LINE_GAP, angle);\n const end = polar(g.cx, g.cy, g.R * CLOCK_TEXT_INNER_RATIO - CLOCK_TEXT_GAP_FROM_LEAD, angle);\n return { start, end };\n};\n\n/**\n * block 文字段的矩形(中心 + 宽高 + 对齐)。\n * 文字段沿水平方向从 dot 一侧外延:\n * - 左半圆:文字右对齐,向左延伸至画布左边界(含 padding)\n * - 右半圆:文字左对齐,向右延伸至画布右边界(含 padding)\n * 这样所有 block 的可用宽度都是一致的\"画布半宽 - 中心圆半径\",避免出现窄文字。\n */\nconst getClockTextRect = (spec: IStorylineSpec, ctx: LayoutContext, index: number) => {\n const g = getClockGeometry(spec, ctx);\n const { width: regionWidth, startX } = getRegionGeometry(ctx);\n const padding = normalizePadding(spec.block?.padding);\n const angle = getClockBlockAngle(g, index);\n const onLeft = isOnLeftHalf(angle);\n // 文字段从 dot 外侧的 inner ring 处开始水平延展\n const rInner = g.R * CLOCK_TEXT_INNER_RATIO;\n const innerPoint = polar(g.cx, g.cy, rInner, angle);\n // 画布水平边界(含 padding)\n const leftEdge = startX + padding.left;\n const rightEdge = startX + regionWidth - padding.right;\n const width = onLeft\n ? Math.min(Math.max(innerPoint.x - leftEdge, 80), CLOCK_TEXT_MAX_WIDTH)\n : Math.min(Math.max(rightEdge - innerPoint.x, 80), CLOCK_TEXT_MAX_WIDTH);\n return { x: innerPoint.x, y: innerPoint.y, width, onLeft, anchorY: innerPoint.y };\n};\n\nexport const buildClockBlockMark = (\n spec: IStorylineSpec,\n block: IStorylineBlock,\n index: number\n): IExtensionGroupMarkSpec => {\n const hasImage = !!block.image;\n const themeColor = getThemeColor(spec);\n const showImageBackground = shouldShowImageBackground(spec);\n const contentText = Array.isArray(block.content) ? block.content : block.content ? [block.content] : [];\n const getTitleFontSize = (ctx: LayoutContext) =>\n resolveTitleFontSize(\n spec,\n ctx,\n block.title,\n getClockTextRect(spec, ctx, index).width,\n CLOCK_TITLE_FONT_SIZE,\n [8, 30]\n );\n const getTitleLineHeight = (ctx: LayoutContext) =>\n resolveAdaptiveLineHeight(getTitleFontSize(ctx), spec.title?.style as any, CLOCK_TITLE_LINE_HEIGHT, 1.28);\n\n const leadPath = (_d: unknown, ctx: LayoutContext) => {\n const { start, end } = getClockLeadLine(spec, ctx, index);\n return `M ${start.x.toFixed(2)} ${start.y.toFixed(2)} L ${end.x.toFixed(2)} ${end.y.toFixed(2)}`;\n };\n\n const children: (ICustomMarkSpec<any> | null)[] = [\n // 引线:从 dot 外缘到文字段内边\n {\n type: 'path',\n name: `storyline-clock-lead-${index}`,\n interactive: false,\n style: {\n path: leadPath,\n stroke: withAlpha(themeColor, 0.7),\n lineWidth: 1,\n lineDash: [3, 3],\n fill: 'transparent',\n fillOpacity: 0\n }\n } as ICustomMarkSpec<'path'>,\n showImageBackground\n ? ({\n type: 'symbol',\n name: `storyline-clock-dot-bg-${index}`,\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).x,\n y: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).y,\n size: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).diameter + 10,\n symbolType: 'circle',\n ...getImageBackgroundStyle(spec)\n }\n } as ICustomMarkSpec<'symbol'>)\n : null,\n // 圆形小图(dot):压在轨道上,作为时间锚点\n hasImage\n ? ({\n type: 'image',\n name: `storyline-clock-dot-${index}`,\n interactive: false,\n ...omitImageLayoutSpec(spec.image),\n style: {\n x: (_d: unknown, ctx: LayoutContext) => {\n const dot = getClockDotCenter(spec, ctx, index);\n return dot.x - dot.diameter / 2;\n },\n y: (_d: unknown, ctx: LayoutContext) => {\n const dot = getClockDotCenter(spec, ctx, index);\n return dot.y - dot.diameter / 2;\n },\n width: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).diameter,\n height: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).diameter,\n image: block.image,\n repeatX: 'no-repeat',\n repeatY: 'no-repeat',\n imageMode: 'contain',\n imagePosition: 'center',\n cornerRadius: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).diameter / 2,\n ...spec.image?.style\n }\n } as ICustomMarkSpec<'image'>)\n : ({\n type: 'symbol',\n name: `storyline-clock-dot-${index}`,\n interactive: false,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).x,\n y: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).y,\n size: (_d: unknown, ctx: LayoutContext) => getClockDotCenter(spec, ctx, index).diameter,\n symbolType: 'circle',\n fill: themeColor,\n stroke: '#ffffff',\n lineWidth: 1.5\n }\n } as ICustomMarkSpec<'symbol'>),\n // title:文字段的第一行\n block.title\n ? ({\n type: 'text',\n name: `storyline-clock-title-${index}`,\n interactive: false,\n ...spec.title,\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getClockTextRect(spec, ctx, index).x,\n y: (_d: unknown, ctx: LayoutContext) =>\n getClockTextRect(spec, ctx, index).anchorY - getTitleLineHeight(ctx),\n text: block.title,\n maxLineWidth: (_d: unknown, ctx: LayoutContext) => getClockTextRect(spec, ctx, index).width,\n fontSize: (_d: unknown, ctx: LayoutContext) => getTitleFontSize(ctx),\n lineHeight: (_d: unknown, ctx: LayoutContext) => getTitleLineHeight(ctx),\n fontWeight: 'bold',\n fill: themeColor,\n stroke: '#fff',\n lineWidth: 5,\n lineJoin: 'round',\n textAlign: (_d: unknown, ctx: LayoutContext) =>\n getClockTextRect(spec, ctx, index).onLeft ? 'right' : 'left',\n textBaseline: 'top',\n ...spec.title?.style\n }\n } as ICustomMarkSpec<'text'>)\n : null,\n // content:富文本,title 下方\n contentText.length\n ? ({\n type: 'text',\n name: `storyline-clock-content-${index}`,\n interactive: false,\n ...spec.content,\n textType: 'rich',\n style: {\n x: (_d: unknown, ctx: LayoutContext) => getClockTextRect(spec, ctx, index).x,\n y: (_d: unknown, ctx: LayoutContext) => getClockTextRect(spec, ctx, index).anchorY + 4,\n width: (_d: unknown, ctx: LayoutContext) => getClockTextRect(spec, ctx, index).width,\n maxLineWidth: (_d: unknown, ctx: LayoutContext) => getClockTextRect(spec, ctx, index).width,\n text: buildRichContent(contentText, spec),\n fontSize: CLOCK_CONTENT_FONT_SIZE,\n lineHeight: CLOCK_CONTENT_LINE_HEIGHT,\n fill: '#3a3f4d',\n textAlign: (_d: unknown, ctx: LayoutContext) =>\n getClockTextRect(spec, ctx, index).onLeft ? 'right' : 'left',\n textBaseline: 'top',\n wordBreak: 'break-word',\n ...spec.content?.style\n }\n } as ICustomMarkSpec<'text'>)\n : null\n ];\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 children: children.filter(Boolean) as ICustomMarkSpec<any>[]\n };\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ICustomMarkSpec } from '@visactor/vchart';
|
|
2
2
|
import type { IStorylineBlock, IStorylineSpec, StorylineImagePosition } from '../interface';
|
|
3
3
|
import { normalizeLayout, normalizePadding, type StorylineLayoutResult, type StorylinePoint } from '../layout';
|
|
4
4
|
export type LayoutContext = {
|
|
@@ -39,6 +39,58 @@ export declare const isWing: (spec: IStorylineSpec) => boolean;
|
|
|
39
39
|
export declare const isLadder: (spec: IStorylineSpec) => boolean;
|
|
40
40
|
export declare const getThemeColor: (spec: IStorylineSpec) => string;
|
|
41
41
|
export declare const shouldShowImageBackground: (spec: IStorylineSpec) => boolean;
|
|
42
|
+
export declare const resolveAdaptiveLineHeight: (fontSize: number, style: Record<string, unknown> | undefined, fallback: number, ratio?: number) => number;
|
|
43
|
+
export declare const resolveTitleFontSize: (spec: IStorylineSpec, ctx: LayoutContext | undefined, title: string | undefined, boxWidth: number | undefined, fallback: number, range?: [number, number]) => number;
|
|
44
|
+
export declare const resolveMarkerFontSize: (spec: IStorylineSpec, ctx: LayoutContext, marker: string | undefined, boxHeight: number | undefined, fallback: number, range?: [number, number]) => number;
|
|
45
|
+
export declare const getImageBackgroundStyle: (spec: IStorylineSpec) => {
|
|
46
|
+
fill: {
|
|
47
|
+
gradient: string;
|
|
48
|
+
x0: number;
|
|
49
|
+
y0: number;
|
|
50
|
+
x1: number;
|
|
51
|
+
y1: number;
|
|
52
|
+
stops: {
|
|
53
|
+
offset: number;
|
|
54
|
+
color: string;
|
|
55
|
+
}[];
|
|
56
|
+
};
|
|
57
|
+
stroke: string;
|
|
58
|
+
lineWidth: number;
|
|
59
|
+
shadowColor: string;
|
|
60
|
+
shadowBlur: number;
|
|
61
|
+
shadowOffsetX: number;
|
|
62
|
+
shadowOffsetY: number;
|
|
63
|
+
};
|
|
64
|
+
export declare const getTitleImageSize: (spec: IStorylineSpec, width: number, height: number, options?: {
|
|
65
|
+
widthRatio?: number;
|
|
66
|
+
maxWidth?: number;
|
|
67
|
+
heightRatio?: number;
|
|
68
|
+
}) => {
|
|
69
|
+
width: number;
|
|
70
|
+
height: number;
|
|
71
|
+
};
|
|
72
|
+
export declare const getTitleImageReservedHeight: (spec: IStorylineSpec, width: number, height: number, options?: {
|
|
73
|
+
y?: number;
|
|
74
|
+
widthRatio?: number;
|
|
75
|
+
maxWidth?: number;
|
|
76
|
+
heightRatio?: number;
|
|
77
|
+
bottom?: number;
|
|
78
|
+
}) => number;
|
|
79
|
+
export declare const getChartGeometry: (ctx: LayoutContext, spec?: {
|
|
80
|
+
width?: number;
|
|
81
|
+
height?: number;
|
|
82
|
+
}) => {
|
|
83
|
+
width: number;
|
|
84
|
+
height: number;
|
|
85
|
+
startX: number;
|
|
86
|
+
startY: number;
|
|
87
|
+
};
|
|
88
|
+
export declare const buildTopTitleImageMark: (spec: IStorylineSpec, options?: {
|
|
89
|
+
y?: number;
|
|
90
|
+
widthRatio?: number;
|
|
91
|
+
maxWidth?: number;
|
|
92
|
+
heightRatio?: number;
|
|
93
|
+
}) => ICustomMarkSpec<'image'> | null;
|
|
42
94
|
export declare const withAlpha: (color: string, alpha: number) => string;
|
|
43
95
|
export declare const resolveBlockWidth: (spec: IStorylineSpec, viewWidth: number) => number;
|
|
44
96
|
export declare const getRegionGeometry: (ctx: LayoutContext, spec?: {
|