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

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 (85) hide show
  1. package/build/index.js +1960 -0
  2. package/build/index.min.js +2 -2
  3. package/cjs/charts/image-cloud/series/image-cloud.d.ts +138 -0
  4. package/cjs/charts/storyline/index.d.ts +4 -0
  5. package/cjs/charts/storyline/index.js +22 -0
  6. package/cjs/charts/storyline/index.js.map +1 -0
  7. package/cjs/charts/storyline/interface.d.ts +59 -0
  8. package/cjs/charts/storyline/interface.js +6 -0
  9. package/cjs/charts/storyline/interface.js.map +1 -0
  10. package/cjs/charts/storyline/layout.d.ts +53 -0
  11. package/cjs/charts/storyline/layout.js +215 -0
  12. package/cjs/charts/storyline/layout.js.map +1 -0
  13. package/cjs/charts/storyline/layouts/bowl.d.ts +5 -0
  14. package/cjs/charts/storyline/layouts/bowl.js +286 -0
  15. package/cjs/charts/storyline/layouts/bowl.js.map +1 -0
  16. package/cjs/charts/storyline/layouts/clock.d.ts +5 -0
  17. package/cjs/charts/storyline/layouts/clock.js +233 -0
  18. package/cjs/charts/storyline/layouts/clock.js.map +1 -0
  19. package/cjs/charts/storyline/layouts/common.d.ts +87 -0
  20. package/cjs/charts/storyline/layouts/common.js +287 -0
  21. package/cjs/charts/storyline/layouts/common.js.map +1 -0
  22. package/cjs/charts/storyline/layouts/default.d.ts +4 -0
  23. package/cjs/charts/storyline/layouts/default.js +179 -0
  24. package/cjs/charts/storyline/layouts/default.js.map +1 -0
  25. package/cjs/charts/storyline/layouts/dome.d.ts +5 -0
  26. package/cjs/charts/storyline/layouts/dome.js +286 -0
  27. package/cjs/charts/storyline/layouts/dome.js.map +1 -0
  28. package/cjs/charts/storyline/layouts/landscape.d.ts +4 -0
  29. package/cjs/charts/storyline/layouts/landscape.js +254 -0
  30. package/cjs/charts/storyline/layouts/landscape.js.map +1 -0
  31. package/cjs/charts/storyline/layouts/portrait.d.ts +4 -0
  32. package/cjs/charts/storyline/layouts/portrait.js +241 -0
  33. package/cjs/charts/storyline/layouts/portrait.js.map +1 -0
  34. package/cjs/charts/storyline/storyline-transformer.d.ts +4 -0
  35. package/cjs/charts/storyline/storyline-transformer.js +62 -0
  36. package/cjs/charts/storyline/storyline-transformer.js.map +1 -0
  37. package/cjs/charts/storyline/storyline.d.ts +16 -0
  38. package/cjs/charts/storyline/storyline.js +36 -0
  39. package/cjs/charts/storyline/storyline.js.map +1 -0
  40. package/cjs/components/map-label/map-label.d.ts +52 -0
  41. package/cjs/index.d.ts +1 -0
  42. package/cjs/index.js +5 -5
  43. package/cjs/index.js.map +1 -1
  44. package/esm/charts/image-cloud/series/image-cloud.d.ts +138 -0
  45. package/esm/charts/storyline/index.d.ts +4 -0
  46. package/esm/charts/storyline/index.js +8 -0
  47. package/esm/charts/storyline/index.js.map +1 -0
  48. package/esm/charts/storyline/interface.d.ts +59 -0
  49. package/esm/charts/storyline/interface.js +2 -0
  50. package/esm/charts/storyline/interface.js.map +1 -0
  51. package/esm/charts/storyline/layout.d.ts +53 -0
  52. package/esm/charts/storyline/layout.js +205 -0
  53. package/esm/charts/storyline/layout.js.map +1 -0
  54. package/esm/charts/storyline/layouts/bowl.d.ts +5 -0
  55. package/esm/charts/storyline/layouts/bowl.js +278 -0
  56. package/esm/charts/storyline/layouts/bowl.js.map +1 -0
  57. package/esm/charts/storyline/layouts/clock.d.ts +5 -0
  58. package/esm/charts/storyline/layouts/clock.js +227 -0
  59. package/esm/charts/storyline/layouts/clock.js.map +1 -0
  60. package/esm/charts/storyline/layouts/common.d.ts +87 -0
  61. package/esm/charts/storyline/layouts/common.js +255 -0
  62. package/esm/charts/storyline/layouts/common.js.map +1 -0
  63. package/esm/charts/storyline/layouts/default.d.ts +4 -0
  64. package/esm/charts/storyline/layouts/default.js +172 -0
  65. package/esm/charts/storyline/layouts/default.js.map +1 -0
  66. package/esm/charts/storyline/layouts/dome.d.ts +5 -0
  67. package/esm/charts/storyline/layouts/dome.js +278 -0
  68. package/esm/charts/storyline/layouts/dome.js.map +1 -0
  69. package/esm/charts/storyline/layouts/landscape.d.ts +4 -0
  70. package/esm/charts/storyline/layouts/landscape.js +250 -0
  71. package/esm/charts/storyline/layouts/landscape.js.map +1 -0
  72. package/esm/charts/storyline/layouts/portrait.d.ts +4 -0
  73. package/esm/charts/storyline/layouts/portrait.js +238 -0
  74. package/esm/charts/storyline/layouts/portrait.js.map +1 -0
  75. package/esm/charts/storyline/storyline-transformer.d.ts +4 -0
  76. package/esm/charts/storyline/storyline-transformer.js +61 -0
  77. package/esm/charts/storyline/storyline-transformer.js.map +1 -0
  78. package/esm/charts/storyline/storyline.d.ts +16 -0
  79. package/esm/charts/storyline/storyline.js +29 -0
  80. package/esm/charts/storyline/storyline.js.map +1 -0
  81. package/esm/components/map-label/map-label.d.ts +52 -0
  82. package/esm/index.d.ts +1 -0
  83. package/esm/index.js +2 -0
  84. package/esm/index.js.map +1 -1
  85. package/package.json +8 -8
@@ -0,0 +1,138 @@
1
+ import type { IImageCloudSeriesSpec } from './interface';
2
+ import { ImageCloudMarkNameEnum } from './constant';
3
+ import type { IPoint } from '@visactor/vchart';
4
+ import { createImage } from '@visactor/vchart';
5
+ import type { Datum, IImageMark, IMark, IRectMark } from '@visactor/vchart';
6
+ import { BaseSeries } from '@visactor/vchart';
7
+ export declare class ImageCloudSeries<T extends IImageCloudSeriesSpec> extends BaseSeries<T> {
8
+ static readonly type: string;
9
+ type: string;
10
+ static readonly mark: {
11
+ image: {
12
+ name: ImageCloudMarkNameEnum;
13
+ type: import("@visactor/vchart").MarkTypeEnum;
14
+ };
15
+ imageMask: {
16
+ name: ImageCloudMarkNameEnum;
17
+ type: import("@visactor/vchart").MarkTypeEnum;
18
+ };
19
+ label?: import("@visactor/vchart").ISeriesMarkInfo;
20
+ point?: import("@visactor/vchart").ISeriesMarkInfo;
21
+ line?: import("@visactor/vchart").ISeriesMarkInfo;
22
+ area?: import("@visactor/vchart").ISeriesMarkInfo;
23
+ bar?: import("@visactor/vchart").ISeriesMarkInfo;
24
+ boxPlot?: import("@visactor/vchart").ISeriesMarkInfo;
25
+ outlier?: import("@visactor/vchart").ISeriesMarkInfo;
26
+ circlePacking?: import("@visactor/vchart").ISeriesMarkInfo;
27
+ group?: import("@visactor/vchart").ISeriesMarkInfo;
28
+ gridBackground?: import("@visactor/vchart").ISeriesMarkInfo;
29
+ grid?: import("@visactor/vchart").ISeriesMarkInfo;
30
+ dot?: import("@visactor/vchart").ISeriesMarkInfo;
31
+ title?: import("@visactor/vchart").ISeriesMarkInfo;
32
+ subTitle?: import("@visactor/vchart").ISeriesMarkInfo;
33
+ symbol?: import("@visactor/vchart").ISeriesMarkInfo;
34
+ funnel?: import("@visactor/vchart").ISeriesMarkInfo;
35
+ transform?: import("@visactor/vchart").ISeriesMarkInfo;
36
+ transformLabel?: import("@visactor/vchart").ISeriesMarkInfo;
37
+ outerLabel?: import("@visactor/vchart").ISeriesMarkInfo;
38
+ outerLabelLine?: import("@visactor/vchart").ISeriesMarkInfo;
39
+ pin?: import("@visactor/vchart").ISeriesMarkInfo;
40
+ pinBackground?: import("@visactor/vchart").ISeriesMarkInfo;
41
+ pointer?: import("@visactor/vchart").ISeriesMarkInfo;
42
+ segment?: import("@visactor/vchart").ISeriesMarkInfo;
43
+ track?: import("@visactor/vchart").ISeriesMarkInfo;
44
+ cell?: import("@visactor/vchart").ISeriesMarkInfo;
45
+ cellBackground?: import("@visactor/vchart").ISeriesMarkInfo;
46
+ link?: import("@visactor/vchart").ISeriesMarkInfo;
47
+ arrow?: import("@visactor/vchart").ISeriesMarkInfo;
48
+ pie?: import("@visactor/vchart").ISeriesMarkInfo;
49
+ labelLine?: import("@visactor/vchart").ISeriesMarkInfo;
50
+ progress?: import("@visactor/vchart").ISeriesMarkInfo;
51
+ minLabel?: import("@visactor/vchart").ISeriesMarkInfo;
52
+ maxLabel?: import("@visactor/vchart").ISeriesMarkInfo;
53
+ rose?: import("@visactor/vchart").ISeriesMarkInfo;
54
+ node?: import("@visactor/vchart").ISeriesMarkInfo;
55
+ sunburst?: import("@visactor/vchart").ISeriesMarkInfo;
56
+ nonLeaf?: import("@visactor/vchart").ISeriesMarkInfo;
57
+ leaf?: import("@visactor/vchart").ISeriesMarkInfo;
58
+ nonLeafLabel?: import("@visactor/vchart").ISeriesMarkInfo;
59
+ leaderLine?: import("@visactor/vchart").ISeriesMarkInfo;
60
+ stackLabel?: import("@visactor/vchart").ISeriesMarkInfo;
61
+ word?: import("@visactor/vchart").ISeriesMarkInfo;
62
+ fillingWord?: import("@visactor/vchart").ISeriesMarkInfo;
63
+ wordMask?: import("@visactor/vchart").ISeriesMarkInfo;
64
+ nodePoint?: import("@visactor/vchart").ISeriesMarkInfo;
65
+ ripplePoint?: import("@visactor/vchart").ISeriesMarkInfo;
66
+ centerPoint?: import("@visactor/vchart").ISeriesMarkInfo;
67
+ centerLabel?: import("@visactor/vchart").ISeriesMarkInfo;
68
+ barBackground?: import("@visactor/vchart").ISeriesMarkInfo;
69
+ lineLabel?: import("@visactor/vchart").ISeriesMarkInfo;
70
+ areaLabel?: import("@visactor/vchart").ISeriesMarkInfo;
71
+ liquidGroup?: import("@visactor/vchart").ISeriesMarkInfo;
72
+ liquid?: import("@visactor/vchart").ISeriesMarkInfo;
73
+ liquidBackground?: import("@visactor/vchart").ISeriesMarkInfo;
74
+ liquidOutline?: import("@visactor/vchart").ISeriesMarkInfo;
75
+ circle?: import("@visactor/vchart").ISeriesMarkInfo;
76
+ overlap?: import("@visactor/vchart").ISeriesMarkInfo;
77
+ overlapLabel?: import("@visactor/vchart").ISeriesMarkInfo;
78
+ };
79
+ protected _urlField: string;
80
+ protected _nameField?: string;
81
+ protected _valueField?: string;
82
+ setValueField(field: string): void;
83
+ protected _imageMark?: IImageMark;
84
+ protected _maskMark?: IRectMark;
85
+ setAttrFromSpec(): void;
86
+ initMark(): void;
87
+ initMarkStyle(): void;
88
+ protected _initImageMarkStyle(): void;
89
+ protected isFillingImage(datum: Datum): boolean;
90
+ protected _initMaskMarkStyle(): void;
91
+ protected initTooltip(): void;
92
+ protected _imageCloudTransformOption(): {
93
+ size: () => number[];
94
+ image: {
95
+ field: string;
96
+ };
97
+ weight: {
98
+ field: string;
99
+ };
100
+ imageConfig: {
101
+ imageSize: number;
102
+ imageSizeRange: [number, number];
103
+ padding: number;
104
+ };
105
+ ratio: number;
106
+ mask: string | import("@visactor/vchart").TextShapeMask | import("@visactor/vchart").GeometricMaskShape;
107
+ maskConfig: {
108
+ visible?: boolean;
109
+ threshold?: number;
110
+ invert?: boolean;
111
+ removeWhiteBorder?: boolean;
112
+ style?: Partial<import("@visactor/vchart").IImageMarkSpec>;
113
+ };
114
+ layoutConfig: import("@visactor/vchart").LayoutConfigType;
115
+ createCanvas: (params: import("@visactor/vrender-core").ICreateCanvasParams) => any;
116
+ createImage: typeof createImage;
117
+ onUpdateMaskCanvas: (inputImage?: HTMLCanvasElement, maskImage?: HTMLCanvasElement) => void;
118
+ onLayoutFinished: () => void;
119
+ };
120
+ protected _buildMarkAttributeContext(): void;
121
+ initAnimation(): void;
122
+ getDimensionField(): string[];
123
+ getMeasureField(): string[];
124
+ getStatisticFields(): {
125
+ key: string;
126
+ operations: Array<'max' | 'min' | 'values'>;
127
+ }[];
128
+ getActiveMarks(): IMark[];
129
+ getMarkData(datum: Datum): any;
130
+ getGroupFields(): string[];
131
+ dataToPosition(data: Datum): IPoint | null;
132
+ dataToPositionX(data: Datum): number | null;
133
+ dataToPositionY(data: Datum): number | null;
134
+ valueToPosition(value1: any, value2?: any): null;
135
+ getStackGroupFields(): string[];
136
+ getStackValueField(): string;
137
+ }
138
+ export declare const registerImageCloudSeries: () => void;
@@ -0,0 +1,4 @@
1
+ export * from './interface';
2
+ export * from './layout';
3
+ export * from './storyline';
4
+ export * from './storyline-transformer';
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ var __createBinding = this && this.__createBinding || (Object.create ? function(o, m, k, k2) {
4
+ void 0 === k2 && (k2 = k);
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ desc && !("get" in desc ? !m.__esModule : desc.writable || desc.configurable) || (desc = {
7
+ enumerable: !0,
8
+ get: function() {
9
+ return m[k];
10
+ }
11
+ }), Object.defineProperty(o, k2, desc);
12
+ } : function(o, m, k, k2) {
13
+ void 0 === k2 && (k2 = k), o[k2] = m[k];
14
+ }), __exportStar = this && this.__exportStar || function(m, exports) {
15
+ for (var p in m) "default" === p || Object.prototype.hasOwnProperty.call(exports, p) || __createBinding(exports, m, p);
16
+ };
17
+
18
+ Object.defineProperty(exports, "__esModule", {
19
+ value: !0
20
+ }), __exportStar(require("./interface"), exports), __exportStar(require("./layout"), exports),
21
+ __exportStar(require("./storyline"), exports), __exportStar(require("./storyline-transformer"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/charts/storyline/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,2CAAyB;AACzB,8CAA4B;AAC5B,0DAAwC","file":"index.js","sourcesContent":["export * from './interface';\nexport * from './layout';\nexport * from './storyline';\nexport * from './storyline-transformer';\n"]}
@@ -0,0 +1,59 @@
1
+ import type { IChartSpec, IComposedTextMarkSpec, IImageMarkSpec, IMarkSpec, IPathMarkSpec, IRectMarkSpec, ITextMarkSpec, StringOrNumber } from '@visactor/vchart';
2
+ export type StorylineLayoutType = 'clock' | 'bowl' | 'dome' | 'left-wing' | 'right-wing' | 'landscape' | 'portrait' | 'up-ladder' | 'down-ladder' | 'pulse' | 'spiral';
3
+ export type StorylineImagePosition = 'top' | 'left' | 'right' | 'bottom';
4
+ export type StorylineLineType = 'line' | 'polyline' | 'curve';
5
+ export interface IStorylineBlock {
6
+ id?: StringOrNumber;
7
+ title?: string;
8
+ content?: string | string[];
9
+ image?: string | HTMLImageElement | HTMLCanvasElement;
10
+ datum?: unknown;
11
+ }
12
+ export interface IStorylineLayoutOptions {
13
+ type: StorylineLayoutType;
14
+ padding?: number | [number, number, number, number];
15
+ radiusRatio?: number;
16
+ startAngle?: number;
17
+ endAngle?: number;
18
+ }
19
+ export interface IStorylineBlockSpec {
20
+ width?: number;
21
+ widthRatio?: number;
22
+ minWidth?: number;
23
+ maxWidth?: number;
24
+ height?: number;
25
+ padding?: number | [number, number, number, number];
26
+ gap?: number;
27
+ style?: Partial<IRectMarkSpec>;
28
+ }
29
+ export interface IStorylineImageSpec extends IMarkSpec<IImageMarkSpec> {
30
+ width?: number;
31
+ height?: number;
32
+ position?: StorylineImagePosition;
33
+ gap?: number;
34
+ }
35
+ export interface IStorylineCenterImageSpec extends IMarkSpec<IImageMarkSpec> {
36
+ width?: number;
37
+ height?: number;
38
+ visible?: boolean;
39
+ image?: string | HTMLImageElement | HTMLCanvasElement;
40
+ }
41
+ export interface IStorylineLineSpec extends IMarkSpec<IPathMarkSpec> {
42
+ visible?: boolean;
43
+ type?: StorylineLineType;
44
+ showArrow?: boolean;
45
+ arrowSize?: number;
46
+ distance?: number;
47
+ }
48
+ export interface IStorylineSpec extends Omit<IChartSpec, 'type' | 'data' | 'series' | 'title' | 'layout'> {
49
+ type: 'storyline';
50
+ data: IStorylineBlock[];
51
+ layout?: StorylineLayoutType | IStorylineLayoutOptions;
52
+ block?: IStorylineBlockSpec;
53
+ title?: IMarkSpec<ITextMarkSpec>;
54
+ content?: IMarkSpec<IComposedTextMarkSpec>;
55
+ image?: IStorylineImageSpec;
56
+ centerImage?: IStorylineCenterImageSpec;
57
+ line?: IStorylineLineSpec;
58
+ themeColor?: string;
59
+ }
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ });
6
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/charts/storyline/interface.ts"],"names":[],"mappings":"","file":"interface.js","sourcesContent":["import type {\n IChartSpec,\n IComposedTextMarkSpec,\n IImageMarkSpec,\n IMarkSpec,\n IPathMarkSpec,\n IRectMarkSpec,\n ITextMarkSpec,\n StringOrNumber\n} from '@visactor/vchart';\n\nexport type StorylineLayoutType =\n | 'clock'\n | 'bowl'\n | 'dome'\n | 'left-wing'\n | 'right-wing'\n | 'landscape'\n | 'portrait'\n | 'up-ladder'\n | 'down-ladder'\n | 'pulse'\n | 'spiral';\n\nexport type StorylineImagePosition = 'top' | 'left' | 'right' | 'bottom';\nexport type StorylineLineType = 'line' | 'polyline' | 'curve';\n\nexport interface IStorylineBlock {\n id?: StringOrNumber;\n title?: string;\n content?: string | string[];\n image?: string | HTMLImageElement | HTMLCanvasElement;\n datum?: unknown;\n}\n\nexport interface IStorylineLayoutOptions {\n type: StorylineLayoutType;\n /**\n * 边缘留白,支持单值或 [top, right, bottom, left]。\n */\n padding?: number | [number, number, number, number];\n /**\n * 对 circular/arc 布局生效,控制半径占可用空间的比例。\n */\n radiusRatio?: number;\n /**\n * 对 circular/arc 布局生效,角度单位为度。\n */\n startAngle?: number;\n /**\n * 对 circular/arc 布局生效,角度单位为度。\n */\n endAngle?: number;\n}\n\nexport interface IStorylineBlockSpec {\n width?: number;\n widthRatio?: number;\n minWidth?: number;\n maxWidth?: number;\n height?: number;\n padding?: number | [number, number, number, number];\n gap?: number;\n style?: Partial<IRectMarkSpec>;\n}\n\nexport interface IStorylineImageSpec extends IMarkSpec<IImageMarkSpec> {\n width?: number;\n height?: number;\n position?: StorylineImagePosition;\n gap?: number;\n}\n\nexport interface IStorylineCenterImageSpec extends IMarkSpec<IImageMarkSpec> {\n width?: number;\n height?: number;\n visible?: boolean;\n image?: string | HTMLImageElement | HTMLCanvasElement;\n}\n\nexport interface IStorylineLineSpec extends IMarkSpec<IPathMarkSpec> {\n visible?: boolean;\n type?: StorylineLineType;\n showArrow?: boolean;\n arrowSize?: number;\n /**\n * 连接线和 block 边缘之间的距离。\n */\n distance?: number;\n}\n\nexport interface IStorylineSpec extends Omit<IChartSpec, 'type' | 'data' | 'series' | 'title' | 'layout'> {\n type: 'storyline';\n data: IStorylineBlock[];\n layout?: StorylineLayoutType | IStorylineLayoutOptions;\n block?: IStorylineBlockSpec;\n title?: IMarkSpec<ITextMarkSpec>;\n content?: IMarkSpec<IComposedTextMarkSpec>;\n image?: IStorylineImageSpec;\n centerImage?: IStorylineCenterImageSpec;\n line?: IStorylineLineSpec;\n themeColor?: string;\n}\n"]}
@@ -0,0 +1,53 @@
1
+ import type { IStorylineBlock, IStorylineLayoutOptions, StorylineLayoutType } from './interface';
2
+ export interface StorylineSize {
3
+ width: number;
4
+ height: number;
5
+ }
6
+ export interface StorylinePadding {
7
+ top: number;
8
+ right: number;
9
+ bottom: number;
10
+ left: number;
11
+ }
12
+ export interface StorylinePoint {
13
+ x: number;
14
+ y: number;
15
+ }
16
+ export interface StorylineBlockPosition extends StorylinePoint, StorylineSize {
17
+ id: string | number;
18
+ index: number;
19
+ datum: IStorylineBlock;
20
+ center: StorylinePoint;
21
+ }
22
+ export interface StorylineLinkPosition {
23
+ from: StorylineBlockPosition;
24
+ to: StorylineBlockPosition;
25
+ start: StorylinePoint;
26
+ end: StorylinePoint;
27
+ points: StorylinePoint[];
28
+ }
29
+ export interface StorylineCircleGuide {
30
+ center: StorylinePoint;
31
+ radius: number;
32
+ }
33
+ export interface StorylineLayoutResult {
34
+ blocks: StorylineBlockPosition[];
35
+ links: StorylineLinkPosition[];
36
+ circleGuide?: StorylineCircleGuide;
37
+ }
38
+ export interface StorylineComputeOptions {
39
+ layout: StorylineLayoutType | IStorylineLayoutOptions | undefined;
40
+ viewBox: StorylineSize;
41
+ block: StorylineSize;
42
+ gap?: number;
43
+ padding?: number | [number, number, number, number];
44
+ lineDistance?: number;
45
+ }
46
+ export declare const normalizePadding: (padding?: number | [
47
+ number,
48
+ number,
49
+ number,
50
+ number
51
+ ]) => StorylinePadding;
52
+ export declare const normalizeLayout: (layout?: StorylineLayoutType | IStorylineLayoutOptions) => IStorylineLayoutOptions;
53
+ export declare const computeStorylineLayout: (data: IStorylineBlock[], options: StorylineComputeOptions) => StorylineLayoutResult;
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.computeStorylineLayout = exports.normalizeLayout = exports.normalizePadding = void 0;
6
+
7
+ const DEFAULT_LAYOUT = "landscape", DEFAULT_PADDING = 24, normalizePadding = padding => {
8
+ var _a, _b, _c, _d;
9
+ if (Array.isArray(padding)) return {
10
+ top: null !== (_a = padding[0]) && void 0 !== _a ? _a : 0,
11
+ right: null !== (_b = padding[1]) && void 0 !== _b ? _b : 0,
12
+ bottom: null !== (_c = padding[2]) && void 0 !== _c ? _c : 0,
13
+ left: null !== (_d = padding[3]) && void 0 !== _d ? _d : 0
14
+ };
15
+ const value = null != padding ? padding : 24;
16
+ return {
17
+ top: value,
18
+ right: value,
19
+ bottom: value,
20
+ left: value
21
+ };
22
+ };
23
+
24
+ exports.normalizePadding = normalizePadding;
25
+
26
+ const normalizeLayout = layout => layout ? "string" == typeof layout ? {
27
+ type: layout
28
+ } : layout : {
29
+ type: "landscape"
30
+ };
31
+
32
+ exports.normalizeLayout = normalizeLayout;
33
+
34
+ const computeStorylineLayout = (data, options) => {
35
+ var _a, _b, _c;
36
+ const layout = (0, exports.normalizeLayout)(options.layout), padding = (0, exports.normalizePadding)(null !== (_a = layout.padding) && void 0 !== _a ? _a : options.padding), gap = null !== (_b = options.gap) && void 0 !== _b ? _b : 40, lineDistance = null !== (_c = options.lineDistance) && void 0 !== _c ? _c : 8, blocks = computeBlockPositions(data, layout, options.viewBox, options.block, padding, gap), circleGuide = "clock" === layout.type ? computeClockCircleGuide(options.viewBox, options.block, padding, layout) : void 0;
37
+ return {
38
+ blocks: blocks,
39
+ links: computeLinks(blocks, lineDistance),
40
+ circleGuide: circleGuide
41
+ };
42
+ };
43
+
44
+ exports.computeStorylineLayout = computeStorylineLayout;
45
+
46
+ const computeBlockPositions = (data, layout, viewBox, block, padding, gap) => {
47
+ const count = data.length;
48
+ if (!count) return [];
49
+ const inner = {
50
+ x: padding.left,
51
+ y: padding.top,
52
+ width: Math.max(viewBox.width - padding.left - padding.right, block.width),
53
+ height: Math.max(viewBox.height - padding.top - padding.bottom, block.height)
54
+ }, center = {
55
+ x: inner.x + inner.width / 2,
56
+ y: inner.y + inner.height / 2
57
+ };
58
+ let centers;
59
+ switch (layout.type) {
60
+ case "portrait":
61
+ centers = lineCenters(count, center.x, inner.y + block.height / 2, center.x, inner.y + inner.height - block.height / 2);
62
+ break;
63
+
64
+ case "up-ladder":
65
+ centers = lineCenters(count, inner.x + block.width / 2, inner.y + inner.height - block.height / 2, inner.x + inner.width - block.width / 2, inner.y + block.height / 2);
66
+ break;
67
+
68
+ case "down-ladder":
69
+ centers = lineCenters(count, inner.x + block.width / 2, inner.y + block.height / 2, inner.x + inner.width - block.width / 2, inner.y + inner.height - block.height / 2);
70
+ break;
71
+
72
+ case "pulse":
73
+ centers = alternatingHorizontalCenters(count, inner, block, gap);
74
+ break;
75
+
76
+ case "spiral":
77
+ centers = alternatingVerticalCenters(count, inner, block, gap);
78
+ break;
79
+
80
+ case "clock":
81
+ centers = circularCenters(count, viewBox, block, padding, layout);
82
+ break;
83
+
84
+ case "bowl":
85
+ centers = arcCenters(count, inner, block, layout, 200, 340);
86
+ break;
87
+
88
+ case "dome":
89
+ centers = arcCenters(count, inner, block, layout, 160, 20);
90
+ break;
91
+
92
+ case "left-wing":
93
+ centers = arcCenters(count, inner, block, layout, 250, 110);
94
+ break;
95
+
96
+ case "right-wing":
97
+ centers = arcCenters(count, inner, block, layout, -70, 70);
98
+ break;
99
+
100
+ default:
101
+ centers = lineCenters(count, inner.x + block.width / 2, center.y, inner.x + inner.width - block.width / 2, center.y);
102
+ }
103
+ return centers.map(((point, index) => {
104
+ var _a, _b;
105
+ return {
106
+ id: null !== (_b = null === (_a = data[index]) || void 0 === _a ? void 0 : _a.id) && void 0 !== _b ? _b : index,
107
+ index: index,
108
+ datum: data[index],
109
+ width: block.width,
110
+ height: block.height,
111
+ x: point.x - block.width / 2,
112
+ y: point.y - block.height / 2,
113
+ center: point
114
+ };
115
+ }));
116
+ }, lineCenters = (count, x0, y0, x1, y1) => 1 === count ? [ {
117
+ x: (x0 + x1) / 2,
118
+ y: (y0 + y1) / 2
119
+ } ] : Array.from({
120
+ length: count
121
+ }, ((_, index) => {
122
+ const t = index / (count - 1);
123
+ return {
124
+ x: x0 + (x1 - x0) * t,
125
+ y: y0 + (y1 - y0) * t
126
+ };
127
+ })), alternatingHorizontalCenters = (count, inner, block, gap) => {
128
+ const baseY = inner.y + inner.height / 2, offset = Math.min(Math.max(.65 * block.height + gap / 2, 0), Math.max((inner.height - block.height) / 2, 0));
129
+ return lineCenters(count, inner.x + block.width / 2, baseY, inner.x + inner.width - block.width / 2, baseY).map(((point, index) => ({
130
+ x: point.x,
131
+ y: point.y + (index % 2 == 0 ? -offset : offset)
132
+ })));
133
+ }, alternatingVerticalCenters = (count, inner, block, gap) => {
134
+ const baseX = inner.x + inner.width / 2, offset = Math.min(Math.max(.65 * block.width + gap / 2, 0), Math.max((inner.width - block.width) / 2, 0));
135
+ return lineCenters(count, baseX, inner.y + block.height / 2, baseX, inner.y + inner.height - block.height / 2).map(((point, index) => ({
136
+ x: point.x + (index % 2 == 0 ? -offset : offset),
137
+ y: point.y
138
+ })));
139
+ }, circularCenters = (count, viewBox, block, padding, layout) => {
140
+ var _a;
141
+ const guide = computeClockCircleGuide(viewBox, block, padding, layout), startAngle = null !== (_a = layout.startAngle) && void 0 !== _a ? _a : -90;
142
+ if (1 === count) {
143
+ const angle = degreeToRadian(startAngle);
144
+ return [ {
145
+ x: guide.center.x + Math.cos(angle) * guide.radius,
146
+ y: guide.center.y + Math.sin(angle) * guide.radius
147
+ } ];
148
+ }
149
+ return Array.from({
150
+ length: count
151
+ }, ((_, index) => {
152
+ const angle = degreeToRadian(startAngle + 360 * index / count);
153
+ return {
154
+ x: guide.center.x + Math.cos(angle) * guide.radius,
155
+ y: guide.center.y + Math.sin(angle) * guide.radius
156
+ };
157
+ }));
158
+ }, computeClockCircleGuide = (viewBox, block, padding, layout) => {
159
+ var _a;
160
+ const innerWidth = Math.max(viewBox.width - padding.left - padding.right, 1), innerHeight = Math.max(viewBox.height - padding.top - padding.bottom, 1), center = {
161
+ x: padding.left + innerWidth / 2,
162
+ y: padding.top + innerHeight / 2
163
+ }, ratio = null !== (_a = layout.radiusRatio) && void 0 !== _a ? _a : .7, maxRadius = Math.max(Math.min(innerWidth - block.width, innerHeight - block.height) / 2, 1);
164
+ return {
165
+ center: center,
166
+ radius: Math.max(1, maxRadius * ratio)
167
+ };
168
+ }, arcCenters = (count, inner, block, layout, fallbackStartAngle, fallbackEndAngle, defaultRatio = .88) => {
169
+ var _a, _b, _c, _d, _e;
170
+ const startAngle = null !== (_b = null !== (_a = layout.startAngle) && void 0 !== _a ? _a : fallbackStartAngle) && void 0 !== _b ? _b : -90, endAngle = null !== (_d = null !== (_c = layout.endAngle) && void 0 !== _c ? _c : fallbackEndAngle) && void 0 !== _d ? _d : 270, ratio = null !== (_e = layout.radiusRatio) && void 0 !== _e ? _e : defaultRatio, rx = Math.max((inner.width - block.width) / 2, 1) * ratio, ry = Math.max((inner.height - block.height) / 2, 1) * ratio, center_x = inner.x + inner.width / 2, center_y = inner.y + inner.height / 2;
171
+ if (1 === count) {
172
+ const angle = degreeToRadian((startAngle + endAngle) / 2);
173
+ return [ {
174
+ x: center_x + Math.cos(angle) * rx,
175
+ y: center_y + Math.sin(angle) * ry
176
+ } ];
177
+ }
178
+ return Array.from({
179
+ length: count
180
+ }, ((_, index) => {
181
+ const t = index / (count - 1), angle = degreeToRadian(startAngle + angleDelta(startAngle, endAngle) * t);
182
+ return {
183
+ x: center_x + Math.cos(angle) * rx,
184
+ y: center_y + Math.sin(angle) * ry
185
+ };
186
+ }));
187
+ }, angleDelta = (startAngle, endAngle) => {
188
+ const delta = endAngle - startAngle;
189
+ return Math.abs(delta) >= 360 ? 360 : delta;
190
+ }, degreeToRadian = degree => degree / 180 * Math.PI, computeLinks = (blocks, distance) => {
191
+ const links = [];
192
+ for (let i = 0; i < blocks.length - 1; i++) {
193
+ const from = blocks[i], to = blocks[i + 1], start = pointOnBlockEdge(from, to.center, distance), end = pointOnBlockEdge(to, from.center, distance);
194
+ links.push({
195
+ from: from,
196
+ to: to,
197
+ start: start,
198
+ end: end,
199
+ points: [ start, end ]
200
+ });
201
+ }
202
+ return links;
203
+ }, pointOnBlockEdge = (block, toward, distance) => {
204
+ const dx = toward.x - block.center.x, dy = toward.y - block.center.y;
205
+ if (0 === dx && 0 === dy) return {
206
+ x: block.center.x,
207
+ y: block.center.y
208
+ };
209
+ const scaleX = 0 === dx ? Number.POSITIVE_INFINITY : block.width / 2 / Math.abs(dx), scaleY = 0 === dy ? Number.POSITIVE_INFINITY : block.height / 2 / Math.abs(dy), scale = Math.min(scaleX, scaleY), length = Math.sqrt(dx * dx + dy * dy) || 1;
210
+ return {
211
+ x: block.center.x + dx * scale + dx / length * distance,
212
+ y: block.center.y + dy * scale + dy / length * distance
213
+ };
214
+ };
215
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/charts/storyline/layout.ts"],"names":[],"mappings":"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","file":"layout.js","sourcesContent":["import type { IStorylineBlock, IStorylineLayoutOptions, StorylineLayoutType } from './interface';\n\nexport interface StorylineSize {\n width: number;\n height: number;\n}\n\nexport interface StorylinePadding {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\nexport interface StorylinePoint {\n x: number;\n y: number;\n}\n\nexport interface StorylineBlockPosition extends StorylinePoint, StorylineSize {\n id: string | number;\n index: number;\n datum: IStorylineBlock;\n center: StorylinePoint;\n}\n\nexport interface StorylineLinkPosition {\n from: StorylineBlockPosition;\n to: StorylineBlockPosition;\n start: StorylinePoint;\n end: StorylinePoint;\n points: StorylinePoint[];\n}\n\nexport interface StorylineCircleGuide {\n center: StorylinePoint;\n radius: number;\n}\n\nexport interface StorylineLayoutResult {\n blocks: StorylineBlockPosition[];\n links: StorylineLinkPosition[];\n circleGuide?: StorylineCircleGuide;\n}\n\nexport interface StorylineComputeOptions {\n layout: StorylineLayoutType | IStorylineLayoutOptions | undefined;\n viewBox: StorylineSize;\n block: StorylineSize;\n gap?: number;\n padding?: number | [number, number, number, number];\n lineDistance?: number;\n}\n\nconst DEFAULT_LAYOUT: StorylineLayoutType = 'landscape';\nconst DEFAULT_PADDING = 24;\n\nexport const normalizePadding = (padding?: number | [number, number, number, number]): StorylinePadding => {\n if (Array.isArray(padding)) {\n return {\n top: padding[0] ?? 0,\n right: padding[1] ?? 0,\n bottom: padding[2] ?? 0,\n left: padding[3] ?? 0\n };\n }\n const value = padding ?? DEFAULT_PADDING;\n return { top: value, right: value, bottom: value, left: value };\n};\n\nexport const normalizeLayout = (layout?: StorylineLayoutType | IStorylineLayoutOptions): IStorylineLayoutOptions => {\n if (!layout) {\n return { type: DEFAULT_LAYOUT };\n }\n if (typeof layout === 'string') {\n return { type: layout };\n }\n return layout;\n};\n\nexport const computeStorylineLayout = (\n data: IStorylineBlock[],\n options: StorylineComputeOptions\n): StorylineLayoutResult => {\n const layout = normalizeLayout(options.layout);\n const padding = normalizePadding(layout.padding ?? options.padding);\n const gap = options.gap ?? 40;\n const lineDistance = options.lineDistance ?? 8;\n const blocks = computeBlockPositions(data, layout, options.viewBox, options.block, padding, gap);\n const circleGuide =\n layout.type === 'clock' ? computeClockCircleGuide(options.viewBox, options.block, padding, layout) : undefined;\n return {\n blocks,\n links: computeLinks(blocks, lineDistance),\n circleGuide\n };\n};\n\nconst computeBlockPositions = (\n data: IStorylineBlock[],\n layout: IStorylineLayoutOptions,\n viewBox: StorylineSize,\n block: StorylineSize,\n padding: StorylinePadding,\n gap: number\n): StorylineBlockPosition[] => {\n const count = data.length;\n if (!count) {\n return [];\n }\n\n const inner = {\n x: padding.left,\n y: padding.top,\n width: Math.max(viewBox.width - padding.left - padding.right, block.width),\n height: Math.max(viewBox.height - padding.top - padding.bottom, block.height)\n };\n const center = {\n x: inner.x + inner.width / 2,\n y: inner.y + inner.height / 2\n };\n\n let centers: StorylinePoint[];\n switch (layout.type) {\n case 'portrait':\n centers = lineCenters(\n count,\n center.x,\n inner.y + block.height / 2,\n center.x,\n inner.y + inner.height - block.height / 2\n );\n break;\n case 'up-ladder':\n centers = lineCenters(\n count,\n inner.x + block.width / 2,\n inner.y + inner.height - block.height / 2,\n inner.x + inner.width - block.width / 2,\n inner.y + block.height / 2\n );\n break;\n case 'down-ladder':\n centers = lineCenters(\n count,\n inner.x + block.width / 2,\n inner.y + block.height / 2,\n inner.x + inner.width - block.width / 2,\n inner.y + inner.height - block.height / 2\n );\n break;\n case 'pulse':\n centers = alternatingHorizontalCenters(count, inner, block, gap);\n break;\n case 'spiral':\n centers = alternatingVerticalCenters(count, inner, block, gap);\n break;\n case 'clock':\n centers = circularCenters(count, viewBox, block, padding, layout);\n break;\n case 'bowl':\n centers = arcCenters(count, inner, block, layout, 200, 340);\n break;\n case 'dome':\n centers = arcCenters(count, inner, block, layout, 160, 20);\n break;\n case 'left-wing':\n centers = arcCenters(count, inner, block, layout, 250, 110);\n break;\n case 'right-wing':\n centers = arcCenters(count, inner, block, layout, -70, 70);\n break;\n case 'landscape':\n default:\n centers = lineCenters(\n count,\n inner.x + block.width / 2,\n center.y,\n inner.x + inner.width - block.width / 2,\n center.y\n );\n break;\n }\n\n return centers.map((point, index) => ({\n id: data[index]?.id ?? index,\n index,\n datum: data[index],\n width: block.width,\n height: block.height,\n x: point.x - block.width / 2,\n y: point.y - block.height / 2,\n center: point\n }));\n};\n\nconst lineCenters = (count: number, x0: number, y0: number, x1: number, y1: number): StorylinePoint[] => {\n if (count === 1) {\n return [{ x: (x0 + x1) / 2, y: (y0 + y1) / 2 }];\n }\n return Array.from({ length: count }, (_, index) => {\n const t = index / (count - 1);\n return {\n x: x0 + (x1 - x0) * t,\n y: y0 + (y1 - y0) * t\n };\n });\n};\n\nconst alternatingHorizontalCenters = (\n count: number,\n inner: { x: number; y: number; width: number; height: number },\n block: StorylineSize,\n gap: number\n) => {\n const baseY = inner.y + inner.height / 2;\n const offset = Math.min(Math.max(block.height * 0.65 + gap / 2, 0), Math.max((inner.height - block.height) / 2, 0));\n const points = lineCenters(count, inner.x + block.width / 2, baseY, inner.x + inner.width - block.width / 2, baseY);\n return points.map((point, index) => ({\n x: point.x,\n y: point.y + (index % 2 === 0 ? -offset : offset)\n }));\n};\n\nconst alternatingVerticalCenters = (\n count: number,\n inner: { x: number; y: number; width: number; height: number },\n block: StorylineSize,\n gap: number\n) => {\n const baseX = inner.x + inner.width / 2;\n const offset = Math.min(Math.max(block.width * 0.65 + gap / 2, 0), Math.max((inner.width - block.width) / 2, 0));\n const points = lineCenters(\n count,\n baseX,\n inner.y + block.height / 2,\n baseX,\n inner.y + inner.height - block.height / 2\n );\n return points.map((point, index) => ({\n x: point.x + (index % 2 === 0 ? -offset : offset),\n y: point.y\n }));\n};\n\nconst circularCenters = (\n count: number,\n viewBox: StorylineSize,\n block: StorylineSize,\n padding: StorylinePadding,\n layout: IStorylineLayoutOptions\n) => {\n const guide = computeClockCircleGuide(viewBox, block, padding, layout);\n const startAngle = layout.startAngle ?? -90;\n const delta = 360;\n\n if (count === 1) {\n const angle = degreeToRadian(startAngle);\n return [\n {\n x: guide.center.x + Math.cos(angle) * guide.radius,\n y: guide.center.y + Math.sin(angle) * guide.radius\n }\n ];\n }\n\n return Array.from({ length: count }, (_, index) => {\n const angle = degreeToRadian(startAngle + (delta * index) / count);\n return {\n x: guide.center.x + Math.cos(angle) * guide.radius,\n y: guide.center.y + Math.sin(angle) * guide.radius\n };\n });\n};\n\nconst computeClockCircleGuide = (\n viewBox: StorylineSize,\n block: StorylineSize,\n padding: StorylinePadding,\n layout: IStorylineLayoutOptions\n): StorylineCircleGuide => {\n const innerWidth = Math.max(viewBox.width - padding.left - padding.right, 1);\n const innerHeight = Math.max(viewBox.height - padding.top - padding.bottom, 1);\n const center = {\n x: padding.left + innerWidth / 2,\n y: padding.top + innerHeight / 2\n };\n const ratio = layout.radiusRatio ?? 0.7;\n const maxRadius = Math.max(Math.min(innerWidth - block.width, innerHeight - block.height) / 2, 1);\n\n return {\n center,\n radius: Math.max(1, maxRadius * ratio)\n };\n};\n\nconst arcCenters = (\n count: number,\n inner: { x: number; y: number; width: number; height: number },\n block: StorylineSize,\n layout: IStorylineLayoutOptions,\n fallbackStartAngle?: number,\n fallbackEndAngle?: number,\n defaultRatio = 0.88\n) => {\n const startAngle = layout.startAngle ?? fallbackStartAngle ?? -90;\n const endAngle = layout.endAngle ?? fallbackEndAngle ?? 270;\n const ratio = layout.radiusRatio ?? defaultRatio;\n const rx = Math.max((inner.width - block.width) / 2, 1) * ratio;\n const ry = Math.max((inner.height - block.height) / 2, 1) * ratio;\n const center = {\n x: inner.x + inner.width / 2,\n y: inner.y + inner.height / 2\n };\n\n if (count === 1) {\n const angle = degreeToRadian((startAngle + endAngle) / 2);\n return [{ x: center.x + Math.cos(angle) * rx, y: center.y + Math.sin(angle) * ry }];\n }\n\n return Array.from({ length: count }, (_, index) => {\n const t = index / (count - 1);\n const angle = degreeToRadian(startAngle + angleDelta(startAngle, endAngle) * t);\n return {\n x: center.x + Math.cos(angle) * rx,\n y: center.y + Math.sin(angle) * ry\n };\n });\n};\n\nconst angleDelta = (startAngle: number, endAngle: number) => {\n const delta = endAngle - startAngle;\n return Math.abs(delta) >= 360 ? 360 : delta;\n};\n\nconst degreeToRadian = (degree: number) => (degree / 180) * Math.PI;\n\nconst computeLinks = (blocks: StorylineBlockPosition[], distance: number): StorylineLinkPosition[] => {\n const links: StorylineLinkPosition[] = [];\n for (let i = 0; i < blocks.length - 1; i++) {\n const from = blocks[i];\n const to = blocks[i + 1];\n const start = pointOnBlockEdge(from, to.center, distance);\n const end = pointOnBlockEdge(to, from.center, distance);\n links.push({\n from,\n to,\n start,\n end,\n points: [start, end]\n });\n }\n return links;\n};\n\nconst pointOnBlockEdge = (block: StorylineBlockPosition, toward: StorylinePoint, distance: number): StorylinePoint => {\n const dx = toward.x - block.center.x;\n const dy = toward.y - block.center.y;\n if (dx === 0 && dy === 0) {\n return { x: block.center.x, y: block.center.y };\n }\n const scaleX = dx === 0 ? Number.POSITIVE_INFINITY : block.width / 2 / Math.abs(dx);\n const scaleY = dy === 0 ? Number.POSITIVE_INFINITY : block.height / 2 / Math.abs(dy);\n const scale = Math.min(scaleX, scaleY);\n const length = Math.sqrt(dx * dx + dy * dy) || 1;\n return {\n x: block.center.x + dx * scale + (dx / length) * distance,\n y: block.center.y + dy * scale + (dy / length) * distance\n };\n};\n"]}
@@ -0,0 +1,5 @@
1
+ import type { IExtensionGroupMarkSpec } from '@visactor/vchart';
2
+ import type { IStorylineBlock, IStorylineSpec } from '../interface';
3
+ export declare const buildBowlArcMark: (spec: IStorylineSpec) => IExtensionGroupMarkSpec | null;
4
+ export declare const buildBowlCenterImageMark: (spec: IStorylineSpec) => IExtensionGroupMarkSpec | null;
5
+ export declare const buildBowlBlockMark: (spec: IStorylineSpec, block: IStorylineBlock, index: number) => IExtensionGroupMarkSpec;