@rokkit/chart 1.0.0-next.83 → 1.0.0-next.85
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/package.json +6 -6
- package/src/chart/Axis.svelte +47 -21
- package/src/chart/Chart.svelte +11 -6
- package/src/lib/theme.js +9 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rokkit/chart",
|
|
3
|
-
"version": "1.0.0-next.
|
|
3
|
+
"version": "1.0.0-next.85",
|
|
4
4
|
"description": "Components for making interactive charts.",
|
|
5
5
|
"author": "Jerry Thomas <me@jerrythomas.name>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"typescript": "^5.3.3",
|
|
23
23
|
"vite": "^5.1.4",
|
|
24
24
|
"vitest": "~1.3.1",
|
|
25
|
-
"shared-config": "1.0.0-next.
|
|
25
|
+
"shared-config": "1.0.0-next.85"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"d3-array": "^3.2.4",
|
|
@@ -34,10 +34,10 @@
|
|
|
34
34
|
"date-fns": "^3.3.1",
|
|
35
35
|
"ramda": "^0.29.1",
|
|
36
36
|
"yootils": "^0.3.1",
|
|
37
|
-
"@rokkit/atoms": "1.0.0-next.
|
|
38
|
-
"@rokkit/core": "1.0.0-next.
|
|
39
|
-
"@rokkit/molecules": "1.0.0-next.
|
|
40
|
-
"@rokkit/stores": "1.0.0-next.
|
|
37
|
+
"@rokkit/atoms": "1.0.0-next.85",
|
|
38
|
+
"@rokkit/core": "1.0.0-next.85",
|
|
39
|
+
"@rokkit/molecules": "1.0.0-next.85",
|
|
40
|
+
"@rokkit/stores": "1.0.0-next.85"
|
|
41
41
|
},
|
|
42
42
|
"files": [
|
|
43
43
|
"src/**/*.js",
|
package/src/chart/Axis.svelte
CHANGED
|
@@ -1,28 +1,57 @@
|
|
|
1
1
|
<script>
|
|
2
2
|
import { getContext } from 'svelte'
|
|
3
|
+
const chart = getContext('chart')
|
|
4
|
+
|
|
3
5
|
export let orient = 'bottom'
|
|
6
|
+
export let majorTickStep = 0
|
|
7
|
+
export let minorTickStep = 0
|
|
8
|
+
export let lower = 0
|
|
9
|
+
export let upper = 100
|
|
10
|
+
|
|
11
|
+
function getTicks(lower, upper, majorTickStep, minorTickStep) {
|
|
12
|
+
if (majorTickStep === 0 && minorTickStep === 0) return []
|
|
13
|
+
const minorTicks = Array.from(
|
|
14
|
+
{ length: Math.floor((upper - lower) / minorTickStep) + 1 },
|
|
15
|
+
(_, i) => ({
|
|
16
|
+
position: i * minorTickStep,
|
|
17
|
+
label: i * minorTickStep,
|
|
18
|
+
type: 'minor'
|
|
19
|
+
})
|
|
20
|
+
)
|
|
21
|
+
const majorTicks = Array.from(
|
|
22
|
+
{ length: Math.floor((upper - lower) / majorTickStep) + 1 },
|
|
23
|
+
(_, i) => ({
|
|
24
|
+
position: i * majorTickStep,
|
|
25
|
+
label: i * majorTickStep,
|
|
26
|
+
type: 'major'
|
|
27
|
+
})
|
|
28
|
+
)
|
|
29
|
+
const end = [
|
|
30
|
+
{ position: upper, label: upper, type: 'end' },
|
|
31
|
+
{ position: lower, label: lower, type: 'end' }
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
return [...minorTicks, ...majorTicks, ...end].sort((a, b) => a.position - b.position)
|
|
35
|
+
}
|
|
4
36
|
|
|
5
|
-
let
|
|
37
|
+
let top = orient === 'bottom' ? $chart.height - $chart.margin.bottom : $chart.margin.top
|
|
38
|
+
let left = orient === 'right' ? $chart.width - $chart.margin.right : $chart.margin.left
|
|
6
39
|
|
|
7
|
-
let
|
|
8
|
-
let left = orient === 'right' ? $chart.width - $chart.margin.right : $chart.margin?.left ?? 0
|
|
9
|
-
let tickSizeInner = $chart.theme.tick?.size?.inner || 6
|
|
10
|
-
let tickSizeOuter = $chart.theme.tick?.size?.outer || 6
|
|
11
|
-
let tickPadding = $chart.theme.tick?.size?.padding || 3
|
|
40
|
+
let tickPadding = $chart.theme.tick.size.padding
|
|
12
41
|
|
|
13
|
-
function axisPath(vertical
|
|
14
|
-
const range =
|
|
42
|
+
function axisPath(vertical) {
|
|
43
|
+
const range = [lower, upper]
|
|
44
|
+
const size = $chart.theme.tick.size.end
|
|
15
45
|
return vertical
|
|
16
|
-
? `M${k *
|
|
17
|
-
: `M${range[0]},${k *
|
|
46
|
+
? `M${k * size},${range[0]}H0V${range[1]}H${k * size}`
|
|
47
|
+
: `M${range[0]},${k * size}V0H${range[1]}V${k * size}`
|
|
18
48
|
}
|
|
19
49
|
|
|
20
50
|
$: anchor = orient === 'right' ? 'start' : orient === 'left' ? 'end' : 'middle'
|
|
21
51
|
$: k = orient === 'top' || orient === 'left' ? -1 : 1
|
|
22
52
|
$: dy = orient === 'top' ? '0em' : orient === 'bottom' ? '0.71em' : '0.32em'
|
|
23
53
|
$: vertical = orient === 'left' || orient === 'right'
|
|
24
|
-
|
|
25
|
-
$: axis = vertical ? $chart.axis.y : $chart.axis.x
|
|
54
|
+
$: ticks = getTicks(lower, upper, majorTickStep, minorTickStep)
|
|
26
55
|
</script>
|
|
27
56
|
|
|
28
57
|
<g
|
|
@@ -33,21 +62,18 @@
|
|
|
33
62
|
text-anchor={anchor}
|
|
34
63
|
class="axis"
|
|
35
64
|
>
|
|
36
|
-
<path class="domain" stroke="currentColor" d="{axisPath(vertical
|
|
37
|
-
{#each
|
|
65
|
+
<path class="domain" stroke="currentColor" d="{axisPath(vertical)}}" />
|
|
66
|
+
{#each ticks as tick}
|
|
67
|
+
{@const size = $chart.theme.tick.size[tick.type]}
|
|
38
68
|
<g
|
|
39
69
|
class="tick"
|
|
40
70
|
transform="translate({vertical ? 0 : tick.position},{vertical ? tick.position : 0})"
|
|
41
71
|
>
|
|
42
|
-
<line
|
|
43
|
-
stroke="currentColor"
|
|
44
|
-
y2={vertical ? 0 : k * tickSizeInner}
|
|
45
|
-
x2={vertical ? k * tickSizeInner : 0}
|
|
46
|
-
/>
|
|
72
|
+
<line stroke="currentColor" y2={vertical ? 0 : k * size} x2={vertical ? k * size : 0} />
|
|
47
73
|
<text
|
|
48
74
|
fill="currentColor"
|
|
49
|
-
y={vertical ? 0 : k * (
|
|
50
|
-
x={vertical ? k * (
|
|
75
|
+
y={vertical ? 0 : k * (size + tickPadding)}
|
|
76
|
+
x={vertical ? k * (size + tickPadding) : 0}
|
|
51
77
|
{dy}>{tick.label}</text
|
|
52
78
|
>
|
|
53
79
|
</g>
|
package/src/chart/Chart.svelte
CHANGED
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
|
|
9
9
|
setContext('chart', chart)
|
|
10
10
|
|
|
11
|
+
export let data
|
|
11
12
|
export let width = 800
|
|
12
13
|
export let height = 450
|
|
13
|
-
export let data
|
|
14
14
|
export let theme = builtIn
|
|
15
|
-
export let x
|
|
16
|
-
export let y
|
|
17
|
-
export let fill
|
|
18
|
-
export let color
|
|
15
|
+
export let x = 'x'
|
|
16
|
+
export let y = 'y'
|
|
17
|
+
export let fill = null
|
|
18
|
+
export let color = null
|
|
19
19
|
export let padding = 20
|
|
20
20
|
export let curve = 'basis'
|
|
21
21
|
export let stat = 'identity'
|
|
@@ -26,7 +26,12 @@
|
|
|
26
26
|
height,
|
|
27
27
|
data,
|
|
28
28
|
theme,
|
|
29
|
-
aes
|
|
29
|
+
aes,
|
|
30
|
+
axis: {
|
|
31
|
+
x: { scale: 'linear', orient: 'bottom' },
|
|
32
|
+
y: { scale: 'linear', orient: 'left' }
|
|
33
|
+
},
|
|
34
|
+
margin: { top: 10, right: 10, bottom: 10, left: 10 }
|
|
30
35
|
})
|
|
31
36
|
</script>
|
|
32
37
|
|