layerchart 2.0.0-next.0 → 2.0.0-next.2
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/actions/movable.d.ts +28 -0
- package/dist/actions/movable.js +91 -0
- package/dist/components/AnnotationLine.svelte +155 -0
- package/dist/components/AnnotationLine.svelte.d.ts +28 -0
- package/dist/components/AnnotationPoint.svelte +121 -0
- package/dist/components/AnnotationPoint.svelte.d.ts +32 -0
- package/dist/components/AnnotationRange.svelte +147 -0
- package/dist/components/AnnotationRange.svelte.d.ts +40 -0
- package/dist/components/Arc.svelte +344 -151
- package/dist/components/Arc.svelte.d.ts +138 -0
- package/dist/components/Area.svelte +165 -149
- package/dist/components/Area.svelte.d.ts +45 -0
- package/dist/components/Axis.svelte +287 -174
- package/dist/components/Axis.svelte.d.ts +116 -0
- package/dist/components/Bar.svelte +163 -107
- package/dist/components/Bar.svelte.d.ts +48 -0
- package/dist/components/Bars.svelte +54 -68
- package/dist/components/Bars.svelte.d.ts +27 -0
- package/dist/components/Blur.svelte +31 -7
- package/dist/components/Blur.svelte.d.ts +23 -21
- package/dist/components/Bounds.svelte +49 -19
- package/dist/components/Bounds.svelte.d.ts +24 -50
- package/dist/components/BrushContext.svelte +296 -168
- package/dist/components/BrushContext.svelte.d.ts +97 -65
- package/dist/components/Calendar.svelte +116 -59
- package/dist/components/Calendar.svelte.d.ts +50 -31
- package/dist/components/Chart.svelte +1289 -398
- package/dist/components/Chart.svelte.d.ts +535 -410
- package/dist/components/ChartClipPath.svelte +37 -15
- package/dist/components/ChartClipPath.svelte.d.ts +21 -19
- package/dist/components/Circle.svelte +124 -85
- package/dist/components/Circle.svelte.d.ts +52 -0
- package/dist/components/CircleClipPath.svelte +76 -16
- package/dist/components/CircleClipPath.svelte.d.ts +46 -0
- package/dist/components/ClipPath.svelte +60 -15
- package/dist/components/ClipPath.svelte.d.ts +40 -27
- package/dist/components/ColorRamp.svelte +75 -9
- package/dist/components/ColorRamp.svelte.d.ts +37 -19
- package/dist/components/ComputedStyles.svelte +17 -5
- package/dist/components/ComputedStyles.svelte.d.ts +11 -19
- package/dist/components/Connector.svelte +149 -0
- package/dist/components/Connector.svelte.d.ts +51 -0
- package/dist/components/Dagre.svelte +211 -122
- package/dist/components/Dagre.svelte.d.ts +119 -56
- package/dist/components/ForceSimulation.svelte +215 -90
- package/dist/components/ForceSimulation.svelte.d.ts +82 -35
- package/dist/components/Frame.svelte +33 -13
- package/dist/components/Frame.svelte.d.ts +13 -17
- package/dist/components/GeoCircle.svelte +29 -16
- package/dist/components/GeoCircle.svelte.d.ts +22 -24
- package/dist/components/GeoContext.svelte +113 -72
- package/dist/components/GeoContext.svelte.d.ts +49 -41
- package/dist/components/GeoEdgeFade.svelte +47 -12
- package/dist/components/GeoEdgeFade.svelte.d.ts +17 -19
- package/dist/components/GeoPath.svelte +157 -127
- package/dist/components/GeoPath.svelte.d.ts +48 -36
- package/dist/components/GeoPoint.svelte +52 -20
- package/dist/components/GeoPoint.svelte.d.ts +25 -22
- package/dist/components/GeoSpline.svelte +75 -26
- package/dist/components/GeoSpline.svelte.d.ts +29 -20
- package/dist/components/GeoTile.svelte +100 -49
- package/dist/components/GeoTile.svelte.d.ts +38 -23
- package/dist/components/GeoVisible.svelte +17 -9
- package/dist/components/GeoVisible.svelte.d.ts +10 -18
- package/dist/components/Graticule.svelte +28 -13
- package/dist/components/Graticule.svelte.d.ts +11 -52
- package/dist/components/Grid.svelte +226 -114
- package/dist/components/Grid.svelte.d.ts +70 -0
- package/dist/components/Group.svelte +132 -105
- package/dist/components/Group.svelte.d.ts +53 -0
- package/dist/components/Highlight.svelte +409 -307
- package/dist/components/Highlight.svelte.d.ts +107 -0
- package/dist/components/Hull.svelte +96 -45
- package/dist/components/Hull.svelte.d.ts +40 -30
- package/dist/components/Labels.svelte +125 -46
- package/dist/components/Labels.svelte.d.ts +70 -27
- package/dist/components/Legend.svelte +374 -190
- package/dist/components/Legend.svelte.d.ts +95 -44
- package/dist/components/Line.svelte +163 -125
- package/dist/components/Line.svelte.d.ts +75 -0
- package/dist/components/LinearGradient.svelte +153 -78
- package/dist/components/LinearGradient.svelte.d.ts +66 -31
- package/dist/components/Link.svelte +160 -104
- package/dist/components/Link.svelte.d.ts +54 -0
- package/dist/components/Marker.svelte +100 -39
- package/dist/components/Marker.svelte.d.ts +59 -27
- package/dist/components/MarkerWrapper.svelte +35 -0
- package/dist/components/MarkerWrapper.svelte.d.ts +18 -0
- package/dist/components/MonthPath.svelte +65 -20
- package/dist/components/MonthPath.svelte.d.ts +23 -17
- package/dist/components/MotionPath.svelte +80 -24
- package/dist/components/MotionPath.svelte.d.ts +46 -27
- package/dist/components/Pack.svelte +53 -17
- package/dist/components/Pack.svelte.d.ts +42 -21
- package/dist/components/Partition.svelte +64 -22
- package/dist/components/Partition.svelte.d.ts +49 -26
- package/dist/components/Pattern.svelte +297 -11
- package/dist/components/Pattern.svelte.d.ts +103 -19
- package/dist/components/Pie.svelte +122 -76
- package/dist/components/Pie.svelte.d.ts +65 -51
- package/dist/components/Point.svelte +20 -9
- package/dist/components/Point.svelte.d.ts +16 -20
- package/dist/components/Points.svelte +148 -137
- package/dist/components/Points.svelte.d.ts +45 -34
- package/dist/components/RadialGradient.svelte +143 -70
- package/dist/components/RadialGradient.svelte.d.ts +69 -31
- package/dist/components/Rect.svelte +121 -102
- package/dist/components/Rect.svelte.d.ts +36 -0
- package/dist/components/RectClipPath.svelte +82 -18
- package/dist/components/RectClipPath.svelte.d.ts +55 -0
- package/dist/components/Rule.svelte +105 -62
- package/dist/components/Rule.svelte.d.ts +40 -19
- package/dist/components/Sankey.svelte +132 -55
- package/dist/components/Sankey.svelte.d.ts +61 -31
- package/dist/components/Spline.svelte +281 -218
- package/dist/components/Spline.svelte.d.ts +95 -0
- package/dist/components/Text.svelte +437 -176
- package/dist/components/Text.svelte.d.ts +130 -0
- package/dist/components/Threshold.svelte +48 -16
- package/dist/components/Threshold.svelte.d.ts +29 -31
- package/dist/components/TileImage.svelte +103 -30
- package/dist/components/TileImage.svelte.d.ts +48 -23
- package/dist/components/TransformContext.svelte +365 -171
- package/dist/components/TransformControls.svelte +50 -26
- package/dist/components/TransformControls.svelte.d.ts +27 -19
- package/dist/components/Tree.svelte +74 -33
- package/dist/components/Tree.svelte.d.ts +42 -30
- package/dist/components/Treemap.svelte +119 -42
- package/dist/components/Treemap.svelte.d.ts +75 -27
- package/dist/components/Voronoi.svelte +106 -75
- package/dist/components/Voronoi.svelte.d.ts +40 -41
- package/dist/components/charts/ArcChart.svelte +464 -0
- package/dist/components/charts/ArcChart.svelte.d.ts +90 -0
- package/dist/components/charts/AreaChart.svelte +450 -393
- package/dist/components/charts/AreaChart.svelte.d.ts +61 -0
- package/dist/components/charts/BarChart.svelte +454 -389
- package/dist/components/charts/BarChart.svelte.d.ts +76 -0
- package/dist/components/charts/ChartAnnotations.svelte +37 -0
- package/dist/components/charts/ChartAnnotations.svelte.d.ts +10 -0
- package/dist/components/charts/DefaultTooltip.svelte +60 -0
- package/dist/components/charts/DefaultTooltip.svelte.d.ts +10 -0
- package/dist/components/charts/LineChart.svelte +369 -314
- package/dist/components/charts/LineChart.svelte.d.ts +53 -0
- package/dist/components/charts/PieChart.svelte +458 -316
- package/dist/components/charts/PieChart.svelte.d.ts +137 -353
- package/dist/components/charts/ScatterChart.svelte +334 -296
- package/dist/components/charts/ScatterChart.svelte.d.ts +39 -0
- package/dist/components/charts/index.d.ts +8 -0
- package/dist/components/charts/index.js +7 -0
- package/dist/components/charts/types.d.ts +253 -0
- package/dist/components/charts/utils.svelte.d.ts +30 -0
- package/dist/components/charts/utils.svelte.js +55 -0
- package/dist/components/index.d.ts +76 -4
- package/dist/components/index.js +76 -5
- package/dist/components/layout/Canvas.svelte +321 -155
- package/dist/components/layout/Canvas.svelte.d.ts +104 -55
- package/dist/components/layout/Html.svelte +82 -42
- package/dist/components/layout/Html.svelte.d.ts +39 -28
- package/dist/components/layout/Layer.svelte +39 -0
- package/dist/components/layout/Layer.svelte.d.ts +17 -0
- package/dist/components/layout/Svg.svelte +122 -70
- package/dist/components/layout/Svg.svelte.d.ts +53 -34
- package/dist/components/layout/WebGL.svelte +135 -0
- package/dist/components/layout/WebGL.svelte.d.ts +50 -0
- package/dist/components/tooltip/Tooltip.svelte +246 -78
- package/dist/components/tooltip/Tooltip.svelte.d.ts +149 -31
- package/dist/components/tooltip/TooltipContext.svelte +409 -271
- package/dist/components/tooltip/TooltipContext.svelte.d.ts +86 -55
- package/dist/components/tooltip/TooltipHeader.svelte +100 -11
- package/dist/components/tooltip/TooltipHeader.svelte.d.ts +43 -23
- package/dist/components/tooltip/TooltipItem.svelte +167 -27
- package/dist/components/tooltip/TooltipItem.svelte.d.ts +63 -31
- package/dist/components/tooltip/TooltipList.svelte +22 -3
- package/dist/components/tooltip/TooltipList.svelte.d.ts +6 -17
- package/dist/components/tooltip/TooltipSeparator.svelte +27 -1
- package/dist/components/tooltip/TooltipSeparator.svelte.d.ts +6 -15
- package/dist/components/tooltip/index.d.ts +6 -0
- package/dist/components/tooltip/index.js +6 -0
- package/dist/components/tooltip/tooltipMetaContext.d.ts +79 -0
- package/dist/components/tooltip/tooltipMetaContext.js +139 -0
- package/dist/components/types.d.ts +1 -0
- package/dist/components/types.js +1 -0
- package/dist/docs/Blockquote.svelte.d.ts +18 -14
- package/dist/docs/Code.svelte.d.ts +26 -22
- package/dist/docs/ConnectorSweepMenuField.svelte +17 -0
- package/dist/docs/ConnectorSweepMenuField.svelte.d.ts +7 -0
- package/dist/docs/ConnectorTypeMenuField.svelte +17 -0
- package/dist/docs/ConnectorTypeMenuField.svelte.d.ts +7 -0
- package/dist/docs/CurveMenuField.svelte +14 -3
- package/dist/docs/CurveMenuField.svelte.d.ts +9 -18
- package/dist/docs/GeoDebug.svelte +47 -42
- package/dist/docs/GeoDebug.svelte.d.ts +4 -16
- package/dist/docs/Header1.svelte.d.ts +27 -16
- package/dist/docs/Json.svelte.d.ts +20 -16
- package/dist/docs/Layout.svelte.d.ts +18 -13
- package/dist/docs/Link.svelte.d.ts +33 -21
- package/dist/docs/PathDataMenuField.svelte +14 -10
- package/dist/docs/PathDataMenuField.svelte.d.ts +8 -18
- package/dist/docs/Preview.svelte +20 -7
- package/dist/docs/Preview.svelte.d.ts +12 -22
- package/dist/docs/TilesetField.svelte.d.ts +21 -17
- package/dist/docs/TransformDebug.svelte +5 -6
- package/dist/docs/TransformDebug.svelte.d.ts +18 -14
- package/dist/docs/ViewSourceButton.svelte.d.ts +21 -17
- package/dist/types/d3-shape-extentions.d.ts +7 -0
- package/dist/utils/afterTick.d.ts +5 -0
- package/dist/utils/afterTick.js +8 -0
- package/dist/utils/arcText.svelte.d.ts +57 -0
- package/dist/utils/arcText.svelte.js +262 -0
- package/dist/utils/array.d.ts +9 -1
- package/dist/utils/array.js +13 -0
- package/dist/utils/attributes.d.ts +29 -0
- package/dist/utils/attributes.js +40 -0
- package/dist/utils/canvas.js +47 -10
- package/dist/utils/chart.d.ts +78 -0
- package/dist/utils/chart.js +512 -0
- package/dist/utils/color.d.ts +1 -0
- package/dist/utils/color.js +8 -0
- package/dist/utils/common.d.ts +3 -5
- package/dist/utils/common.js +3 -2
- package/dist/utils/connectorUtils.d.ts +21 -0
- package/dist/utils/connectorUtils.js +111 -0
- package/dist/utils/createId.d.ts +7 -0
- package/dist/utils/createId.js +9 -0
- package/dist/utils/debug.d.ts +1 -0
- package/dist/utils/debug.js +84 -0
- package/dist/utils/filterObject.d.ts +9 -0
- package/dist/utils/filterObject.js +12 -0
- package/dist/utils/graph/dagre.d.ts +34 -0
- package/dist/utils/graph/dagre.js +78 -0
- package/dist/utils/graph/dagre.test.d.ts +1 -0
- package/dist/utils/{graph.test.js → graph/dagre.test.js} +19 -33
- package/dist/utils/graph/sankey.d.ts +28 -0
- package/dist/utils/{graph.js → graph/sankey.js} +13 -41
- package/dist/utils/index.d.ts +3 -1
- package/dist/utils/index.js +3 -1
- package/dist/utils/key.svelte.d.ts +3 -0
- package/dist/utils/key.svelte.js +11 -0
- package/dist/utils/legendPayload.d.ts +7 -0
- package/dist/utils/legendPayload.js +8 -0
- package/dist/utils/motion.svelte.d.ts +140 -0
- package/dist/utils/motion.svelte.js +180 -0
- package/dist/utils/motion.test.d.ts +1 -0
- package/dist/utils/motion.test.js +213 -0
- package/dist/utils/{rect.d.ts → rect.svelte.d.ts} +7 -4
- package/dist/utils/rect.svelte.js +105 -0
- package/dist/utils/scales.svelte.d.ts +90 -0
- package/dist/utils/{scales.js → scales.svelte.js} +100 -39
- package/dist/utils/stack.d.ts +2 -3
- package/dist/utils/stack.js +1 -1
- package/dist/utils/string.js +87 -0
- package/dist/utils/ticks.d.ts +8 -2
- package/dist/utils/ticks.js +28 -0
- package/dist/utils/ticks.test.d.ts +1 -0
- package/dist/utils/ticks.test.js +67 -0
- package/dist/utils/types.d.ts +81 -0
- package/package.json +25 -24
- package/dist/components/ChartContext.svelte +0 -295
- package/dist/components/ChartContext.svelte.d.ts +0 -139
- package/dist/components/TransformContext.svelte.d.ts +0 -158
- package/dist/stores/motionStore.d.ts +0 -30
- package/dist/stores/motionStore.js +0 -62
- package/dist/utils/graph.d.ts +0 -37
- package/dist/utils/rect.js +0 -107
- package/dist/utils/scales.d.ts +0 -66
- /package/dist/{utils/graph.test.d.ts → components/charts/types.js} +0 -0
|
@@ -1,15 +1,301 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { SVGAttributes } from 'svelte/elements';
|
|
4
|
+
|
|
5
|
+
import { asAny, type Without } from '../utils/types.js';
|
|
6
|
+
import { extractLayerProps } from '../utils/attributes.js';
|
|
7
|
+
import { createId } from '../utils/createId.js';
|
|
8
|
+
|
|
9
|
+
type PatternLineDef = {
|
|
10
|
+
/**
|
|
11
|
+
* The width of the line
|
|
12
|
+
* @default 1
|
|
13
|
+
*/
|
|
14
|
+
width?: string;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The rotation of the line
|
|
18
|
+
* @default 0
|
|
19
|
+
*/
|
|
20
|
+
rotate?: number;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The color of the line
|
|
24
|
+
* @default 'var(--color-surface-content)'
|
|
25
|
+
*/
|
|
26
|
+
color?: string;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The opacity of the line
|
|
30
|
+
* @default 1
|
|
31
|
+
*/
|
|
32
|
+
opacity?: number;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
type PatternCircleDef = {
|
|
36
|
+
/**
|
|
37
|
+
* The radius of the circle
|
|
38
|
+
* @default 1
|
|
39
|
+
*/
|
|
40
|
+
radius?: number;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Stagger the circle layout
|
|
44
|
+
* @default false
|
|
45
|
+
*/
|
|
46
|
+
stagger?: boolean;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The color of the circle
|
|
50
|
+
* @default 'var(--color-surface-content)'
|
|
51
|
+
*/
|
|
52
|
+
color?: string;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The opacity of the circle
|
|
56
|
+
* @default 1
|
|
57
|
+
*/
|
|
58
|
+
opacity?: number;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export type PatternPropsWithoutHTML = {
|
|
62
|
+
/**
|
|
63
|
+
* The id of the pattern
|
|
64
|
+
*/
|
|
65
|
+
id?: string;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* The size of the pattern (sets `width` and `height` as same value).
|
|
69
|
+
*/
|
|
70
|
+
size?: number;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* The width of the pattern for custom patterns (set by `lines`, etc)
|
|
74
|
+
*/
|
|
75
|
+
width?: number;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* The height of the pattern for custom patterns (set by `lines`, etc)
|
|
79
|
+
*/
|
|
80
|
+
height?: number;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* The number of lines to render
|
|
84
|
+
*/
|
|
85
|
+
lines?: boolean | PatternLineDef | PatternLineDef[];
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* The number of circles to render
|
|
89
|
+
*/
|
|
90
|
+
circles?: boolean | PatternCircleDef | PatternCircleDef[];
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The background color of the pattern
|
|
94
|
+
*/
|
|
95
|
+
background?: string;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Render as a child of the pattern
|
|
99
|
+
*/
|
|
100
|
+
patternContent?: Snippet;
|
|
101
|
+
|
|
102
|
+
children?: Snippet<[{ id: string; pattern: string }]>;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export type PatternProps = PatternPropsWithoutHTML &
|
|
106
|
+
Without<SVGAttributes<SVGPatternElement>, PatternPropsWithoutHTML>;
|
|
107
|
+
|
|
108
|
+
export type CircleShape = {
|
|
109
|
+
type: 'circle';
|
|
110
|
+
cx: number;
|
|
111
|
+
cy: number;
|
|
112
|
+
r: number;
|
|
113
|
+
fill: string;
|
|
114
|
+
opacity: number;
|
|
115
|
+
};
|
|
116
|
+
export type LineShape = {
|
|
117
|
+
type: 'line';
|
|
118
|
+
path: string;
|
|
119
|
+
stroke: string;
|
|
120
|
+
strokeWidth: string | number;
|
|
121
|
+
opacity: number;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
export type PatternShape = CircleShape | LineShape;
|
|
125
|
+
</script>
|
|
126
|
+
|
|
1
127
|
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
128
|
+
import { getRenderContext } from './Chart.svelte';
|
|
129
|
+
import { registerCanvasComponent } from './layout/Canvas.svelte';
|
|
130
|
+
import { createPattern } from '../utils/canvas.js';
|
|
131
|
+
|
|
132
|
+
const uid = $props.id();
|
|
133
|
+
|
|
134
|
+
let {
|
|
135
|
+
id = createId('pattern-', uid),
|
|
136
|
+
size = 4,
|
|
137
|
+
width = size,
|
|
138
|
+
height = size,
|
|
139
|
+
lines: linesProp,
|
|
140
|
+
circles: circlesProp,
|
|
141
|
+
background,
|
|
142
|
+
patternContent,
|
|
143
|
+
children,
|
|
144
|
+
...restProps
|
|
145
|
+
}: PatternProps = $props();
|
|
146
|
+
|
|
147
|
+
const renderCtx = getRenderContext();
|
|
148
|
+
|
|
149
|
+
let canvasPattern = $state<CanvasPattern | null>(null);
|
|
150
|
+
|
|
151
|
+
let shapes = $state<PatternShape[]>([]);
|
|
152
|
+
|
|
153
|
+
if (linesProp) {
|
|
154
|
+
const lineDefs = Array.isArray(linesProp) ? linesProp : linesProp === true ? [{}] : [linesProp];
|
|
155
|
+
for (const line of lineDefs) {
|
|
156
|
+
// const spacing = Math.abs(line.spacing);
|
|
157
|
+
const stroke = line.color ?? 'var(--color-surface-content)';
|
|
158
|
+
const strokeWidth = line.width ?? 1;
|
|
159
|
+
const opacity = line.opacity ?? 1;
|
|
6
160
|
|
|
7
|
-
|
|
8
|
-
|
|
161
|
+
let rotate = Math.round(line.rotate ?? 0) % 360;
|
|
162
|
+
if (rotate > 180) rotate = rotate - 360;
|
|
163
|
+
else if (rotate > 90) rotate = rotate - 180;
|
|
164
|
+
else if (rotate < -180) rotate = rotate + 360;
|
|
165
|
+
else if (rotate < -90) rotate = rotate + 180;
|
|
166
|
+
|
|
167
|
+
// Use a <path> instead of a <line> to have corners without gaps (start, main line, end)
|
|
168
|
+
let path = '';
|
|
169
|
+
|
|
170
|
+
if (rotate === 0) {
|
|
171
|
+
path = `
|
|
172
|
+
M 0 0 L ${width} 0
|
|
173
|
+
M 0 ${height} L ${width} ${height}
|
|
174
|
+
`;
|
|
175
|
+
} else if (rotate === 90) {
|
|
176
|
+
path = `
|
|
177
|
+
M 0 0 L 0 ${height}
|
|
178
|
+
M ${width} 0 L ${width} ${height}
|
|
179
|
+
`;
|
|
180
|
+
} else {
|
|
181
|
+
if (rotate > 0) {
|
|
182
|
+
path = `
|
|
183
|
+
M 0 ${-height} L ${width * 2} ${height}
|
|
184
|
+
M ${-width} ${-height} L ${width} ${height}
|
|
185
|
+
M ${-width} 0 L ${width} ${height * 2}
|
|
186
|
+
`;
|
|
187
|
+
} else {
|
|
188
|
+
path = `
|
|
189
|
+
M ${-width} ${height} L ${width} ${-height}
|
|
190
|
+
M ${-width} ${height * 2} L ${width * 2} ${-height}
|
|
191
|
+
M 0 ${height * 2} L ${width * 2} 0
|
|
192
|
+
`;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
shapes.push({
|
|
197
|
+
type: 'line',
|
|
198
|
+
path,
|
|
199
|
+
stroke,
|
|
200
|
+
strokeWidth,
|
|
201
|
+
opacity,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (circlesProp) {
|
|
207
|
+
const circleDefs = Array.isArray(circlesProp)
|
|
208
|
+
? circlesProp
|
|
209
|
+
: circlesProp === true
|
|
210
|
+
? [{}]
|
|
211
|
+
: [circlesProp];
|
|
212
|
+
for (const circle of circleDefs) {
|
|
213
|
+
if (circle.stagger) {
|
|
214
|
+
shapes.push(
|
|
215
|
+
{
|
|
216
|
+
type: 'circle',
|
|
217
|
+
cx: size / 4,
|
|
218
|
+
cy: size / 4,
|
|
219
|
+
r: circle.radius ?? 1,
|
|
220
|
+
fill: circle.color ?? 'var(--color-surface-content)',
|
|
221
|
+
opacity: circle.opacity ?? 1,
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
type: 'circle',
|
|
225
|
+
cx: (size * 3) / 4,
|
|
226
|
+
cy: (size * 3) / 4,
|
|
227
|
+
r: circle.radius ?? 1,
|
|
228
|
+
fill: circle.color ?? 'var(--color-surface-content)',
|
|
229
|
+
opacity: circle.opacity ?? 1,
|
|
230
|
+
}
|
|
231
|
+
);
|
|
232
|
+
} else {
|
|
233
|
+
shapes.push({
|
|
234
|
+
type: 'circle',
|
|
235
|
+
cx: size / 2,
|
|
236
|
+
cy: size / 2,
|
|
237
|
+
r: circle.radius ?? 1,
|
|
238
|
+
fill: circle.color ?? 'var(--color-surface-content)',
|
|
239
|
+
opacity: circle.opacity ?? 1,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function render(_ctx: CanvasRenderingContext2D) {
|
|
246
|
+
const pattern = createPattern(_ctx, width, height, shapes, background);
|
|
247
|
+
canvasPattern = pattern;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
if (renderCtx === 'canvas') {
|
|
251
|
+
registerCanvasComponent({
|
|
252
|
+
name: 'Pattern',
|
|
253
|
+
render,
|
|
254
|
+
deps: () => [width, height, shapes, background],
|
|
255
|
+
});
|
|
256
|
+
}
|
|
9
257
|
</script>
|
|
10
258
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
259
|
+
{#if renderCtx === 'canvas'}
|
|
260
|
+
{@render children?.({ id, pattern: asAny(canvasPattern) })}
|
|
261
|
+
{:else if renderCtx === 'svg'}
|
|
262
|
+
<defs>
|
|
263
|
+
<pattern
|
|
264
|
+
{id}
|
|
265
|
+
{width}
|
|
266
|
+
{height}
|
|
267
|
+
patternUnits="userSpaceOnUse"
|
|
268
|
+
{...extractLayerProps(restProps, 'pattern')}
|
|
269
|
+
>
|
|
270
|
+
{#if patternContent}
|
|
271
|
+
{@render patternContent?.()}
|
|
272
|
+
{:else}
|
|
273
|
+
{#if background}
|
|
274
|
+
<rect {width} {height} fill={background} />
|
|
275
|
+
{/if}
|
|
276
|
+
|
|
277
|
+
{#each shapes.filter((shape) => shape.type === 'line') as line}
|
|
278
|
+
<path
|
|
279
|
+
d={line.path}
|
|
280
|
+
stroke={line.stroke}
|
|
281
|
+
stroke-width={line.strokeWidth}
|
|
282
|
+
fill="none"
|
|
283
|
+
opacity={line.opacity}
|
|
284
|
+
/>
|
|
285
|
+
{/each}
|
|
286
|
+
|
|
287
|
+
{#each shapes.filter((shape) => shape.type === 'circle') as circle}
|
|
288
|
+
<circle
|
|
289
|
+
cx={circle.cx}
|
|
290
|
+
cy={circle.cy}
|
|
291
|
+
r={circle.r}
|
|
292
|
+
fill={circle.fill}
|
|
293
|
+
opacity={circle.opacity}
|
|
294
|
+
/>
|
|
295
|
+
{/each}
|
|
296
|
+
{/if}
|
|
297
|
+
</pattern>
|
|
298
|
+
</defs>
|
|
299
|
+
|
|
300
|
+
{@render children?.({ id, pattern: `url(#${id})` })}
|
|
301
|
+
{/if}
|
|
@@ -1,21 +1,105 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { SVGAttributes } from 'svelte/elements';
|
|
3
|
+
import { type Without } from '../utils/types.js';
|
|
4
|
+
type PatternLineDef = {
|
|
5
|
+
/**
|
|
6
|
+
* The width of the line
|
|
7
|
+
* @default 1
|
|
8
|
+
*/
|
|
9
|
+
width?: string;
|
|
10
|
+
/**
|
|
11
|
+
* The rotation of the line
|
|
12
|
+
* @default 0
|
|
13
|
+
*/
|
|
14
|
+
rotate?: number;
|
|
15
|
+
/**
|
|
16
|
+
* The color of the line
|
|
17
|
+
* @default 'var(--color-surface-content)'
|
|
18
|
+
*/
|
|
19
|
+
color?: string;
|
|
20
|
+
/**
|
|
21
|
+
* The opacity of the line
|
|
22
|
+
* @default 1
|
|
23
|
+
*/
|
|
24
|
+
opacity?: number;
|
|
25
|
+
};
|
|
26
|
+
type PatternCircleDef = {
|
|
27
|
+
/**
|
|
28
|
+
* The radius of the circle
|
|
29
|
+
* @default 1
|
|
30
|
+
*/
|
|
31
|
+
radius?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Stagger the circle layout
|
|
34
|
+
* @default false
|
|
35
|
+
*/
|
|
36
|
+
stagger?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* The color of the circle
|
|
39
|
+
* @default 'var(--color-surface-content)'
|
|
40
|
+
*/
|
|
41
|
+
color?: string;
|
|
42
|
+
/**
|
|
43
|
+
* The opacity of the circle
|
|
44
|
+
* @default 1
|
|
45
|
+
*/
|
|
46
|
+
opacity?: number;
|
|
47
|
+
};
|
|
48
|
+
export type PatternPropsWithoutHTML = {
|
|
49
|
+
/**
|
|
50
|
+
* The id of the pattern
|
|
51
|
+
*/
|
|
52
|
+
id?: string;
|
|
53
|
+
/**
|
|
54
|
+
* The size of the pattern (sets `width` and `height` as same value).
|
|
55
|
+
*/
|
|
56
|
+
size?: number;
|
|
57
|
+
/**
|
|
58
|
+
* The width of the pattern for custom patterns (set by `lines`, etc)
|
|
59
|
+
*/
|
|
60
|
+
width?: number;
|
|
61
|
+
/**
|
|
62
|
+
* The height of the pattern for custom patterns (set by `lines`, etc)
|
|
63
|
+
*/
|
|
64
|
+
height?: number;
|
|
65
|
+
/**
|
|
66
|
+
* The number of lines to render
|
|
67
|
+
*/
|
|
68
|
+
lines?: boolean | PatternLineDef | PatternLineDef[];
|
|
69
|
+
/**
|
|
70
|
+
* The number of circles to render
|
|
71
|
+
*/
|
|
72
|
+
circles?: boolean | PatternCircleDef | PatternCircleDef[];
|
|
73
|
+
/**
|
|
74
|
+
* The background color of the pattern
|
|
75
|
+
*/
|
|
76
|
+
background?: string;
|
|
77
|
+
/**
|
|
78
|
+
* Render as a child of the pattern
|
|
79
|
+
*/
|
|
80
|
+
patternContent?: Snippet;
|
|
81
|
+
children?: Snippet<[{
|
|
5
82
|
id: string;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
83
|
+
pattern: string;
|
|
84
|
+
}]>;
|
|
85
|
+
};
|
|
86
|
+
export type PatternProps = PatternPropsWithoutHTML & Without<SVGAttributes<SVGPatternElement>, PatternPropsWithoutHTML>;
|
|
87
|
+
export type CircleShape = {
|
|
88
|
+
type: 'circle';
|
|
89
|
+
cx: number;
|
|
90
|
+
cy: number;
|
|
91
|
+
r: number;
|
|
92
|
+
fill: string;
|
|
93
|
+
opacity: number;
|
|
94
|
+
};
|
|
95
|
+
export type LineShape = {
|
|
96
|
+
type: 'line';
|
|
97
|
+
path: string;
|
|
98
|
+
stroke: string;
|
|
99
|
+
strokeWidth: string | number;
|
|
100
|
+
opacity: number;
|
|
15
101
|
};
|
|
16
|
-
export type
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
export default
|
|
20
|
-
}
|
|
21
|
-
export {};
|
|
102
|
+
export type PatternShape = CircleShape | LineShape;
|
|
103
|
+
declare const Pattern: import("svelte").Component<PatternProps, {}, "">;
|
|
104
|
+
type Pattern = ReturnType<typeof Pattern>;
|
|
105
|
+
export default Pattern;
|
|
@@ -1,13 +1,87 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
import { pie as d3pie, type PieArcDatum } from 'd3-shape';
|
|
3
|
+
|
|
4
|
+
export type PiePropsWithoutHTML = {
|
|
5
|
+
data?: any[];
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Range [min,max] in degrees. See also startAngle/endAngle
|
|
9
|
+
*
|
|
10
|
+
* @default [0, 360]
|
|
11
|
+
*/
|
|
12
|
+
range?: [number, number] | number[];
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Start angle in radians
|
|
16
|
+
*/
|
|
17
|
+
startAngle?: number;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* End angle in radians
|
|
21
|
+
*/
|
|
22
|
+
endAngle?: number;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Define innerRadius.
|
|
26
|
+
* value >= 1: discrete value
|
|
27
|
+
* value > 0: percent of `outerRadius`
|
|
28
|
+
* value < 0: offset of `outerRadius`
|
|
29
|
+
* default: yRange min
|
|
30
|
+
*/
|
|
31
|
+
innerRadius?: number;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Define outerRadius. Defaults to yRange max/2 (ie. chart height / 2)
|
|
35
|
+
*/
|
|
36
|
+
outerRadius?: number;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Corner radius of the arc
|
|
40
|
+
*
|
|
41
|
+
* @default 0
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
cornerRadius?: number;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Angle between the arcs
|
|
48
|
+
*
|
|
49
|
+
* @default 0
|
|
50
|
+
*/
|
|
51
|
+
padAngle?: number;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Offset all arcs from center
|
|
55
|
+
*
|
|
56
|
+
* @default 0
|
|
57
|
+
*/
|
|
58
|
+
offset?: number;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Tooltip context to setup pointer events to show tooltip for related data
|
|
62
|
+
*/
|
|
63
|
+
tooltipContext?: TooltipContextValue;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Sort function to sort the arcs
|
|
67
|
+
*/
|
|
68
|
+
sort?: ((a: any, b: any) => number) | null;
|
|
69
|
+
|
|
70
|
+
children?: Snippet<[{ arcs: PieArcDatum<any>[] }]>;
|
|
71
|
+
|
|
72
|
+
motion?: MotionProp;
|
|
73
|
+
};
|
|
74
|
+
</script>
|
|
75
|
+
|
|
1
76
|
<script lang="ts">
|
|
2
|
-
import type { spring as springStore, tweened as tweenedStore } from 'svelte/motion';
|
|
3
|
-
import { pie as d3pie } from 'd3-shape';
|
|
4
77
|
import { min, max } from 'd3-array';
|
|
5
|
-
|
|
6
78
|
import Arc from './Arc.svelte';
|
|
7
|
-
import { chartContext } from './ChartContext.svelte';
|
|
8
79
|
import { degreesToRadians } from '../utils/math.js';
|
|
9
|
-
import {
|
|
80
|
+
import { createMotion, type MotionProp } from '../utils/motion.svelte.js';
|
|
10
81
|
import type { TooltipContextValue } from './tooltip/TooltipContext.svelte';
|
|
82
|
+
import { getChartContext } from './Chart.svelte';
|
|
83
|
+
import type { Snippet } from 'svelte';
|
|
84
|
+
import { layerClass } from '../utils/attributes.js';
|
|
11
85
|
|
|
12
86
|
/*
|
|
13
87
|
TODO:
|
|
@@ -17,84 +91,56 @@
|
|
|
17
91
|
- [ ] Hover events / change innerRadius / outerRadius, etc
|
|
18
92
|
*/
|
|
19
93
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
export let cornerRadius = 0;
|
|
52
|
-
export let padAngle = 0;
|
|
53
|
-
|
|
54
|
-
export let spring: boolean | Parameters<typeof springStore>[1] = undefined;
|
|
55
|
-
export let tweened: boolean | Parameters<typeof tweenedStore>[1] = undefined;
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Offset all arcs from center
|
|
59
|
-
*/
|
|
60
|
-
export let offset = 0;
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Tooltip context to setup pointer events to show tooltip for related data
|
|
64
|
-
*/
|
|
65
|
-
export let tooltip: TooltipContextValue | undefined = undefined;
|
|
66
|
-
|
|
67
|
-
export let sort: ((a: any, b: any) => number) | null | undefined = undefined;
|
|
68
|
-
|
|
69
|
-
const { data: contextData, x, y, xRange, c, cScale, config } = chartContext();
|
|
70
|
-
|
|
71
|
-
// @ts-expect-error
|
|
72
|
-
$: resolved_endAngle = endAngle ?? degreesToRadians($config.xRange ? max($xRange) : max(range));
|
|
73
|
-
let tweened_endAngle = motionStore(0, { spring, tweened });
|
|
74
|
-
$: tweened_endAngle.set(resolved_endAngle);
|
|
75
|
-
|
|
76
|
-
let pie: ReturnType<typeof d3pie<any>>;
|
|
77
|
-
$: {
|
|
78
|
-
pie = d3pie<any>()
|
|
79
|
-
// @ts-expect-error
|
|
80
|
-
.startAngle(startAngle ?? degreesToRadians($config.xRange ? min($xRange) : min(range)))
|
|
81
|
-
.endAngle($tweened_endAngle)
|
|
94
|
+
let {
|
|
95
|
+
data,
|
|
96
|
+
range = [0, 360],
|
|
97
|
+
startAngle: startAngleProp,
|
|
98
|
+
endAngle: endAngleProp,
|
|
99
|
+
innerRadius,
|
|
100
|
+
outerRadius,
|
|
101
|
+
cornerRadius = 0,
|
|
102
|
+
padAngle = 0,
|
|
103
|
+
motion,
|
|
104
|
+
offset = 0,
|
|
105
|
+
tooltipContext,
|
|
106
|
+
sort,
|
|
107
|
+
children,
|
|
108
|
+
}: PiePropsWithoutHTML = $props();
|
|
109
|
+
|
|
110
|
+
const ctx = getChartContext();
|
|
111
|
+
|
|
112
|
+
const endAngle = $derived(
|
|
113
|
+
endAngleProp ?? degreesToRadians(ctx.config.xRange ? max(ctx.xRange) : max(range))
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
const motionEndAngle = createMotion(0, () => endAngle, motion);
|
|
117
|
+
|
|
118
|
+
const pie = $derived.by(() => {
|
|
119
|
+
let _pie = d3pie<any>()
|
|
120
|
+
.startAngle(
|
|
121
|
+
startAngleProp ?? degreesToRadians(ctx.config.xRange ? min(ctx.xRange) : min(range))
|
|
122
|
+
)
|
|
123
|
+
.endAngle(motionEndAngle.current)
|
|
82
124
|
.padAngle(padAngle)
|
|
83
|
-
.value(
|
|
125
|
+
.value(ctx.x);
|
|
84
126
|
|
|
85
127
|
if (sort === null) {
|
|
86
|
-
|
|
128
|
+
_pie = _pie.sort(null);
|
|
87
129
|
} else if (sort) {
|
|
88
|
-
|
|
130
|
+
_pie = _pie.sort(sort);
|
|
89
131
|
}
|
|
90
|
-
|
|
132
|
+
return _pie;
|
|
133
|
+
});
|
|
91
134
|
|
|
92
|
-
|
|
135
|
+
const arcs = $derived(pie(data ?? (Array.isArray(ctx.data) ? ctx.data : [])));
|
|
93
136
|
</script>
|
|
94
137
|
|
|
95
|
-
|
|
138
|
+
{#if children}
|
|
139
|
+
{@render children({ arcs })}
|
|
140
|
+
{:else}
|
|
96
141
|
{#each arcs as arc}
|
|
97
142
|
<Arc
|
|
143
|
+
class={layerClass('pie-arc')}
|
|
98
144
|
startAngle={arc.startAngle}
|
|
99
145
|
endAngle={arc.endAngle}
|
|
100
146
|
padAngle={arc.padAngle}
|
|
@@ -102,9 +148,9 @@
|
|
|
102
148
|
{outerRadius}
|
|
103
149
|
{cornerRadius}
|
|
104
150
|
{offset}
|
|
105
|
-
fill={
|
|
151
|
+
fill={ctx.config.c ? ctx.cScale?.(ctx.c(arc.data)) : null}
|
|
106
152
|
data={arc.data}
|
|
107
|
-
{
|
|
153
|
+
{tooltipContext}
|
|
108
154
|
/>
|
|
109
155
|
{/each}
|
|
110
|
-
|
|
156
|
+
{/if}
|