layerchart 0.4.1 → 0.5.0
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/components/Arc.svelte +1 -1
- package/components/Arc.svelte.d.ts +2 -0
- package/components/Bounds.svelte +24 -0
- package/components/Bounds.svelte.d.ts +48 -0
- package/components/Partition.svelte +27 -0
- package/components/Partition.svelte.d.ts +27 -0
- package/components/Treemap.svelte +9 -40
- package/components/Treemap.svelte.d.ts +0 -6
- package/package.json +3 -1
- package/utils/scales.d.ts +17 -0
- package/utils/scales.js +46 -0
package/components/Arc.svelte
CHANGED
|
@@ -110,6 +110,6 @@ $: yOffset = -Math.cos(angle) * offset;
|
|
|
110
110
|
<path d={trackArc()} class="track" bind:this={trackArcEl} {...track} />
|
|
111
111
|
{/if}
|
|
112
112
|
|
|
113
|
-
<path d={arc()} transform="translate({xOffset}, {yOffset})" {...$$restProps} />
|
|
113
|
+
<path d={arc()} transform="translate({xOffset}, {yOffset})" {...$$restProps} on:click />
|
|
114
114
|
|
|
115
115
|
<slot value={$tweened_value} centroid={trackArcCentroid} {boundingBox} />
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<script>import { getContext } from 'svelte';
|
|
2
|
+
import { cubicOut } from 'svelte/easing';
|
|
3
|
+
import { scaleLinear } from 'd3-scale';
|
|
4
|
+
import { tweenedScale } from '../utils/scales';
|
|
5
|
+
const { width, height } = getContext('LayerCake');
|
|
6
|
+
export let domain;
|
|
7
|
+
export let range;
|
|
8
|
+
const tweenedOptions = { easing: cubicOut, duration: 800 };
|
|
9
|
+
function getExtents(extents, axis, fallback) {
|
|
10
|
+
const resolvedExtents = typeof extents === 'function' ? extents({ width: $width, height: $height }) : extents;
|
|
11
|
+
return [
|
|
12
|
+
resolvedExtents?.[axis + '0'] ?? 0,
|
|
13
|
+
resolvedExtents?.[axis + '1'] ?? fallback // x1 or y1, fallback as $width or $height
|
|
14
|
+
];
|
|
15
|
+
}
|
|
16
|
+
const xScale = tweenedScale(scaleLinear, tweenedOptions);
|
|
17
|
+
$: xScale.domain(getExtents(domain, 'x', $width));
|
|
18
|
+
$: xScale.range(getExtents(range, 'x', $width));
|
|
19
|
+
const yScale = tweenedScale(scaleLinear, tweenedOptions);
|
|
20
|
+
$: yScale.domain(getExtents(domain, 'y', $height));
|
|
21
|
+
$: yScale.range(getExtents(range, 'y', $height));
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<slot xScale={$xScale} yScale={$yScale} />
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
domain: {
|
|
5
|
+
x0: number;
|
|
6
|
+
y0: number;
|
|
7
|
+
x1: number;
|
|
8
|
+
y1: number;
|
|
9
|
+
} | ((dimensions: {
|
|
10
|
+
width: number;
|
|
11
|
+
height: number;
|
|
12
|
+
}) => {
|
|
13
|
+
x0: number;
|
|
14
|
+
y0: number;
|
|
15
|
+
x1: number;
|
|
16
|
+
y1: number;
|
|
17
|
+
});
|
|
18
|
+
range: {
|
|
19
|
+
x0: number;
|
|
20
|
+
y0: number;
|
|
21
|
+
x1: number;
|
|
22
|
+
y1: number;
|
|
23
|
+
} | ((dimensions: {
|
|
24
|
+
width: number;
|
|
25
|
+
height: number;
|
|
26
|
+
}) => {
|
|
27
|
+
x0: number;
|
|
28
|
+
y0: number;
|
|
29
|
+
x1: number;
|
|
30
|
+
y1: number;
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
events: {
|
|
34
|
+
[evt: string]: CustomEvent<any>;
|
|
35
|
+
};
|
|
36
|
+
slots: {
|
|
37
|
+
default: {
|
|
38
|
+
xScale: any;
|
|
39
|
+
yScale: any;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export declare type BoundsProps = typeof __propDef.props;
|
|
44
|
+
export declare type BoundsEvents = typeof __propDef.events;
|
|
45
|
+
export declare type BoundsSlots = typeof __propDef.slots;
|
|
46
|
+
export default class Bounds extends SvelteComponentTyped<BoundsProps, BoundsEvents, BoundsSlots> {
|
|
47
|
+
}
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<script>import { getContext } from 'svelte';
|
|
2
|
+
import { partition as d3Partition } from 'd3-hierarchy';
|
|
3
|
+
const { data, width, height } = getContext('LayerCake');
|
|
4
|
+
export let orientation = 'horizontal';
|
|
5
|
+
export let size = undefined;
|
|
6
|
+
/**
|
|
7
|
+
* see: https://github.com/d3/d3-hierarchy#tree_nodeSize
|
|
8
|
+
*/
|
|
9
|
+
export let padding = undefined;
|
|
10
|
+
/**
|
|
11
|
+
* see: https://github.com/d3/d3-hierarchy#tree_nodeSize
|
|
12
|
+
*/
|
|
13
|
+
export let round = undefined;
|
|
14
|
+
let partition;
|
|
15
|
+
$: {
|
|
16
|
+
partition = d3Partition().size(size ?? (orientation === 'horizontal' ? [$height, $width] : [$width, $height]));
|
|
17
|
+
if (padding) {
|
|
18
|
+
partition.padding(padding);
|
|
19
|
+
}
|
|
20
|
+
if (round) {
|
|
21
|
+
partition.round(round);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
$: partitionData = partition($data);
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
<slot nodes={partitionData.descendants()} />
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
orientation?: 'vertical' | 'horizontal';
|
|
5
|
+
size?: [number, number] | undefined;
|
|
6
|
+
/**
|
|
7
|
+
* see: https://github.com/d3/d3-hierarchy#tree_nodeSize
|
|
8
|
+
*/ padding?: number | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* see: https://github.com/d3/d3-hierarchy#tree_nodeSize
|
|
11
|
+
*/ round?: boolean | undefined;
|
|
12
|
+
};
|
|
13
|
+
events: {
|
|
14
|
+
[evt: string]: CustomEvent<any>;
|
|
15
|
+
};
|
|
16
|
+
slots: {
|
|
17
|
+
default: {
|
|
18
|
+
nodes: import("d3-hierarchy").HierarchyRectangularNode<unknown>[];
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export declare type PartitionProps = typeof __propDef.props;
|
|
23
|
+
export declare type PartitionEvents = typeof __propDef.events;
|
|
24
|
+
export declare type PartitionSlots = typeof __propDef.slots;
|
|
25
|
+
export default class Partition extends SvelteComponentTyped<PartitionProps, PartitionEvents, PartitionSlots> {
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
@@ -3,12 +3,8 @@
|
|
|
3
3
|
* - [ ] Improve zoomable nested (apply extent ratio? const extentRatio = ($extents.y1 - $extents.y0) / $height;
|
|
4
4
|
*/
|
|
5
5
|
import { getContext } from 'svelte';
|
|
6
|
-
import { tweened } from 'svelte/motion';
|
|
7
|
-
import { cubicOut } from 'svelte/easing';
|
|
8
6
|
import * as d3 from 'd3-hierarchy';
|
|
9
|
-
import { scaleLinear } from 'd3-scale';
|
|
10
7
|
import { group } from 'd3-array';
|
|
11
|
-
import RectClipPath from './RectClipPath.svelte';
|
|
12
8
|
import { aspectTile } from '../utils/treemap';
|
|
13
9
|
const { data, width, height } = getContext('LayerCake');
|
|
14
10
|
export let tile = d3.treemapSquarify;
|
|
@@ -61,43 +57,16 @@ $: {
|
|
|
61
57
|
}
|
|
62
58
|
}
|
|
63
59
|
$: root = treemap($data);
|
|
60
|
+
// TODO: Remove selected
|
|
64
61
|
$: selected = root; // set initial selection
|
|
65
|
-
// group nodes by depth so can be rendered lowest to highest
|
|
62
|
+
// group nodes by depth so can be rendered lowest to highest, to stack properly
|
|
66
63
|
$: nodesByDepth = group(root, (d) => d.depth);
|
|
67
|
-
const duration = 800;
|
|
68
|
-
const extents = tweened(undefined, { easing: cubicOut, duration });
|
|
69
|
-
$: $extents = selected
|
|
70
|
-
? {
|
|
71
|
-
x0: selected.x0,
|
|
72
|
-
y0: selected.y0,
|
|
73
|
-
x1: selected.x1,
|
|
74
|
-
y1: selected.y1
|
|
75
|
-
}
|
|
76
|
-
: {
|
|
77
|
-
x0: 0,
|
|
78
|
-
y0: 0,
|
|
79
|
-
x1: $width,
|
|
80
|
-
y1: $height
|
|
81
|
-
};
|
|
82
|
-
$: xScale = scaleLinear().domain([$extents.x0, $extents.x1]).rangeRound([0, $width]);
|
|
83
|
-
$: yScale = scaleLinear().domain([$extents.y0, $extents.y1]).rangeRound([0, $height]);
|
|
84
64
|
</script>
|
|
85
65
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
rect={{
|
|
94
|
-
x: xScale(node.x0),
|
|
95
|
-
y: yScale(node.y0),
|
|
96
|
-
width: xScale(node.x1) - xScale(node.x0),
|
|
97
|
-
height: yScale(node.y1) - yScale(node.y0)
|
|
98
|
-
}}
|
|
99
|
-
/>
|
|
100
|
-
{/each}
|
|
101
|
-
</g>
|
|
102
|
-
{/each}
|
|
103
|
-
</RectClipPath>
|
|
66
|
+
{#each Array.from(nodesByDepth) as [depth, nodes]}
|
|
67
|
+
<g>
|
|
68
|
+
{#each nodes as node, i (nodeKey(node, i))}
|
|
69
|
+
<slot name="node" {node} />
|
|
70
|
+
{/each}
|
|
71
|
+
</g>
|
|
72
|
+
{/each}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"author": "Sean Lynch <techniq35@gmail.com>",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": "techniq/layerchart",
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.5.0",
|
|
7
7
|
"devDependencies": {
|
|
8
8
|
"@rollup/plugin-dsv": "^2.0.3",
|
|
9
9
|
"@sveltejs/adapter-vercel": "^1.0.0-next.58",
|
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"./components/AxisY.svelte": "./components/AxisY.svelte",
|
|
57
57
|
"./components/Bars.svelte": "./components/Bars.svelte",
|
|
58
58
|
"./components/Baseline.svelte": "./components/Baseline.svelte",
|
|
59
|
+
"./components/Bounds.svelte": "./components/Bounds.svelte",
|
|
59
60
|
"./components/Chart.svelte": "./components/Chart.svelte",
|
|
60
61
|
"./components/ChartClipPath.svelte": "./components/ChartClipPath.svelte",
|
|
61
62
|
"./components/Circle.svelte": "./components/Circle.svelte",
|
|
@@ -69,6 +70,7 @@
|
|
|
69
70
|
"./components/Line.svelte": "./components/Line.svelte",
|
|
70
71
|
"./components/LinearGradient.svelte": "./components/LinearGradient.svelte",
|
|
71
72
|
"./components/Link.svelte": "./components/Link.svelte",
|
|
73
|
+
"./components/Partition.svelte": "./components/Partition.svelte",
|
|
72
74
|
"./components/Path.svelte": "./components/Path.svelte",
|
|
73
75
|
"./components/Pattern.svelte": "./components/Pattern.svelte",
|
|
74
76
|
"./components/Pie.svelte": "./components/Pie.svelte",
|
package/utils/scales.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { tweened, spring } from 'svelte/motion';
|
|
1
2
|
/**
|
|
2
3
|
* Implemenation for missing `scaleBand().invert()`
|
|
3
4
|
*
|
|
@@ -8,3 +9,19 @@
|
|
|
8
9
|
*/
|
|
9
10
|
export declare function scaleBandInvert(scale: any): (value: any) => any;
|
|
10
11
|
export declare function isScaleBand(scale: any): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Animate d3-scale as domain and/or range are updated using tweened store
|
|
14
|
+
*/
|
|
15
|
+
export declare function tweenedScale(scale: any, tweenedOptions?: Parameters<typeof tweened>[1]): {
|
|
16
|
+
subscribe: (this: void, run: import("svelte/store").Subscriber<any>, invalidate?: (value?: any) => void) => import("svelte/store").Unsubscriber;
|
|
17
|
+
domain: (values: any) => Promise<void>;
|
|
18
|
+
range: (values: any) => Promise<void>;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Animate d3-scale as domain and/or range are updated using spring store
|
|
22
|
+
*/
|
|
23
|
+
export declare function springScale(scale: any, springOptions?: Parameters<typeof spring>[1]): {
|
|
24
|
+
subscribe: (this: void, run: import("svelte/store").Subscriber<any>, invalidate?: (value?: any) => void) => import("svelte/store").Unsubscriber;
|
|
25
|
+
domain: (values: any) => Promise<void>;
|
|
26
|
+
range: (values: any) => Promise<void>;
|
|
27
|
+
};
|
package/utils/scales.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { derived } from 'svelte/store';
|
|
2
|
+
import { tweened, spring } from 'svelte/motion';
|
|
1
3
|
/**
|
|
2
4
|
* Implemenation for missing `scaleBand().invert()`
|
|
3
5
|
*
|
|
@@ -19,3 +21,47 @@ export function scaleBandInvert(scale) {
|
|
|
19
21
|
export function isScaleBand(scale) {
|
|
20
22
|
return typeof scale.bandwidth === 'function';
|
|
21
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Animate d3-scale as domain and/or range are updated using tweened store
|
|
26
|
+
*/
|
|
27
|
+
export function tweenedScale(scale, tweenedOptions = {}) {
|
|
28
|
+
const tweenedDomain = tweened(undefined, tweenedOptions);
|
|
29
|
+
const tweenedRange = tweened(undefined, tweenedOptions);
|
|
30
|
+
const tweenedScale = derived([tweenedDomain, tweenedRange], ([domain, range]) => {
|
|
31
|
+
const scaleInstance = scale.domain ? scale : scale(); // support `scaleLinear` or `scaleLinear()` (which could have `.interpolate()` and others set)
|
|
32
|
+
if (domain) {
|
|
33
|
+
scaleInstance.domain(domain);
|
|
34
|
+
}
|
|
35
|
+
if (range) {
|
|
36
|
+
scaleInstance.range(range);
|
|
37
|
+
}
|
|
38
|
+
return scaleInstance;
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
subscribe: tweenedScale.subscribe,
|
|
42
|
+
domain: (values) => tweenedDomain.set(values),
|
|
43
|
+
range: (values) => tweenedRange.set(values)
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Animate d3-scale as domain and/or range are updated using spring store
|
|
48
|
+
*/
|
|
49
|
+
export function springScale(scale, springOptions = {}) {
|
|
50
|
+
const springDomain = spring(undefined, springOptions);
|
|
51
|
+
const springRange = spring(undefined, springOptions);
|
|
52
|
+
const tweenedScale = derived([springDomain, springRange], ([domain, range]) => {
|
|
53
|
+
const scaleInstance = scale.domain ? scale : scale(); // support `scaleLinear` or `scaleLinear()` (which could have `.interpolate()` and others set)
|
|
54
|
+
if (domain) {
|
|
55
|
+
scaleInstance.domain(domain);
|
|
56
|
+
}
|
|
57
|
+
if (range) {
|
|
58
|
+
scaleInstance.range(range);
|
|
59
|
+
}
|
|
60
|
+
return scaleInstance;
|
|
61
|
+
});
|
|
62
|
+
return {
|
|
63
|
+
subscribe: tweenedScale.subscribe,
|
|
64
|
+
domain: (values) => springDomain.set(values),
|
|
65
|
+
range: (values) => springRange.set(values)
|
|
66
|
+
};
|
|
67
|
+
}
|