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.
Files changed (116) hide show
  1. package/dist/components/Arc.svelte +18 -1
  2. package/dist/components/Arc.svelte.d.ts +3 -0
  3. package/dist/components/Area.svelte +49 -18
  4. package/dist/components/Area.svelte.d.ts +0 -1
  5. package/dist/components/Axis.svelte +2 -1
  6. package/dist/components/Axis.svelte.d.ts +2 -1
  7. package/dist/components/Bar.svelte +18 -8
  8. package/dist/components/Bar.svelte.d.ts +6 -3
  9. package/dist/components/Bars.svelte +18 -11
  10. package/dist/components/Bars.svelte.d.ts +3 -3
  11. package/dist/components/Blur.svelte +1 -1
  12. package/dist/components/Brush.svelte +2 -1
  13. package/dist/components/Calendar.svelte +2 -2
  14. package/dist/components/Calendar.svelte.d.ts +1 -1
  15. package/dist/components/Chart.svelte +85 -25
  16. package/dist/components/Chart.svelte.d.ts +77 -37
  17. package/dist/components/ChartContext.svelte +124 -6
  18. package/dist/components/ChartContext.svelte.d.ts +50 -2
  19. package/dist/components/Circle.svelte +1 -1
  20. package/dist/components/CircleClipPath.svelte +1 -1
  21. package/dist/components/ClipPath.svelte +1 -1
  22. package/dist/components/GeoPath.svelte +1 -1
  23. package/dist/components/GeoPath.svelte.d.ts +1 -1
  24. package/dist/components/Highlight.svelte +45 -19
  25. package/dist/components/Highlight.svelte.d.ts +2 -3
  26. package/dist/components/HitCanvas.svelte +1 -1
  27. package/dist/components/Hull.svelte +1 -1
  28. package/dist/components/Labels.svelte +39 -73
  29. package/dist/components/Labels.svelte.d.ts +2 -5
  30. package/dist/components/Legend.svelte +5 -5
  31. package/dist/components/Legend.svelte.d.ts +2 -2
  32. package/dist/components/Line.svelte +1 -1
  33. package/dist/components/LinearGradient.svelte +1 -1
  34. package/dist/components/MotionPath.svelte +1 -1
  35. package/dist/components/Pie.svelte +18 -41
  36. package/dist/components/Pie.svelte.d.ts +2 -3
  37. package/dist/components/Points.svelte +110 -56
  38. package/dist/components/Points.svelte.d.ts +20 -2
  39. package/dist/components/RadialGradient.svelte +1 -1
  40. package/dist/components/Rect.svelte +2 -1
  41. package/dist/components/Rect.svelte.d.ts +1 -0
  42. package/dist/components/RectClipPath.svelte +1 -1
  43. package/dist/components/Rule.svelte +1 -1
  44. package/dist/components/Spline.svelte +26 -18
  45. package/dist/components/Spline.svelte.d.ts +1 -1
  46. package/dist/components/Text.svelte +1 -1
  47. package/dist/components/Threshold.svelte +19 -81
  48. package/dist/components/Threshold.svelte.d.ts +13 -20
  49. package/dist/components/TransformContext.svelte.d.ts +2 -2
  50. package/dist/components/TransformControls.svelte +2 -1
  51. package/dist/components/TransformControls.svelte.d.ts +2 -2
  52. package/dist/components/Voronoi.svelte +15 -5
  53. package/dist/components/Voronoi.svelte.d.ts +6 -1
  54. package/dist/components/charts/AreaChart.svelte +182 -0
  55. package/dist/components/charts/AreaChart.svelte.d.ts +261 -0
  56. package/dist/components/charts/BarChart.svelte +207 -0
  57. package/dist/components/charts/BarChart.svelte.d.ts +241 -0
  58. package/dist/components/charts/LineChart.svelte +138 -0
  59. package/dist/components/charts/LineChart.svelte.d.ts +260 -0
  60. package/dist/components/charts/PieChart.svelte +146 -0
  61. package/dist/components/charts/PieChart.svelte.d.ts +220 -0
  62. package/dist/components/charts/ScatterChart.svelte +133 -0
  63. package/dist/components/charts/ScatterChart.svelte.d.ts +236 -0
  64. package/dist/components/charts/index.d.ts +5 -0
  65. package/dist/components/charts/index.js +5 -0
  66. package/dist/components/index.d.ts +2 -6
  67. package/dist/components/index.js +3 -6
  68. package/dist/components/layout/Canvas.svelte +1 -1
  69. package/dist/components/layout/Html.svelte +1 -1
  70. package/dist/components/layout/Svg.svelte +14 -4
  71. package/dist/components/layout/Svg.svelte.d.ts +1 -0
  72. package/dist/components/{Tooltip.svelte → tooltip/Tooltip.svelte} +5 -28
  73. package/dist/components/{Tooltip.svelte.d.ts → tooltip/Tooltip.svelte.d.ts} +1 -5
  74. package/dist/components/{TooltipContext.svelte → tooltip/TooltipContext.svelte} +20 -12
  75. package/dist/components/tooltip/TooltipHeader.svelte +21 -0
  76. package/dist/components/tooltip/TooltipHeader.svelte.d.ts +23 -0
  77. package/dist/components/tooltip/TooltipItem.svelte +37 -0
  78. package/dist/components/{TooltipItem.svelte.d.ts → tooltip/TooltipItem.svelte.d.ts} +4 -1
  79. package/dist/components/tooltip/TooltipList.svelte +12 -0
  80. package/dist/components/tooltip/TooltipList.svelte.d.ts +18 -0
  81. package/dist/components/tooltip/TooltipSeparator.svelte +4 -0
  82. package/dist/components/tooltip/index.d.ts +6 -0
  83. package/dist/components/tooltip/index.js +6 -0
  84. package/dist/docs/Blockquote.svelte +2 -1
  85. package/dist/docs/Code.svelte +2 -1
  86. package/dist/docs/CurveMenuField.svelte +2 -1
  87. package/dist/docs/GeoDebug.svelte +3 -1
  88. package/dist/docs/Json.svelte +1 -1
  89. package/dist/docs/Preview.svelte +2 -1
  90. package/dist/docs/TransformDebug.svelte +2 -1
  91. package/dist/utils/common.d.ts +1 -1
  92. package/dist/utils/common.js +2 -2
  93. package/dist/utils/common.test.d.ts +8 -0
  94. package/dist/utils/common.test.js +38 -0
  95. package/dist/utils/event.js +1 -1
  96. package/dist/utils/genData.d.ts +2 -2
  97. package/dist/utils/genData.js +20 -20
  98. package/dist/utils/math.d.ts +2 -2
  99. package/dist/utils/math.js +8 -2
  100. package/dist/utils/rect.d.ts +4 -10
  101. package/dist/utils/rect.js +15 -19
  102. package/dist/utils/scales.d.ts +8 -2
  103. package/dist/utils/scales.js +15 -1
  104. package/dist/utils/stack.d.ts +2 -2
  105. package/dist/utils/stack.js +37 -20
  106. package/dist/utils/stack.test.d.ts +6 -0
  107. package/dist/utils/stack.test.js +136 -0
  108. package/dist/utils/string.js +41 -0
  109. package/dist/utils/ticks.js +1 -2
  110. package/package.json +9 -3
  111. package/dist/components/AreaStack.svelte +0 -47
  112. package/dist/components/AreaStack.svelte.d.ts +0 -28
  113. package/dist/components/TooltipItem.svelte +0 -26
  114. package/dist/components/TooltipSeparator.svelte +0 -4
  115. /package/dist/components/{TooltipContext.svelte.d.ts → tooltip/TooltipContext.svelte.d.ts} +0 -0
  116. /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>