layerchart 0.7.2 → 0.7.5
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 +5 -6
- package/components/Baseline.svelte +8 -1
- package/components/Chart.svelte +0 -1
- package/components/Rect.svelte +5 -5
- package/components/Tooltip.svelte +4 -3
- package/docs/Layout.svelte +11 -4
- package/docs/Preview.svelte +38 -7
- package/docs/Preview.svelte.d.ts +2 -1
- package/package.json +2 -2
- package/stores/motionStore.d.ts +19 -2
- package/stores/motionStore.js +17 -0
- package/utils/scales.js +1 -2
- package/utils/stack.js +8 -3
- package/components/Rect.svelte.d.ts +0 -27
package/components/Arc.svelte
CHANGED
|
@@ -37,15 +37,14 @@ export let startAngle = undefined;
|
|
|
37
37
|
*/
|
|
38
38
|
export let endAngle = undefined;
|
|
39
39
|
/**
|
|
40
|
-
* Define innerRadius.
|
|
41
|
-
* value >= 1: discrete value
|
|
42
|
-
* value
|
|
43
|
-
* value <
|
|
44
|
-
* default: yRange min
|
|
40
|
+
* Define innerRadius. Defaults to yRange min
|
|
41
|
+
* • value >= 1: discrete value
|
|
42
|
+
* • value < 1: percent of `outerRadius`
|
|
43
|
+
* • value < 0: offset of `outerRadius`
|
|
45
44
|
*/
|
|
46
45
|
export let innerRadius = undefined;
|
|
47
46
|
/**
|
|
48
|
-
* Define outerRadius. Defaults to yRange max/2 (ie. chart height / 2)
|
|
47
|
+
* Define outerRadius. Defaults to yRange max / 2 (ie. chart height / 2)
|
|
49
48
|
*/
|
|
50
49
|
export let outerRadius = undefined;
|
|
51
50
|
export let cornerRadius = 0;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script>import { getContext } from 'svelte';
|
|
2
2
|
import { min, max } from 'd3-array';
|
|
3
|
+
import { isScaleBand } from '../utils/scales';
|
|
3
4
|
const { xRange, yScale, yRange } = getContext('LayerCake');
|
|
4
5
|
export let x = false;
|
|
5
6
|
export let y = false;
|
|
@@ -7,7 +8,13 @@ export let y = false;
|
|
|
7
8
|
|
|
8
9
|
<g class="baseline">
|
|
9
10
|
{#if x}
|
|
10
|
-
<line
|
|
11
|
+
<line
|
|
12
|
+
x1={0}
|
|
13
|
+
x2={max($xRange) || 0}
|
|
14
|
+
y1={isScaleBand($yScale) ? max($yRange) : $yScale(0) || 0}
|
|
15
|
+
y2={isScaleBand($yScale) ? max($yRange) : $yScale(0) || 0}
|
|
16
|
+
class="baseline"
|
|
17
|
+
/>
|
|
11
18
|
{/if}
|
|
12
19
|
|
|
13
20
|
{#if y}
|
package/components/Chart.svelte
CHANGED
package/components/Rect.svelte
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
<script>import { motionStore } from '../stores/motionStore';
|
|
1
|
+
<script>import { motionStore, resolveOptions } from '../stores/motionStore';
|
|
2
2
|
export let x = 0;
|
|
3
3
|
export let y = 0;
|
|
4
4
|
export let width;
|
|
5
5
|
export let height;
|
|
6
6
|
export let spring = undefined;
|
|
7
7
|
export let tweened = undefined;
|
|
8
|
-
let tweened_x = motionStore(x, { spring, tweened });
|
|
9
|
-
let tweened_y = motionStore(y, { spring, tweened });
|
|
10
|
-
let tweened_width = motionStore(width, { spring, tweened });
|
|
11
|
-
let tweened_height = motionStore(height, { spring, tweened });
|
|
8
|
+
let tweened_x = motionStore(x, resolveOptions('x', { spring, tweened }));
|
|
9
|
+
let tweened_y = motionStore(y, resolveOptions('y', { spring, tweened }));
|
|
10
|
+
let tweened_width = motionStore(width, resolveOptions('width', { spring, tweened }));
|
|
11
|
+
let tweened_height = motionStore(height, resolveOptions('height', { spring, tweened }));
|
|
12
12
|
$: tweened_x.set(x);
|
|
13
13
|
$: tweened_y.set(y);
|
|
14
14
|
$: tweened_width.set(width);
|
|
@@ -107,9 +107,10 @@ function findData(previousValue, currentValue, valueAtPoint, accessor) {
|
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
function handleTooltip(event, tooltipData) {
|
|
110
|
-
const
|
|
111
|
-
const
|
|
112
|
-
const
|
|
110
|
+
const referenceNode = event.target.closest('.layercake-container');
|
|
111
|
+
const point = localPoint(referenceNode, event);
|
|
112
|
+
const localX = point?.x - $padding.left ?? 0;
|
|
113
|
+
const localY = point?.y - $padding.top ?? 0;
|
|
113
114
|
// If tooltipData not provided already (voronoi, etc), attempt to find it
|
|
114
115
|
// TODO: When using bisect-x/y/band, values should be sorted. Tyipcally are for `x`, but not `y` (and band depends on if x or y scale)
|
|
115
116
|
if (tooltipData == null) {
|
package/docs/Layout.svelte
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
<Button
|
|
27
27
|
class="text-black/50"
|
|
28
28
|
icon={mdiCodeTags}
|
|
29
|
-
href="https://github.com/techniq/
|
|
29
|
+
href="https://github.com/techniq/layerchart/blob/master/src/lib/components/{component}.svelte"
|
|
30
30
|
target="_blank"
|
|
31
31
|
/>
|
|
32
32
|
</Tooltip>
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
<Button
|
|
38
38
|
class="text-black/50"
|
|
39
39
|
icon={mdiFileDocumentEditOutline}
|
|
40
|
-
href="https://github.com/techniq/
|
|
40
|
+
href="https://github.com/techniq/layerchart/blob/master/{filename}"
|
|
41
41
|
target="_blank"
|
|
42
42
|
/>
|
|
43
43
|
</Tooltip>
|
|
@@ -46,9 +46,16 @@
|
|
|
46
46
|
{/if}
|
|
47
47
|
|
|
48
48
|
{#if description}
|
|
49
|
-
|
|
49
|
+
<div class="text-sm text-black/50">
|
|
50
|
+
{description}
|
|
51
|
+
</div>
|
|
50
52
|
{/if}
|
|
51
53
|
|
|
52
|
-
|
|
54
|
+
{#if $$slots.toc}
|
|
55
|
+
<div class="text-xs uppercase text-black/50 leading-8 tracking-widest mt-4">Contents</div>
|
|
56
|
+
<div class="border border-black/20 rounded bg-white">
|
|
57
|
+
<slot name="toc" />
|
|
58
|
+
</div>
|
|
59
|
+
{/if}
|
|
53
60
|
|
|
54
61
|
<slot />
|
package/docs/Preview.svelte
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script>// TODO: No longer copy from svelte-ux after prismjs is migrated to ESM (commonjs causes issue with Vite from another library)
|
|
2
|
+
import Prism from 'prismjs';
|
|
2
3
|
import 'prism-svelte';
|
|
4
|
+
import { mdiCodeTags, mdiContentCopy } from '@mdi/js';
|
|
5
|
+
import { slide } from 'svelte/transition';
|
|
6
|
+
import { Button } from 'svelte-ux';
|
|
3
7
|
export let code = null;
|
|
4
8
|
export let language = 'svelte';
|
|
5
|
-
export let
|
|
6
|
-
|
|
9
|
+
export let highlightedCode = Prism.highlight(code, Prism.languages.svelte, language);
|
|
10
|
+
export let showCode = false;
|
|
7
11
|
</script>
|
|
8
12
|
|
|
9
13
|
<div class="border border-black/20 rounded bg-white">
|
|
@@ -11,9 +15,36 @@ $: displayCode = highlight ? Prism.highlight(code, Prism.languages.svelte, 'svel
|
|
|
11
15
|
<slot />
|
|
12
16
|
</div>
|
|
13
17
|
|
|
14
|
-
{#if
|
|
15
|
-
<
|
|
16
|
-
<
|
|
17
|
-
|
|
18
|
+
{#if code && showCode}
|
|
19
|
+
<div class="relative">
|
|
20
|
+
<pre
|
|
21
|
+
class="language-{language} rounded"
|
|
22
|
+
style="margin: 0; white-space: normal;"
|
|
23
|
+
transition:slide|local>
|
|
24
|
+
<code class="language-{language}">{@html highlightedCode}</code>
|
|
25
|
+
</pre>
|
|
26
|
+
|
|
27
|
+
<div class="absolute top-0 right-0 p-2">
|
|
28
|
+
<Button
|
|
29
|
+
icon={mdiContentCopy}
|
|
30
|
+
small
|
|
31
|
+
class=" text-white/70 hover:bg-white/20 py-1"
|
|
32
|
+
on:click={() => navigator.clipboard.writeText(code)}
|
|
33
|
+
>
|
|
34
|
+
Copy
|
|
35
|
+
</Button>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
18
38
|
{/if}
|
|
19
39
|
</div>
|
|
40
|
+
|
|
41
|
+
{#if code}
|
|
42
|
+
<Button
|
|
43
|
+
icon={mdiCodeTags}
|
|
44
|
+
small
|
|
45
|
+
class=" text-black/70 py-1"
|
|
46
|
+
on:click={() => (showCode = !showCode)}
|
|
47
|
+
>
|
|
48
|
+
{showCode ? 'Hide' : 'Show'} Code
|
|
49
|
+
</Button>
|
|
50
|
+
{/if}
|
package/docs/Preview.svelte.d.ts
CHANGED
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.7.
|
|
6
|
+
"version": "0.7.5",
|
|
7
7
|
"devDependencies": {
|
|
8
8
|
"@rollup/plugin-dsv": "^2.0.3",
|
|
9
9
|
"@sveltejs/adapter-vercel": "^1.0.0-next.59",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"date-fns": "^2.28.0",
|
|
50
50
|
"layercake": "^6.1.0",
|
|
51
51
|
"lodash-es": "^4.17.21",
|
|
52
|
-
"svelte-ux": "^0.6.
|
|
52
|
+
"svelte-ux": "^0.6.10"
|
|
53
53
|
},
|
|
54
54
|
"exports": {
|
|
55
55
|
"./package.json": "./package.json",
|
package/stores/motionStore.d.ts
CHANGED
|
@@ -1,9 +1,26 @@
|
|
|
1
1
|
import { spring, tweened } from 'svelte/motion';
|
|
2
|
+
export declare type SpringOptions = Parameters<typeof spring>[1];
|
|
3
|
+
export declare type TweenedOptions = Parameters<typeof tweened>[1];
|
|
2
4
|
export declare type MotionOptions = {
|
|
3
|
-
spring?: boolean |
|
|
4
|
-
tweened?: boolean |
|
|
5
|
+
spring?: boolean | SpringOptions;
|
|
6
|
+
tweened?: boolean | TweenedOptions;
|
|
7
|
+
};
|
|
8
|
+
export declare type PropMotionOptions = {
|
|
9
|
+
spring?: boolean | SpringOptions | {
|
|
10
|
+
[prop: string]: SpringOptions;
|
|
11
|
+
};
|
|
12
|
+
tweened?: boolean | TweenedOptions | {
|
|
13
|
+
[prop: string]: TweenedOptions;
|
|
14
|
+
};
|
|
5
15
|
};
|
|
6
16
|
/**
|
|
7
17
|
* Convenient wrapper to create a motion store (spring(), tweened()) based on properties, or fall back to basic writable() store
|
|
8
18
|
*/
|
|
9
19
|
export declare function motionStore(value: any, options: MotionOptions): import("svelte/motion").Tweened<unknown> | import("svelte/motion").Spring<any> | import("svelte/store").Writable<any>;
|
|
20
|
+
/**
|
|
21
|
+
* Helper to resolve motion options with specific property option (useful for specifying per-prop delays)
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveOptions(prop: string, options: PropMotionOptions): {
|
|
24
|
+
spring: any;
|
|
25
|
+
tweened: any;
|
|
26
|
+
};
|
package/stores/motionStore.js
CHANGED
|
@@ -14,3 +14,20 @@ export function motionStore(value, options) {
|
|
|
14
14
|
return writable(value);
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Helper to resolve motion options with specific property option (useful for specifying per-prop delays)
|
|
19
|
+
*/
|
|
20
|
+
export function resolveOptions(prop, options) {
|
|
21
|
+
return {
|
|
22
|
+
spring: typeof options.spring === 'boolean' || options.spring == null
|
|
23
|
+
? options.spring
|
|
24
|
+
: prop in options.spring
|
|
25
|
+
? options.spring[prop]
|
|
26
|
+
: options.spring,
|
|
27
|
+
tweened: typeof options.tweened === 'boolean' || options.tweened == null
|
|
28
|
+
? options.tweened
|
|
29
|
+
: prop in options.tweened
|
|
30
|
+
? options.tweened[prop]
|
|
31
|
+
: options.tweened
|
|
32
|
+
};
|
|
33
|
+
}
|
package/utils/scales.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { derived } from 'svelte/store';
|
|
2
2
|
import { tweened, spring } from 'svelte/motion';
|
|
3
|
-
import { min } from 'd3-array';
|
|
4
3
|
import { motionStore } from '../stores/motionStore';
|
|
5
4
|
/**
|
|
6
5
|
* Implemenation for missing `scaleBand().invert()`
|
|
@@ -14,8 +13,8 @@ import { motionStore } from '../stores/motionStore';
|
|
|
14
13
|
*/
|
|
15
14
|
export function scaleBandInvert(scale) {
|
|
16
15
|
const domain = scale.domain();
|
|
17
|
-
const paddingOuter = scale(min(domain));
|
|
18
16
|
const eachBand = scale.step();
|
|
17
|
+
const paddingOuter = eachBand * (scale.paddingOuter?.() ?? scale.padding()); // `scaleBand` uses paddingOuter(), while `scalePoint` uses padding() for outer paddding - https://github.com/d3/d3-scale#point_padding
|
|
19
18
|
return function (value) {
|
|
20
19
|
// TODO: Should this use Math.round to better select? https://stackoverflow.com/questions/38633082/d3-getting-invert-value-of-band-scales/50846323#comment104743795_50846323
|
|
21
20
|
const index = Math.floor((value - paddingOuter) / eachBand);
|
package/utils/stack.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { flatGroup, max, sum } from 'd3-array';
|
|
1
|
+
import { flatGroup, max, rollup, sum } from 'd3-array';
|
|
2
2
|
import { stack } from 'd3-shape';
|
|
3
3
|
import { pivotWider } from './pivot';
|
|
4
4
|
export function createStackData(data, options) {
|
|
@@ -42,8 +42,13 @@ export function createStackData(data, options) {
|
|
|
42
42
|
return result;
|
|
43
43
|
}
|
|
44
44
|
else {
|
|
45
|
-
//
|
|
46
|
-
return data
|
|
45
|
+
// No grouping or stacking. Aggregate based on `xKey`
|
|
46
|
+
return Array.from(rollup(data, (items) => {
|
|
47
|
+
return {
|
|
48
|
+
keys: [items[0][options.xKey]],
|
|
49
|
+
values: [0, sum(items, (d) => d.value)]
|
|
50
|
+
};
|
|
51
|
+
}, (d) => d[options.xKey]).values());
|
|
47
52
|
}
|
|
48
53
|
}
|
|
49
54
|
/**
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { SvelteComponentTyped } from "svelte";
|
|
2
|
-
import type { spring as springStore, tweened as tweenedStore } from 'svelte/motion';
|
|
3
|
-
declare const __propDef: {
|
|
4
|
-
props: {
|
|
5
|
-
[x: string]: any;
|
|
6
|
-
x?: number;
|
|
7
|
-
y?: number;
|
|
8
|
-
width: number;
|
|
9
|
-
height: number;
|
|
10
|
-
spring?: boolean | Parameters<typeof springStore>[1];
|
|
11
|
-
tweened?: boolean | Parameters<typeof tweenedStore>[1];
|
|
12
|
-
};
|
|
13
|
-
events: {
|
|
14
|
-
click: MouseEvent;
|
|
15
|
-
mouseover: MouseEvent;
|
|
16
|
-
mouseout: MouseEvent;
|
|
17
|
-
} & {
|
|
18
|
-
[evt: string]: CustomEvent<any>;
|
|
19
|
-
};
|
|
20
|
-
slots: {};
|
|
21
|
-
};
|
|
22
|
-
export declare type RectProps = typeof __propDef.props;
|
|
23
|
-
export declare type RectEvents = typeof __propDef.events;
|
|
24
|
-
export declare type RectSlots = typeof __propDef.slots;
|
|
25
|
-
export default class Rect extends SvelteComponentTyped<RectProps, RectEvents, RectSlots> {
|
|
26
|
-
}
|
|
27
|
-
export {};
|