@rokkit/chart 1.0.0-next.84 → 1.0.0-next.86

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rokkit/chart",
3
- "version": "1.0.0-next.84",
3
+ "version": "1.0.0-next.86",
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.84"
25
+ "shared-config": "1.0.0-next.86"
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.84",
38
- "@rokkit/core": "1.0.0-next.84",
39
- "@rokkit/stores": "1.0.0-next.84",
40
- "@rokkit/molecules": "1.0.0-next.84"
37
+ "@rokkit/atoms": "1.0.0-next.86",
38
+ "@rokkit/core": "1.0.0-next.86",
39
+ "@rokkit/stores": "1.0.0-next.86",
40
+ "@rokkit/molecules": "1.0.0-next.86"
41
41
  },
42
42
  "files": [
43
43
  "src/**/*.js",
@@ -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 chart = getContext('chart')
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 top = orient === 'bottom' ? $chart.height - $chart.margin?.bottom ?? 0 : $chart.margin.top
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, scale) {
14
- const range = scale.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 * tickSizeOuter},${range[0]}H0V${range[1]}H${k * tickSizeOuter}`
17
- : `M${range[0]},${k * tickSizeOuter}V0H${range[1]}V${k * tickSizeOuter}`
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
- // $: range = axis.scale.range()
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, axis.scale)}}" />
37
- {#each axis.ticks as tick}
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 * (tickSizeInner + tickPadding)}
50
- x={vertical ? k * (tickSizeInner + tickPadding) : 0}
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>
@@ -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
 
package/src/lib/theme.js CHANGED
@@ -19,5 +19,13 @@ export const builtIn = {
19
19
  palette,
20
20
  patterns,
21
21
  shapes,
22
- symbols
22
+ symbols,
23
+ tick: {
24
+ size: {
25
+ major: 6,
26
+ minor: 4,
27
+ end: 6,
28
+ padding: 3
29
+ }
30
+ }
23
31
  }