layerchart 0.44.0 → 0.51.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/Arc.svelte +18 -1
- package/dist/components/Arc.svelte.d.ts +3 -0
- package/dist/components/Area.svelte +49 -18
- package/dist/components/Area.svelte.d.ts +0 -1
- package/dist/components/Axis.svelte +2 -1
- package/dist/components/Axis.svelte.d.ts +2 -1
- package/dist/components/Bar.svelte +18 -8
- package/dist/components/Bar.svelte.d.ts +6 -3
- package/dist/components/Bars.svelte +18 -11
- package/dist/components/Bars.svelte.d.ts +3 -3
- package/dist/components/Blur.svelte +1 -1
- package/dist/components/Brush.svelte +2 -1
- package/dist/components/Calendar.svelte +2 -2
- package/dist/components/Calendar.svelte.d.ts +1 -1
- package/dist/components/Chart.svelte +85 -25
- package/dist/components/Chart.svelte.d.ts +77 -37
- package/dist/components/ChartContext.svelte +124 -6
- package/dist/components/ChartContext.svelte.d.ts +50 -2
- package/dist/components/Circle.svelte +1 -1
- package/dist/components/CircleClipPath.svelte +1 -1
- package/dist/components/ClipPath.svelte +1 -1
- package/dist/components/GeoPath.svelte +1 -1
- package/dist/components/GeoPath.svelte.d.ts +1 -1
- package/dist/components/Highlight.svelte +45 -19
- package/dist/components/Highlight.svelte.d.ts +2 -3
- package/dist/components/HitCanvas.svelte +1 -1
- package/dist/components/Hull.svelte +1 -1
- package/dist/components/Labels.svelte +39 -73
- package/dist/components/Labels.svelte.d.ts +2 -5
- package/dist/components/Legend.svelte +5 -5
- package/dist/components/Legend.svelte.d.ts +2 -2
- package/dist/components/Line.svelte +1 -1
- package/dist/components/LinearGradient.svelte +1 -1
- package/dist/components/MotionPath.svelte +1 -1
- package/dist/components/Pie.svelte +18 -41
- package/dist/components/Pie.svelte.d.ts +2 -3
- package/dist/components/Points.svelte +110 -56
- package/dist/components/Points.svelte.d.ts +20 -2
- package/dist/components/RadialGradient.svelte +1 -1
- package/dist/components/Rect.svelte +2 -1
- package/dist/components/Rect.svelte.d.ts +1 -0
- package/dist/components/RectClipPath.svelte +1 -1
- package/dist/components/Rule.svelte +1 -1
- package/dist/components/Spline.svelte +26 -18
- package/dist/components/Spline.svelte.d.ts +1 -1
- package/dist/components/Text.svelte +1 -1
- package/dist/components/Threshold.svelte +19 -81
- package/dist/components/Threshold.svelte.d.ts +13 -20
- package/dist/components/TransformContext.svelte.d.ts +2 -2
- package/dist/components/TransformControls.svelte +2 -1
- package/dist/components/TransformControls.svelte.d.ts +2 -2
- package/dist/components/Voronoi.svelte +15 -5
- package/dist/components/Voronoi.svelte.d.ts +6 -1
- package/dist/components/charts/AreaChart.svelte +182 -0
- package/dist/components/charts/AreaChart.svelte.d.ts +261 -0
- package/dist/components/charts/BarChart.svelte +207 -0
- package/dist/components/charts/BarChart.svelte.d.ts +241 -0
- package/dist/components/charts/LineChart.svelte +138 -0
- package/dist/components/charts/LineChart.svelte.d.ts +260 -0
- package/dist/components/charts/PieChart.svelte +146 -0
- package/dist/components/charts/PieChart.svelte.d.ts +220 -0
- package/dist/components/charts/ScatterChart.svelte +133 -0
- package/dist/components/charts/ScatterChart.svelte.d.ts +236 -0
- package/dist/components/charts/index.d.ts +5 -0
- package/dist/components/charts/index.js +5 -0
- package/dist/components/index.d.ts +2 -6
- package/dist/components/index.js +3 -6
- package/dist/components/layout/Canvas.svelte +1 -1
- package/dist/components/layout/Html.svelte +1 -1
- package/dist/components/layout/Svg.svelte +14 -4
- package/dist/components/layout/Svg.svelte.d.ts +1 -0
- package/dist/components/{Tooltip.svelte → tooltip/Tooltip.svelte} +5 -28
- package/dist/components/{Tooltip.svelte.d.ts → tooltip/Tooltip.svelte.d.ts} +1 -5
- package/dist/components/{TooltipContext.svelte → tooltip/TooltipContext.svelte} +20 -12
- package/dist/components/tooltip/TooltipHeader.svelte +21 -0
- package/dist/components/tooltip/TooltipHeader.svelte.d.ts +23 -0
- package/dist/components/tooltip/TooltipItem.svelte +37 -0
- package/dist/components/{TooltipItem.svelte.d.ts → tooltip/TooltipItem.svelte.d.ts} +4 -1
- package/dist/components/tooltip/TooltipList.svelte +12 -0
- package/dist/components/tooltip/TooltipList.svelte.d.ts +18 -0
- package/dist/components/tooltip/TooltipSeparator.svelte +4 -0
- package/dist/components/tooltip/index.d.ts +6 -0
- package/dist/components/tooltip/index.js +6 -0
- package/dist/docs/Blockquote.svelte +2 -1
- package/dist/docs/Code.svelte +2 -1
- package/dist/docs/CurveMenuField.svelte +2 -1
- package/dist/docs/GeoDebug.svelte +3 -1
- package/dist/docs/Json.svelte +1 -1
- package/dist/docs/Preview.svelte +2 -1
- package/dist/docs/TransformDebug.svelte +2 -1
- package/dist/utils/common.d.ts +1 -1
- package/dist/utils/common.js +2 -2
- package/dist/utils/common.test.d.ts +8 -0
- package/dist/utils/common.test.js +38 -0
- package/dist/utils/event.js +1 -1
- package/dist/utils/genData.d.ts +2 -2
- package/dist/utils/genData.js +20 -20
- package/dist/utils/math.d.ts +2 -2
- package/dist/utils/math.js +8 -2
- package/dist/utils/rect.d.ts +4 -10
- package/dist/utils/rect.js +15 -19
- package/dist/utils/scales.d.ts +8 -2
- package/dist/utils/scales.js +15 -1
- package/dist/utils/stack.d.ts +2 -2
- package/dist/utils/stack.js +37 -20
- package/dist/utils/stack.test.d.ts +6 -0
- package/dist/utils/stack.test.js +136 -0
- package/dist/utils/string.js +41 -0
- package/dist/utils/ticks.js +1 -2
- package/package.json +9 -3
- package/dist/components/AreaStack.svelte +0 -47
- package/dist/components/AreaStack.svelte.d.ts +0 -28
- package/dist/components/TooltipItem.svelte +0 -26
- package/dist/components/TooltipSeparator.svelte +0 -4
- /package/dist/components/{TooltipContext.svelte.d.ts → tooltip/TooltipContext.svelte.d.ts} +0 -0
- /package/dist/components/{TooltipSeparator.svelte.d.ts → tooltip/TooltipSeparator.svelte.d.ts} +0 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
<script generics="TData">import {} from 'svelte';
|
|
2
|
+
import { scaleBand, scaleLinear } from 'd3-scale';
|
|
3
|
+
import { stack } from 'd3-shape';
|
|
4
|
+
import { sum } from 'd3-array';
|
|
5
|
+
import { format } from '@layerstack/utils';
|
|
6
|
+
import Axis from '../Axis.svelte';
|
|
7
|
+
import Bars from '../Bars.svelte';
|
|
8
|
+
import Chart from '../Chart.svelte';
|
|
9
|
+
import Highlight from '../Highlight.svelte';
|
|
10
|
+
import Labels from '../Labels.svelte';
|
|
11
|
+
import Svg from '../layout/Svg.svelte';
|
|
12
|
+
import * as Tooltip from '../tooltip/index.js';
|
|
13
|
+
import { accessor, chartDataArray } from '../../utils/common.js';
|
|
14
|
+
export let data = [];
|
|
15
|
+
export let x = undefined;
|
|
16
|
+
export let y = undefined;
|
|
17
|
+
export let orientation = 'vertical';
|
|
18
|
+
$: isVertical = orientation === 'vertical';
|
|
19
|
+
export let series = [
|
|
20
|
+
{
|
|
21
|
+
key: 'default',
|
|
22
|
+
value: orientation === 'vertical' ? y : x,
|
|
23
|
+
color: 'hsl(var(--color-primary))',
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
/** Determine how to layout series. Overlap (default), stack, or group side by side */
|
|
27
|
+
export let seriesLayout = 'overlap';
|
|
28
|
+
$: stackSeries = seriesLayout === 'stack';
|
|
29
|
+
$: groupSeries = seriesLayout === 'group';
|
|
30
|
+
export let axis = true;
|
|
31
|
+
export let labels = false;
|
|
32
|
+
/** Padding between primary x or y bands/bars, applied to scaleBand().padding() */
|
|
33
|
+
export let bandPadding = 0.4;
|
|
34
|
+
/** Padding between group/series items when using 'seriesLayout="group"', applied to scaleBand().padding() */
|
|
35
|
+
export let groupPadding = 0;
|
|
36
|
+
$: xScale = isVertical ? scaleBand().padding(bandPadding) : scaleLinear();
|
|
37
|
+
$: xBaseline = isVertical ? undefined : 0;
|
|
38
|
+
$: yScale = isVertical ? scaleLinear() : scaleBand().padding(bandPadding);
|
|
39
|
+
$: yBaseline = isVertical ? 0 : undefined;
|
|
40
|
+
let x1Scale;
|
|
41
|
+
let x1Domain;
|
|
42
|
+
let x1Range;
|
|
43
|
+
let y1Scale;
|
|
44
|
+
let y1Domain;
|
|
45
|
+
let y1Range;
|
|
46
|
+
$: if (seriesLayout === 'group') {
|
|
47
|
+
if (isVertical) {
|
|
48
|
+
x1Scale = scaleBand().padding(groupPadding);
|
|
49
|
+
x1Domain = series.map((s) => s.key);
|
|
50
|
+
x1Range = ({ xScale }) => [0, xScale.bandwidth?.()];
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
y1Scale = scaleBand().padding(groupPadding);
|
|
54
|
+
y1Domain = series.map((s) => s.key);
|
|
55
|
+
y1Range = ({ yScale }) => [0, yScale.bandwidth?.()];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export let props = {};
|
|
59
|
+
$: allSeriesData = series
|
|
60
|
+
.flatMap((s) => s.data?.map((d) => {
|
|
61
|
+
return { seriesKey: s.key, ...d };
|
|
62
|
+
}))
|
|
63
|
+
.filter((d) => d);
|
|
64
|
+
$: chartData = (allSeriesData.length ? allSeriesData : chartDataArray(data));
|
|
65
|
+
$: if (stackSeries) {
|
|
66
|
+
const seriesKeys = series.map((s) => s.key);
|
|
67
|
+
const stackData = stack().keys(seriesKeys)(chartDataArray(data));
|
|
68
|
+
chartData = chartData.map((d, i) => {
|
|
69
|
+
return {
|
|
70
|
+
...d,
|
|
71
|
+
stackData: stackData.map((sd) => sd[i]),
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
</script>
|
|
76
|
+
|
|
77
|
+
<Chart
|
|
78
|
+
data={chartData}
|
|
79
|
+
x={x ??
|
|
80
|
+
(stackSeries
|
|
81
|
+
? (d) => series.map((s, i) => d.stackData[i][1])
|
|
82
|
+
: series.map((s) => s.value ?? s.key))}
|
|
83
|
+
{xScale}
|
|
84
|
+
{xBaseline}
|
|
85
|
+
xNice={orientation === 'horizontal'}
|
|
86
|
+
{x1Scale}
|
|
87
|
+
{x1Domain}
|
|
88
|
+
{x1Range}
|
|
89
|
+
y={y ??
|
|
90
|
+
(stackSeries
|
|
91
|
+
? (d) => series.map((s, i) => d.stackData[i][1])
|
|
92
|
+
: series.map((s) => s.value ?? s.key))}
|
|
93
|
+
{yScale}
|
|
94
|
+
{yBaseline}
|
|
95
|
+
yNice={orientation === 'vertical'}
|
|
96
|
+
{y1Scale}
|
|
97
|
+
{y1Domain}
|
|
98
|
+
{y1Range}
|
|
99
|
+
padding={axis === false ? undefined : { left: 16, bottom: 16 }}
|
|
100
|
+
tooltip={{ mode: 'band' }}
|
|
101
|
+
{...$$restProps}
|
|
102
|
+
let:x
|
|
103
|
+
let:xScale
|
|
104
|
+
let:y
|
|
105
|
+
let:yScale
|
|
106
|
+
let:width
|
|
107
|
+
let:height
|
|
108
|
+
let:padding
|
|
109
|
+
let:tooltip
|
|
110
|
+
>
|
|
111
|
+
{@const slotProps = { x, xScale, y, yScale, width, height, padding, tooltip, series }}
|
|
112
|
+
<slot {...slotProps}>
|
|
113
|
+
<Svg>
|
|
114
|
+
<slot name="axis" {...slotProps}>
|
|
115
|
+
{#if axis}
|
|
116
|
+
<Axis
|
|
117
|
+
placement="left"
|
|
118
|
+
grid={isVertical}
|
|
119
|
+
rule
|
|
120
|
+
format={(value) => format(value, undefined, { variant: 'short' })}
|
|
121
|
+
{...typeof axis === 'object' ? axis : null}
|
|
122
|
+
{...props.yAxis}
|
|
123
|
+
/>
|
|
124
|
+
<Axis
|
|
125
|
+
placement="bottom"
|
|
126
|
+
grid={!isVertical}
|
|
127
|
+
rule
|
|
128
|
+
format={(value) => format(value, undefined, { variant: 'short' })}
|
|
129
|
+
{...typeof axis === 'object' ? axis : null}
|
|
130
|
+
{...props.xAxis}
|
|
131
|
+
/>
|
|
132
|
+
{/if}
|
|
133
|
+
</slot>
|
|
134
|
+
|
|
135
|
+
<slot name="below-marks" {...slotProps} />
|
|
136
|
+
|
|
137
|
+
<slot name="marks" {...slotProps}>
|
|
138
|
+
{#each series as s, i}
|
|
139
|
+
<Bars
|
|
140
|
+
data={s.data}
|
|
141
|
+
x={!isVertical
|
|
142
|
+
? stackSeries
|
|
143
|
+
? (d) => d.stackData[i]
|
|
144
|
+
: (s.value ?? (s.data ? undefined : s.key))
|
|
145
|
+
: undefined}
|
|
146
|
+
y={isVertical
|
|
147
|
+
? stackSeries
|
|
148
|
+
? (d) => d.stackData[i]
|
|
149
|
+
: (s.value ?? (s.data ? undefined : s.key))
|
|
150
|
+
: undefined}
|
|
151
|
+
x1={isVertical && groupSeries ? (d) => s.value ?? s.key : undefined}
|
|
152
|
+
y1={!isVertical && groupSeries ? (d) => s.value ?? s.key : undefined}
|
|
153
|
+
radius={4}
|
|
154
|
+
strokeWidth={1}
|
|
155
|
+
fill={s.color}
|
|
156
|
+
{...props.bars}
|
|
157
|
+
{...s.props}
|
|
158
|
+
/>
|
|
159
|
+
{/each}
|
|
160
|
+
</slot>
|
|
161
|
+
|
|
162
|
+
<slot name="above-marks" {...slotProps} />
|
|
163
|
+
|
|
164
|
+
<slot name="highlight" {...slotProps}>
|
|
165
|
+
<Highlight area {...props.highlight} />
|
|
166
|
+
</slot>
|
|
167
|
+
|
|
168
|
+
{#if labels}
|
|
169
|
+
<Labels {...props.labels} {...typeof labels === 'object' ? labels : null} />
|
|
170
|
+
{/if}
|
|
171
|
+
</Svg>
|
|
172
|
+
|
|
173
|
+
<slot name="tooltip" {...slotProps}>
|
|
174
|
+
<Tooltip.Root let:data>
|
|
175
|
+
<Tooltip.Header>{format(isVertical ? x(data) : y(data))}</Tooltip.Header>
|
|
176
|
+
<Tooltip.List>
|
|
177
|
+
<!-- Reverse series order so tooltip items match stacks -->
|
|
178
|
+
{@const seriesItems = stackSeries ? [...series].reverse() : series}
|
|
179
|
+
{#each seriesItems as s}
|
|
180
|
+
{@const valueAccessor = accessor(s.value ?? s.key)}
|
|
181
|
+
<Tooltip.Item
|
|
182
|
+
label={s.label ?? (s.key !== 'default' ? s.key : 'value')}
|
|
183
|
+
value={valueAccessor(data)}
|
|
184
|
+
color={s.color}
|
|
185
|
+
{format}
|
|
186
|
+
valueAlign="right"
|
|
187
|
+
/>
|
|
188
|
+
{/each}
|
|
189
|
+
|
|
190
|
+
{#if stackSeries || groupSeries}
|
|
191
|
+
<Tooltip.Separator />
|
|
192
|
+
|
|
193
|
+
<Tooltip.Item
|
|
194
|
+
label="total"
|
|
195
|
+
value={sum(series, (s) => {
|
|
196
|
+
const valueAccessor = accessor(s.value ?? s.key);
|
|
197
|
+
return valueAccessor(data);
|
|
198
|
+
})}
|
|
199
|
+
format="integer"
|
|
200
|
+
valueAlign="right"
|
|
201
|
+
/>
|
|
202
|
+
{/if}
|
|
203
|
+
</Tooltip.List>
|
|
204
|
+
</Tooltip.Root>
|
|
205
|
+
</slot>
|
|
206
|
+
</slot>
|
|
207
|
+
</Chart>
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
import { type ComponentProps } from 'svelte';
|
|
3
|
+
import Axis from '../Axis.svelte';
|
|
4
|
+
import Bars from '../Bars.svelte';
|
|
5
|
+
import Highlight from '../Highlight.svelte';
|
|
6
|
+
import Labels from '../Labels.svelte';
|
|
7
|
+
import { type Accessor } from '../../utils/common.js';
|
|
8
|
+
declare class __sveltets_Render<TData> {
|
|
9
|
+
props(): {
|
|
10
|
+
ssr?: boolean;
|
|
11
|
+
pointerEvents?: boolean;
|
|
12
|
+
position?: string;
|
|
13
|
+
percentRange?: boolean;
|
|
14
|
+
width?: number;
|
|
15
|
+
height?: number;
|
|
16
|
+
containerWidth?: number;
|
|
17
|
+
containerHeight?: number;
|
|
18
|
+
element?: HTMLDivElement;
|
|
19
|
+
data?: import("d3-sankey").SankeyGraph<any, any> | import("d3-hierarchy").HierarchyNode<TData> | TData[] | undefined;
|
|
20
|
+
flatData?: any[];
|
|
21
|
+
x?: Accessor<TData>;
|
|
22
|
+
y?: Accessor<TData>;
|
|
23
|
+
z?: Accessor<TData>;
|
|
24
|
+
r?: Accessor<TData>;
|
|
25
|
+
x1?: Accessor<TData>;
|
|
26
|
+
y1?: Accessor<TData>;
|
|
27
|
+
c?: Accessor<TData>;
|
|
28
|
+
xDomain?: import("../../utils/scales").DomainType;
|
|
29
|
+
yDomain?: import("../../utils/scales").DomainType;
|
|
30
|
+
zDomain?: import("../../utils/scales").DomainType;
|
|
31
|
+
rDomain?: import("../../utils/scales").DomainType;
|
|
32
|
+
x1Domain?: import("../../utils/scales").DomainType;
|
|
33
|
+
y1Domain?: import("../../utils/scales").DomainType;
|
|
34
|
+
cDomain?: import("../../utils/scales").DomainType;
|
|
35
|
+
xNice?: boolean | number;
|
|
36
|
+
yNice?: boolean | number;
|
|
37
|
+
zNice?: boolean | number;
|
|
38
|
+
rNice?: boolean | number;
|
|
39
|
+
xPadding?: [number, number];
|
|
40
|
+
yPadding?: [number, number];
|
|
41
|
+
zPadding?: [number, number];
|
|
42
|
+
rPadding?: [number, number];
|
|
43
|
+
xScale?: import("../../utils/scales").AnyScale;
|
|
44
|
+
yScale?: import("../../utils/scales").AnyScale;
|
|
45
|
+
zScale?: import("../../utils/scales").AnyScale;
|
|
46
|
+
rScale?: import("../../utils/scales").AnyScale;
|
|
47
|
+
x1Scale?: import("../../utils/scales").AnyScale;
|
|
48
|
+
y1Scale?: import("../../utils/scales").AnyScale;
|
|
49
|
+
cScale?: import("../../utils/scales").AnyScale;
|
|
50
|
+
xRange?: string[] | number[] | ((args: {
|
|
51
|
+
width: number;
|
|
52
|
+
height: number;
|
|
53
|
+
}) => number[] | string[]) | undefined;
|
|
54
|
+
yRange?: string[] | number[] | ((args: {
|
|
55
|
+
width: number;
|
|
56
|
+
height: number;
|
|
57
|
+
}) => number[] | string[]) | undefined;
|
|
58
|
+
zRange?: string[] | number[] | ((args: {
|
|
59
|
+
width: number;
|
|
60
|
+
height: number;
|
|
61
|
+
}) => number[] | string[]) | undefined;
|
|
62
|
+
rRange?: string[] | number[] | ((args: {
|
|
63
|
+
width: number;
|
|
64
|
+
height: number;
|
|
65
|
+
}) => number[] | string[]) | undefined;
|
|
66
|
+
x1Range?: string[] | number[] | ((args: {
|
|
67
|
+
xScale: import("../../utils/scales").AnyScale;
|
|
68
|
+
width: number;
|
|
69
|
+
height: number;
|
|
70
|
+
}) => number[] | string[]) | undefined;
|
|
71
|
+
y1Range?: string[] | number[] | ((args: {
|
|
72
|
+
yScale: import("../../utils/scales").AnyScale;
|
|
73
|
+
width: number;
|
|
74
|
+
height: number;
|
|
75
|
+
}) => number[] | string[]) | undefined;
|
|
76
|
+
cRange?: string[];
|
|
77
|
+
xReverse?: boolean;
|
|
78
|
+
yReverse?: boolean;
|
|
79
|
+
zReverse?: boolean;
|
|
80
|
+
rReverse?: boolean;
|
|
81
|
+
xDomainSort?: boolean;
|
|
82
|
+
yDomainSort?: boolean;
|
|
83
|
+
zDomainSort?: boolean;
|
|
84
|
+
rDomainSort?: boolean;
|
|
85
|
+
padding?: {
|
|
86
|
+
top?: Number;
|
|
87
|
+
right?: Number;
|
|
88
|
+
bottom?: Number;
|
|
89
|
+
left?: Number;
|
|
90
|
+
} | undefined;
|
|
91
|
+
extents?: {
|
|
92
|
+
x?: [min: Number, max: Number];
|
|
93
|
+
y?: [min: Number, max: Number];
|
|
94
|
+
r?: [min: Number, max: Number];
|
|
95
|
+
z?: [min: Number, max: Number];
|
|
96
|
+
} | undefined;
|
|
97
|
+
custom?: Record<string, any>;
|
|
98
|
+
debug?: boolean;
|
|
99
|
+
verbose?: boolean;
|
|
100
|
+
xBaseline?: number | null;
|
|
101
|
+
yBaseline?: number | null;
|
|
102
|
+
radial?: boolean;
|
|
103
|
+
geo?: Partial<{
|
|
104
|
+
projection?: (() => import("d3-geo").GeoProjection) | undefined;
|
|
105
|
+
fitGeojson?: import("d3-geo").GeoPermissibleObjects | undefined;
|
|
106
|
+
fixedAspectRatio?: number | undefined;
|
|
107
|
+
clipAngle?: number | undefined;
|
|
108
|
+
clipExtent?: [[number, number], [number, number]] | undefined;
|
|
109
|
+
rotate?: {
|
|
110
|
+
yaw: number;
|
|
111
|
+
pitch: number;
|
|
112
|
+
roll: number;
|
|
113
|
+
} | undefined;
|
|
114
|
+
scale?: number | undefined;
|
|
115
|
+
translate?: [number, number] | undefined;
|
|
116
|
+
center?: [number, number] | undefined;
|
|
117
|
+
applyTransform?: ("scale" | "translate" | "rotate")[];
|
|
118
|
+
reflectX?: boolean | undefined;
|
|
119
|
+
reflectY?: boolean | undefined;
|
|
120
|
+
geo?: import("svelte/store").Writable<import("d3-geo").GeoProjection>;
|
|
121
|
+
}> | undefined;
|
|
122
|
+
tooltip?: boolean | Partial<{
|
|
123
|
+
mode?: "bisect-x" | "bisect-y" | "band" | "bisect-band" | "bounds" | "voronoi" | "quadtree" | "manual";
|
|
124
|
+
findTooltipData?: "closest" | "left" | "right";
|
|
125
|
+
raiseTarget?: boolean;
|
|
126
|
+
radius?: number;
|
|
127
|
+
debug?: boolean;
|
|
128
|
+
onClick?: ({ data }: {
|
|
129
|
+
data: any;
|
|
130
|
+
}) => any;
|
|
131
|
+
}> | undefined;
|
|
132
|
+
transform?: Partial<{
|
|
133
|
+
mode?: "canvas" | "manual" | "none";
|
|
134
|
+
translateOnScale?: boolean;
|
|
135
|
+
spring?: boolean | Parameters<typeof import("../../stores/motionStore").motionStore>[1]["spring"];
|
|
136
|
+
tweened?: boolean | Parameters<typeof import("../../stores/motionStore").motionStore>[1]["tweened"];
|
|
137
|
+
processTranslate?: (x: number, y: number, deltaX: number, deltaY: number, scale: number) => {
|
|
138
|
+
x: number;
|
|
139
|
+
y: number;
|
|
140
|
+
};
|
|
141
|
+
disablePointer?: boolean;
|
|
142
|
+
initialScrollMode?: "none" | "scale" | "translate";
|
|
143
|
+
clickDistance?: number;
|
|
144
|
+
initialTranslate?: {
|
|
145
|
+
x: number;
|
|
146
|
+
y: number;
|
|
147
|
+
} | undefined;
|
|
148
|
+
translate?: import("svelte/motion").Spring<{
|
|
149
|
+
x: number;
|
|
150
|
+
y: number;
|
|
151
|
+
}> | import("svelte/motion").Tweened<{
|
|
152
|
+
x: number;
|
|
153
|
+
y: number;
|
|
154
|
+
}> | import("svelte/store").Writable<{
|
|
155
|
+
x: number;
|
|
156
|
+
y: number;
|
|
157
|
+
}>;
|
|
158
|
+
initialScale?: number | undefined;
|
|
159
|
+
scale?: import("svelte/store").Writable<number> | import("svelte/motion").Spring<number> | import("svelte/motion").Tweened<number>;
|
|
160
|
+
setScrollMode?: (mode: "none" | "scale" | "translate") => void;
|
|
161
|
+
reset?: () => void;
|
|
162
|
+
zoomIn?: () => void;
|
|
163
|
+
zoomOut?: () => void;
|
|
164
|
+
translateCenter?: () => void;
|
|
165
|
+
zoomTo?: (center: {
|
|
166
|
+
x: number;
|
|
167
|
+
y: number;
|
|
168
|
+
}, rect?: {
|
|
169
|
+
width: number;
|
|
170
|
+
height: number;
|
|
171
|
+
}) => void;
|
|
172
|
+
setTranslate?: (point: {
|
|
173
|
+
x: number;
|
|
174
|
+
y: number;
|
|
175
|
+
}, options?: import("../../stores/motionStore").MotionOptions) => void;
|
|
176
|
+
setScale?: (value: number, options?: import("../../stores/motionStore").MotionOptions) => void;
|
|
177
|
+
}> | undefined;
|
|
178
|
+
transformContext?: import("..").TransformContext;
|
|
179
|
+
} & {
|
|
180
|
+
series?: {
|
|
181
|
+
key: string;
|
|
182
|
+
label?: string;
|
|
183
|
+
value?: Accessor<TData>;
|
|
184
|
+
/** Provider series data, else uses chart data (with value/key accessor) */
|
|
185
|
+
data?: TData[] | undefined;
|
|
186
|
+
color?: string;
|
|
187
|
+
props?: Partial<ComponentProps<Bars>>;
|
|
188
|
+
}[] | undefined;
|
|
189
|
+
seriesLayout?: "overlap" | "stack" | "group";
|
|
190
|
+
labels?: boolean | {
|
|
191
|
+
[x: string]: any;
|
|
192
|
+
placement?: ("inside" | "outside" | "center") | undefined;
|
|
193
|
+
offset?: number | undefined;
|
|
194
|
+
format?: import("@layerstack/utils").FormatType | undefined;
|
|
195
|
+
};
|
|
196
|
+
axis?: boolean | {
|
|
197
|
+
placement: "top" | "bottom" | "left" | "right" | "angle" | "radius";
|
|
198
|
+
label?: string;
|
|
199
|
+
labelPlacement?: "start" | "middle" | "end";
|
|
200
|
+
labelProps?: Partial<ComponentProps<import("..").Text>> | undefined;
|
|
201
|
+
rule?: boolean | Pick<import("svelte/elements").SVGAttributes<SVGElement>, "class" | "style">;
|
|
202
|
+
grid?: boolean | Pick<import("svelte/elements").SVGAttributes<SVGElement>, "class" | "style">;
|
|
203
|
+
ticks?: number | any[] | ((scale: import("../../utils/scales").AnyScale) => any) | null | undefined;
|
|
204
|
+
tickLength?: number;
|
|
205
|
+
format?: import("@layerstack/utils").FormatType | undefined;
|
|
206
|
+
tickLabelProps?: Partial<ComponentProps<import("..").Text>> | undefined;
|
|
207
|
+
spring?: boolean | Parameters<typeof import("svelte/motion").spring>[1];
|
|
208
|
+
tweened?: boolean | Parameters<typeof import("svelte/motion").tweened>[1];
|
|
209
|
+
transitionIn?: typeof import("svelte/transition").fade | (() => {});
|
|
210
|
+
transitionInParams?: import("svelte-ux").TransitionParams;
|
|
211
|
+
scale?: any;
|
|
212
|
+
};
|
|
213
|
+
orientation?: "horizontal" | "vertical";
|
|
214
|
+
bandPadding?: number;
|
|
215
|
+
props?: {
|
|
216
|
+
xAxis?: Partial<ComponentProps<Axis>>;
|
|
217
|
+
yAxis?: Partial<ComponentProps<Axis>>;
|
|
218
|
+
bars?: Partial<ComponentProps<Bars>>;
|
|
219
|
+
highlight?: Partial<ComponentProps<Highlight>>;
|
|
220
|
+
labels?: Partial<ComponentProps<Labels>>;
|
|
221
|
+
} | undefined;
|
|
222
|
+
};
|
|
223
|
+
events(): {} & {
|
|
224
|
+
[evt: string]: CustomEvent<any>;
|
|
225
|
+
};
|
|
226
|
+
slots(): {
|
|
227
|
+
default: any;
|
|
228
|
+
axis: any;
|
|
229
|
+
'below-marks': any;
|
|
230
|
+
marks: any;
|
|
231
|
+
'above-marks': any;
|
|
232
|
+
highlight: any;
|
|
233
|
+
tooltip: any;
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
export type BarChartProps<TData> = ReturnType<__sveltets_Render<TData>['props']>;
|
|
237
|
+
export type BarChartEvents<TData> = ReturnType<__sveltets_Render<TData>['events']>;
|
|
238
|
+
export type BarChartSlots<TData> = ReturnType<__sveltets_Render<TData>['slots']>;
|
|
239
|
+
export default class BarChart<TData> extends SvelteComponentTyped<BarChartProps<TData>, BarChartEvents<TData>, BarChartSlots<TData>> {
|
|
240
|
+
}
|
|
241
|
+
export {};
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
<script generics="TData">import Points from '../Points.svelte';
|
|
2
|
+
import {} from 'svelte';
|
|
3
|
+
import { scaleLinear, scaleTime } from 'd3-scale';
|
|
4
|
+
import { format } from '@layerstack/utils';
|
|
5
|
+
import Axis from '../Axis.svelte';
|
|
6
|
+
import Chart from '../Chart.svelte';
|
|
7
|
+
import Highlight from '../Highlight.svelte';
|
|
8
|
+
import Labels from '../Labels.svelte';
|
|
9
|
+
import Spline from '../Spline.svelte';
|
|
10
|
+
import Svg from '../layout/Svg.svelte';
|
|
11
|
+
import * as Tooltip from '../tooltip/index.js';
|
|
12
|
+
import { accessor, chartDataArray } from '../../utils/common.js';
|
|
13
|
+
export let data = [];
|
|
14
|
+
export let x = undefined;
|
|
15
|
+
export let y = undefined;
|
|
16
|
+
/** 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 */
|
|
17
|
+
export let radial = false;
|
|
18
|
+
export let series = [{ key: 'default', value: y, color: 'hsl(var(--color-primary))' }];
|
|
19
|
+
export let axis = true;
|
|
20
|
+
export let labels = false;
|
|
21
|
+
export let points = false;
|
|
22
|
+
export let props = {};
|
|
23
|
+
$: allSeriesData = series
|
|
24
|
+
.flatMap((s) => s.data?.map((d) => ({ seriesKey: s.key, ...d })))
|
|
25
|
+
.filter((d) => d);
|
|
26
|
+
$: chartData = (allSeriesData.length ? allSeriesData : chartDataArray(data));
|
|
27
|
+
// Default xScale based on first data's `x` value
|
|
28
|
+
$: xScale = accessor(x)(chartData[0]) instanceof Date ? scaleTime() : scaleLinear();
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<Chart
|
|
32
|
+
data={chartData}
|
|
33
|
+
{x}
|
|
34
|
+
{xScale}
|
|
35
|
+
y={y ?? series.map((s) => s.value ?? s.key)}
|
|
36
|
+
yBaseline={0}
|
|
37
|
+
yNice
|
|
38
|
+
{radial}
|
|
39
|
+
padding={radial || axis === false ? undefined : { left: 16, bottom: 16 }}
|
|
40
|
+
tooltip={{ mode: 'bisect-x' }}
|
|
41
|
+
{...$$restProps}
|
|
42
|
+
let:x
|
|
43
|
+
let:xScale
|
|
44
|
+
let:y
|
|
45
|
+
let:yScale
|
|
46
|
+
let:width
|
|
47
|
+
let:height
|
|
48
|
+
let:padding
|
|
49
|
+
let:tooltip
|
|
50
|
+
>
|
|
51
|
+
{@const slotProps = { x, xScale, y, yScale, width, height, padding, tooltip, series }}
|
|
52
|
+
<slot {...slotProps}>
|
|
53
|
+
<Svg center={radial}>
|
|
54
|
+
<slot name="axis" {...slotProps}>
|
|
55
|
+
{#if axis}
|
|
56
|
+
<Axis
|
|
57
|
+
placement={radial ? 'radius' : 'left'}
|
|
58
|
+
grid
|
|
59
|
+
rule
|
|
60
|
+
format={(value) => format(value, undefined, { variant: 'short' })}
|
|
61
|
+
{...typeof axis === 'object' ? axis : null}
|
|
62
|
+
{...props.yAxis}
|
|
63
|
+
/>
|
|
64
|
+
<Axis
|
|
65
|
+
placement={radial ? 'angle' : 'bottom'}
|
|
66
|
+
grid={radial}
|
|
67
|
+
rule
|
|
68
|
+
format={(value) => format(value, undefined, { variant: 'short' })}
|
|
69
|
+
{...typeof axis === 'object' ? axis : null}
|
|
70
|
+
{...props.xAxis}
|
|
71
|
+
/>
|
|
72
|
+
{/if}
|
|
73
|
+
</slot>
|
|
74
|
+
|
|
75
|
+
<slot name="below-marks" {...slotProps} />
|
|
76
|
+
|
|
77
|
+
<slot name="marks" {...slotProps}>
|
|
78
|
+
{#each series as s}
|
|
79
|
+
<Spline
|
|
80
|
+
data={s.data}
|
|
81
|
+
y={s.value ?? (s.data ? undefined : s.key)}
|
|
82
|
+
class="stroke-2"
|
|
83
|
+
stroke={s.color}
|
|
84
|
+
{...props.spline}
|
|
85
|
+
{...s.props}
|
|
86
|
+
/>
|
|
87
|
+
{/each}
|
|
88
|
+
</slot>
|
|
89
|
+
|
|
90
|
+
<slot name="above-marks" {...slotProps} />
|
|
91
|
+
|
|
92
|
+
{#if points}
|
|
93
|
+
{#each series as s}
|
|
94
|
+
<Points
|
|
95
|
+
data={s.data}
|
|
96
|
+
fill={s.color}
|
|
97
|
+
class="stroke-surface-200"
|
|
98
|
+
{...props.points}
|
|
99
|
+
{...typeof points === 'object' ? points : null}
|
|
100
|
+
/>
|
|
101
|
+
{/each}
|
|
102
|
+
{/if}
|
|
103
|
+
|
|
104
|
+
{#if labels}
|
|
105
|
+
<Labels {...props.labels} {...typeof labels === 'object' ? labels : null} />
|
|
106
|
+
{/if}
|
|
107
|
+
|
|
108
|
+
<slot name="highlight" {...slotProps}>
|
|
109
|
+
{#each series as s, i}
|
|
110
|
+
<Highlight
|
|
111
|
+
data={s.data}
|
|
112
|
+
y={s.value ?? s.key}
|
|
113
|
+
points={{ fill: s.color }}
|
|
114
|
+
lines={i === 0}
|
|
115
|
+
{...props.highlight}
|
|
116
|
+
/>
|
|
117
|
+
{/each}
|
|
118
|
+
</slot>
|
|
119
|
+
</Svg>
|
|
120
|
+
|
|
121
|
+
<slot name="tooltip" {...slotProps}>
|
|
122
|
+
<Tooltip.Root let:data>
|
|
123
|
+
<Tooltip.Header>{format(x(data))}</Tooltip.Header>
|
|
124
|
+
<Tooltip.List>
|
|
125
|
+
{#each series as s}
|
|
126
|
+
{@const valueAccessor = accessor(s.value ?? s.key)}
|
|
127
|
+
<Tooltip.Item
|
|
128
|
+
label={s.label ?? (s.key !== 'default' ? s.key : 'value')}
|
|
129
|
+
value={valueAccessor(data)}
|
|
130
|
+
color={s.color}
|
|
131
|
+
{format}
|
|
132
|
+
/>
|
|
133
|
+
{/each}
|
|
134
|
+
</Tooltip.List>
|
|
135
|
+
</Tooltip.Root>
|
|
136
|
+
</slot>
|
|
137
|
+
</slot>
|
|
138
|
+
</Chart>
|