svelteplot 0.0.1-alpha.0 → 0.0.1-alpha.10

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 (78) hide show
  1. package/dist/Plot.svelte +172 -0
  2. package/dist/Plot.svelte.d.ts +15 -0
  3. package/dist/classes/Channel.svelte.js +74 -0
  4. package/dist/classes/Mark.svelte.js +17 -0
  5. package/dist/classes/Plot.svelte.js +98 -0
  6. package/dist/contants.d.ts +3 -0
  7. package/dist/contants.js +40 -0
  8. package/dist/helpers/GroupMultiple.svelte +8 -0
  9. package/dist/helpers/GroupMultiple.svelte.d.ts +19 -0
  10. package/dist/helpers/autoTimeFormat.d.ts +2 -0
  11. package/dist/helpers/autoTimeFormat.js +10 -0
  12. package/dist/helpers/callWithProps.d.ts +4 -0
  13. package/dist/helpers/callWithProps.js +9 -0
  14. package/dist/helpers/colors.d.ts +13 -0
  15. package/dist/helpers/colors.js +200 -0
  16. package/dist/helpers/createScale.d.ts +5 -0
  17. package/dist/helpers/createScale.js +57 -0
  18. package/dist/helpers/getBaseStyles.d.ts +2 -0
  19. package/dist/helpers/getBaseStyles.js +18 -0
  20. package/dist/helpers/getLogTicks.d.ts +1 -0
  21. package/dist/helpers/getLogTicks.js +57 -0
  22. package/dist/helpers/isDataRecord.d.ts +2 -0
  23. package/dist/helpers/isDataRecord.js +13 -0
  24. package/dist/helpers/mergeDeep.d.ts +5 -0
  25. package/dist/helpers/mergeDeep.js +26 -0
  26. package/dist/helpers/removeIdenticalLines.d.ts +1 -0
  27. package/dist/helpers/removeIdenticalLines.js +16 -0
  28. package/dist/helpers/resolveChannel.d.ts +2 -0
  29. package/dist/helpers/resolveChannel.js +28 -0
  30. package/dist/helpers/symbols.d.ts +5 -0
  31. package/dist/helpers/symbols.js +51 -0
  32. package/dist/helpers/typeChecks.d.ts +7 -0
  33. package/dist/helpers/typeChecks.js +21 -0
  34. package/dist/helpers/wrapArray.d.ts +2 -0
  35. package/dist/helpers/wrapArray.js +4 -0
  36. package/dist/index.d.ts +19 -0
  37. package/dist/index.js +20 -0
  38. package/dist/marks/Area.svelte +81 -0
  39. package/dist/marks/Area.svelte.d.ts +15 -0
  40. package/dist/marks/AreaX.svelte +19 -0
  41. package/dist/marks/AreaX.svelte.d.ts +17 -0
  42. package/dist/marks/AreaY.svelte +14 -0
  43. package/dist/marks/AreaY.svelte.d.ts +17 -0
  44. package/dist/marks/AxisX.svelte +102 -0
  45. package/dist/marks/AxisX.svelte.d.ts +17 -0
  46. package/dist/marks/AxisY.svelte +80 -0
  47. package/dist/marks/AxisY.svelte.d.ts +15 -0
  48. package/dist/marks/BaseMark.svelte +22 -0
  49. package/dist/marks/BaseMark.svelte.d.ts +19 -0
  50. package/dist/marks/ColorLegend.svelte +54 -0
  51. package/dist/marks/ColorLegend.svelte.d.ts +14 -0
  52. package/dist/marks/Dot.svelte +82 -0
  53. package/dist/marks/Dot.svelte.d.ts +15 -0
  54. package/dist/marks/DotX.svelte +5 -0
  55. package/dist/marks/DotX.svelte.d.ts +17 -0
  56. package/dist/marks/DotY.svelte +5 -0
  57. package/dist/marks/DotY.svelte.d.ts +17 -0
  58. package/dist/marks/Frame.svelte +37 -0
  59. package/dist/marks/Frame.svelte.d.ts +15 -0
  60. package/dist/marks/GridX.svelte +42 -0
  61. package/dist/marks/GridX.svelte.d.ts +19 -0
  62. package/dist/marks/GridY.svelte +31 -0
  63. package/dist/marks/GridY.svelte.d.ts +15 -0
  64. package/dist/marks/Line.svelte +59 -0
  65. package/dist/marks/Line.svelte.d.ts +15 -0
  66. package/dist/marks/LineX.svelte +10 -0
  67. package/dist/marks/LineX.svelte.d.ts +17 -0
  68. package/dist/marks/LineY.svelte +10 -0
  69. package/dist/marks/LineY.svelte.d.ts +17 -0
  70. package/dist/marks/RuleX.svelte +30 -0
  71. package/dist/marks/RuleX.svelte.d.ts +15 -0
  72. package/dist/marks/RuleY.svelte +30 -0
  73. package/dist/marks/RuleY.svelte.d.ts +15 -0
  74. package/dist/marks/SymbolLegend.svelte +50 -0
  75. package/dist/marks/SymbolLegend.svelte.d.ts +14 -0
  76. package/dist/types.d.ts +209 -0
  77. package/dist/types.js +1 -0
  78. package/package.json +5 -3
@@ -0,0 +1,200 @@
1
+ import { interpolateBlues, interpolateBrBG, interpolateBuGn, interpolateBuPu, interpolateGnBu, interpolateGreens, interpolateGreys, interpolateOranges, interpolateOrRd, interpolatePiYG, interpolatePRGn, interpolatePuBu, interpolatePuBuGn, interpolatePuOr, interpolatePuRd, interpolatePurples, interpolateRdBu, interpolateRdGy, interpolateRdPu, interpolateRdYlBu, interpolateRdYlGn, interpolateReds, interpolateSpectral, interpolateYlGn, interpolateYlGnBu, interpolateYlOrBr, interpolateYlOrRd, interpolateTurbo, interpolateViridis, interpolateMagma, interpolateInferno, interpolatePlasma, interpolateCividis, interpolateCubehelixDefault, interpolateWarm, interpolateCool, interpolateRainbow, interpolateSinebow, schemeAccent, schemeBlues, schemeBrBG, schemeBuGn, schemeBuPu, schemeCategory10, schemeDark2, schemeGnBu, schemeGreens, schemeGreys, schemeOranges, schemeOrRd, schemePaired, schemePastel1, schemePastel2, schemePiYG, schemePRGn, schemePuBu, schemePuBuGn, schemePuOr, schemePuRd, schemePurples, schemeRdBu, schemeRdGy, schemeRdPu, schemeRdYlBu, schemeRdYlGn, schemeReds, schemeSet1, schemeSet2, schemeSet3, schemeSpectral, schemeTableau10, schemeYlGn, schemeYlGnBu, schemeYlOrBr, schemeYlOrRd } from 'd3-scale-chromatic';
2
+ import { quantize } from 'd3-interpolate';
3
+ export const categoricalSchemes = new Map([
4
+ ['accent', schemeAccent],
5
+ ['category10', schemeCategory10],
6
+ ['dark2', schemeDark2],
7
+ ['paired', schemePaired],
8
+ ['pastel1', schemePastel1],
9
+ ['pastel2', schemePastel2],
10
+ ['set1', schemeSet1],
11
+ ['set2', schemeSet2],
12
+ ['set3', schemeSet3],
13
+ ['tableau10', schemeTableau10]
14
+ ]);
15
+ export function isCategoricalScheme(scheme) {
16
+ return scheme != null && categoricalSchemes.has(`${scheme}`.toLowerCase());
17
+ }
18
+ const ordinalSchemes = new Map([
19
+ // diverging
20
+ ['brbg', scheme11(schemeBrBG, interpolateBrBG)],
21
+ ['prgn', scheme11(schemePRGn, interpolatePRGn)],
22
+ ['piyg', scheme11(schemePiYG, interpolatePiYG)],
23
+ ['puor', scheme11(schemePuOr, interpolatePuOr)],
24
+ ['rdbu', scheme11(schemeRdBu, interpolateRdBu)],
25
+ ['rdgy', scheme11(schemeRdGy, interpolateRdGy)],
26
+ ['rdylbu', scheme11(schemeRdYlBu, interpolateRdYlBu)],
27
+ ['rdylgn', scheme11(schemeRdYlGn, interpolateRdYlGn)],
28
+ ['spectral', scheme11(schemeSpectral, interpolateSpectral)],
29
+ // reversed diverging (for temperature data)
30
+ ['burd', scheme11r(schemeRdBu, interpolateRdBu)],
31
+ ['buylrd', scheme11r(schemeRdYlBu, interpolateRdYlBu)],
32
+ // sequential (single-hue)
33
+ ['blues', scheme9(schemeBlues, interpolateBlues)],
34
+ ['greens', scheme9(schemeGreens, interpolateGreens)],
35
+ ['greys', scheme9(schemeGreys, interpolateGreys)],
36
+ ['oranges', scheme9(schemeOranges, interpolateOranges)],
37
+ ['purples', scheme9(schemePurples, interpolatePurples)],
38
+ ['reds', scheme9(schemeReds, interpolateReds)],
39
+ // sequential (multi-hue)
40
+ ['turbo', schemei(interpolateTurbo)],
41
+ ['viridis', schemei(interpolateViridis)],
42
+ ['magma', schemei(interpolateMagma)],
43
+ ['inferno', schemei(interpolateInferno)],
44
+ ['plasma', schemei(interpolatePlasma)],
45
+ ['cividis', schemei(interpolateCividis)],
46
+ ['cubehelix', schemei(interpolateCubehelixDefault)],
47
+ ['warm', schemei(interpolateWarm)],
48
+ ['cool', schemei(interpolateCool)],
49
+ ['bugn', scheme9(schemeBuGn, interpolateBuGn)],
50
+ ['bupu', scheme9(schemeBuPu, interpolateBuPu)],
51
+ ['gnbu', scheme9(schemeGnBu, interpolateGnBu)],
52
+ ['orrd', scheme9(schemeOrRd, interpolateOrRd)],
53
+ ['pubu', scheme9(schemePuBu, interpolatePuBu)],
54
+ ['pubugn', scheme9(schemePuBuGn, interpolatePuBuGn)],
55
+ ['purd', scheme9(schemePuRd, interpolatePuRd)],
56
+ ['rdpu', scheme9(schemeRdPu, interpolateRdPu)],
57
+ ['ylgn', scheme9(schemeYlGn, interpolateYlGn)],
58
+ ['ylgnbu', scheme9(schemeYlGnBu, interpolateYlGnBu)],
59
+ ['ylorbr', scheme9(schemeYlOrBr, interpolateYlOrBr)],
60
+ ['ylorrd', scheme9(schemeYlOrRd, interpolateYlOrRd)],
61
+ // cyclical
62
+ ['rainbow', schemeicyclical(interpolateRainbow)],
63
+ ['sinebow', schemeicyclical(interpolateSinebow)]
64
+ ]);
65
+ export function isOrdinalScheme(scheme) {
66
+ return ordinalSchemes.has(scheme);
67
+ }
68
+ function scheme9(scheme, interpolate) {
69
+ return (n) => {
70
+ if (n === 1)
71
+ return [scheme[3][1]]; // favor midpoint
72
+ if (n === 2)
73
+ return [scheme[3][1], scheme[3][2]]; // favor darker
74
+ n = Math.max(3, Math.floor(n));
75
+ return n > 9 ? quantize(interpolate, n) : scheme[n];
76
+ };
77
+ }
78
+ function scheme11(scheme, interpolate) {
79
+ return (n) => {
80
+ if (n === 2)
81
+ return [scheme[3][0], scheme[3][2]]; // favor diverging extrema
82
+ n = Math.max(3, Math.floor(n));
83
+ return n > 11 ? quantize(interpolate, n) : scheme[n];
84
+ };
85
+ }
86
+ function scheme11r(scheme, interpolate) {
87
+ return (n) => {
88
+ if (n === 2)
89
+ return [scheme[3][2], scheme[3][0]]; // favor diverging extrema
90
+ n = Math.max(3, Math.floor(n));
91
+ return n > 11 ? quantize((t) => interpolate(1 - t), n) : scheme[n].slice().reverse();
92
+ };
93
+ }
94
+ function schemei(interpolate) {
95
+ return (n) => quantize(interpolate, Math.max(2, Math.floor(n)));
96
+ }
97
+ function schemeicyclical(interpolate) {
98
+ return (n) => quantize(interpolate, Math.floor(n) + 1).slice(0, -1);
99
+ }
100
+ export function ordinalScheme(scheme) {
101
+ const s = `${scheme}`.toLowerCase();
102
+ if (!ordinalSchemes.has(s))
103
+ throw new Error(`unknown ordinal scheme: ${s}`);
104
+ return ordinalSchemes.get(s);
105
+ }
106
+ export function ordinalRange(scheme, length) {
107
+ const s = ordinalScheme(scheme);
108
+ const r = typeof s === 'function' ? s({ length }) : s;
109
+ return r.length !== length ? r.slice(0, length) : r;
110
+ }
111
+ // If the specified domain contains only booleans (ignoring null and undefined),
112
+ // returns a corresponding range where false is mapped to the low color and true
113
+ // is mapped to the high color of the specified scheme.
114
+ export function maybeBooleanRange(domain, scheme = 'greys') {
115
+ const range = new Set();
116
+ const [f, t] = ordinalRange(scheme, 2);
117
+ for (const value of domain) {
118
+ if (value == null)
119
+ continue;
120
+ if (value === true)
121
+ range.add(t);
122
+ else if (value === false)
123
+ range.add(f);
124
+ else
125
+ return;
126
+ }
127
+ return [...range];
128
+ }
129
+ const quantitativeSchemes = new Map([
130
+ // diverging
131
+ ['brbg', interpolateBrBG],
132
+ ['prgn', interpolatePRGn],
133
+ ['piyg', interpolatePiYG],
134
+ ['puor', interpolatePuOr],
135
+ ['rdbu', interpolateRdBu],
136
+ ['rdgy', interpolateRdGy],
137
+ ['rdylbu', interpolateRdYlBu],
138
+ ['rdylgn', interpolateRdYlGn],
139
+ ['spectral', interpolateSpectral],
140
+ // reversed diverging (for temperature data)
141
+ ['burd', (t) => interpolateRdBu(1 - t)],
142
+ ['buylrd', (t) => interpolateRdYlBu(1 - t)],
143
+ // sequential (single-hue)
144
+ ['blues', interpolateBlues],
145
+ ['greens', interpolateGreens],
146
+ ['greys', interpolateGreys],
147
+ ['purples', interpolatePurples],
148
+ ['reds', interpolateReds],
149
+ ['oranges', interpolateOranges],
150
+ // sequential (multi-hue)
151
+ ['turbo', interpolateTurbo],
152
+ ['viridis', interpolateViridis],
153
+ ['magma', interpolateMagma],
154
+ ['inferno', interpolateInferno],
155
+ ['plasma', interpolatePlasma],
156
+ ['cividis', interpolateCividis],
157
+ ['cubehelix', interpolateCubehelixDefault],
158
+ ['warm', interpolateWarm],
159
+ ['cool', interpolateCool],
160
+ ['bugn', interpolateBuGn],
161
+ ['bupu', interpolateBuPu],
162
+ ['gnbu', interpolateGnBu],
163
+ ['orrd', interpolateOrRd],
164
+ ['pubugn', interpolatePuBuGn],
165
+ ['pubu', interpolatePuBu],
166
+ ['purd', interpolatePuRd],
167
+ ['rdpu', interpolateRdPu],
168
+ ['ylgnbu', interpolateYlGnBu],
169
+ ['ylgn', interpolateYlGn],
170
+ ['ylorbr', interpolateYlOrBr],
171
+ ['ylorrd', interpolateYlOrRd],
172
+ // cyclical
173
+ ['rainbow', interpolateRainbow],
174
+ ['sinebow', interpolateSinebow]
175
+ ]);
176
+ export function isQuantitativeScheme(scheme) {
177
+ return quantitativeSchemes.has(scheme);
178
+ }
179
+ export function quantitativeScheme(scheme) {
180
+ const s = `${scheme}`.toLowerCase();
181
+ if (!quantitativeSchemes.has(s))
182
+ throw new Error(`unknown quantitative scheme: ${s}`);
183
+ return quantitativeSchemes.get(s);
184
+ }
185
+ const divergingSchemes = new Set([
186
+ 'brbg',
187
+ 'prgn',
188
+ 'piyg',
189
+ 'puor',
190
+ 'rdbu',
191
+ 'rdgy',
192
+ 'rdylbu',
193
+ 'rdylgn',
194
+ 'spectral',
195
+ 'burd',
196
+ 'buylrd'
197
+ ]);
198
+ export function isDivergingScheme(scheme) {
199
+ return scheme != null && divergingSchemes.has(`${scheme}`.toLowerCase());
200
+ }
@@ -0,0 +1,5 @@
1
+ import type { ColorScheme, RawValue } from '../types.js';
2
+ declare const Scales: Record<string, (domain: number[], range: [number, number]) => (val: any) => any>;
3
+ export declare function createScale(type: keyof typeof Scales, domain: any, range: any, options?: {}): (val: any) => any;
4
+ export declare function createColorScale(type: any, domain: string[] | [number, number] | [Date, Date] | [boolean | boolean], range: RawValue[] | null, scheme: ColorScheme | null): ((d: any) => any) | (unknown[] & string[] & import("d3-scale").ScaleOrdinal<string, unknown, never>) | import("d3-scale").ScaleSequential<string, never>;
5
+ export {};
@@ -0,0 +1,57 @@
1
+ import { scaleBand, scaleLinear, scaleTime, scaleSqrt, scaleLog, scaleOrdinal } from 'd3-scale';
2
+ import { scaleSequential, scaleDiverging } from 'd3-scale';
3
+ import { getLogTicks } from './getLogTicks.js';
4
+ import { categoricalSchemes, isCategoricalScheme, isQuantitativeScheme, ordinalScheme, quantitativeScheme } from './colors.js';
5
+ import { isColorOrNull } from './typeChecks.js';
6
+ const Scales = {
7
+ band: scaleBand,
8
+ linear: scaleLinear,
9
+ time: scaleTime,
10
+ sqrt: scaleSqrt,
11
+ log: scaleLog,
12
+ ordinal: scaleOrdinal,
13
+ sequential: scaleSequential,
14
+ diverging: scaleDiverging
15
+ };
16
+ export function createScale(type, domain, range, options = {}) {
17
+ const scale = Scales[type](domain, range);
18
+ // allow setting arbiraty scale options
19
+ for (const [key, val] of Object.entries(options)) {
20
+ if (typeof scale[key] === 'function')
21
+ scale[key](val);
22
+ else
23
+ console.warn('unknown scale setter ' + key);
24
+ }
25
+ if (type === 'log') {
26
+ // overwrite scaleLog's internal ticks() method
27
+ scale.ticks = (count) => getLogTicks(domain, count);
28
+ // console.log({domain})
29
+ // console.log(getLogTicks(domain, 5))
30
+ }
31
+ return scale;
32
+ }
33
+ const identity = (d) => d;
34
+ export function createColorScale(type, domain, range, scheme) {
35
+ if (type === 'identity')
36
+ return identity;
37
+ if (type === 'band') {
38
+ if (domain.every(isColorOrNull)) {
39
+ return identity;
40
+ }
41
+ const colorRange = Array.isArray(range)
42
+ ? range
43
+ : !scheme
44
+ ? categoricalSchemes.get('tableau10')
45
+ : isCategoricalScheme(scheme)
46
+ ? categoricalSchemes.get(scheme)
47
+ : ordinalScheme(scheme)(domain.length);
48
+ return scaleOrdinal().domain(domain).range(colorRange);
49
+ }
50
+ else if (type === 'linear') {
51
+ const colorInterpolator = isQuantitativeScheme(scheme)
52
+ ? quantitativeScheme(scheme)
53
+ : quantitativeScheme('blues');
54
+ return scaleSequential(domain, colorInterpolator);
55
+ }
56
+ return (d) => d;
57
+ }
@@ -0,0 +1,2 @@
1
+ import type { ChannelAccessor, MarkStyleProps, DataRow } from '../types.js';
2
+ export default function (datum: DataRow, props: Partial<Record<MarkStyleProps, ChannelAccessor>>): string;
@@ -0,0 +1,18 @@
1
+ import { MARK_PROP_CHANNEL } from '../contants.js';
2
+ import resolveChannel from './resolveChannel.js';
3
+ const styleProps = {
4
+ fill: 'fill',
5
+ stroke: 'stroke',
6
+ strokeWidth: 'stroke-width',
7
+ strokeDasharray: 'stroke-dasharray',
8
+ fillOpacity: 'fill-opacity',
9
+ strokeOpacity: 'stroke-opacity',
10
+ fontSize: 'font-size',
11
+ opacity: 'opacity'
12
+ };
13
+ export default function (datum, props) {
14
+ return Object.entries(styleProps)
15
+ .filter(([key, cssKey]) => cssKey && props[key] != null)
16
+ .map(([key, cssKey]) => `${cssKey}: ${resolveChannel(MARK_PROP_CHANNEL[key], datum, props[key])}`)
17
+ .join(';');
18
+ }
@@ -0,0 +1 @@
1
+ export declare function getLogTicks(domain: [number, number], count?: number): number[];
@@ -0,0 +1,57 @@
1
+ import { ticks as ticksArray } from 'd3-array';
2
+ export function getLogTicks(domain, count = 6) {
3
+ const inverted = domain[0] < 0 && domain[1] < 0;
4
+ if (inverted)
5
+ domain = [domain[0] * -1, domain[1] * -1];
6
+ const reversed = domain[1] < domain[0];
7
+ if (reversed)
8
+ domain = domain.slice(0).reverse();
9
+ if (domain[0] < 0 || domain[1] < 0)
10
+ return [];
11
+ if (domain[0] === 0)
12
+ return ticksArray(domain[0], domain[1], count - 2);
13
+ let mult = Math.pow(10, Math.floor(Math.log10(Math.abs(domain[1] - domain[0]))) - 1);
14
+ count += 2;
15
+ let candidates = getTickCandidates(domain, mult);
16
+ if (candidates[0].num > count) {
17
+ // too many ticks
18
+ while (candidates[0].num > count) {
19
+ mult *= 10;
20
+ candidates = getTickCandidates(domain, mult);
21
+ }
22
+ }
23
+ else if (candidates[candidates.length - 1].num < count) {
24
+ // not enough ticks, let's fallback to linear ticks
25
+ const ticksList = ticksArray(domain[0], domain[1], count - 2);
26
+ if (reversed)
27
+ ticksList.reverse();
28
+ return ticksList;
29
+ }
30
+ count -= 2;
31
+ const ticksList = candidates
32
+ .map((d) => ({
33
+ ...d,
34
+ ticks: d.ticks.filter((t) => t >= domain[0] && t <= domain[1])
35
+ }))
36
+ .map((d) => ({ ...d, diff: Math.abs(d.ticks.length - count) }))
37
+ .sort((a, b) => a.diff - b.diff)[0].ticks;
38
+ if (reversed)
39
+ ticksList.reverse();
40
+ if (inverted)
41
+ return ticksList.map((t) => t * -1);
42
+ return ticksList;
43
+ }
44
+ const logSeries = [[10], [5, 4, 5], [3, 10 / 3], [2, 2.5, 2], [1.5, 2, 5 / 3, 2]];
45
+ function getTickCandidates(domain, mult = 1) {
46
+ return logSeries.map((factors) => {
47
+ let i = Math.pow(10, Math.floor(Math.log10(domain[0])));
48
+ let f = 0;
49
+ const r = [i];
50
+ while (i < domain[1] && r.length < 50) {
51
+ i *= factors[f] * mult;
52
+ r.push(i);
53
+ f = (f + 1) % factors.length;
54
+ }
55
+ return { ticks: r, num: r.length };
56
+ });
57
+ }
@@ -0,0 +1,2 @@
1
+ import type { DataRecord } from '../types.js';
2
+ export default function (value: any): value is DataRecord;
@@ -0,0 +1,13 @@
1
+ export default function (value) {
2
+ if (typeof value !== 'object' || value === null)
3
+ return false;
4
+ if (Object.prototype.toString.call(value) !== '[object Object]')
5
+ return false;
6
+ const proto = Object.getPrototypeOf(value);
7
+ if (proto === null)
8
+ return true;
9
+ const Ctor = Object.prototype.hasOwnProperty.call(proto, 'constructor') && proto.constructor;
10
+ return (typeof Ctor === 'function' &&
11
+ Ctor instanceof Ctor &&
12
+ Function.prototype.call(Ctor) === Function.prototype.call(value));
13
+ }
@@ -0,0 +1,5 @@
1
+ type ObjectType = {
2
+ [key: string]: any;
3
+ };
4
+ export default function mergeDeep(target: ObjectType, ...sources: ObjectType[]): ObjectType;
5
+ export {};
@@ -0,0 +1,26 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
2
+ function isObject(item) {
3
+ return item && typeof item === 'object' && !Array.isArray(item);
4
+ }
5
+ export default function mergeDeep(target, ...sources) {
6
+ if (!sources.length)
7
+ return target;
8
+ const source = sources.shift();
9
+ if (isObject(target) && isObject(source)) {
10
+ for (const key in source) {
11
+ if (isObject(source[key])) {
12
+ if (!target[key]) {
13
+ Object.assign(target, { [key]: {} });
14
+ }
15
+ else {
16
+ target[key] = Object.assign({}, target[key]);
17
+ }
18
+ mergeDeep(target[key], source[key]);
19
+ }
20
+ else if (source[key] !== null) {
21
+ Object.assign(target, { [key]: source[key] });
22
+ }
23
+ }
24
+ }
25
+ return mergeDeep(target, ...sources);
26
+ }
@@ -0,0 +1 @@
1
+ export default function removeIdenticalLines(input: string[][]): string[][];
@@ -0,0 +1,16 @@
1
+ export default function removeIdenticalLines(input) {
2
+ const uniqueLines = [];
3
+ if (!input.length)
4
+ return input;
5
+ for (let c = 0; c < input.length; c++) {
6
+ uniqueLines.push([]);
7
+ }
8
+ for (let l = 0; l < input[0].length; l++) {
9
+ const isIdentical = input.every((value) => input[0][l] === value[l]);
10
+ for (let c = 0; c < input.length; c++) {
11
+ if (!isIdentical)
12
+ uniqueLines[c].push(input[c][l]);
13
+ }
14
+ }
15
+ return uniqueLines;
16
+ }
@@ -0,0 +1,2 @@
1
+ import type { ChannelName, ChannelAccessor, DataRow, RawValue } from '../types';
2
+ export default function (channel: ChannelName, datum: DataRow, accessor?: ChannelAccessor): RawValue;
@@ -0,0 +1,28 @@
1
+ import isDataRecord from './isDataRecord.js';
2
+ export default function (channel, datum, accessor = null) {
3
+ if ((channel === 'x' || channel === 'y') && Array.isArray(datum) && accessor === null) {
4
+ // special case for [[x0,y0], [x1,y1], ...] format
5
+ return datum[channel === 'x' ? 0 : 1];
6
+ }
7
+ else if (isDataRecord(datum)) {
8
+ // use accessor function
9
+ if (typeof accessor === 'function')
10
+ return accessor(datum.___orig___ ? datum.___orig___ : datum);
11
+ // use accessor string
12
+ if (typeof accessor === 'string' && datum[accessor] !== undefined)
13
+ return datum[accessor];
14
+ // fallback to channel name as accessor
15
+ if (accessor === null && datum[channel] !== undefined)
16
+ return datum[channel];
17
+ // interpret accessor as constant
18
+ return accessor;
19
+ }
20
+ else {
21
+ // return single value or accessor
22
+ return typeof accessor === 'function'
23
+ ? accessor(datum)
24
+ : accessor !== null
25
+ ? accessor
26
+ : datum;
27
+ }
28
+ }
@@ -0,0 +1,5 @@
1
+ import { type SymbolType } from 'd3-shape';
2
+ export declare const sqrt3: number;
3
+ export declare const sqrt4_3: number;
4
+ export declare function isSymbol(value: string | SymbolType): boolean;
5
+ export declare function maybeSymbol(symbol: SymbolType | string): SymbolType;
@@ -0,0 +1,51 @@
1
+ import { symbolAsterisk, symbolDiamond2, symbolPlus, symbolSquare2, symbolTriangle2, symbolX as symbolTimes, symbolCircle, symbolCross, symbolDiamond, symbolSquare, symbolStar, symbolTriangle, symbolWye } from 'd3-shape';
2
+ export const sqrt3 = Math.sqrt(3);
3
+ export const sqrt4_3 = 2 / sqrt3;
4
+ const symbolHexagon = {
5
+ draw(context, size) {
6
+ const rx = Math.sqrt(size / Math.PI), ry = rx * sqrt4_3, hy = ry / 2;
7
+ context.moveTo(0, ry);
8
+ context.lineTo(rx, hy);
9
+ context.lineTo(rx, -hy);
10
+ context.lineTo(0, -ry);
11
+ context.lineTo(-rx, -hy);
12
+ context.lineTo(-rx, hy);
13
+ context.closePath();
14
+ }
15
+ };
16
+ const symbols = new Map([
17
+ ['asterisk', symbolAsterisk],
18
+ ['circle', symbolCircle],
19
+ ['cross', symbolCross],
20
+ ['diamond', symbolDiamond],
21
+ ['diamond2', symbolDiamond2],
22
+ ['hexagon', symbolHexagon],
23
+ ['plus', symbolPlus],
24
+ ['square', symbolSquare],
25
+ ['square2', symbolSquare2],
26
+ ['star', symbolStar],
27
+ ['times', symbolTimes],
28
+ ['triangle', symbolTriangle],
29
+ ['triangle2', symbolTriangle2],
30
+ ['wye', symbolWye]
31
+ ]);
32
+ function isSymbolObject(value) {
33
+ if (typeof value === 'string')
34
+ return false;
35
+ return value && typeof value.draw === 'function';
36
+ }
37
+ export function isSymbol(value) {
38
+ if (isSymbolObject(value))
39
+ return true;
40
+ if (typeof value !== 'string')
41
+ return false;
42
+ return symbols.has(value.toLowerCase());
43
+ }
44
+ export function maybeSymbol(symbol) {
45
+ if (symbol == null || isSymbolObject(symbol))
46
+ return symbol;
47
+ const value = symbols.get(`${symbol}`.toLowerCase());
48
+ if (value)
49
+ return value;
50
+ throw new Error(`invalid symbol: ${symbol}`);
51
+ }
@@ -0,0 +1,7 @@
1
+ import type { RawValue } from '../types.js';
2
+ export declare function isBooleanOrNull(v: RawValue): boolean;
3
+ export declare function isDateOrNull(v: RawValue): boolean;
4
+ export declare function isNumberOrNull(v: RawValue): boolean;
5
+ export declare function isStringOrNull(v: RawValue): boolean;
6
+ export declare function isColorOrNull(v: RawValue): boolean;
7
+ export declare function isOpacityOrNull(v: RawValue): boolean;
@@ -0,0 +1,21 @@
1
+ import chroma from 'chroma-js';
2
+ import { isDate, isFinite } from 'underscore';
3
+ export function isBooleanOrNull(v) {
4
+ return v == null || typeof v === 'boolean';
5
+ }
6
+ export function isDateOrNull(v) {
7
+ return v == null || isDate(v);
8
+ }
9
+ export function isNumberOrNull(v) {
10
+ return v == null || isFinite(v);
11
+ }
12
+ export function isStringOrNull(v) {
13
+ return v == null || typeof v === 'string';
14
+ }
15
+ export function isColorOrNull(v) {
16
+ // todo: maybe not use chroma.js here to save kb
17
+ return v == null || (typeof v === 'string' && chroma.valid(v));
18
+ }
19
+ export function isOpacityOrNull(v) {
20
+ return v == null || (typeof v === 'number' && isFinite(v) && v >= 0 && v <= 1);
21
+ }
@@ -0,0 +1,2 @@
1
+ import type { DataRow } from '../types.js';
2
+ export default function (data: DataRow[]): (Date | [number, number] | import("../types.js").DataRecord)[];
@@ -0,0 +1,4 @@
1
+ import { isObject } from 'underscore';
2
+ export default function (data) {
3
+ return data.map((d) => (isObject(d) ? d : { value: d }));
4
+ }
@@ -0,0 +1,19 @@
1
+ export { default as AxisX } from './marks/AxisX.svelte';
2
+ export { default as AxisY } from './marks/AxisY.svelte';
3
+ export { default as ColorLegend } from './marks/ColorLegend.svelte';
4
+ export { default as Area } from './marks/Area.svelte';
5
+ export { default as AreaX } from './marks/AreaX.svelte';
6
+ export { default as AreaY } from './marks/AreaY.svelte';
7
+ export { default as Dot } from './marks/Dot.svelte';
8
+ export { default as DotX } from './marks/DotX.svelte';
9
+ export { default as DotY } from './marks/DotY.svelte';
10
+ export { default as Frame } from './marks/Frame.svelte';
11
+ export { default as GridX } from './marks/GridX.svelte';
12
+ export { default as GridY } from './marks/GridY.svelte';
13
+ export { default as Line } from './marks/Line.svelte';
14
+ export { default as LineX } from './marks/LineX.svelte';
15
+ export { default as LineY } from './marks/LineY.svelte';
16
+ export { default as Plot } from './Plot.svelte';
17
+ export { default as RuleX } from './marks/RuleX.svelte';
18
+ export { default as RuleY } from './marks/RuleY.svelte';
19
+ export { default as SymbolLegend } from './marks/SymbolLegend.svelte';
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ // Reexport your entry components here
2
+ export { default as AxisX } from './marks/AxisX.svelte';
3
+ export { default as AxisY } from './marks/AxisY.svelte';
4
+ export { default as ColorLegend } from './marks/ColorLegend.svelte';
5
+ export { default as Area } from './marks/Area.svelte';
6
+ export { default as AreaX } from './marks/AreaX.svelte';
7
+ export { default as AreaY } from './marks/AreaY.svelte';
8
+ export { default as Dot } from './marks/Dot.svelte';
9
+ export { default as DotX } from './marks/DotX.svelte';
10
+ export { default as DotY } from './marks/DotY.svelte';
11
+ export { default as Frame } from './marks/Frame.svelte';
12
+ export { default as GridX } from './marks/GridX.svelte';
13
+ export { default as GridY } from './marks/GridY.svelte';
14
+ export { default as Line } from './marks/Line.svelte';
15
+ export { default as LineX } from './marks/LineX.svelte';
16
+ export { default as LineY } from './marks/LineY.svelte';
17
+ export { default as Plot } from './Plot.svelte';
18
+ export { default as RuleX } from './marks/RuleX.svelte';
19
+ export { default as RuleY } from './marks/RuleY.svelte';
20
+ export { default as SymbolLegend } from './marks/SymbolLegend.svelte';