svelteplot 0.0.1-alpha.21 → 0.0.1-alpha.23
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/Plot.svelte +9 -11
- package/dist/classes/Plot.svelte.js +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/marks/BarX.svelte +8 -1
- package/dist/marks/BarY.svelte +16 -1
- package/dist/marks/HTMLTooltip.svelte +61 -0
- package/dist/marks/HTMLTooltip.svelte.d.ts +25 -0
- package/dist/types.d.ts +3 -0
- package/package.json +8 -7
package/dist/Plot.svelte
CHANGED
|
@@ -67,24 +67,24 @@ $effect(() => {
|
|
|
67
67
|
caption
|
|
68
68
|
});
|
|
69
69
|
});
|
|
70
|
-
|
|
70
|
+
const onMouseMove = (evt) => {
|
|
71
71
|
if (onmousemove)
|
|
72
72
|
onmousemove({ ...evt, plot });
|
|
73
|
-
}
|
|
73
|
+
};
|
|
74
74
|
let hasLegend = $derived(color?.legend || symbol?.legend);
|
|
75
75
|
</script>
|
|
76
76
|
|
|
77
77
|
<figure data-testid={testid} class="svelteplot" bind:clientWidth={width} style:max-width={maxWidth}>
|
|
78
|
-
<div
|
|
78
|
+
<div
|
|
79
|
+
role="document"
|
|
80
|
+
class="plot-body"
|
|
81
|
+
bind:this={plot.body}
|
|
82
|
+
on:mousemove={onmousemove ? onMouseMove : null}
|
|
83
|
+
>
|
|
79
84
|
<div class="overlay">
|
|
80
85
|
{#if overlay}{@render overlay(plot)}{/if}
|
|
81
86
|
</div>
|
|
82
|
-
<svg
|
|
83
|
-
role="document"
|
|
84
|
-
{width}
|
|
85
|
-
height={plot.height}
|
|
86
|
-
onmousemove={onmousemove ? onMouseMove : null}
|
|
87
|
-
>
|
|
87
|
+
<svg {width} height={plot.height}>
|
|
88
88
|
<!-- automatic grids -->
|
|
89
89
|
{#if (grid && plot.hasScaleX) || x?.grid}<GridX automatic />{/if}
|
|
90
90
|
{#if (grid && plot.hasScaleY) || y?.grid}<GridY automatic />{/if}
|
|
@@ -111,7 +111,6 @@ let hasLegend = $derived(color?.legend || symbol?.legend);
|
|
|
111
111
|
{#if frame}<Frame />{/if}
|
|
112
112
|
{#if children}{@render children(plot)}{/if}
|
|
113
113
|
</svg>
|
|
114
|
-
|
|
115
114
|
</div>
|
|
116
115
|
|
|
117
116
|
{#if plot.options.title || plot.options.subtitle || header || hasLegend}
|
|
@@ -165,7 +164,6 @@ let hasLegend = $derived(color?.legend || symbol?.legend);
|
|
|
165
164
|
}
|
|
166
165
|
.plot-body {
|
|
167
166
|
order: 2;
|
|
168
|
-
|
|
169
167
|
}
|
|
170
168
|
svg {
|
|
171
169
|
overflow: visible;
|
|
@@ -72,6 +72,7 @@ export class Plot {
|
|
|
72
72
|
radius = new Scale('radius', this);
|
|
73
73
|
color = new Scale('color', this);
|
|
74
74
|
symbol = new Scale('symbol', this);
|
|
75
|
+
body = $state();
|
|
75
76
|
colorSymbolRedundant = $derived(this.color.uniqueMarkProps.length === 1 &&
|
|
76
77
|
this.symbol.uniqueMarkProps.length === 1 &&
|
|
77
78
|
this.color.uniqueMarkProps[0] === this.symbol.uniqueMarkProps[0]);
|
package/dist/index.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export { default as DotY } from './marks/DotY.svelte';
|
|
|
13
13
|
export { default as Frame } from './marks/Frame.svelte';
|
|
14
14
|
export { default as GridX } from './marks/GridX.svelte';
|
|
15
15
|
export { default as GridY } from './marks/GridY.svelte';
|
|
16
|
+
export { default as HTMLTooltip } from './marks/HTMLTooltip.svelte';
|
|
16
17
|
export { default as Line } from './marks/Line.svelte';
|
|
17
18
|
export { default as LineX } from './marks/LineX.svelte';
|
|
18
19
|
export { default as LineY } from './marks/LineY.svelte';
|
package/dist/index.js
CHANGED
|
@@ -15,6 +15,7 @@ export { default as DotY } from './marks/DotY.svelte';
|
|
|
15
15
|
export { default as Frame } from './marks/Frame.svelte';
|
|
16
16
|
export { default as GridX } from './marks/GridX.svelte';
|
|
17
17
|
export { default as GridY } from './marks/GridY.svelte';
|
|
18
|
+
export { default as HTMLTooltip } from './marks/HTMLTooltip.svelte';
|
|
18
19
|
export { default as Line } from './marks/Line.svelte';
|
|
19
20
|
export { default as LineX } from './marks/LineX.svelte';
|
|
20
21
|
export { default as LineY } from './marks/LineY.svelte';
|
package/dist/marks/BarX.svelte
CHANGED
|
@@ -8,11 +8,14 @@ import { stackX } from "../transforms/stack.js";
|
|
|
8
8
|
import { recordizeX } from "../transforms/recordize.js";
|
|
9
9
|
const BaseMark_BarX = BaseMark;
|
|
10
10
|
const plot = getContext("svelteplot");
|
|
11
|
-
let { data: rawData, inset = 0, ...rawChannels } = $props();
|
|
11
|
+
let { data: rawData, inset = 0, onclick, onmouseenter, onmouseleave, ...rawChannels } = $props();
|
|
12
12
|
let { data, ...channels } = $derived(stackX(recordizeX({ data: rawData, ...rawChannels })));
|
|
13
13
|
function isValid(value) {
|
|
14
14
|
return value !== null && !Number.isNaN(value);
|
|
15
15
|
}
|
|
16
|
+
function wrapEvent(handler, d) {
|
|
17
|
+
return handler ? () => handler(d.___orig___ !== void 0 ? d.___orig___ : d) : null;
|
|
18
|
+
}
|
|
16
19
|
</script>
|
|
17
20
|
|
|
18
21
|
<BaseMark_BarX type="bar-x" {data} channels={['y', 'x1', 'x2', 'fill', 'stroke']} {...channels}>
|
|
@@ -37,6 +40,10 @@ function isValid(value) {
|
|
|
37
40
|
transform="translate({[minx, plot.yScale(cy) + inset]})"
|
|
38
41
|
width={maxx - minx}
|
|
39
42
|
height={plot.yScale.bandwidth() - inset * 2}
|
|
43
|
+
role={onclick ? 'button' : null}
|
|
44
|
+
onclick={wrapEvent(onclick, datum)}
|
|
45
|
+
onmouseenter={wrapEvent(onmouseenter, datum)}
|
|
46
|
+
onmouseleave={wrapEvent(onmouseleave, datum)}
|
|
40
47
|
/>
|
|
41
48
|
{/if}
|
|
42
49
|
{/each}
|
package/dist/marks/BarY.svelte
CHANGED
|
@@ -8,11 +8,22 @@ import { stackY } from "../transforms/stack.js";
|
|
|
8
8
|
import { recordizeY } from "../transforms/recordize.js";
|
|
9
9
|
const BaseMark_BarY = BaseMark;
|
|
10
10
|
const plot = getContext("svelteplot");
|
|
11
|
-
let {
|
|
11
|
+
let {
|
|
12
|
+
data: rawData,
|
|
13
|
+
insetLeft,
|
|
14
|
+
insetRight,
|
|
15
|
+
onclick,
|
|
16
|
+
onmouseenter,
|
|
17
|
+
onmouseleave,
|
|
18
|
+
...rawChannels
|
|
19
|
+
} = $props();
|
|
12
20
|
let { data, ...channels } = $derived(stackY(recordizeY({ data: rawData, ...rawChannels })));
|
|
13
21
|
function isValid(value) {
|
|
14
22
|
return value !== null && !Number.isNaN(value);
|
|
15
23
|
}
|
|
24
|
+
function wrapEvent(handler, d) {
|
|
25
|
+
return handler ? () => handler(d.___orig___ !== void 0 ? d.___orig___ : d) : null;
|
|
26
|
+
}
|
|
16
27
|
</script>
|
|
17
28
|
|
|
18
29
|
<BaseMark_BarY type="bar-y" {data} channels={['x', 'y1', 'y2', 'fill', 'stroke']} {...channels}>
|
|
@@ -37,6 +48,10 @@ function isValid(value) {
|
|
|
37
48
|
transform="translate({[plot.xScale(cx), miny]})"
|
|
38
49
|
height={maxy - miny}
|
|
39
50
|
width={plot.xScale.bandwidth()}
|
|
51
|
+
role={onclick ? 'button' : null}
|
|
52
|
+
onclick={wrapEvent(onclick, datum)}
|
|
53
|
+
onmouseenter={wrapEvent(onmouseenter, datum)}
|
|
54
|
+
onmouseleave={wrapEvent(onmouseleave, datum)}
|
|
40
55
|
/>
|
|
41
56
|
{/if}
|
|
42
57
|
{/each}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<script context="module"></script>
|
|
2
|
+
|
|
3
|
+
<script>import { getContext } from "svelte";
|
|
4
|
+
import resolveChannel from "../helpers/resolveChannel.js";
|
|
5
|
+
import { quadtree } from "d3-quadtree";
|
|
6
|
+
const plot = getContext("svelteplot");
|
|
7
|
+
let { data, x, y, r } = $props();
|
|
8
|
+
let datum = $state(false);
|
|
9
|
+
let tooltipX = $state();
|
|
10
|
+
let tooltipY = $state();
|
|
11
|
+
function onMouseMove(evt) {
|
|
12
|
+
const pt = tree.find(evt.layerX, evt.layerY, 15);
|
|
13
|
+
if (pt) {
|
|
14
|
+
tooltipX = resolveChannel("x", pt, { x, y, r });
|
|
15
|
+
tooltipY = resolveChannel("y", pt, { x, y, r });
|
|
16
|
+
datum = pt;
|
|
17
|
+
} else {
|
|
18
|
+
datum = false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
$effect(() => {
|
|
22
|
+
plot.body?.addEventListener("mousemove", onMouseMove);
|
|
23
|
+
return () => {
|
|
24
|
+
plot.body?.removeEventListener("mousemove", onMouseMove);
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
let tree = $derived(
|
|
28
|
+
quadtree().x((d) => plot.xScale(resolveChannel("x", d, { x, y, r }))).y((d) => plot.yScale(resolveChannel("y", d, { x, y, r }))).addAll(data)
|
|
29
|
+
);
|
|
30
|
+
</script>
|
|
31
|
+
|
|
32
|
+
<div
|
|
33
|
+
class="tooltip"
|
|
34
|
+
class:hide={!!!datum}
|
|
35
|
+
style:left="{tooltipX ? plot.xScale(tooltipX) : 0}px"
|
|
36
|
+
style:top="{tooltipY ? plot.yScale(tooltipY) : 0}px"
|
|
37
|
+
>
|
|
38
|
+
<div class="tooltip-body">
|
|
39
|
+
<slot {datum} />
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<style>
|
|
44
|
+
div.tooltip {
|
|
45
|
+
background: white;
|
|
46
|
+
background: var(--svelteplot-tooltip-bg);
|
|
47
|
+
border: 1px solid #ccc;
|
|
48
|
+
border-color: var(--svelteplot-tooltip-border);
|
|
49
|
+
font-size: 13px;
|
|
50
|
+
padding: 1ex 1em;
|
|
51
|
+
border-radius: 3px;
|
|
52
|
+
box-shadow:
|
|
53
|
+
rgba(50, 50, 93, 0.25) 0px 2px 5px -1px,
|
|
54
|
+
rgba(0, 0, 0, 0.3) 0px 1px 3px -1px;
|
|
55
|
+
position: absolute;
|
|
56
|
+
pointer-events: none;
|
|
57
|
+
}
|
|
58
|
+
.tooltip.hide {
|
|
59
|
+
display: none;
|
|
60
|
+
}
|
|
61
|
+
</style>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
import type { ChannelAccessor, DataRow } from '../types.js';
|
|
3
|
+
export type HTMLTooltipMarkProps = {
|
|
4
|
+
data: DataRow[];
|
|
5
|
+
x?: ChannelAccessor;
|
|
6
|
+
y?: ChannelAccessor;
|
|
7
|
+
r?: ChannelAccessor;
|
|
8
|
+
};
|
|
9
|
+
declare const __propDef: {
|
|
10
|
+
props: HTMLTooltipMarkProps;
|
|
11
|
+
events: {
|
|
12
|
+
[evt: string]: CustomEvent<any>;
|
|
13
|
+
};
|
|
14
|
+
slots: {
|
|
15
|
+
default: {
|
|
16
|
+
datum: boolean;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export type HtmlTooltipProps = typeof __propDef.props;
|
|
21
|
+
export type HtmlTooltipEvents = typeof __propDef.events;
|
|
22
|
+
export type HtmlTooltipSlots = typeof __propDef.slots;
|
|
23
|
+
export default class HtmlTooltip extends SvelteComponentTyped<HtmlTooltipProps, HtmlTooltipEvents, HtmlTooltipSlots> {
|
|
24
|
+
}
|
|
25
|
+
export {};
|
package/dist/types.d.ts
CHANGED
|
@@ -145,6 +145,9 @@ export type ValueOf<T> = T[keyof T];
|
|
|
145
145
|
export type ChannelType = ValueOf<typeof SCALE_TYPES>;
|
|
146
146
|
export interface MarkProps {
|
|
147
147
|
data: DataRow[];
|
|
148
|
+
onclick?: MouseEventHandler<SVGPathElement>;
|
|
149
|
+
onmouseenter?: MouseEventHandler<SVGPathElement>;
|
|
150
|
+
onmouseleave?: MouseEventHandler<SVGPathElement>;
|
|
148
151
|
}
|
|
149
152
|
export type BaseMarkProps = MarkProps & {
|
|
150
153
|
type: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "svelteplot",
|
|
3
|
-
"version": "0.0.1-alpha.
|
|
3
|
+
"version": "0.0.1-alpha.23",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"dev": "vite dev",
|
|
6
6
|
"build": "vite build",
|
|
@@ -27,24 +27,24 @@
|
|
|
27
27
|
"!dist/**/*.spec.*"
|
|
28
28
|
],
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@sveltejs/package": "^2.2.5",
|
|
31
30
|
"@playwright/test": "^1.40.1",
|
|
32
31
|
"@sveltejs/adapter-auto": "^3.1.0",
|
|
33
32
|
"@sveltejs/kit": "^2.3.2",
|
|
33
|
+
"@sveltejs/package": "^2.2.5",
|
|
34
|
+
"@sveltejs/vite-plugin-svelte": "^3.0.1",
|
|
35
|
+
"@sveltepress/theme-default": "^1.22.3",
|
|
36
|
+
"@sveltepress/vite": "^0.31.3",
|
|
34
37
|
"@types/chroma-js": "^2.4.3",
|
|
38
|
+
"@types/d3-array": "^3.2.1",
|
|
35
39
|
"@types/d3-dsv": "^3.0.7",
|
|
36
40
|
"@types/d3-interpolate": "^3.0.4",
|
|
37
41
|
"@types/d3-random": "^3.0.3",
|
|
42
|
+
"@types/d3-scale": "^4.0.8",
|
|
38
43
|
"@types/d3-scale-chromatic": "^3.0.3",
|
|
39
44
|
"@types/d3-shape": "^3.1.6",
|
|
40
|
-
"@types/d3-array": "^3.2.1",
|
|
41
|
-
"@types/d3-scale": "^4.0.8",
|
|
42
45
|
"@types/underscore": "^1.11.15",
|
|
43
46
|
"@typescript-eslint/eslint-plugin": "^6.19.0",
|
|
44
47
|
"@typescript-eslint/parser": "^6.19.0",
|
|
45
|
-
"@sveltejs/vite-plugin-svelte": "^3.0.1",
|
|
46
|
-
"@sveltepress/theme-default": "^1.22.3",
|
|
47
|
-
"@sveltepress/vite": "^0.31.3",
|
|
48
48
|
"bulma": "^0.9.4",
|
|
49
49
|
"d3-dsv": "^3.0.1",
|
|
50
50
|
"eslint": "^8.56.0",
|
|
@@ -71,6 +71,7 @@
|
|
|
71
71
|
"chroma-js": "^2.4.2",
|
|
72
72
|
"d3-array": "^3.2.4",
|
|
73
73
|
"d3-interpolate": "^3.0.1",
|
|
74
|
+
"d3-quadtree": "^3.0.1",
|
|
74
75
|
"d3-random": "^3.0.1",
|
|
75
76
|
"d3-scale": "^4.0.2",
|
|
76
77
|
"d3-scale-chromatic": "^3.0.0",
|