@rokkit/chart 1.0.0-next.87 → 1.0.0-next.89

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 (80) hide show
  1. package/package.json +11 -6
  2. package/src/Chart.svelte +67 -0
  3. package/src/PatternDefs.svelte +14 -0
  4. package/src/Symbol.svelte +17 -0
  5. package/src/{chart/Texture.svelte → Texture.svelte} +3 -3
  6. package/src/elements/Bar.svelte +2 -2
  7. package/src/elements/ContinuousLegend.svelte +3 -2
  8. package/src/elements/DefinePatterns.svelte +22 -0
  9. package/src/elements/DiscreteLegend.svelte +1 -1
  10. package/src/elements/Label.svelte +7 -5
  11. package/src/elements/SymbolGrid.svelte +23 -0
  12. package/src/elements/index.js +6 -0
  13. package/src/index.js +5 -15
  14. package/src/lib/brewer.js +17 -0
  15. package/src/lib/chart.js +179 -160
  16. package/src/lib/grid.js +68 -0
  17. package/src/lib/index.js +4 -0
  18. package/src/lib/palette.js +279 -28
  19. package/src/lib/plots.js +23 -0
  20. package/src/lib/swatch.js +24 -8
  21. package/src/lib/ticks.js +19 -0
  22. package/src/patterns/Brick.svelte +17 -0
  23. package/src/patterns/Circles.svelte +18 -0
  24. package/src/patterns/CrossHatch.svelte +14 -0
  25. package/src/patterns/CurvedWave.svelte +9 -0
  26. package/src/patterns/Dots.svelte +19 -0
  27. package/src/patterns/OutlineCircles.svelte +15 -0
  28. package/src/patterns/Texture.svelte +20 -0
  29. package/src/patterns/Tile.svelte +17 -0
  30. package/src/patterns/Triangles.svelte +15 -0
  31. package/src/patterns/Waves.svelte +13 -0
  32. package/src/patterns/constants.js +43 -0
  33. package/src/patterns/index.js +13 -0
  34. package/src/patterns/paths/NamedPattern.svelte +12 -0
  35. package/src/patterns/paths/constants.js +7 -0
  36. package/src/patterns/templates/Circles.svelte +18 -0
  37. package/src/patterns/templates/Lines.svelte +17 -0
  38. package/src/patterns/templates/Path.svelte +17 -0
  39. package/src/patterns/templates/index.js +3 -0
  40. package/src/plots/Plot.svelte +36 -21
  41. package/src/plots/index.js +1 -10
  42. package/src/symbols/RoundedSquare.svelte +27 -0
  43. package/src/symbols/Shape.svelte +31 -0
  44. package/src/symbols/constants/index.js +7 -0
  45. package/src/symbols/index.js +9 -0
  46. package/src/chart/Axis.svelte +0 -81
  47. package/src/chart/AxisGrid.svelte +0 -22
  48. package/src/chart/Chart.svelte +0 -40
  49. package/src/chart/FacetGrid.svelte +0 -49
  50. package/src/chart/Legend.svelte +0 -16
  51. package/src/chart/Swatch.svelte +0 -84
  52. package/src/chart/SwatchButton.svelte +0 -29
  53. package/src/chart/SwatchGrid.svelte +0 -53
  54. package/src/chart/TexturedShape.svelte +0 -20
  55. package/src/chart/TimelapseChart.svelte +0 -90
  56. package/src/chart/Timer.svelte +0 -27
  57. package/src/elements/Tooltip.svelte +0 -19
  58. package/src/lib/axis.js +0 -77
  59. package/src/lib/color.js +0 -55
  60. package/src/lib/constants.js +0 -41
  61. package/src/lib/funnel.js +0 -230
  62. package/src/lib/geom.js +0 -99
  63. package/src/lib/heatmap.js +0 -68
  64. package/src/lib/lookup.js +0 -29
  65. package/src/lib/pattern.js +0 -182
  66. package/src/lib/rollup.js +0 -49
  67. package/src/lib/shape.js +0 -46
  68. package/src/lib/store.js +0 -63
  69. package/src/lib/summary.js +0 -28
  70. package/src/lib/theme.js +0 -31
  71. package/src/lib/utils.js +0 -158
  72. package/src/plots/BarPlot.svelte +0 -51
  73. package/src/plots/BarPlot2.svelte +0 -34
  74. package/src/plots/BoxPlot.svelte +0 -54
  75. package/src/plots/FunnelPlot.svelte +0 -26
  76. package/src/plots/HeatMapCalendar.svelte +0 -121
  77. package/src/plots/LinePlot.svelte +0 -51
  78. package/src/plots/RankBarPlot.svelte +0 -38
  79. package/src/plots/ScatterPlot.svelte +0 -28
  80. package/src/plots/ViolinPlot.svelte +0 -10
@@ -1,32 +1,283 @@
1
- // import { writable } from 'svelte/store'
2
- import { repeatAcross } from './utils'
1
+ /**
2
+ * @typedef {Object<50|100|200|300|400|500|600|700|800|900|950,string>} Shades
3
+ */
4
+ /**
5
+ * @type {Object<string,Shades>} }
6
+ */
7
+ export const palette = {
8
+ gold: {
9
+ 50: '#fffef7',
10
+ 100: '#fffdf0',
11
+ 200: '#fffadb',
12
+ 300: '#fff6c4',
13
+ 400: '#ffec96',
14
+ 500: '#ffde6b',
15
+ 600: '#e6c257',
16
+ 700: '#bf953b',
17
+ 800: '#996f26',
18
+ 900: '#734a16',
19
+ 950: '#4a2909'
20
+ },
21
+ lavender: {
22
+ 50: '#fffaff',
23
+ 100: '#fcf2fc',
24
+ 200: '#fce1fc',
25
+ 300: '#facff9',
26
+ 400: '#f5abf4',
27
+ 500: '#ef89ee',
28
+ 600: '#d96fd2',
29
+ 700: '#b34da5',
30
+ 800: '#8f317a',
31
+ 900: '#6b1c55',
32
+ 950: '#450c30'
33
+ },
34
+ teal: {
35
+ 50: '#f2fcfc',
36
+ 100: '#e3fafa',
37
+ 200: '#bdf2f1',
38
+ 300: '#96ebe9',
39
+ 400: '#51dbd7',
40
+ 500: '#15cbc4',
41
+ 600: '#11b8aa',
42
+ 700: '#0b9984',
43
+ 800: '#077a60',
44
+ 900: '#045c41',
45
+ 950: '#023b25'
46
+ },
47
+ rose: {
48
+ 50: '#fffbf7',
49
+ 100: '#fcf6f0',
50
+ 200: '#fce8dc',
51
+ 300: '#fad7c8',
52
+ 400: '#f5aa9d',
53
+ 500: '#f07575',
54
+ 600: '#d95f5f',
55
+ 700: '#b34242',
56
+ 800: '#8f2929',
57
+ 900: '#6b1818',
58
+ 950: '#450a0a'
59
+ },
60
+ sky: {
61
+ 50: '#f2fdff',
62
+ 100: '#e6fbff',
63
+ 200: '#bff3ff',
64
+ 300: '#99ebff',
65
+ 400: '#4fd6ff',
66
+ 500: '#02b8ff',
67
+ 600: '#029ee6',
68
+ 700: '#027abf',
69
+ 800: '#025799',
70
+ 900: '#003b73',
71
+ 950: '#00234a'
72
+ },
73
+ yellow: {
74
+ 50: '#fffef2',
75
+ 100: '#fffce8',
76
+ 200: '#fff8c4',
77
+ 300: '#fcf09f',
78
+ 400: '#fce25b',
79
+ 500: '#facc15',
80
+ 600: '#e0b010',
81
+ 700: '#ba860b',
82
+ 800: '#966208',
83
+ 900: '#704304',
84
+ 950: '#472601'
85
+ },
86
+ pink: {
87
+ 50: '#fef5ff',
88
+ 100: '#fbebfc',
89
+ 200: '#f9cffc',
90
+ 300: '#f3b4fa',
91
+ 400: '#e77af5',
92
+ 500: '#d946ef',
93
+ 600: '#bb38d9',
94
+ 700: '#9227b3',
95
+ 800: '#6b188f',
96
+ 900: '#490e6b',
97
+ 950: '#290645'
98
+ },
3
99
 
4
- const palette = [
5
- '#FFDE6B',
6
- '#EF89EE',
7
- '#F79F1E',
8
- '#02B8FF',
9
- '#9F84EC',
10
- '#15CBC4',
11
- '#0092FD',
12
- '#F63A57',
13
- '#A2CB39',
14
- '#FF6E2F',
15
- '#FEB8B9',
16
- '#af7aa1',
17
- '#7EFFF5'
18
- ]
100
+ lime: {
101
+ 50: '#fbfcf2',
102
+ 100: '#f7fae8',
103
+ 200: '#eaf2c7',
104
+ 300: '#ddeba7',
105
+ 400: '#c2db6e',
106
+ 500: '#a2cb39',
107
+ 600: '#8cb82e',
108
+ 700: '#6d9920',
109
+ 800: '#4e7a15',
110
+ 900: '#355c0c',
111
+ 950: '#1e3b05'
112
+ },
113
+ red: {
114
+ 50: '#fff5fa',
115
+ 100: '#ffebf5',
116
+ 200: '#fccce3',
117
+ 300: '#faafcd',
118
+ 400: '#f77499',
119
+ 500: '#f63a57',
120
+ 600: '#db304a',
121
+ 700: '#b82135',
122
+ 800: '#941524',
123
+ 900: '#6e0c17',
124
+ 950: '#47050c'
125
+ },
126
+ cyan: {
127
+ 50: '#f0fbfc',
128
+ 100: '#e1f8fa',
129
+ 200: '#baeff5',
130
+ 300: '#91e4ed',
131
+ 400: '#48cce0',
132
+ 500: '#06b6d4',
133
+ 600: '#069abf',
134
+ 700: '#03779e',
135
+ 800: '#035880',
136
+ 900: '#013b5e',
137
+ 950: '#01223d'
138
+ },
139
+ orange: {
140
+ 50: '#fffdf5',
141
+ 100: '#fffae8',
142
+ 200: '#fcefc5',
143
+ 300: '#fce3a4',
144
+ 400: '#fac65f',
145
+ 500: '#f79f1e',
146
+ 600: '#de8818',
147
+ 700: '#ba6b11',
148
+ 800: '#944d0a',
149
+ 900: '#703406',
150
+ 950: '#471d02'
151
+ },
152
+ violet: {
153
+ 50: '#fdfaff',
154
+ 100: '#f8f2fc',
155
+ 200: '#eedefa',
156
+ 300: '#e0cbf7',
157
+ 400: '#c4a7f2',
158
+ 500: '#9f84ec',
159
+ 600: '#866bd6',
160
+ 700: '#634bb3',
161
+ 800: '#45318f',
162
+ 900: '#2b1b6b',
163
+ 950: '#150b45'
164
+ },
165
+ emerald: {
166
+ 50: '#f2fcf9',
167
+ 100: '#e6faf3',
168
+ 200: '#bdf0dc',
169
+ 300: '#9be8c6',
170
+ 400: '#5ad694',
171
+ 500: '#22c55e',
172
+ 600: '#1ab04f',
173
+ 700: '#13943c',
174
+ 800: '#0c752b',
175
+ 900: '#07591d',
176
+ 950: '#03380f'
177
+ },
178
+ wood: {
179
+ 50: '#faf5f0',
180
+ 100: '#f2e6dc',
181
+ 200: '#e3c4b1',
182
+ 300: '#d19c86',
183
+ 400: '#ad5140',
184
+ 500: '#890e0e',
185
+ 600: '#7d0b0b',
186
+ 700: '#660707',
187
+ 800: '#520505',
188
+ 900: '#3d0202',
189
+ 950: '#290101'
190
+ },
191
+ blue: {
192
+ 50: '#f2fcff',
193
+ 100: '#e6f9ff',
194
+ 200: '#bfeeff',
195
+ 300: '#99e0ff',
196
+ 400: '#4cbffc',
197
+ 500: '#0092fd',
198
+ 600: '#007de3',
199
+ 700: '#0061bd',
200
+ 800: '#004696',
201
+ 900: '#003073',
202
+ 950: '#001c4a'
203
+ },
19
204
 
20
- export class Palette {
21
- constructor(palette) {
22
- this.colors = palette
205
+ amber: {
206
+ 50: '#fffbf5',
207
+ 100: '#fff7eb',
208
+ 200: '#ffe9cc',
209
+ 300: '#ffd6ab',
210
+ 400: '#ffa86e',
211
+ 500: '#ff6e2f',
212
+ 600: '#e65b25',
213
+ 700: '#bf4519',
214
+ 800: '#993111',
215
+ 900: '#732009',
216
+ 950: '#4a1204'
217
+ },
218
+ purple: {
219
+ 50: '#fdf7ff',
220
+ 100: '#faedff',
221
+ 200: '#f0d4fc',
222
+ 300: '#e7bbfc',
223
+ 400: '#ca87fa',
224
+ 500: '#a855f7',
225
+ 600: '#8f45de',
226
+ 700: '#6d2fba',
227
+ 800: '#4f1e94',
228
+ 900: '#341170',
229
+ 950: '#1d0747'
230
+ },
231
+ zinc: {
232
+ 50: '#f7f9fa',
233
+ 100: '#edf2f5',
234
+ 200: '#d3dde3',
235
+ 300: '#bac8d1',
236
+ 400: '#8d9eb0',
237
+ 500: '#64748b',
238
+ 600: '#536580',
239
+ 700: '#384a69',
240
+ 800: '#243454',
241
+ 900: '#142140',
242
+ 950: '#091129'
243
+ },
244
+ stone: {
245
+ 50: '#f7f7f7',
246
+ 100: '#f2f1f0',
247
+ 200: '#dedcd9',
248
+ 300: '#c9c6c1',
249
+ 400: '#a19b95',
250
+ 500: '#78716c',
251
+ 600: '#6b5f57',
252
+ 700: '#59473c',
253
+ 800: '#473227',
254
+ 900: '#361f15',
255
+ 950: '#241009'
256
+ },
257
+ indigo: {
258
+ 50: '#f7fbff',
259
+ 100: '#f0f7ff',
260
+ 200: '#d7e5fc',
261
+ 300: '#bed1fa',
262
+ 400: '#92a3f7',
263
+ 500: '#6366f1',
264
+ 600: '#5153db',
265
+ 700: '#383ab5',
266
+ 800: '#242691',
267
+ 900: '#14156e',
268
+ 950: '#090a47'
269
+ },
270
+ gray: {
271
+ 50: '#f7f9fa',
272
+ 100: '#edf0f2',
273
+ 200: '#d7dde0',
274
+ 300: '#c0c6cc',
275
+ 400: '#949ba6',
276
+ 500: '#6b7280',
277
+ 600: '#576073',
278
+ 700: '#3b455e',
279
+ 800: '#26304d',
280
+ 900: '#151d38',
281
+ 950: '#090e24'
23
282
  }
24
-
25
- set colors(value) {
26
- if (value && Array.isArray(value)) this.colors = value
27
- }
28
- }
29
-
30
- export function colorBrewer(values) {
31
- return repeatAcross(palette, [...new Set(values)])
32
283
  }
@@ -0,0 +1,23 @@
1
+ import * as Plot from '@observablehq/plot'
2
+
3
+ export function plotter(node, options) {
4
+ let { data, aes, type, opts } = options
5
+ // let chart = Plot.lineY(options.data).plot({ grid: true })
6
+
7
+ function render() {
8
+ const chart = Plot[type](data, aes).plot(opts)
9
+ node.firstChild?.remove() // remove old chart, if any
10
+ node.append(chart)
11
+ }
12
+ render()
13
+
14
+ return {
15
+ update: (options) => {
16
+ data = options.data
17
+ aes = options.aes
18
+ type = options.type
19
+ opts = options.opts
20
+ render()
21
+ }
22
+ }
23
+ }
package/src/lib/swatch.js CHANGED
@@ -1,11 +1,27 @@
1
+ // import { omit } from 'ramda'
1
2
  import { writable } from 'svelte/store'
3
+ import { palette } from './palette'
4
+ // import { patterns } from '../patterns/constants'
5
+ import * as patterns from '../patterns'
6
+ import { shapes } from '../symbols'
2
7
 
3
- // import { __patterns__, __colors__, __shapes__ } from './constants'
8
+ // const combinedPatterns = {
9
+ // ...patterns,
10
+ // ...omit(['NamedPattern'], components)
11
+ // }
4
12
 
5
- export const swatchStore = writable({})
6
-
7
- // A set of 7 should be sufficient
8
- // set of patterns
9
- // set of shapes
10
- // set of colors
11
- // fill, stroke, text
13
+ // const combinedShapes = {
14
+ // ...namedShapes,
15
+ // ...shapes
16
+ // }
17
+ export const swatch = writable({
18
+ palette,
19
+ patterns,
20
+ // symbols: combinedShapes,
21
+ keys: {
22
+ gray: ['gray'],
23
+ color: Object.keys(palette).filter((name) => name !== 'gray'),
24
+ symbol: shapes,
25
+ pattern: Object.keys(patterns)
26
+ }
27
+ })
@@ -0,0 +1,19 @@
1
+ function ticksByType(lower, upper, steps, type) {
2
+ return Array.from({ length: Math.floor((upper - lower) / steps[type]) + 1 }, (_, i) => ({
3
+ position: i * steps[type],
4
+ label: i * steps[type],
5
+ type
6
+ }))
7
+ }
8
+
9
+ export function getTicks(lower, upper, steps = { major: 10, minor: 0 }) {
10
+ if (steps.major === 0 && steps.minor === 0) return []
11
+ const minorTicks = ticksByType(lower, upper, steps.major, 'major')
12
+ const majorTicks = ticksByType(lower, upper, steps.minor, 'minor')
13
+ const end = [
14
+ { position: upper, label: upper, type: 'end' },
15
+ { position: lower, label: lower, type: 'end' }
16
+ ]
17
+
18
+ return [...minorTicks, ...majorTicks, ...end].sort((a, b) => a.position - b.position)
19
+ }
@@ -0,0 +1,17 @@
1
+ <script>
2
+ export let size = 10
3
+ export let thickness = 0.5
4
+ export let stroke = 'currentColor'
5
+
6
+ $: lines = [
7
+ { x1: 0, y1: 0.25 * size, x2: 0.5 * size, y2: 0.25 * size },
8
+ { x1: 0.5 * size, y1: 0.75 * size, x2: size, y2: 0.75 * size },
9
+ { x1: 0, y1: 0, x2: 0, y2: size },
10
+ { x1: size, y1: 0, x2: size, y2: size },
11
+ { x1: 0.5 * size, y1: 0, x2: 0.5 * size, 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,18 @@
1
+ <script>
2
+ export let size = 10
3
+ export let fill = 'currentColor'
4
+ export let stroke = 'currentColor'
5
+
6
+ $: data = [
7
+ { cx: 0, cy: 0, r: 0.5 },
8
+ { cx: 1, cy: 1, r: 0.5 }
9
+ ].map(({ cx, cy, r }) => ({
10
+ cx: cx * size,
11
+ cy: cy * size,
12
+ r: r * size
13
+ }))
14
+ </script>
15
+
16
+ {#each data as { cx, cy, r }}
17
+ <circle {cx} {cy} {r} {fill} {stroke} />
18
+ {/each}
@@ -0,0 +1,14 @@
1
+ <script>
2
+ export let size = 10
3
+ export let thickness = 0.5
4
+ export let stroke = 'currentColor'
5
+
6
+ $: lines = [
7
+ { x1: 0, y1: 0, x2: size, y2: size },
8
+ { x1: 0, y1: size, x2: size, y2: 0 }
9
+ ]
10
+ </script>
11
+
12
+ {#each lines as line}
13
+ <line {...line} {stroke} stroke-width={thickness} stroke-linecap="round" />
14
+ {/each}
@@ -0,0 +1,9 @@
1
+ <script>
2
+ import NamedPattern from './paths/NamedPattern.svelte'
3
+
4
+ export let size = 10
5
+ export let thickness = 0.5
6
+ export let stroke = 'currentColor'
7
+ </script>
8
+
9
+ <NamedPattern {size} {thickness} {stroke} name="curvedWave" />
@@ -0,0 +1,19 @@
1
+ <script>
2
+ export let size = 10
3
+ export let fill = 'currentColor'
4
+
5
+ $: data = [
6
+ { cx: 0.2 * size, cy: 0.2 * size },
7
+ { cx: 0.4 * size, cy: 0.4 * size },
8
+ { cx: 0.6 * size, cy: 0.6 * size },
9
+ { cx: 0.8 * size, cy: 0.8 * size },
10
+ { cx: 0.8 * size, cy: 0.2 * size },
11
+ { cx: 0.6 * size, cy: 0.4 * size },
12
+ { cx: 0.4 * size, cy: 0.6 * size },
13
+ { cx: 0.2 * size, cy: 0.8 * size }
14
+ ].map((x) => ({ ...x, r: 0.08 * size }))
15
+ </script>
16
+
17
+ {#each data as { cx, cy, r }}
18
+ <circle {cx} {cy} {r} {fill} />
19
+ {/each}
@@ -0,0 +1,15 @@
1
+ <script>
2
+ export let size = 10
3
+ export let fill = 'currentColor'
4
+ export let stroke = 'currentColor'
5
+
6
+ const centres = [
7
+ { cx: 0, cy: 0 },
8
+ { cx: size, cy: size }
9
+ ]
10
+ $: r = 0.5 * size
11
+ </script>
12
+
13
+ {#each centres as { cx, cy }}
14
+ <circle {cx} {cy} {r} {fill} {stroke} />
15
+ {/each}
@@ -0,0 +1,20 @@
1
+ <script>
2
+ import { library } from './constants'
3
+ import templates from './templates'
4
+ import { pick } from 'ramda'
5
+
6
+ export let size = 10
7
+ export let fill = 'none'
8
+ export let stroke = 'none'
9
+ export let name = 'Waves'
10
+
11
+ $: pattern = library[name]
12
+ $: props = { fill, stroke }
13
+ </script>
14
+
15
+ <svelte:component
16
+ this={templates[pattern.component]}
17
+ {size}
18
+ {...pick(pattern.allowed, props)}
19
+ data={pattern.data}
20
+ />
@@ -0,0 +1,17 @@
1
+ <script>
2
+ const thickness = 0.5
3
+ export let size = 10
4
+ export let stroke = 'currentColor'
5
+
6
+ const lines = [
7
+ { x1: 0, y1: 0.25 * size, x2: 0.5 * size, y2: 0.25 * size },
8
+ { x1: 0.5 * size, y1: 0.75 * size, x2: size, y2: 0.75 * size },
9
+ { x1: 0, y1: 0, x2: 0, y2: size },
10
+ { x1: size, y1: 0, x2: size, y2: size },
11
+ { x1: 0.5 * size, y1: 0, x2: 0.5 * size, 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,15 @@
1
+ <script>
2
+ export let size = 10
3
+ export let fill = 'currentColor'
4
+ export let stroke = 'currentColor'
5
+
6
+ const polygons = [
7
+ [0, 0.5 * size, 0.5 * size, size, 0, size],
8
+ [0.5 * size, 0, 0, 0, 0, 0.5 * size],
9
+ [size, 0, 0.5 * size, 0.5 * size, size, size]
10
+ ]
11
+ </script>
12
+
13
+ {#each polygons as points}
14
+ <polygon points={points.join(', ')} {fill} {stroke} stroke-width=0 />
15
+ {/each}
@@ -0,0 +1,13 @@
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 fill = 'none'
8
+ export let data = []
9
+
10
+ $: d = scaledPath(size, data)
11
+ </script>
12
+
13
+ <path {d} {stroke} stroke-width={thickness} {fill} />
@@ -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,13 @@
1
+ export { default as Brick } from './Brick.svelte'
2
+ export { default as Circles } from './Circles.svelte'
3
+ export { default as Dots } from './Dots.svelte'
4
+ export { default as CrossHatch } from './CrossHatch.svelte'
5
+ export { default as Waves } from './Waves.svelte'
6
+ // export { default as Squares } from './Squares.svelte'
7
+ export { default as Tile } from './Tile.svelte'
8
+ export { default as Triangles } from './Triangles.svelte'
9
+ // export { default as Waves } from './Waves.svelte'
10
+ // export { default as ZigZag } from './ZigZag.svelte'
11
+ // export { default as Flower } from './Flower.svelte'
12
+ // export { default as NamedPath } from './NamedPath.svelte'
13
+ export { default as CurvedWave } from './CurvedWave.svelte'
@@ -0,0 +1,12 @@
1
+ <script>
2
+ import { patterns } from './constants'
3
+
4
+ export let size = 10
5
+ export let thickness = 0.5
6
+ export let stroke = 'currentColor'
7
+ export let name = 'cross-hatch'
8
+
9
+ $: d = patterns[name](size)
10
+ </script>
11
+
12
+ <path {d} {stroke} stroke-width={thickness} fill="none" />
@@ -0,0 +1,7 @@
1
+ import { scaledPath } from '@rokkit/core'
2
+ import paths from './patterns.json'
3
+
4
+ export const patterns = Object.entries(paths).reduce(
5
+ (acc, [key, value]) => ({ ...acc, [key]: (s) => scaledPath(s, value) }),
6
+ {}
7
+ )
@@ -0,0 +1,18 @@
1
+ <script>
2
+ export let size = 10
3
+ export let fill = 'currentColor'
4
+ export let stroke = 'currentColor'
5
+
6
+ $: data = [
7
+ { cx: 0, cy: 0, r: 0.5 },
8
+ { cx: 1, cy: 1, r: 0.5 }
9
+ ].map(({ cx, cy, r }) => ({
10
+ cx: cx * size,
11
+ cy: cy * size,
12
+ r: r * size
13
+ }))
14
+ </script>
15
+
16
+ {#each data as { cx, cy, r }}
17
+ <circle {cx} {cy} {r} {fill} {stroke} />
18
+ {/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}