layerchart 2.0.0-next.16 → 2.0.0-next.17
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/dist/components/Arc.svelte +2 -2
- package/dist/components/Blur.svelte +5 -3
- package/dist/components/Blur.svelte.d.ts +2 -5
- package/dist/components/Connector.svelte +2 -2
- package/dist/components/Connector.svelte.d.ts +1 -1
- package/dist/components/Ellipse.svelte +187 -0
- package/dist/components/Ellipse.svelte.d.ts +64 -0
- package/dist/components/ForceSimulation.svelte +68 -22
- package/dist/components/ForceSimulation.svelte.d.ts +24 -11
- package/dist/components/GeoPath.svelte +5 -4
- package/dist/components/GeoPoint.svelte +1 -2
- package/dist/components/GeoSpline.svelte +4 -4
- package/dist/components/GeoSpline.svelte.d.ts +1 -1
- package/dist/components/MonthPath.svelte +11 -8
- package/dist/components/MonthPath.svelte.d.ts +4 -3
- package/dist/components/Polygon.svelte +285 -0
- package/dist/components/Polygon.svelte.d.ts +115 -0
- package/dist/components/Spline.svelte +29 -17
- package/dist/components/Spline.svelte.d.ts +12 -4
- package/dist/components/Treemap.svelte +63 -26
- package/dist/components/Treemap.svelte.d.ts +11 -11
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.js +4 -0
- package/dist/components/layout/Layer.svelte +6 -4
- package/dist/components/layout/Layer.svelte.d.ts +6 -4
- package/dist/components/tooltip/TooltipList.svelte +1 -1
- package/dist/utils/canvas.js +15 -0
- package/dist/utils/path.d.ts +10 -0
- package/dist/utils/path.js +30 -0
- package/dist/utils/shape.d.ts +43 -0
- package/dist/utils/shape.js +59 -0
- package/dist/utils/treemap.d.ts +1 -1
- package/package.json +1 -1
|
@@ -18,53 +18,53 @@
|
|
|
18
18
|
*
|
|
19
19
|
* @default 0
|
|
20
20
|
*/
|
|
21
|
-
padding?: number;
|
|
21
|
+
padding?: number | ((node: HierarchyRectangularNode<T>) => number);
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* The inner padding between nodes.
|
|
25
25
|
*
|
|
26
26
|
* @default 0
|
|
27
27
|
*/
|
|
28
|
-
paddingInner?: number;
|
|
28
|
+
paddingInner?: number | ((node: HierarchyRectangularNode<T>) => number);
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
31
|
* The outer padding between nodes.
|
|
32
32
|
*
|
|
33
33
|
* @default 0
|
|
34
34
|
*/
|
|
35
|
-
paddingOuter?: number;
|
|
35
|
+
paddingOuter?: number | ((node: HierarchyRectangularNode<T>) => number);
|
|
36
36
|
|
|
37
37
|
/**
|
|
38
38
|
* The top padding between nodes.
|
|
39
39
|
*
|
|
40
40
|
* @default 0
|
|
41
41
|
*/
|
|
42
|
-
paddingTop?: number;
|
|
42
|
+
paddingTop?: number | ((node: HierarchyRectangularNode<T>) => number);
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
45
|
* The bottom padding between nodes.
|
|
46
46
|
*
|
|
47
47
|
* @default 0
|
|
48
48
|
*/
|
|
49
|
-
paddingBottom?: number;
|
|
49
|
+
paddingBottom?: number | ((node: HierarchyRectangularNode<T>) => number);
|
|
50
50
|
/**
|
|
51
51
|
* The left padding between nodes.
|
|
52
52
|
*
|
|
53
53
|
*/
|
|
54
|
-
paddingLeft?: number;
|
|
54
|
+
paddingLeft?: number | ((node: HierarchyRectangularNode<T>) => number);
|
|
55
55
|
|
|
56
56
|
/**
|
|
57
57
|
* The right padding between nodes.
|
|
58
58
|
*
|
|
59
59
|
*/
|
|
60
|
-
paddingRight?: number;
|
|
60
|
+
paddingRight?: number | ((node: HierarchyRectangularNode<T>) => number);
|
|
61
61
|
|
|
62
62
|
/**
|
|
63
|
-
*
|
|
63
|
+
* Modify tiling function for approapriate aspect ratio when treemap is zoomed in
|
|
64
64
|
*
|
|
65
|
-
* @default
|
|
65
|
+
* @default false
|
|
66
66
|
*/
|
|
67
|
-
|
|
67
|
+
maintainAspectRatio?: boolean;
|
|
68
68
|
|
|
69
69
|
hierarchy?: HierarchyNode<T>;
|
|
70
70
|
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
paddingBottom = 0,
|
|
100
100
|
paddingLeft,
|
|
101
101
|
paddingRight,
|
|
102
|
-
|
|
102
|
+
maintainAspectRatio = false,
|
|
103
103
|
children,
|
|
104
104
|
}: TreemapProps<T> = $props();
|
|
105
105
|
|
|
@@ -121,45 +121,82 @@
|
|
|
121
121
|
: tile
|
|
122
122
|
);
|
|
123
123
|
|
|
124
|
-
const
|
|
124
|
+
const treemapData = $derived.by(() => {
|
|
125
125
|
const _treemap = d3treemap<T>()
|
|
126
126
|
.size([ctx.width, ctx.height])
|
|
127
|
-
.tile(aspectTile(tileFunc, ctx.width, ctx.height));
|
|
127
|
+
.tile(maintainAspectRatio ? aspectTile(tileFunc, ctx.width, ctx.height) : tileFunc);
|
|
128
128
|
|
|
129
129
|
if (padding) {
|
|
130
|
-
|
|
130
|
+
// Make Typescript happy to pick the correct overload
|
|
131
|
+
// TODO: Better way to do this?
|
|
132
|
+
if (typeof padding === 'number') {
|
|
133
|
+
_treemap.padding(padding);
|
|
134
|
+
} else {
|
|
135
|
+
_treemap.padding(padding);
|
|
136
|
+
}
|
|
131
137
|
}
|
|
132
138
|
|
|
133
139
|
if (paddingInner) {
|
|
134
|
-
|
|
140
|
+
if (typeof paddingInner === 'number') {
|
|
141
|
+
_treemap.paddingInner(typeof paddingInner === 'number' ? paddingInner : paddingInner);
|
|
142
|
+
} else {
|
|
143
|
+
_treemap.paddingInner(paddingInner);
|
|
144
|
+
}
|
|
135
145
|
}
|
|
136
146
|
|
|
137
147
|
if (paddingOuter) {
|
|
138
|
-
|
|
148
|
+
if (typeof paddingOuter === 'number') {
|
|
149
|
+
_treemap.paddingOuter(paddingOuter);
|
|
150
|
+
} else {
|
|
151
|
+
_treemap.paddingOuter(paddingOuter);
|
|
152
|
+
}
|
|
139
153
|
}
|
|
140
154
|
|
|
141
155
|
if (paddingTop) {
|
|
142
|
-
|
|
156
|
+
if (typeof paddingTop === 'number') {
|
|
157
|
+
_treemap.paddingTop(paddingTop);
|
|
158
|
+
} else {
|
|
159
|
+
_treemap.paddingTop(paddingTop);
|
|
160
|
+
}
|
|
143
161
|
}
|
|
144
162
|
|
|
145
163
|
if (paddingBottom) {
|
|
146
|
-
|
|
164
|
+
if (typeof paddingBottom === 'number') {
|
|
165
|
+
_treemap.paddingBottom(paddingBottom);
|
|
166
|
+
} else {
|
|
167
|
+
_treemap.paddingBottom(paddingBottom);
|
|
168
|
+
}
|
|
147
169
|
}
|
|
148
170
|
|
|
149
171
|
if (paddingLeft) {
|
|
150
|
-
|
|
172
|
+
if (typeof paddingLeft === 'number') {
|
|
173
|
+
_treemap.paddingLeft(paddingLeft);
|
|
174
|
+
} else {
|
|
175
|
+
_treemap.paddingLeft(paddingLeft);
|
|
176
|
+
}
|
|
151
177
|
}
|
|
152
178
|
if (paddingRight) {
|
|
153
|
-
|
|
179
|
+
if (typeof paddingRight === 'number') {
|
|
180
|
+
_treemap.paddingRight(paddingRight);
|
|
181
|
+
} else {
|
|
182
|
+
_treemap.paddingRight(paddingRight);
|
|
183
|
+
}
|
|
154
184
|
}
|
|
155
|
-
return _treemap;
|
|
156
|
-
});
|
|
157
185
|
|
|
158
|
-
|
|
186
|
+
if (hierarchy) {
|
|
187
|
+
const h = hierarchy.copy();
|
|
188
|
+
const treemapData = _treemap(h);
|
|
189
|
+
return {
|
|
190
|
+
links: treemapData.links(),
|
|
191
|
+
nodes: treemapData.descendants(),
|
|
192
|
+
};
|
|
193
|
+
}
|
|
159
194
|
|
|
160
|
-
|
|
161
|
-
|
|
195
|
+
return {
|
|
196
|
+
links: [],
|
|
197
|
+
nodes: [],
|
|
198
|
+
};
|
|
162
199
|
});
|
|
163
200
|
</script>
|
|
164
201
|
|
|
165
|
-
{@render children?.({ nodes: treemapData
|
|
202
|
+
{@render children?.({ nodes: treemapData.nodes })}
|
|
@@ -10,47 +10,47 @@ export type TreemapProps<T> = {
|
|
|
10
10
|
*
|
|
11
11
|
* @default 0
|
|
12
12
|
*/
|
|
13
|
-
padding?: number;
|
|
13
|
+
padding?: number | ((node: HierarchyRectangularNode<T>) => number);
|
|
14
14
|
/**
|
|
15
15
|
* The inner padding between nodes.
|
|
16
16
|
*
|
|
17
17
|
* @default 0
|
|
18
18
|
*/
|
|
19
|
-
paddingInner?: number;
|
|
19
|
+
paddingInner?: number | ((node: HierarchyRectangularNode<T>) => number);
|
|
20
20
|
/**
|
|
21
21
|
* The outer padding between nodes.
|
|
22
22
|
*
|
|
23
23
|
* @default 0
|
|
24
24
|
*/
|
|
25
|
-
paddingOuter?: number;
|
|
25
|
+
paddingOuter?: number | ((node: HierarchyRectangularNode<T>) => number);
|
|
26
26
|
/**
|
|
27
27
|
* The top padding between nodes.
|
|
28
28
|
*
|
|
29
29
|
* @default 0
|
|
30
30
|
*/
|
|
31
|
-
paddingTop?: number;
|
|
31
|
+
paddingTop?: number | ((node: HierarchyRectangularNode<T>) => number);
|
|
32
32
|
/**
|
|
33
33
|
* The bottom padding between nodes.
|
|
34
34
|
*
|
|
35
35
|
* @default 0
|
|
36
36
|
*/
|
|
37
|
-
paddingBottom?: number;
|
|
37
|
+
paddingBottom?: number | ((node: HierarchyRectangularNode<T>) => number);
|
|
38
38
|
/**
|
|
39
39
|
* The left padding between nodes.
|
|
40
40
|
*
|
|
41
41
|
*/
|
|
42
|
-
paddingLeft?: number;
|
|
42
|
+
paddingLeft?: number | ((node: HierarchyRectangularNode<T>) => number);
|
|
43
43
|
/**
|
|
44
44
|
* The right padding between nodes.
|
|
45
45
|
*
|
|
46
46
|
*/
|
|
47
|
-
paddingRight?: number;
|
|
47
|
+
paddingRight?: number | ((node: HierarchyRectangularNode<T>) => number);
|
|
48
48
|
/**
|
|
49
|
-
*
|
|
49
|
+
* Modify tiling function for approapriate aspect ratio when treemap is zoomed in
|
|
50
50
|
*
|
|
51
|
-
* @default
|
|
51
|
+
* @default false
|
|
52
52
|
*/
|
|
53
|
-
|
|
53
|
+
maintainAspectRatio?: boolean;
|
|
54
54
|
hierarchy?: HierarchyNode<T>;
|
|
55
55
|
children?: Snippet<[{
|
|
56
56
|
nodes: HierarchyRectangularNode<T>[];
|
|
@@ -62,7 +62,7 @@ declare class __sveltets_Render<T> {
|
|
|
62
62
|
props(): TreemapProps<T>;
|
|
63
63
|
events(): {};
|
|
64
64
|
slots(): {};
|
|
65
|
-
bindings(): "
|
|
65
|
+
bindings(): "";
|
|
66
66
|
exports(): {};
|
|
67
67
|
}
|
|
68
68
|
interface $$IsomorphicComponent {
|
|
@@ -42,6 +42,8 @@ export { default as Connector } from './Connector.svelte';
|
|
|
42
42
|
export * from './Connector.svelte';
|
|
43
43
|
export { default as Dagre } from './Dagre.svelte';
|
|
44
44
|
export * from './Dagre.svelte';
|
|
45
|
+
export { default as Ellipse } from './Ellipse.svelte';
|
|
46
|
+
export * from './Ellipse.svelte';
|
|
45
47
|
export { default as Frame } from './Frame.svelte';
|
|
46
48
|
export * from './Frame.svelte';
|
|
47
49
|
export { default as ForceSimulation } from './ForceSimulation.svelte';
|
|
@@ -102,6 +104,8 @@ export { default as Point } from './Point.svelte';
|
|
|
102
104
|
export * from './Point.svelte';
|
|
103
105
|
export { default as Points } from './Points.svelte';
|
|
104
106
|
export * from './Points.svelte';
|
|
107
|
+
export { default as Polygon } from './Polygon.svelte';
|
|
108
|
+
export * from './Polygon.svelte';
|
|
105
109
|
export { default as RadialGradient } from './RadialGradient.svelte';
|
|
106
110
|
export * from './RadialGradient.svelte';
|
|
107
111
|
export { default as Rect } from './Rect.svelte';
|
package/dist/components/index.js
CHANGED
|
@@ -42,6 +42,8 @@ export { default as Connector } from './Connector.svelte';
|
|
|
42
42
|
export * from './Connector.svelte';
|
|
43
43
|
export { default as Dagre } from './Dagre.svelte';
|
|
44
44
|
export * from './Dagre.svelte';
|
|
45
|
+
export { default as Ellipse } from './Ellipse.svelte';
|
|
46
|
+
export * from './Ellipse.svelte';
|
|
45
47
|
export { default as Frame } from './Frame.svelte';
|
|
46
48
|
export * from './Frame.svelte';
|
|
47
49
|
export { default as ForceSimulation } from './ForceSimulation.svelte';
|
|
@@ -102,6 +104,8 @@ export { default as Point } from './Point.svelte';
|
|
|
102
104
|
export * from './Point.svelte';
|
|
103
105
|
export { default as Points } from './Points.svelte';
|
|
104
106
|
export * from './Points.svelte';
|
|
107
|
+
export { default as Polygon } from './Polygon.svelte';
|
|
108
|
+
export * from './Polygon.svelte';
|
|
105
109
|
export { default as RadialGradient } from './RadialGradient.svelte';
|
|
106
110
|
export * from './RadialGradient.svelte';
|
|
107
111
|
export { default as Rect } from './Rect.svelte';
|
|
@@ -3,17 +3,19 @@
|
|
|
3
3
|
|
|
4
4
|
export type CanvasLayerProps = {
|
|
5
5
|
type: 'canvas';
|
|
6
|
-
} & Omit<ComponentProps<typeof Canvas>, 'type'>;
|
|
6
|
+
} & Omit<ComponentProps<typeof Canvas>, 'type' | 'onpointermove'>;
|
|
7
7
|
|
|
8
8
|
export type HtmlLayerProps = {
|
|
9
9
|
type: 'html';
|
|
10
|
-
} & Omit<ComponentProps<typeof Html>, 'type'>;
|
|
10
|
+
} & Omit<ComponentProps<typeof Html>, 'type' | 'onpointermove'>;
|
|
11
11
|
|
|
12
12
|
export type SvgLayerProps = {
|
|
13
13
|
type: 'svg';
|
|
14
|
-
} & Omit<ComponentProps<typeof Svg>, 'type'>;
|
|
14
|
+
} & Omit<ComponentProps<typeof Svg>, 'type' | 'onpointermove'>;
|
|
15
15
|
|
|
16
|
-
export type LayerProps = CanvasLayerProps | HtmlLayerProps | SvgLayerProps
|
|
16
|
+
export type LayerProps = (CanvasLayerProps | HtmlLayerProps | SvgLayerProps) & {
|
|
17
|
+
onpointermove?: (e: PointerEvent) => void;
|
|
18
|
+
};
|
|
17
19
|
</script>
|
|
18
20
|
|
|
19
21
|
<script lang="ts">
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import type { ComponentProps } from 'svelte';
|
|
2
2
|
export type CanvasLayerProps = {
|
|
3
3
|
type: 'canvas';
|
|
4
|
-
} & Omit<ComponentProps<typeof Canvas>, 'type'>;
|
|
4
|
+
} & Omit<ComponentProps<typeof Canvas>, 'type' | 'onpointermove'>;
|
|
5
5
|
export type HtmlLayerProps = {
|
|
6
6
|
type: 'html';
|
|
7
|
-
} & Omit<ComponentProps<typeof Html>, 'type'>;
|
|
7
|
+
} & Omit<ComponentProps<typeof Html>, 'type' | 'onpointermove'>;
|
|
8
8
|
export type SvgLayerProps = {
|
|
9
9
|
type: 'svg';
|
|
10
|
-
} & Omit<ComponentProps<typeof Svg>, 'type'>;
|
|
11
|
-
export type LayerProps = CanvasLayerProps | HtmlLayerProps | SvgLayerProps
|
|
10
|
+
} & Omit<ComponentProps<typeof Svg>, 'type' | 'onpointermove'>;
|
|
11
|
+
export type LayerProps = (CanvasLayerProps | HtmlLayerProps | SvgLayerProps) & {
|
|
12
|
+
onpointermove?: (e: PointerEvent) => void;
|
|
13
|
+
};
|
|
12
14
|
import Canvas from './Canvas.svelte';
|
|
13
15
|
import Html from './Html.svelte';
|
|
14
16
|
import Svg from './Svg.svelte';
|
package/dist/utils/canvas.js
CHANGED
|
@@ -24,6 +24,8 @@ export function getComputedStyles(canvas, { styles, classes } = {}) {
|
|
|
24
24
|
if (styles) {
|
|
25
25
|
Object.assign(svg.style, styles);
|
|
26
26
|
}
|
|
27
|
+
// Make sure `<svg>` is not visible
|
|
28
|
+
svg.style.display = 'none';
|
|
27
29
|
if (classes) {
|
|
28
30
|
svg.setAttribute('class', cls(classes)
|
|
29
31
|
.split(' ')
|
|
@@ -145,6 +147,19 @@ export function renderCircle(ctx, coords, styleOptions = {}) {
|
|
|
145
147
|
}, styleOptions);
|
|
146
148
|
ctx.closePath();
|
|
147
149
|
}
|
|
150
|
+
export function renderEllipse(ctx, coords, styleOptions = {}) {
|
|
151
|
+
ctx.beginPath();
|
|
152
|
+
ctx.ellipse(coords.cx, coords.cy, coords.rx, coords.ry, 0, 0, 2 * Math.PI);
|
|
153
|
+
render(ctx, {
|
|
154
|
+
fill: (ctx) => {
|
|
155
|
+
ctx.fill();
|
|
156
|
+
},
|
|
157
|
+
stroke: (ctx) => {
|
|
158
|
+
ctx.stroke();
|
|
159
|
+
},
|
|
160
|
+
}, styleOptions);
|
|
161
|
+
ctx.closePath();
|
|
162
|
+
}
|
|
148
163
|
/** Clear canvas accounting for Canvas `context.translate(...)` */
|
|
149
164
|
export function clearCanvasContext(ctx, options) {
|
|
150
165
|
// Clear with negative offset due to Canvas `context.translate(...)`
|
package/dist/utils/path.d.ts
CHANGED
|
@@ -17,5 +17,15 @@ export declare function spikePath({ x, y, width, height, }: {
|
|
|
17
17
|
width: number;
|
|
18
18
|
height: number;
|
|
19
19
|
}): string;
|
|
20
|
+
/** Create rounded polygon path
|
|
21
|
+
*
|
|
22
|
+
* @param coords - Array of points (x, y)
|
|
23
|
+
* @param radius - Radius of the curve
|
|
24
|
+
* @returns String of path data
|
|
25
|
+
*/
|
|
26
|
+
export declare function roundedPolygonPath(coords: {
|
|
27
|
+
x: number;
|
|
28
|
+
y: number;
|
|
29
|
+
}[], radius: number): string;
|
|
20
30
|
/** Flatten all `y` coordinates to `0` */
|
|
21
31
|
export declare function flattenPathData(pathData: string, yOverride?: number): string;
|
package/dist/utils/path.js
CHANGED
|
@@ -36,6 +36,36 @@ export function spikePath({ x, y, width, height, }) {
|
|
|
36
36
|
`;
|
|
37
37
|
return pathData;
|
|
38
38
|
}
|
|
39
|
+
/** Create rounded polygon path
|
|
40
|
+
*
|
|
41
|
+
* @param coords - Array of points (x, y)
|
|
42
|
+
* @param radius - Radius of the curve
|
|
43
|
+
* @returns String of path data
|
|
44
|
+
*/
|
|
45
|
+
export function roundedPolygonPath(coords, radius) {
|
|
46
|
+
if (radius === 0) {
|
|
47
|
+
// Simple polygon with straight lines
|
|
48
|
+
return `M${coords[0].x},${coords[0].y}${coords
|
|
49
|
+
.slice(1)
|
|
50
|
+
.map((p) => `L${p.x},${p.y}`)
|
|
51
|
+
.join('')}Z`;
|
|
52
|
+
}
|
|
53
|
+
let path = '';
|
|
54
|
+
const length = coords.length + 1;
|
|
55
|
+
for (let i = 0; i < length; i++) {
|
|
56
|
+
const a = coords[i % coords.length];
|
|
57
|
+
const b = coords[(i + 1) % coords.length];
|
|
58
|
+
const t = Math.min(radius / Math.hypot(b.x - a.x, b.y - a.y), 0.5);
|
|
59
|
+
if (i == 0)
|
|
60
|
+
path += `M${a.x * (1 - t) + b.x * t},${a.y * (1 - t) + b.y * t}`;
|
|
61
|
+
if (i > 0)
|
|
62
|
+
path += `Q${a.x},${a.y} ${a.x * (1 - t) + b.x * t},${a.y * (1 - t) + b.y * t}`;
|
|
63
|
+
if (i < length - 1)
|
|
64
|
+
path += `L${a.x * t + b.x * (1 - t)},${a.y * t + b.y * (1 - t)}`;
|
|
65
|
+
}
|
|
66
|
+
path += 'Z';
|
|
67
|
+
return path;
|
|
68
|
+
}
|
|
39
69
|
/** Flatten all `y` coordinates to `0` */
|
|
40
70
|
export function flattenPathData(pathData, yOverride = 0) {
|
|
41
71
|
let result = pathData;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** Get points to create a polygon with given number of points and radius
|
|
2
|
+
*
|
|
3
|
+
* @param count - Number of points
|
|
4
|
+
* @param radius - Radius of the polygon
|
|
5
|
+
* @returns Array of points (angle, radius)
|
|
6
|
+
*/
|
|
7
|
+
export declare function polygonPoints(count: number, radius: number, rotate?: number): {
|
|
8
|
+
angle: number;
|
|
9
|
+
radius: number;
|
|
10
|
+
}[];
|
|
11
|
+
/** Create polygon
|
|
12
|
+
*
|
|
13
|
+
* @param cx - Center x coordinate
|
|
14
|
+
* @param cy - Center y coordinate
|
|
15
|
+
* @param count - Number of points
|
|
16
|
+
* @param radius - Radius of the polygon
|
|
17
|
+
* @param rotate - Rotation of the polygon (degrees)
|
|
18
|
+
* @param inset - Percent to inset odd points (<1 inset, >1 outset)
|
|
19
|
+
* @param scaleX - Horizontal stretch factor
|
|
20
|
+
* @param scaleY - Vertical stretch factor
|
|
21
|
+
* @param skewX - Skew angle in degrees along the X axis
|
|
22
|
+
* @param skewY - Skew angle in degrees along the Y axis
|
|
23
|
+
* @param tiltX - Tilt factor for x-coordinates (0 = no tilt, positive moves points top => down, negative moves points bottom => up)
|
|
24
|
+
* @param tiltY - Tilt factor for y-coordinates (0 = no tilt, positive moves points left => right, negative moves points right => left)
|
|
25
|
+
* @returns Array of points (x, y)
|
|
26
|
+
*/
|
|
27
|
+
export declare function polygon(options: {
|
|
28
|
+
cx: number;
|
|
29
|
+
cy: number;
|
|
30
|
+
count: number;
|
|
31
|
+
radius: number;
|
|
32
|
+
rotate?: number;
|
|
33
|
+
inset?: number;
|
|
34
|
+
scaleX?: number;
|
|
35
|
+
scaleY?: number;
|
|
36
|
+
skewX?: number;
|
|
37
|
+
skewY?: number;
|
|
38
|
+
tiltX?: number;
|
|
39
|
+
tiltY?: number;
|
|
40
|
+
}): {
|
|
41
|
+
x: number;
|
|
42
|
+
y: number;
|
|
43
|
+
}[];
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { range } from 'd3-array';
|
|
2
|
+
import { degreesToRadians } from './math.js';
|
|
3
|
+
/** Get points to create a polygon with given number of points and radius
|
|
4
|
+
*
|
|
5
|
+
* @param count - Number of points
|
|
6
|
+
* @param radius - Radius of the polygon
|
|
7
|
+
* @returns Array of points (angle, radius)
|
|
8
|
+
*/
|
|
9
|
+
export function polygonPoints(count, radius, rotate = 0) {
|
|
10
|
+
const angle = 360 / count;
|
|
11
|
+
return range(count).map((index) => {
|
|
12
|
+
return {
|
|
13
|
+
angle: degreesToRadians(angle * index) + degreesToRadians(rotate),
|
|
14
|
+
radius,
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/** Create polygon
|
|
19
|
+
*
|
|
20
|
+
* @param cx - Center x coordinate
|
|
21
|
+
* @param cy - Center y coordinate
|
|
22
|
+
* @param count - Number of points
|
|
23
|
+
* @param radius - Radius of the polygon
|
|
24
|
+
* @param rotate - Rotation of the polygon (degrees)
|
|
25
|
+
* @param inset - Percent to inset odd points (<1 inset, >1 outset)
|
|
26
|
+
* @param scaleX - Horizontal stretch factor
|
|
27
|
+
* @param scaleY - Vertical stretch factor
|
|
28
|
+
* @param skewX - Skew angle in degrees along the X axis
|
|
29
|
+
* @param skewY - Skew angle in degrees along the Y axis
|
|
30
|
+
* @param tiltX - Tilt factor for x-coordinates (0 = no tilt, positive moves points top => down, negative moves points bottom => up)
|
|
31
|
+
* @param tiltY - Tilt factor for y-coordinates (0 = no tilt, positive moves points left => right, negative moves points right => left)
|
|
32
|
+
* @returns Array of points (x, y)
|
|
33
|
+
*/
|
|
34
|
+
export function polygon(options) {
|
|
35
|
+
const { cx, cy, count, radius, rotate = 0, inset = 1, scaleX = 1, scaleY = 1, skewX = 0, skewY = 0, tiltX = 0, tiltY = 0, } = options;
|
|
36
|
+
const skewXRad = degreesToRadians(skewX);
|
|
37
|
+
const skewYRad = degreesToRadians(skewY);
|
|
38
|
+
return polygonPoints(count, radius, rotate).map(({ angle, radius }, i) => {
|
|
39
|
+
// inset
|
|
40
|
+
const insetScale = i % 2 == 0 ? 1 : 1 - inset;
|
|
41
|
+
// scale
|
|
42
|
+
let x = radius * insetScale * Math.cos(angle) * scaleX;
|
|
43
|
+
let y = radius * insetScale * Math.sin(angle) * scaleY;
|
|
44
|
+
// tilt
|
|
45
|
+
const normalizedY = (y + radius) / (2 * radius);
|
|
46
|
+
const normalizedX = (x + radius) / (2 * radius);
|
|
47
|
+
const tiltScaleX = tiltX > 0 ? 1 + tiltX * (1 - normalizedY) : 1 - tiltX * normalizedY;
|
|
48
|
+
const tiltScaleY = tiltY > 0 ? 1 + tiltY * (1 - normalizedX) : 1 - tiltY * normalizedX;
|
|
49
|
+
x *= tiltScaleX;
|
|
50
|
+
y *= tiltScaleY;
|
|
51
|
+
// skew
|
|
52
|
+
const xSkewed = x + Math.tan(skewXRad) * y;
|
|
53
|
+
const ySkewed = y + Math.tan(skewYRad) * x;
|
|
54
|
+
return {
|
|
55
|
+
x: cx + xSkewed,
|
|
56
|
+
y: cy + ySkewed,
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
}
|
package/dist/utils/treemap.d.ts
CHANGED
|
@@ -9,5 +9,5 @@ export declare function aspectTile(tile: TileFunc, width: number, height: number
|
|
|
9
9
|
/**
|
|
10
10
|
* Show if the node (a) is a child of the selected (b), or any parent above selected
|
|
11
11
|
*/
|
|
12
|
-
export declare function isNodeVisible(a: HierarchyNode<any>, b: HierarchyNode<any> | null): boolean;
|
|
12
|
+
export declare function isNodeVisible(a: HierarchyNode<any>, b: HierarchyNode<any> | null | undefined): boolean;
|
|
13
13
|
export {};
|
package/package.json
CHANGED