@rokkit/chart 1.0.0-next.100
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/LICENSE +21 -0
- package/README.md +55 -0
- package/package.json +71 -0
- package/src/Chart.svelte +67 -0
- package/src/Symbol.svelte +17 -0
- package/src/Texture.svelte +16 -0
- package/src/elements/Bar.svelte +29 -0
- package/src/elements/ColorRamp.svelte +49 -0
- package/src/elements/ContinuousLegend.svelte +45 -0
- package/src/elements/DefinePatterns.svelte +22 -0
- package/src/elements/DiscreteLegend.svelte +39 -0
- package/src/elements/Label.svelte +13 -0
- package/src/elements/SymbolGrid.svelte +23 -0
- package/src/elements/index.js +6 -0
- package/src/index.js +3 -0
- package/src/lib/brewer.js +25 -0
- package/src/lib/chart.js +213 -0
- package/src/lib/grid.js +85 -0
- package/src/lib/index.js +4 -0
- package/src/lib/plots.js +27 -0
- package/src/lib/swatch.js +16 -0
- package/src/lib/ticks.js +46 -0
- package/src/lib/utils.js +8 -0
- package/src/patterns/Brick.svelte +17 -0
- package/src/patterns/Circles.svelte +18 -0
- package/src/patterns/CrossHatch.svelte +14 -0
- package/src/patterns/CurvedWave.svelte +9 -0
- package/src/patterns/Dots.svelte +19 -0
- package/src/patterns/OutlineCircles.svelte +15 -0
- package/src/patterns/Tile.svelte +17 -0
- package/src/patterns/Triangles.svelte +15 -0
- package/src/patterns/Waves.svelte +13 -0
- package/src/patterns/index.js +14 -0
- package/src/patterns/paths/NamedPattern.svelte +12 -0
- package/src/patterns/paths/constants.js +4 -0
- package/src/plots/Plot.svelte +40 -0
- package/src/plots/index.js +1 -0
- package/src/symbols/RoundedSquare.svelte +27 -0
- package/src/symbols/Shape.svelte +31 -0
- package/src/symbols/constants/index.js +4 -0
- package/src/symbols/index.js +9 -0
- package/src/symbols/outline.svelte +60 -0
- package/src/symbols/solid.svelte +60 -0
- package/src/template/Texture.svelte +16 -0
- package/src/template/constants.js +43 -0
- package/src/template/shapes/Circles.svelte +16 -0
- package/src/template/shapes/Lines.svelte +17 -0
- package/src/template/shapes/Path.svelte +12 -0
- package/src/template/shapes/Polygons.svelte +18 -0
- package/src/template/shapes/index.js +4 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { namedShapes } from './constants'
|
|
3
|
+
|
|
4
|
+
export let x = 0
|
|
5
|
+
export let y = 0
|
|
6
|
+
export let size = 1
|
|
7
|
+
export let fill = 'none'
|
|
8
|
+
export let stroke = 'currentColor'
|
|
9
|
+
export let thickness = 1
|
|
10
|
+
|
|
11
|
+
export let name = 'circle'
|
|
12
|
+
|
|
13
|
+
$: d = name in namedShapes ? namedShapes[name](size) : namedShapes['circle'](size)
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
|
17
|
+
<path
|
|
18
|
+
{d}
|
|
19
|
+
{fill}
|
|
20
|
+
{stroke}
|
|
21
|
+
transform="translate({x},{y})"
|
|
22
|
+
stroke-width={thickness}
|
|
23
|
+
fill-rule="evenodd"
|
|
24
|
+
role="button"
|
|
25
|
+
on:click
|
|
26
|
+
on:mouseover
|
|
27
|
+
on:mouseleave
|
|
28
|
+
on:focus
|
|
29
|
+
on:blur
|
|
30
|
+
tabindex="0"
|
|
31
|
+
/>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { namedShapes } from './constants'
|
|
2
|
+
import { default as Shape } from './Shape.svelte'
|
|
3
|
+
import { default as RoundedSquare } from './RoundedSquare.svelte'
|
|
4
|
+
|
|
5
|
+
export const shapes = [...Object.keys(namedShapes), 'rounded-square']
|
|
6
|
+
export const components = {
|
|
7
|
+
default: Shape,
|
|
8
|
+
'rounded-square': RoundedSquare
|
|
9
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<svg
|
|
2
|
+
class="plot"
|
|
3
|
+
fill="currentColor"
|
|
4
|
+
font-family="system-ui, sans-serif"
|
|
5
|
+
font-size="10"
|
|
6
|
+
text-anchor="middle"
|
|
7
|
+
width="688"
|
|
8
|
+
height="60"
|
|
9
|
+
viewBox="0 0 688 60"
|
|
10
|
+
>
|
|
11
|
+
<style>
|
|
12
|
+
:where(.plot) {
|
|
13
|
+
--plot-background: white;
|
|
14
|
+
display: block;
|
|
15
|
+
height: auto;
|
|
16
|
+
height: intrinsic;
|
|
17
|
+
max-width: 100%;
|
|
18
|
+
}
|
|
19
|
+
:where(.plot text),
|
|
20
|
+
:where(.plot tspan) {
|
|
21
|
+
white-space: pre;
|
|
22
|
+
}
|
|
23
|
+
</style>
|
|
24
|
+
<g aria-label="x-axis tick" fill="none" stroke="currentColor"
|
|
25
|
+
><path transform="translate(68,30)" d="M0,0L0,6"></path><path
|
|
26
|
+
transform="translate(160,30)"
|
|
27
|
+
d="M0,0L0,6"
|
|
28
|
+
></path><path transform="translate(252,30)" d="M0,0L0,6"></path><path
|
|
29
|
+
transform="translate(344,30)"
|
|
30
|
+
d="M0,0L0,6"
|
|
31
|
+
></path><path transform="translate(436,30)" d="M0,0L0,6"></path><path
|
|
32
|
+
transform="translate(528,30)"
|
|
33
|
+
d="M0,0L0,6"
|
|
34
|
+
></path><path transform="translate(620,30)" d="M0,0L0,6"></path></g
|
|
35
|
+
><g aria-label="x-axis tick label" transform="translate(0,9)"
|
|
36
|
+
><text y="0.71em" transform="translate(68,30)">asterisk</text><text
|
|
37
|
+
y="0.71em"
|
|
38
|
+
transform="translate(160,30)">circle</text
|
|
39
|
+
><text y="0.71em" transform="translate(252,30)">diamond2</text><text
|
|
40
|
+
y="0.71em"
|
|
41
|
+
transform="translate(344,30)">plus</text
|
|
42
|
+
><text y="0.71em" transform="translate(436,30)">square2</text><text
|
|
43
|
+
y="0.71em"
|
|
44
|
+
transform="translate(528,30)">times</text
|
|
45
|
+
><text y="0.71em" transform="translate(620,30)">triangle2</text></g
|
|
46
|
+
><g aria-label="dot" fill="none" stroke="currentColor" stroke-width="1.5"
|
|
47
|
+
><path transform="translate(160,15.25)" d="M4.5,0A4.5,4.5,0,1,1,-4.5,0A4.5,4.5,0,1,1,4.5,0"
|
|
48
|
+
></path><path transform="translate(344,15.25)" d="M-6.873,0L6.873,0M0,6.873L0,-6.873"
|
|
49
|
+
></path><path transform="translate(528,15.25)" d="M-4.87,-4.87L4.87,4.87M-4.87,4.87L4.87,-4.87"
|
|
50
|
+
></path><path transform="translate(620,15.25)" d="M0,-5.443L4.714,2.721L-4.714,2.721Z"
|
|
51
|
+
></path><path
|
|
52
|
+
transform="translate(68,15.25)"
|
|
53
|
+
d="M0,4.769L0,-4.769M-4.13,-2.384L4.13,2.384M-4.13,2.384L4.13,-2.384"
|
|
54
|
+
></path><path
|
|
55
|
+
transform="translate(436,15.25)"
|
|
56
|
+
d="M3.534,3.534L3.534,-3.534L-3.534,-3.534L-3.534,3.534Z"
|
|
57
|
+
></path><path transform="translate(252,15.25)" d="M0,-4.995L4.995,0L0,4.995L-4.995,0Z"
|
|
58
|
+
></path></g
|
|
59
|
+
></svg
|
|
60
|
+
>
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<svg
|
|
2
|
+
class="plot"
|
|
3
|
+
fill="currentColor"
|
|
4
|
+
font-family="system-ui, sans-serif"
|
|
5
|
+
font-size="10"
|
|
6
|
+
text-anchor="middle"
|
|
7
|
+
width="688"
|
|
8
|
+
height="60"
|
|
9
|
+
viewBox="0 0 688 60"
|
|
10
|
+
><style>
|
|
11
|
+
:where(.plot) {
|
|
12
|
+
--plot-background: white;
|
|
13
|
+
display: block;
|
|
14
|
+
height: auto;
|
|
15
|
+
height: intrinsic;
|
|
16
|
+
max-width: 100%;
|
|
17
|
+
}
|
|
18
|
+
:where(.plot text),
|
|
19
|
+
:where(.plot tspan) {
|
|
20
|
+
white-space: pre;
|
|
21
|
+
}
|
|
22
|
+
</style><g aria-label="x-axis tick" fill="none" stroke="currentColor"
|
|
23
|
+
><path transform="translate(68,30)" d="M0,0L0,6"></path><path
|
|
24
|
+
transform="translate(160,30)"
|
|
25
|
+
d="M0,0L0,6"
|
|
26
|
+
></path><path transform="translate(252,30)" d="M0,0L0,6"></path><path
|
|
27
|
+
transform="translate(344,30)"
|
|
28
|
+
d="M0,0L0,6"
|
|
29
|
+
></path><path transform="translate(436,30)" d="M0,0L0,6"></path><path
|
|
30
|
+
transform="translate(528,30)"
|
|
31
|
+
d="M0,0L0,6"
|
|
32
|
+
></path><path transform="translate(620,30)" d="M0,0L0,6"></path></g
|
|
33
|
+
><g aria-label="x-axis tick label" transform="translate(0,9)"
|
|
34
|
+
><text y="0.71em" transform="translate(68,30)">circle</text><text
|
|
35
|
+
y="0.71em"
|
|
36
|
+
transform="translate(160,30)">cross</text
|
|
37
|
+
><text y="0.71em" transform="translate(252,30)">diamond</text><text
|
|
38
|
+
y="0.71em"
|
|
39
|
+
transform="translate(344,30)">square</text
|
|
40
|
+
><text y="0.71em" transform="translate(436,30)">star</text><text
|
|
41
|
+
y="0.71em"
|
|
42
|
+
transform="translate(528,30)">triangle</text
|
|
43
|
+
><text y="0.71em" transform="translate(620,30)">wye</text></g
|
|
44
|
+
><g aria-label="dot"
|
|
45
|
+
><path transform="translate(68,15.25)" d="M4.5,0A4.5,4.5,0,1,1,-4.5,0A4.5,4.5,0,1,1,4.5,0"
|
|
46
|
+
></path><path
|
|
47
|
+
transform="translate(160,15.25)"
|
|
48
|
+
d="M-5.35,-1.783L-1.783,-1.783L-1.783,-5.35L1.783,-5.35L1.783,-1.783L5.35,-1.783L5.35,1.783L1.783,1.783L1.783,5.35L-1.783,5.35L-1.783,1.783L-5.35,1.783Z"
|
|
49
|
+
></path><path transform="translate(252,15.25)" d="M0,-7.423L4.285,0L0,7.423L-4.285,0Z"
|
|
50
|
+
></path><path transform="translate(344,15.25)" d="M-3.988,-3.988h7.976v7.976h-7.976Z"
|
|
51
|
+
></path><path
|
|
52
|
+
transform="translate(436,15.25)"
|
|
53
|
+
d="M0,-7.528L1.69,-2.326L7.16,-2.326L2.735,0.889L4.425,6.09L0,2.875L-4.425,6.09L-2.735,0.889L-7.16,-2.326L-1.69,-2.326Z"
|
|
54
|
+
></path><path transform="translate(528,15.25)" d="M0,-6.998L6.06,3.499L-6.06,3.499Z"
|
|
55
|
+
></path><path
|
|
56
|
+
transform="translate(620,15.25)"
|
|
57
|
+
d="M2.152,1.243L2.152,5.547L-2.152,5.547L-2.152,1.243L-5.88,-0.91L-3.728,-4.638L0,-2.485L3.728,-4.638L5.88,-0.91Z"
|
|
58
|
+
></path></g
|
|
59
|
+
></svg
|
|
60
|
+
>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { library } from './constants'
|
|
3
|
+
import * as templates from './shapes'
|
|
4
|
+
import { pick } from 'ramda'
|
|
5
|
+
|
|
6
|
+
export let size = 10
|
|
7
|
+
export let fill = 'none'
|
|
8
|
+
export let stroke = 'none'
|
|
9
|
+
export let thickness = 0.5
|
|
10
|
+
export let name = 'Waves'
|
|
11
|
+
|
|
12
|
+
$: pattern = library[name]
|
|
13
|
+
$: props = pick(pattern.allowed ?? [], { fill, stroke, thickness })
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<svelte:component this={templates[pattern.component]} {size} {...props} data={pattern.data} />
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export const library = {
|
|
2
|
+
Brick: {
|
|
3
|
+
component: 'Lines',
|
|
4
|
+
allowed: ['stroke'],
|
|
5
|
+
data: [
|
|
6
|
+
{ x1: 0, y1: 0.25, x2: 0.5, y2: 0.25 },
|
|
7
|
+
{ x1: 0.5, y1: 0.75, x2: 1, y2: 0.75 },
|
|
8
|
+
{ x1: 0, y1: 0, x2: 0, y2: 1 },
|
|
9
|
+
{ x1: 1, y1: 0, x2: 1, y2: 1 },
|
|
10
|
+
{ x1: 0.5, y1: 0, x2: 0.5, y2: 1 }
|
|
11
|
+
]
|
|
12
|
+
},
|
|
13
|
+
Circles: {
|
|
14
|
+
component: 'Circles',
|
|
15
|
+
allowed: ['fill', 'stroke'],
|
|
16
|
+
data: [
|
|
17
|
+
{ cx: 0, cy: 0, r: 0.5 },
|
|
18
|
+
{ cx: 1, cy: 1, r: 0.5 }
|
|
19
|
+
]
|
|
20
|
+
},
|
|
21
|
+
Dominoes: {
|
|
22
|
+
component: 'Circles',
|
|
23
|
+
allowed: ['fill'],
|
|
24
|
+
data: [
|
|
25
|
+
{ cx: 0.2, cy: 0.2, r: 0.8 },
|
|
26
|
+
{ cx: 0.4, cy: 0.4, r: 0.8 },
|
|
27
|
+
{ cx: 0.6, cy: 0.6, r: 0.8 },
|
|
28
|
+
{ cx: 0.8, cy: 0.8, r: 0.8 },
|
|
29
|
+
{ cx: 0.8, cy: 0.2, r: 0.8 },
|
|
30
|
+
{ cx: 0.6, cy: 0.4, r: 0.8 },
|
|
31
|
+
{ cx: 0.4, cy: 0.6, r: 0.8 },
|
|
32
|
+
{ cx: 0.2, cy: 0.8, r: 0.8 }
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
Waves: {
|
|
36
|
+
component: 'Path',
|
|
37
|
+
stroke: true,
|
|
38
|
+
data: [
|
|
39
|
+
['M', 0, 0.25],
|
|
40
|
+
['A', 0.6, 0.5, 0, 0, 0, 1, 0.25]
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
export let size = 10
|
|
3
|
+
export let fill = 'currentColor'
|
|
4
|
+
export let stroke = 'currentColor'
|
|
5
|
+
export let data
|
|
6
|
+
|
|
7
|
+
$: circles = data.map(({ cx, cy, r }) => ({
|
|
8
|
+
cx: cx * size,
|
|
9
|
+
cy: cy * size,
|
|
10
|
+
r: r * size
|
|
11
|
+
}))
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
{#each circles as { cx, cy, r }}
|
|
15
|
+
<circle {cx} {cy} {r} {fill} {stroke} />
|
|
16
|
+
{/each}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
export let size = 10
|
|
3
|
+
export let thickness = 0.5
|
|
4
|
+
export let stroke = 'currentColor'
|
|
5
|
+
export let data = []
|
|
6
|
+
|
|
7
|
+
$: lines = data.map(({ x1, y1, x2, y2 }) => ({
|
|
8
|
+
x1: x1 * size,
|
|
9
|
+
y1: y1 * size,
|
|
10
|
+
x2: x2 * size,
|
|
11
|
+
y2: y2 * size
|
|
12
|
+
}))
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
{#each lines as line}
|
|
16
|
+
<line {...line} {stroke} stroke-width={thickness} stroke-linecap="round" />
|
|
17
|
+
{/each}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { scaledPath } from '@rokkit/core'
|
|
3
|
+
|
|
4
|
+
export let size = 10
|
|
5
|
+
export let thickness = 0.5
|
|
6
|
+
export let stroke = 'currentColor'
|
|
7
|
+
export let data = []
|
|
8
|
+
|
|
9
|
+
$: d = scaledPath(size, data)
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<path {d} {stroke} stroke-width={thickness} fill="none" />
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
export let size = 10
|
|
3
|
+
export let thickness = 0.5
|
|
4
|
+
export let fill = 'currentColor'
|
|
5
|
+
export let stroke = 'currentColor'
|
|
6
|
+
export let data = []
|
|
7
|
+
|
|
8
|
+
const polygons = data.map((points) => points.map((point) => point * size).join(', '))
|
|
9
|
+
// [
|
|
10
|
+
// [0, 0.5 * size, 0.5 * size, size, 0, size],
|
|
11
|
+
// [0.5 * size, 0, 0, 0, 0, 0.5 * size],
|
|
12
|
+
// [size, 0, 0.5 * size, 0.5 * size, size, size]
|
|
13
|
+
// ]
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
{#each polygons as points}
|
|
17
|
+
<polygon {points} {fill} {stroke} stroke-width={thickness} />
|
|
18
|
+
{/each}
|