layerchart 0.53.0 → 0.54.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/dist/components/Axis.svelte +51 -94
- package/dist/components/Axis.svelte.d.ts +2 -1
- package/dist/components/Bars.svelte +2 -1
- package/dist/components/Bars.svelte.d.ts +1 -0
- package/dist/components/Chart.svelte +6 -4
- package/dist/components/Chart.svelte.d.ts +25 -8
- package/dist/components/ChartContext.svelte +1 -1
- package/dist/components/ChartContext.svelte.d.ts +1 -1
- package/dist/components/Grid.svelte +151 -0
- package/dist/components/Grid.svelte.d.ts +35 -0
- package/dist/components/Labels.svelte +15 -5
- package/dist/components/Labels.svelte.d.ts +2 -0
- package/dist/components/Legend.svelte +1 -1
- package/dist/components/Rule.svelte +20 -4
- package/dist/components/Rule.svelte.d.ts +2 -0
- package/dist/components/TransformContext.svelte +3 -1
- package/dist/components/charts/AreaChart.svelte +59 -35
- package/dist/components/charts/AreaChart.svelte.d.ts +40 -2
- package/dist/components/charts/BarChart.svelte +63 -29
- package/dist/components/charts/BarChart.svelte.d.ts +40 -2
- package/dist/components/charts/LineChart.svelte +44 -16
- package/dist/components/charts/LineChart.svelte.d.ts +40 -2
- package/dist/components/charts/PieChart.svelte +15 -1
- package/dist/components/charts/PieChart.svelte.d.ts +16 -1
- package/dist/components/charts/ScatterChart.svelte +31 -16
- package/dist/components/charts/ScatterChart.svelte.d.ts +38 -2
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.js +1 -0
- package/dist/components/tooltip/Tooltip.svelte +20 -5
- package/dist/components/tooltip/TooltipContext.svelte +2 -1
- package/dist/components/tooltip/TooltipContext.svelte.d.ts +7 -0
- package/dist/docs/Preview.svelte +24 -11
- package/dist/utils/scales.d.ts +1 -1
- package/package.json +1 -1
|
@@ -15,6 +15,8 @@ $: [yRangeMin, yRangeMax] = extent($yRange);
|
|
|
15
15
|
* - Use number | Date value for annotation (yScale(value))
|
|
16
16
|
*/
|
|
17
17
|
export let x = false;
|
|
18
|
+
/** Pixel offset to apply to `x` coordinate */
|
|
19
|
+
export let xOffset = 0;
|
|
18
20
|
/**
|
|
19
21
|
* Create a horizontal `y` line
|
|
20
22
|
* - If true or 'bottom', will draw at chart bottom (yRange[0])
|
|
@@ -23,6 +25,8 @@ export let x = false;
|
|
|
23
25
|
* - Use number | Date value for annotation (xScale(value))
|
|
24
26
|
*/
|
|
25
27
|
export let y = false;
|
|
28
|
+
/** Pixel offset to apply to `y` coordinate */
|
|
29
|
+
export let yOffset = 0;
|
|
26
30
|
function showRule(value, axis) {
|
|
27
31
|
switch (typeof value) {
|
|
28
32
|
case 'boolean':
|
|
@@ -43,7 +47,7 @@ function showRule(value, axis) {
|
|
|
43
47
|
<g class="rule">
|
|
44
48
|
{#if showRule(x, 'x')}
|
|
45
49
|
{@const xCoord =
|
|
46
|
-
x === true || x === 'left' ? xRangeMin : x === 'right' ? xRangeMax : $xScale(x)}
|
|
50
|
+
x === true || x === 'left' ? xRangeMin : x === 'right' ? xRangeMax : $xScale(x) + xOffset}
|
|
47
51
|
|
|
48
52
|
{#if $radial}
|
|
49
53
|
{@const [x1, y1] = pointRadial(xCoord, Number(yRangeMin))}
|
|
@@ -72,15 +76,27 @@ function showRule(value, axis) {
|
|
|
72
76
|
{#if showRule(y, 'y')}
|
|
73
77
|
{#if $radial}
|
|
74
78
|
<Circle
|
|
75
|
-
r={y === true || y === 'bottom'
|
|
79
|
+
r={y === true || y === 'bottom'
|
|
80
|
+
? yRangeMax
|
|
81
|
+
: y === 'top'
|
|
82
|
+
? yRangeMin
|
|
83
|
+
: $yScale(y) + yOffset}
|
|
76
84
|
class={cls('fill-none stroke-surface-content/50', $$props.class)}
|
|
77
85
|
/>
|
|
78
86
|
{:else}
|
|
79
87
|
<Line
|
|
80
88
|
x1={$xRange[0] || 0}
|
|
81
89
|
x2={$xRange[1] || 0}
|
|
82
|
-
y1={y === true || y === 'bottom'
|
|
83
|
-
|
|
90
|
+
y1={y === true || y === 'bottom'
|
|
91
|
+
? yRangeMax
|
|
92
|
+
: y === 'top'
|
|
93
|
+
? yRangeMin
|
|
94
|
+
: $yScale(y) + yOffset}
|
|
95
|
+
y2={y === true || y === 'bottom'
|
|
96
|
+
? yRangeMax
|
|
97
|
+
: y === 'top'
|
|
98
|
+
? yRangeMin
|
|
99
|
+
: $yScale(y) + yOffset}
|
|
84
100
|
{...$$restProps}
|
|
85
101
|
class={cls('stroke-surface-content/50', $$props.class)}
|
|
86
102
|
/>
|
|
@@ -3,7 +3,9 @@ declare const __propDef: {
|
|
|
3
3
|
props: {
|
|
4
4
|
[x: string]: any;
|
|
5
5
|
x?: (number | Date | boolean | "left" | "right") | undefined;
|
|
6
|
+
xOffset?: number | undefined;
|
|
6
7
|
y?: (number | Date | boolean | "top" | "bottom") | undefined;
|
|
8
|
+
yOffset?: number | undefined;
|
|
7
9
|
};
|
|
8
10
|
events: {
|
|
9
11
|
[evt: string]: CustomEvent<any>;
|
|
@@ -226,7 +226,9 @@ setTransformContext({
|
|
|
226
226
|
// Touch events cause pointer events to be interrupted.
|
|
227
227
|
// Typically `touch-action: none` works, but doesn't appear to with SVG, but `preventDefault()` works here
|
|
228
228
|
// https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events#touch-action_css_property
|
|
229
|
-
|
|
229
|
+
if (mode !== 'none' && !disablePointer) {
|
|
230
|
+
e.preventDefault();
|
|
231
|
+
}
|
|
230
232
|
}}
|
|
231
233
|
on:pointerup={onPointerUp}
|
|
232
234
|
on:dblclick={onDoubleClick}
|
|
@@ -6,6 +6,7 @@ import { format } from '@layerstack/utils';
|
|
|
6
6
|
import Area from '../Area.svelte';
|
|
7
7
|
import Axis from '../Axis.svelte';
|
|
8
8
|
import Chart from '../Chart.svelte';
|
|
9
|
+
import Grid from '../Grid.svelte';
|
|
9
10
|
import Highlight from '../Highlight.svelte';
|
|
10
11
|
import Labels from '../Labels.svelte';
|
|
11
12
|
import Legend from '../Legend.svelte';
|
|
@@ -21,10 +22,12 @@ export let y = undefined;
|
|
|
21
22
|
/** Use radial instead of cartesian coordinates, mapping `x` to `angle` and `y`` to radial. Radial lines are positioned relative to the origin, use transform (ex. `<Group center>`) to change the origin */
|
|
22
23
|
export let radial = false;
|
|
23
24
|
export let series = [{ key: 'default', value: y, color: 'hsl(var(--color-primary))' }];
|
|
25
|
+
$: isDefaultSeries = series.length === 1 && series[0].key === 'default';
|
|
24
26
|
/** Determine how to layout series. Overlap (default) or stack */
|
|
25
27
|
export let seriesLayout = 'overlap';
|
|
26
28
|
$: stackSeries = seriesLayout.startsWith('stack');
|
|
27
29
|
export let axis = true;
|
|
30
|
+
export let grid = true;
|
|
28
31
|
export let rule = true;
|
|
29
32
|
export let labels = false;
|
|
30
33
|
export let legend = false;
|
|
@@ -57,6 +60,32 @@ $: if (stackSeries) {
|
|
|
57
60
|
}
|
|
58
61
|
// Default xScale based on first data's `x` value
|
|
59
62
|
$: xScale = accessor(x)(chartData[0]) instanceof Date ? scaleTime() : scaleLinear();
|
|
63
|
+
function getAreaProps(s, i) {
|
|
64
|
+
const lineProps = {
|
|
65
|
+
...props.line,
|
|
66
|
+
...(typeof props.area?.line === 'object' ? props.area.line : null),
|
|
67
|
+
...(typeof s.props?.line === 'object' ? s.props.line : null),
|
|
68
|
+
};
|
|
69
|
+
const areaProps = {
|
|
70
|
+
data: s.data,
|
|
71
|
+
y0: stackSeries ? (d) => d.stackData[i][0] : Array.isArray(s.value) ? s.value[0] : undefined,
|
|
72
|
+
y1: stackSeries
|
|
73
|
+
? (d) => d.stackData[i][1]
|
|
74
|
+
: Array.isArray(s.value)
|
|
75
|
+
? s.value[1]
|
|
76
|
+
: (s.value ?? s.key),
|
|
77
|
+
fill: s.color,
|
|
78
|
+
'fill-opacity': 0.3,
|
|
79
|
+
...props.area,
|
|
80
|
+
...s.props,
|
|
81
|
+
line: {
|
|
82
|
+
class: !('stroke-width' in lineProps) ? 'stroke-2' : '',
|
|
83
|
+
stroke: s.color,
|
|
84
|
+
...lineProps,
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
return areaProps;
|
|
88
|
+
}
|
|
60
89
|
</script>
|
|
61
90
|
|
|
62
91
|
<Chart
|
|
@@ -82,20 +111,41 @@ $: xScale = accessor(x)(chartData[0]) instanceof Date ? scaleTime() : scaleLinea
|
|
|
82
111
|
let:xScale
|
|
83
112
|
let:y
|
|
84
113
|
let:yScale
|
|
114
|
+
let:c
|
|
115
|
+
let:cScale
|
|
85
116
|
let:width
|
|
86
117
|
let:height
|
|
87
118
|
let:padding
|
|
88
119
|
let:tooltip
|
|
89
120
|
>
|
|
90
|
-
{@const slotProps = {
|
|
121
|
+
{@const slotProps = {
|
|
122
|
+
x,
|
|
123
|
+
xScale,
|
|
124
|
+
y,
|
|
125
|
+
yScale,
|
|
126
|
+
c,
|
|
127
|
+
cScale,
|
|
128
|
+
width,
|
|
129
|
+
height,
|
|
130
|
+
padding,
|
|
131
|
+
tooltip,
|
|
132
|
+
series,
|
|
133
|
+
getAreaProps,
|
|
134
|
+
}}
|
|
135
|
+
|
|
91
136
|
<slot {...slotProps}>
|
|
92
137
|
<Svg center={radial}>
|
|
138
|
+
<slot name="grid" {...slotProps}>
|
|
139
|
+
{#if grid}
|
|
140
|
+
<Grid x={radial} y {...typeof grid === 'object' ? grid : null} {...props.grid} />
|
|
141
|
+
{/if}
|
|
142
|
+
</slot>
|
|
143
|
+
|
|
93
144
|
<slot name="axis" {...slotProps}>
|
|
94
145
|
{#if axis}
|
|
95
146
|
{#if axis !== 'x'}
|
|
96
147
|
<Axis
|
|
97
148
|
placement={radial ? 'radius' : 'left'}
|
|
98
|
-
grid
|
|
99
149
|
format={(value) => {
|
|
100
150
|
if (seriesLayout === 'stackExpand') {
|
|
101
151
|
return format(value, 'percentRound');
|
|
@@ -111,7 +161,6 @@ $: xScale = accessor(x)(chartData[0]) instanceof Date ? scaleTime() : scaleLinea
|
|
|
111
161
|
{#if axis !== 'y'}
|
|
112
162
|
<Axis
|
|
113
163
|
placement={radial ? 'angle' : 'bottom'}
|
|
114
|
-
grid={radial}
|
|
115
164
|
format={(value) => format(value, undefined, { variant: 'short' })}
|
|
116
165
|
{...typeof axis === 'object' ? axis : null}
|
|
117
166
|
{...props.xAxis}
|
|
@@ -128,34 +177,7 @@ $: xScale = accessor(x)(chartData[0]) instanceof Date ? scaleTime() : scaleLinea
|
|
|
128
177
|
|
|
129
178
|
<slot name="marks" {...slotProps}>
|
|
130
179
|
{#each series as s, i}
|
|
131
|
-
{
|
|
132
|
-
...props.line,
|
|
133
|
-
...(typeof props.area?.line === 'object' ? props.area.line : null),
|
|
134
|
-
...(typeof s.props?.line === 'object' ? s.props.line : null),
|
|
135
|
-
}}
|
|
136
|
-
|
|
137
|
-
<Area
|
|
138
|
-
data={s.data}
|
|
139
|
-
y0={stackSeries
|
|
140
|
-
? (d) => d.stackData[i][0]
|
|
141
|
-
: Array.isArray(s.value)
|
|
142
|
-
? s.value[0]
|
|
143
|
-
: undefined}
|
|
144
|
-
y1={stackSeries
|
|
145
|
-
? (d) => d.stackData[i][1]
|
|
146
|
-
: Array.isArray(s.value)
|
|
147
|
-
? s.value[1]
|
|
148
|
-
: (s.value ?? s.key)}
|
|
149
|
-
fill={s.color}
|
|
150
|
-
fill-opacity={0.3}
|
|
151
|
-
{...props.area}
|
|
152
|
-
{...s.props}
|
|
153
|
-
line={{
|
|
154
|
-
class: !('stroke-width' in lineProps) ? 'stroke-2' : '',
|
|
155
|
-
stroke: s.color,
|
|
156
|
-
...lineProps,
|
|
157
|
-
}}
|
|
158
|
-
/>
|
|
180
|
+
<Area {...getAreaProps(s, i)} />
|
|
159
181
|
{/each}
|
|
160
182
|
</slot>
|
|
161
183
|
|
|
@@ -192,10 +214,12 @@ $: xScale = accessor(x)(chartData[0]) instanceof Date ? scaleTime() : scaleLinea
|
|
|
192
214
|
<slot name="legend" {...slotProps}>
|
|
193
215
|
{#if legend}
|
|
194
216
|
<Legend
|
|
195
|
-
scale={
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
217
|
+
scale={isDefaultSeries
|
|
218
|
+
? undefined
|
|
219
|
+
: scaleOrdinal(
|
|
220
|
+
series.map((s) => s.label ?? s.key),
|
|
221
|
+
series.map((s) => s.color)
|
|
222
|
+
)}
|
|
199
223
|
placement="bottom"
|
|
200
224
|
variant="swatches"
|
|
201
225
|
{...props.legend}
|
|
@@ -2,6 +2,7 @@ import { SvelteComponentTyped } from "svelte";
|
|
|
2
2
|
import { type ComponentProps } from 'svelte';
|
|
3
3
|
import Area from '../Area.svelte';
|
|
4
4
|
import Axis from '../Axis.svelte';
|
|
5
|
+
import Grid from '../Grid.svelte';
|
|
5
6
|
import Highlight from '../Highlight.svelte';
|
|
6
7
|
import Labels from '../Labels.svelte';
|
|
7
8
|
import Legend from '../Legend.svelte';
|
|
@@ -77,7 +78,7 @@ declare class __sveltets_Render<TData> {
|
|
|
77
78
|
width: number;
|
|
78
79
|
height: number;
|
|
79
80
|
}) => number[] | string[]) | undefined;
|
|
80
|
-
cRange?: string[];
|
|
81
|
+
cRange?: string[] | readonly string[];
|
|
81
82
|
xReverse?: boolean;
|
|
82
83
|
yReverse?: boolean;
|
|
83
84
|
zReverse?: boolean;
|
|
@@ -132,6 +133,13 @@ declare class __sveltets_Render<TData> {
|
|
|
132
133
|
onClick?: ({ data }: {
|
|
133
134
|
data: any;
|
|
134
135
|
}) => any;
|
|
136
|
+
tooltip?: import("svelte/store").Writable<{
|
|
137
|
+
y: number;
|
|
138
|
+
x: number;
|
|
139
|
+
data: any;
|
|
140
|
+
show: (e: PointerEvent, tooltipData?: any) => void;
|
|
141
|
+
hide: () => void;
|
|
142
|
+
}>;
|
|
135
143
|
}> | undefined;
|
|
136
144
|
transform?: Partial<{
|
|
137
145
|
mode?: "canvas" | "manual" | "none";
|
|
@@ -180,6 +188,14 @@ declare class __sveltets_Render<TData> {
|
|
|
180
188
|
setScale?: (value: number, options?: import("../../stores/motionStore").MotionOptions) => void;
|
|
181
189
|
}> | undefined;
|
|
182
190
|
transformContext?: import("..").TransformContext;
|
|
191
|
+
geoProjection?: import("svelte/store").Writable<import("d3-geo").GeoProjection> | undefined;
|
|
192
|
+
tooltipContext?: import("svelte/store").Writable<{
|
|
193
|
+
y: number;
|
|
194
|
+
x: number;
|
|
195
|
+
data: any;
|
|
196
|
+
show: (e: PointerEvent, tooltipData?: any) => void;
|
|
197
|
+
hide: () => void;
|
|
198
|
+
}> | undefined;
|
|
183
199
|
} & {
|
|
184
200
|
axis?: boolean | "x" | "y" | {
|
|
185
201
|
[x: string]: any;
|
|
@@ -187,7 +203,7 @@ declare class __sveltets_Render<TData> {
|
|
|
187
203
|
label?: string | undefined;
|
|
188
204
|
labelPlacement?: ("start" | "middle" | "end") | undefined;
|
|
189
205
|
labelProps?: Partial<ComponentProps<import("..").Text>> | undefined;
|
|
190
|
-
rule?: (boolean |
|
|
206
|
+
rule?: (boolean | Partial<ComponentProps<Rule>>) | undefined;
|
|
191
207
|
grid?: (boolean | Pick<import("svelte/elements").SVGAttributes<SVGElement>, "class" | "style">) | undefined;
|
|
192
208
|
ticks?: number | any[] | ((scale: import("../../utils/scales").AnyScale) => any) | null | undefined;
|
|
193
209
|
tickLength?: number | undefined;
|
|
@@ -203,8 +219,26 @@ declare class __sveltets_Render<TData> {
|
|
|
203
219
|
label?: string;
|
|
204
220
|
} | undefined;
|
|
205
221
|
};
|
|
222
|
+
grid?: boolean | {
|
|
223
|
+
[x: string]: any;
|
|
224
|
+
x?: (boolean | Pick<import("svelte/elements").SVGAttributes<SVGElement>, "class" | "style">) | undefined;
|
|
225
|
+
y?: (boolean | Pick<import("svelte/elements").SVGAttributes<SVGElement>, "class" | "style">) | undefined;
|
|
226
|
+
xTicks?: number | any[] | ((scale: import("../../utils/scales").AnyScale) => any) | null | undefined;
|
|
227
|
+
yTicks?: number | any[] | ((scale: import("../../utils/scales").AnyScale) => any) | null | undefined;
|
|
228
|
+
bandAlign?: ("center" | "between") | undefined;
|
|
229
|
+
radialY?: ("circle" | "linear") | undefined;
|
|
230
|
+
spring?: boolean | Parameters<typeof import("svelte/motion").spring>[1];
|
|
231
|
+
tweened?: boolean | Parameters<typeof import("svelte/motion").tweened>[1];
|
|
232
|
+
transitionIn?: (typeof import("svelte/transition").fade | (() => {})) | undefined;
|
|
233
|
+
transitionInParams?: import("svelte-ux").TransitionParams | undefined;
|
|
234
|
+
classes?: {
|
|
235
|
+
root?: string;
|
|
236
|
+
line?: string;
|
|
237
|
+
} | undefined;
|
|
238
|
+
};
|
|
206
239
|
labels?: boolean | {
|
|
207
240
|
[x: string]: any;
|
|
241
|
+
value?: Accessor;
|
|
208
242
|
placement?: ("inside" | "outside" | "center") | undefined;
|
|
209
243
|
offset?: number | undefined;
|
|
210
244
|
format?: import("@layerstack/utils").FormatType | undefined;
|
|
@@ -248,6 +282,7 @@ declare class __sveltets_Render<TData> {
|
|
|
248
282
|
props?: {
|
|
249
283
|
xAxis?: Partial<ComponentProps<Axis>>;
|
|
250
284
|
yAxis?: Partial<ComponentProps<Axis>>;
|
|
285
|
+
grid?: Partial<ComponentProps<Grid>>;
|
|
251
286
|
rule?: Partial<ComponentProps<Rule>>;
|
|
252
287
|
area?: Partial<ComponentProps<Area>>;
|
|
253
288
|
line?: Partial<ComponentProps<Line>>;
|
|
@@ -259,7 +294,9 @@ declare class __sveltets_Render<TData> {
|
|
|
259
294
|
rule?: boolean | {
|
|
260
295
|
[x: string]: any;
|
|
261
296
|
x?: (number | Date | boolean | "left" | "right") | undefined;
|
|
297
|
+
xOffset?: number | undefined;
|
|
262
298
|
y?: (number | Date | boolean | "top" | "bottom") | undefined;
|
|
299
|
+
yOffset?: number | undefined;
|
|
263
300
|
};
|
|
264
301
|
series?: {
|
|
265
302
|
key: string;
|
|
@@ -277,6 +314,7 @@ declare class __sveltets_Render<TData> {
|
|
|
277
314
|
};
|
|
278
315
|
slots(): {
|
|
279
316
|
default: any;
|
|
317
|
+
grid: any;
|
|
280
318
|
axis: any;
|
|
281
319
|
'below-marks': any;
|
|
282
320
|
marks: any;
|
|
@@ -6,6 +6,7 @@ import { format } from '@layerstack/utils';
|
|
|
6
6
|
import Axis from '../Axis.svelte';
|
|
7
7
|
import Bars from '../Bars.svelte';
|
|
8
8
|
import Chart from '../Chart.svelte';
|
|
9
|
+
import Grid from '../Grid.svelte';
|
|
9
10
|
import Highlight from '../Highlight.svelte';
|
|
10
11
|
import Labels from '../Labels.svelte';
|
|
11
12
|
import Legend from '../Legend.svelte';
|
|
@@ -22,15 +23,16 @@ export let series = [
|
|
|
22
23
|
{
|
|
23
24
|
key: 'default',
|
|
24
25
|
value: orientation === 'vertical' ? y : x,
|
|
25
|
-
color: 'hsl(var(--color-primary))',
|
|
26
26
|
},
|
|
27
27
|
];
|
|
28
|
+
$: isDefaultSeries = series.length === 1 && series[0].key === 'default';
|
|
28
29
|
/** Determine how to layout series. Overlap (default), stack, or group side by side */
|
|
29
30
|
export let seriesLayout = 'overlap';
|
|
30
31
|
$: stackSeries = seriesLayout.startsWith('stack');
|
|
31
32
|
$: groupSeries = seriesLayout === 'group';
|
|
32
33
|
export let axis = true;
|
|
33
34
|
export let rule = true;
|
|
35
|
+
export let grid = true;
|
|
34
36
|
export let labels = false;
|
|
35
37
|
export let legend = false;
|
|
36
38
|
/** Padding between primary x or y bands/bars, applied to scaleBand().padding() */
|
|
@@ -88,6 +90,29 @@ $: if (stackSeries) {
|
|
|
88
90
|
};
|
|
89
91
|
});
|
|
90
92
|
}
|
|
93
|
+
function getBarsProps(s, i) {
|
|
94
|
+
const barsProps = {
|
|
95
|
+
data: s.data,
|
|
96
|
+
x: !isVertical
|
|
97
|
+
? stackSeries
|
|
98
|
+
? (d) => d.stackData[i]
|
|
99
|
+
: (s.value ?? (s.data ? undefined : s.key))
|
|
100
|
+
: undefined,
|
|
101
|
+
y: isVertical
|
|
102
|
+
? stackSeries
|
|
103
|
+
? (d) => d.stackData[i]
|
|
104
|
+
: (s.value ?? (s.data ? undefined : s.key))
|
|
105
|
+
: undefined,
|
|
106
|
+
x1: isVertical && groupSeries ? (d) => s.value ?? s.key : undefined,
|
|
107
|
+
y1: !isVertical && groupSeries ? (d) => s.value ?? s.key : undefined,
|
|
108
|
+
radius: 4,
|
|
109
|
+
strokeWidth: 1,
|
|
110
|
+
fill: s.color,
|
|
111
|
+
...props.bars,
|
|
112
|
+
...s.props,
|
|
113
|
+
};
|
|
114
|
+
return barsProps;
|
|
115
|
+
}
|
|
91
116
|
</script>
|
|
92
117
|
|
|
93
118
|
<Chart
|
|
@@ -112,6 +137,8 @@ $: if (stackSeries) {
|
|
|
112
137
|
{y1Scale}
|
|
113
138
|
{y1Domain}
|
|
114
139
|
{y1Range}
|
|
140
|
+
c={isVertical ? y : x}
|
|
141
|
+
cRange={['hsl(var(--color-primary))']}
|
|
115
142
|
padding={axis === false
|
|
116
143
|
? undefined
|
|
117
144
|
: {
|
|
@@ -124,20 +151,45 @@ $: if (stackSeries) {
|
|
|
124
151
|
let:xScale
|
|
125
152
|
let:y
|
|
126
153
|
let:yScale
|
|
154
|
+
let:c
|
|
155
|
+
let:cScale
|
|
127
156
|
let:width
|
|
128
157
|
let:height
|
|
129
158
|
let:padding
|
|
130
159
|
let:tooltip
|
|
131
160
|
>
|
|
132
|
-
{@const slotProps = {
|
|
161
|
+
{@const slotProps = {
|
|
162
|
+
x,
|
|
163
|
+
xScale,
|
|
164
|
+
y,
|
|
165
|
+
yScale,
|
|
166
|
+
c,
|
|
167
|
+
cScale,
|
|
168
|
+
width,
|
|
169
|
+
height,
|
|
170
|
+
padding,
|
|
171
|
+
tooltip,
|
|
172
|
+
series,
|
|
173
|
+
getBarsProps,
|
|
174
|
+
}}
|
|
133
175
|
<slot {...slotProps}>
|
|
134
176
|
<Svg>
|
|
177
|
+
<slot name="grid" {...slotProps}>
|
|
178
|
+
{#if grid}
|
|
179
|
+
<Grid
|
|
180
|
+
x={!isVertical}
|
|
181
|
+
y={isVertical}
|
|
182
|
+
{...typeof grid === 'object' ? grid : null}
|
|
183
|
+
{...props.grid}
|
|
184
|
+
/>
|
|
185
|
+
{/if}
|
|
186
|
+
</slot>
|
|
187
|
+
|
|
135
188
|
<slot name="axis" {...slotProps}>
|
|
136
189
|
{#if axis}
|
|
137
190
|
{#if axis !== 'x'}
|
|
138
191
|
<Axis
|
|
139
192
|
placement="left"
|
|
140
|
-
grid={isVertical}
|
|
141
193
|
format={(value) => {
|
|
142
194
|
if (isVertical && seriesLayout === 'stackExpand') {
|
|
143
195
|
return format(value, 'percentRound');
|
|
@@ -153,7 +205,6 @@ $: if (stackSeries) {
|
|
|
153
205
|
{#if axis !== 'y'}
|
|
154
206
|
<Axis
|
|
155
207
|
placement="bottom"
|
|
156
|
-
grid={!isVertical}
|
|
157
208
|
format={(value) => {
|
|
158
209
|
if (!isVertical && seriesLayout === 'stackExpand') {
|
|
159
210
|
return format(value, 'percentRound');
|
|
@@ -176,26 +227,7 @@ $: if (stackSeries) {
|
|
|
176
227
|
|
|
177
228
|
<slot name="marks" {...slotProps}>
|
|
178
229
|
{#each series as s, i}
|
|
179
|
-
<Bars
|
|
180
|
-
data={s.data}
|
|
181
|
-
x={!isVertical
|
|
182
|
-
? stackSeries
|
|
183
|
-
? (d) => d.stackData[i]
|
|
184
|
-
: (s.value ?? (s.data ? undefined : s.key))
|
|
185
|
-
: undefined}
|
|
186
|
-
y={isVertical
|
|
187
|
-
? stackSeries
|
|
188
|
-
? (d) => d.stackData[i]
|
|
189
|
-
: (s.value ?? (s.data ? undefined : s.key))
|
|
190
|
-
: undefined}
|
|
191
|
-
x1={isVertical && groupSeries ? (d) => s.value ?? s.key : undefined}
|
|
192
|
-
y1={!isVertical && groupSeries ? (d) => s.value ?? s.key : undefined}
|
|
193
|
-
radius={4}
|
|
194
|
-
strokeWidth={1}
|
|
195
|
-
fill={s.color}
|
|
196
|
-
{...props.bars}
|
|
197
|
-
{...s.props}
|
|
198
|
-
/>
|
|
230
|
+
<Bars {...getBarsProps(s, i)} />
|
|
199
231
|
{/each}
|
|
200
232
|
</slot>
|
|
201
233
|
|
|
@@ -213,10 +245,12 @@ $: if (stackSeries) {
|
|
|
213
245
|
<slot name="legend" {...slotProps}>
|
|
214
246
|
{#if legend}
|
|
215
247
|
<Legend
|
|
216
|
-
scale={
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
248
|
+
scale={isDefaultSeries
|
|
249
|
+
? undefined
|
|
250
|
+
: scaleOrdinal(
|
|
251
|
+
series.map((s) => s.label ?? s.key),
|
|
252
|
+
series.map((s) => s.color)
|
|
253
|
+
)}
|
|
220
254
|
placement="bottom"
|
|
221
255
|
variant="swatches"
|
|
222
256
|
{...props.legend}
|
|
@@ -236,7 +270,7 @@ $: if (stackSeries) {
|
|
|
236
270
|
<Tooltip.Item
|
|
237
271
|
label={s.label ?? (s.key !== 'default' ? s.key : 'value')}
|
|
238
272
|
value={valueAccessor(data)}
|
|
239
|
-
color={s.color}
|
|
273
|
+
color={s.color ?? cScale(c(data))}
|
|
240
274
|
{format}
|
|
241
275
|
valueAlign="right"
|
|
242
276
|
/>
|
|
@@ -2,6 +2,7 @@ import { SvelteComponentTyped } from "svelte";
|
|
|
2
2
|
import { type ComponentProps } from 'svelte';
|
|
3
3
|
import Axis from '../Axis.svelte';
|
|
4
4
|
import Bars from '../Bars.svelte';
|
|
5
|
+
import Grid from '../Grid.svelte';
|
|
5
6
|
import Highlight from '../Highlight.svelte';
|
|
6
7
|
import Labels from '../Labels.svelte';
|
|
7
8
|
import Legend from '../Legend.svelte';
|
|
@@ -75,7 +76,7 @@ declare class __sveltets_Render<TData> {
|
|
|
75
76
|
width: number;
|
|
76
77
|
height: number;
|
|
77
78
|
}) => number[] | string[]) | undefined;
|
|
78
|
-
cRange?: string[];
|
|
79
|
+
cRange?: string[] | readonly string[];
|
|
79
80
|
xReverse?: boolean;
|
|
80
81
|
yReverse?: boolean;
|
|
81
82
|
zReverse?: boolean;
|
|
@@ -130,6 +131,13 @@ declare class __sveltets_Render<TData> {
|
|
|
130
131
|
onClick?: ({ data }: {
|
|
131
132
|
data: any;
|
|
132
133
|
}) => any;
|
|
134
|
+
tooltip?: import("svelte/store").Writable<{
|
|
135
|
+
y: number;
|
|
136
|
+
x: number;
|
|
137
|
+
data: any;
|
|
138
|
+
show: (e: PointerEvent, tooltipData?: any) => void;
|
|
139
|
+
hide: () => void;
|
|
140
|
+
}>;
|
|
133
141
|
}> | undefined;
|
|
134
142
|
transform?: Partial<{
|
|
135
143
|
mode?: "canvas" | "manual" | "none";
|
|
@@ -178,6 +186,14 @@ declare class __sveltets_Render<TData> {
|
|
|
178
186
|
setScale?: (value: number, options?: import("../../stores/motionStore").MotionOptions) => void;
|
|
179
187
|
}> | undefined;
|
|
180
188
|
transformContext?: import("..").TransformContext;
|
|
189
|
+
geoProjection?: import("svelte/store").Writable<import("d3-geo").GeoProjection> | undefined;
|
|
190
|
+
tooltipContext?: import("svelte/store").Writable<{
|
|
191
|
+
y: number;
|
|
192
|
+
x: number;
|
|
193
|
+
data: any;
|
|
194
|
+
show: (e: PointerEvent, tooltipData?: any) => void;
|
|
195
|
+
hide: () => void;
|
|
196
|
+
}> | undefined;
|
|
181
197
|
} & {
|
|
182
198
|
axis?: boolean | "x" | "y" | {
|
|
183
199
|
[x: string]: any;
|
|
@@ -185,7 +201,7 @@ declare class __sveltets_Render<TData> {
|
|
|
185
201
|
label?: string | undefined;
|
|
186
202
|
labelPlacement?: ("start" | "middle" | "end") | undefined;
|
|
187
203
|
labelProps?: Partial<ComponentProps<import("..").Text>> | undefined;
|
|
188
|
-
rule?: (boolean |
|
|
204
|
+
rule?: (boolean | Partial<ComponentProps<Rule>>) | undefined;
|
|
189
205
|
grid?: (boolean | Pick<import("svelte/elements").SVGAttributes<SVGElement>, "class" | "style">) | undefined;
|
|
190
206
|
ticks?: number | any[] | ((scale: import("../../utils/scales").AnyScale) => any) | null | undefined;
|
|
191
207
|
tickLength?: number | undefined;
|
|
@@ -201,10 +217,28 @@ declare class __sveltets_Render<TData> {
|
|
|
201
217
|
label?: string;
|
|
202
218
|
} | undefined;
|
|
203
219
|
};
|
|
220
|
+
grid?: boolean | {
|
|
221
|
+
[x: string]: any;
|
|
222
|
+
x?: (boolean | Pick<import("svelte/elements").SVGAttributes<SVGElement>, "class" | "style">) | undefined;
|
|
223
|
+
y?: (boolean | Pick<import("svelte/elements").SVGAttributes<SVGElement>, "class" | "style">) | undefined;
|
|
224
|
+
xTicks?: number | any[] | ((scale: import("../../utils/scales").AnyScale) => any) | null | undefined;
|
|
225
|
+
yTicks?: number | any[] | ((scale: import("../../utils/scales").AnyScale) => any) | null | undefined;
|
|
226
|
+
bandAlign?: ("center" | "between") | undefined;
|
|
227
|
+
radialY?: ("circle" | "linear") | undefined;
|
|
228
|
+
spring?: boolean | Parameters<typeof import("svelte/motion").spring>[1];
|
|
229
|
+
tweened?: boolean | Parameters<typeof import("svelte/motion").tweened>[1];
|
|
230
|
+
transitionIn?: (typeof import("svelte/transition").fade | (() => {})) | undefined;
|
|
231
|
+
transitionInParams?: import("svelte-ux").TransitionParams | undefined;
|
|
232
|
+
classes?: {
|
|
233
|
+
root?: string;
|
|
234
|
+
line?: string;
|
|
235
|
+
} | undefined;
|
|
236
|
+
};
|
|
204
237
|
bandPadding?: number;
|
|
205
238
|
groupPadding?: number;
|
|
206
239
|
labels?: boolean | {
|
|
207
240
|
[x: string]: any;
|
|
241
|
+
value?: Accessor;
|
|
208
242
|
placement?: ("inside" | "outside" | "center") | undefined;
|
|
209
243
|
offset?: number | undefined;
|
|
210
244
|
format?: import("@layerstack/utils").FormatType | undefined;
|
|
@@ -236,6 +270,7 @@ declare class __sveltets_Render<TData> {
|
|
|
236
270
|
props?: {
|
|
237
271
|
xAxis?: Partial<ComponentProps<Axis>>;
|
|
238
272
|
yAxis?: Partial<ComponentProps<Axis>>;
|
|
273
|
+
grid?: Partial<ComponentProps<Grid>>;
|
|
239
274
|
rule?: Partial<ComponentProps<Rule>>;
|
|
240
275
|
bars?: Partial<ComponentProps<Bars>>;
|
|
241
276
|
legend?: Partial<ComponentProps<Legend>>;
|
|
@@ -245,7 +280,9 @@ declare class __sveltets_Render<TData> {
|
|
|
245
280
|
rule?: boolean | {
|
|
246
281
|
[x: string]: any;
|
|
247
282
|
x?: (number | Date | boolean | "left" | "right") | undefined;
|
|
283
|
+
xOffset?: number | undefined;
|
|
248
284
|
y?: (number | Date | boolean | "top" | "bottom") | undefined;
|
|
285
|
+
yOffset?: number | undefined;
|
|
249
286
|
};
|
|
250
287
|
series?: {
|
|
251
288
|
key: string;
|
|
@@ -263,6 +300,7 @@ declare class __sveltets_Render<TData> {
|
|
|
263
300
|
};
|
|
264
301
|
slots(): {
|
|
265
302
|
default: any;
|
|
303
|
+
grid: any;
|
|
266
304
|
axis: any;
|
|
267
305
|
'below-marks': any;
|
|
268
306
|
marks: any;
|