layerchart 0.44.0 → 0.51.0

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 (116) hide show
  1. package/dist/components/Arc.svelte +18 -1
  2. package/dist/components/Arc.svelte.d.ts +3 -0
  3. package/dist/components/Area.svelte +49 -18
  4. package/dist/components/Area.svelte.d.ts +0 -1
  5. package/dist/components/Axis.svelte +2 -1
  6. package/dist/components/Axis.svelte.d.ts +2 -1
  7. package/dist/components/Bar.svelte +18 -8
  8. package/dist/components/Bar.svelte.d.ts +6 -3
  9. package/dist/components/Bars.svelte +18 -11
  10. package/dist/components/Bars.svelte.d.ts +3 -3
  11. package/dist/components/Blur.svelte +1 -1
  12. package/dist/components/Brush.svelte +2 -1
  13. package/dist/components/Calendar.svelte +2 -2
  14. package/dist/components/Calendar.svelte.d.ts +1 -1
  15. package/dist/components/Chart.svelte +85 -25
  16. package/dist/components/Chart.svelte.d.ts +77 -37
  17. package/dist/components/ChartContext.svelte +124 -6
  18. package/dist/components/ChartContext.svelte.d.ts +50 -2
  19. package/dist/components/Circle.svelte +1 -1
  20. package/dist/components/CircleClipPath.svelte +1 -1
  21. package/dist/components/ClipPath.svelte +1 -1
  22. package/dist/components/GeoPath.svelte +1 -1
  23. package/dist/components/GeoPath.svelte.d.ts +1 -1
  24. package/dist/components/Highlight.svelte +45 -19
  25. package/dist/components/Highlight.svelte.d.ts +2 -3
  26. package/dist/components/HitCanvas.svelte +1 -1
  27. package/dist/components/Hull.svelte +1 -1
  28. package/dist/components/Labels.svelte +39 -73
  29. package/dist/components/Labels.svelte.d.ts +2 -5
  30. package/dist/components/Legend.svelte +5 -5
  31. package/dist/components/Legend.svelte.d.ts +2 -2
  32. package/dist/components/Line.svelte +1 -1
  33. package/dist/components/LinearGradient.svelte +1 -1
  34. package/dist/components/MotionPath.svelte +1 -1
  35. package/dist/components/Pie.svelte +18 -41
  36. package/dist/components/Pie.svelte.d.ts +2 -3
  37. package/dist/components/Points.svelte +110 -56
  38. package/dist/components/Points.svelte.d.ts +20 -2
  39. package/dist/components/RadialGradient.svelte +1 -1
  40. package/dist/components/Rect.svelte +2 -1
  41. package/dist/components/Rect.svelte.d.ts +1 -0
  42. package/dist/components/RectClipPath.svelte +1 -1
  43. package/dist/components/Rule.svelte +1 -1
  44. package/dist/components/Spline.svelte +26 -18
  45. package/dist/components/Spline.svelte.d.ts +1 -1
  46. package/dist/components/Text.svelte +1 -1
  47. package/dist/components/Threshold.svelte +19 -81
  48. package/dist/components/Threshold.svelte.d.ts +13 -20
  49. package/dist/components/TransformContext.svelte.d.ts +2 -2
  50. package/dist/components/TransformControls.svelte +2 -1
  51. package/dist/components/TransformControls.svelte.d.ts +2 -2
  52. package/dist/components/Voronoi.svelte +15 -5
  53. package/dist/components/Voronoi.svelte.d.ts +6 -1
  54. package/dist/components/charts/AreaChart.svelte +182 -0
  55. package/dist/components/charts/AreaChart.svelte.d.ts +261 -0
  56. package/dist/components/charts/BarChart.svelte +207 -0
  57. package/dist/components/charts/BarChart.svelte.d.ts +241 -0
  58. package/dist/components/charts/LineChart.svelte +138 -0
  59. package/dist/components/charts/LineChart.svelte.d.ts +260 -0
  60. package/dist/components/charts/PieChart.svelte +146 -0
  61. package/dist/components/charts/PieChart.svelte.d.ts +220 -0
  62. package/dist/components/charts/ScatterChart.svelte +133 -0
  63. package/dist/components/charts/ScatterChart.svelte.d.ts +236 -0
  64. package/dist/components/charts/index.d.ts +5 -0
  65. package/dist/components/charts/index.js +5 -0
  66. package/dist/components/index.d.ts +2 -6
  67. package/dist/components/index.js +3 -6
  68. package/dist/components/layout/Canvas.svelte +1 -1
  69. package/dist/components/layout/Html.svelte +1 -1
  70. package/dist/components/layout/Svg.svelte +14 -4
  71. package/dist/components/layout/Svg.svelte.d.ts +1 -0
  72. package/dist/components/{Tooltip.svelte → tooltip/Tooltip.svelte} +5 -28
  73. package/dist/components/{Tooltip.svelte.d.ts → tooltip/Tooltip.svelte.d.ts} +1 -5
  74. package/dist/components/{TooltipContext.svelte → tooltip/TooltipContext.svelte} +20 -12
  75. package/dist/components/tooltip/TooltipHeader.svelte +21 -0
  76. package/dist/components/tooltip/TooltipHeader.svelte.d.ts +23 -0
  77. package/dist/components/tooltip/TooltipItem.svelte +37 -0
  78. package/dist/components/{TooltipItem.svelte.d.ts → tooltip/TooltipItem.svelte.d.ts} +4 -1
  79. package/dist/components/tooltip/TooltipList.svelte +12 -0
  80. package/dist/components/tooltip/TooltipList.svelte.d.ts +18 -0
  81. package/dist/components/tooltip/TooltipSeparator.svelte +4 -0
  82. package/dist/components/tooltip/index.d.ts +6 -0
  83. package/dist/components/tooltip/index.js +6 -0
  84. package/dist/docs/Blockquote.svelte +2 -1
  85. package/dist/docs/Code.svelte +2 -1
  86. package/dist/docs/CurveMenuField.svelte +2 -1
  87. package/dist/docs/GeoDebug.svelte +3 -1
  88. package/dist/docs/Json.svelte +1 -1
  89. package/dist/docs/Preview.svelte +2 -1
  90. package/dist/docs/TransformDebug.svelte +2 -1
  91. package/dist/utils/common.d.ts +1 -1
  92. package/dist/utils/common.js +2 -2
  93. package/dist/utils/common.test.d.ts +8 -0
  94. package/dist/utils/common.test.js +38 -0
  95. package/dist/utils/event.js +1 -1
  96. package/dist/utils/genData.d.ts +2 -2
  97. package/dist/utils/genData.js +20 -20
  98. package/dist/utils/math.d.ts +2 -2
  99. package/dist/utils/math.js +8 -2
  100. package/dist/utils/rect.d.ts +4 -10
  101. package/dist/utils/rect.js +15 -19
  102. package/dist/utils/scales.d.ts +8 -2
  103. package/dist/utils/scales.js +15 -1
  104. package/dist/utils/stack.d.ts +2 -2
  105. package/dist/utils/stack.js +37 -20
  106. package/dist/utils/stack.test.d.ts +6 -0
  107. package/dist/utils/stack.test.js +136 -0
  108. package/dist/utils/string.js +41 -0
  109. package/dist/utils/ticks.js +1 -2
  110. package/package.json +9 -3
  111. package/dist/components/AreaStack.svelte +0 -47
  112. package/dist/components/AreaStack.svelte.d.ts +0 -28
  113. package/dist/components/TooltipItem.svelte +0 -26
  114. package/dist/components/TooltipSeparator.svelte +0 -4
  115. /package/dist/components/{TooltipContext.svelte.d.ts → tooltip/TooltipContext.svelte.d.ts} +0 -0
  116. /package/dist/components/{TooltipSeparator.svelte.d.ts → tooltip/TooltipSeparator.svelte.d.ts} +0 -0
@@ -0,0 +1,6 @@
1
+ export declare const testData: {
2
+ year: number;
3
+ basket: number;
4
+ fruit: string;
5
+ value: number;
6
+ }[];
@@ -0,0 +1,136 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { groupStackData } from './stack.js';
3
+ import { group } from 'd3-array';
4
+ export const testData = [
5
+ { year: 2019, basket: 1, fruit: 'apples', value: 3840 },
6
+ { year: 2019, basket: 1, fruit: 'bananas', value: 1920 },
7
+ { year: 2019, basket: 2, fruit: 'cherries', value: 960 },
8
+ { year: 2019, basket: 2, fruit: 'dates', value: 400 },
9
+ { year: 2018, basket: 1, fruit: 'apples', value: 1600 },
10
+ { year: 2018, basket: 1, fruit: 'bananas', value: 1440 },
11
+ { year: 2018, basket: 2, fruit: 'cherries', value: 960 },
12
+ { year: 2018, basket: 2, fruit: 'dates', value: 400 },
13
+ { year: 2017, basket: 1, fruit: 'apples', value: 820 },
14
+ { year: 2017, basket: 1, fruit: 'bananas', value: 1000 },
15
+ { year: 2017, basket: 2, fruit: 'cherries', value: 640 },
16
+ { year: 2017, basket: 2, fruit: 'dates', value: 400 },
17
+ { year: 2016, basket: 1, fruit: 'apples', value: 820 },
18
+ { year: 2016, basket: 1, fruit: 'bananas', value: 560 },
19
+ { year: 2016, basket: 2, fruit: 'cherries', value: 720 },
20
+ { year: 2016, basket: 2, fruit: 'dates', value: 400 },
21
+ ];
22
+ const testDataByYear = group(testData, (d) => d.year);
23
+ describe('groupStackData', () => {
24
+ it('xKey only', () => {
25
+ const actual = groupStackData(testData, { xKey: 'year' });
26
+ expect(actual.length).toEqual(4);
27
+ expect(actual[0]).toEqual({
28
+ year: 2019,
29
+ keys: { year: 2019 },
30
+ value: 7120,
31
+ values: [0, 7120],
32
+ data: testDataByYear.get(2019),
33
+ });
34
+ });
35
+ it('xKey with groupBy (unique)', () => {
36
+ const xKey = 'year';
37
+ const groupBy = 'fruit';
38
+ const actual = groupStackData(testData, { xKey, groupBy });
39
+ // 4 years, 4 fruits each (each a separate bar)
40
+ expect(actual.length).toEqual(16);
41
+ expect(actual[0]).toEqual({
42
+ year: 2019,
43
+ fruit: 'apples',
44
+ value: 3840,
45
+ keys: { year: 2019, fruit: 'apples' },
46
+ values: [0, 3840],
47
+ data: testDataByYear.get(2019),
48
+ });
49
+ expect(actual[1]).toEqual({
50
+ year: 2019,
51
+ fruit: 'bananas',
52
+ value: 1920,
53
+ keys: { year: 2019, fruit: 'bananas' },
54
+ values: [0, 1920],
55
+ data: testDataByYear.get(2019),
56
+ });
57
+ });
58
+ it('xKey with groupBy (grouped)', () => {
59
+ const xKey = 'year';
60
+ const groupBy = 'basket';
61
+ const actual = groupStackData(testData, { xKey, groupBy });
62
+ // 4 years, 2 buckets each
63
+ expect(actual.length).toEqual(8);
64
+ expect(actual[0]).toEqual({
65
+ year: 2019,
66
+ basket: 1,
67
+ value: 5760,
68
+ keys: { year: 2019, basket: 1 },
69
+ values: [0, 5760],
70
+ data: testDataByYear.get(2019),
71
+ });
72
+ expect(actual[1]).toEqual({
73
+ year: 2019,
74
+ basket: 2,
75
+ value: 1360,
76
+ keys: { year: 2019, basket: 2 },
77
+ values: [0, 1360],
78
+ data: testDataByYear.get(2019),
79
+ });
80
+ expect(actual[2]).toEqual({
81
+ year: 2018,
82
+ basket: 1,
83
+ value: 3040,
84
+ keys: { year: 2018, basket: 1 },
85
+ values: [0, 3040],
86
+ data: testDataByYear.get(2018),
87
+ });
88
+ });
89
+ it('xKey with stackBy', () => {
90
+ const xKey = 'year';
91
+ const stackBy = 'fruit';
92
+ const actual = groupStackData(testData, { xKey, stackBy });
93
+ // 4 years, 4 fruits each (each a separate bar)
94
+ expect(actual.length).toEqual(16);
95
+ expect(actual[0]).toEqual({
96
+ year: 2019,
97
+ fruit: 'apples',
98
+ value: 3840,
99
+ keys: { year: 2019, fruit: 'apples' },
100
+ values: [0, 3840],
101
+ data: testDataByYear.get(2019),
102
+ });
103
+ expect(actual[1]).toEqual({
104
+ year: 2018,
105
+ fruit: 'apples',
106
+ value: 1600,
107
+ keys: { year: 2018, fruit: 'apples' },
108
+ values: [0, 1600],
109
+ data: testDataByYear.get(2018),
110
+ });
111
+ expect(actual[2]).toEqual({
112
+ year: 2017,
113
+ fruit: 'apples',
114
+ value: 820,
115
+ keys: { year: 2017, fruit: 'apples' },
116
+ values: [0, 820],
117
+ data: testDataByYear.get(2017),
118
+ });
119
+ expect(actual[3]).toEqual({
120
+ year: 2016,
121
+ fruit: 'apples',
122
+ value: 820,
123
+ keys: { year: 2016, fruit: 'apples' },
124
+ values: [0, 820],
125
+ data: testDataByYear.get(2016),
126
+ });
127
+ expect(actual[4]).toEqual({
128
+ year: 2019,
129
+ fruit: 'bananas',
130
+ value: 1920,
131
+ keys: { year: 2019, fruit: 'bananas' },
132
+ values: [3840, 5760],
133
+ data: testDataByYear.get(2019),
134
+ });
135
+ });
136
+ });
@@ -25,3 +25,44 @@ function _getStringWidth(str, style) {
25
25
  }
26
26
  }
27
27
  export const getStringWidth = memoize(_getStringWidth, (str, style) => `${str}_${JSON.stringify(style)}`);
28
+ export function rasterizeText(text, options = {}) {
29
+ const fontSize = options.fontSize ?? '200px';
30
+ const fontWeight = options.fontWeight ?? 600;
31
+ const fontFamily = options.fontFamily ?? 'sans-serif';
32
+ const textAlign = options.textAlign ?? 'center';
33
+ const textBaseline = options.textBaseline ?? 'middle';
34
+ const spacing = options.spacing ?? 20;
35
+ const width = options.width ?? 960;
36
+ const height = options.height ?? 500;
37
+ const x = options.x ?? width / 2;
38
+ const y = options.y ?? height / 2;
39
+ const canvas = document.createElement('canvas');
40
+ canvas.width = width;
41
+ canvas.height = height;
42
+ const context = canvas.getContext('2d');
43
+ context.font = [fontWeight, fontSize, fontFamily].join(' ');
44
+ context.textAlign = textAlign;
45
+ context.textBaseline = textBaseline;
46
+ const dx = context.measureText(text).width;
47
+ const dy = +fontSize.replace('px', '');
48
+ const bBox = [
49
+ [x - dx / 2, y - dy / 2],
50
+ [x + dx / 2, y + dy / 2],
51
+ ];
52
+ context.fillText(text, x, y);
53
+ var imageData = context.getImageData(0, 0, width, height);
54
+ var pixels = [];
55
+ for (let x = bBox[0][0]; x < bBox[1][0]; x += spacing) {
56
+ for (let y = bBox[0][1]; y < bBox[1][1]; y += spacing) {
57
+ const pixel = getPixel(imageData, x, y);
58
+ if (pixel[3] != 0)
59
+ pixels.push([x, y]);
60
+ }
61
+ }
62
+ return pixels;
63
+ }
64
+ function getPixel(imageData, x, y) {
65
+ var i = 4 * (Math.floor(x) + Math.floor(y) * imageData.width);
66
+ var d = imageData.data;
67
+ return [d[i], d[i + 1], d[i + 2], d[i + 3]];
68
+ }
@@ -1,7 +1,6 @@
1
1
  import { timeYear, timeMonth, timeWeek, timeDay, timeHour, timeMinute, timeSecond, timeMillisecond, } from 'd3-time';
2
2
  import { format } from 'date-fns';
3
- import { formatDate, PeriodType, getDuration } from 'svelte-ux';
4
- import { fail } from 'svelte-ux';
3
+ import { formatDate, PeriodType, getDuration, fail } from '@layerstack/utils';
5
4
  // TODO: Use PeriodType along with Duration to format (and possibly select intervals)
6
5
  const majorTicks = [
7
6
  {
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "author": "Sean Lynch <techniq35@gmail.com>",
5
5
  "license": "MIT",
6
6
  "repository": "techniq/layerchart",
7
- "version": "0.44.0",
7
+ "version": "0.51.0",
8
8
  "devDependencies": {
9
9
  "@changesets/cli": "^2.27.7",
10
10
  "@mdi/js": "^7.4.47",
@@ -54,6 +54,7 @@
54
54
  "svelte-check": "^3.8.5",
55
55
  "svelte-json-tree": "^2.2.0",
56
56
  "svelte-preprocess": "^6.0.2",
57
+ "svelte-ux": "^0.74.4",
57
58
  "svelte2tsx": "^0.7.15",
58
59
  "tailwindcss": "^3.4.10",
59
60
  "topojson-client": "^3.1.0",
@@ -62,10 +63,15 @@
62
63
  "typescript": "^5.5.4",
63
64
  "unist-util-visit": "^5.0.0",
64
65
  "us-atlas": "^3.0.1",
65
- "vite": "^5.4.0"
66
+ "vite": "^5.4.0",
67
+ "vitest": "^2.0.5"
66
68
  },
67
69
  "type": "module",
68
70
  "dependencies": {
71
+ "@layerstack/svelte-actions": "^0.0.4",
72
+ "@layerstack/svelte-stores": "^0.0.4",
73
+ "@layerstack/tailwind": "^0.0.6",
74
+ "@layerstack/utils": "^0.0.4",
69
75
  "d3-array": "^3.2.4",
70
76
  "d3-color": "^3.1.0",
71
77
  "d3-delaunay": "^6.0.4",
@@ -90,7 +96,6 @@
90
96
  "lodash-es": "^4.17.21",
91
97
  "posthog-js": "^1.155.4",
92
98
  "shapefile": "^0.6.6",
93
- "svelte-ux": "^0.74.4",
94
99
  "topojson-client": "^3.1.0"
95
100
  },
96
101
  "peerDependencies": {
@@ -118,6 +123,7 @@
118
123
  "package": "svelte-package",
119
124
  "check": "svelte-check --tsconfig ./tsconfig.json",
120
125
  "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch",
126
+ "test:unit": "TZ=UTC-5 vitest",
121
127
  "lint": "prettier --check .",
122
128
  "format": "prettier --write ."
123
129
  }
@@ -1,47 +0,0 @@
1
- <script>import {} from 'svelte';
2
- import { chartContext } from './ChartContext.svelte';
3
- import Area from './Area.svelte';
4
- import Spline from './Spline.svelte';
5
- import { chartDataArray } from '../utils/common.js';
6
- const { data, rGet } = chartContext();
7
- export let curve = undefined;
8
- export let defined = undefined;
9
- export let opacity = 0.3;
10
- export let line = false;
11
- export let tweened = undefined;
12
- // Render in reverse order so bottom stacks are rendered last (and stack above the upper stacks). Fixes when upper stack has 0 value
13
- $: lineData = [...chartDataArray($data)].reverse();
14
- </script>
15
-
16
- {#if line}
17
- <g class="line-group">
18
- {#each lineData as seriesData}
19
- <Spline
20
- data={seriesData}
21
- y={(d) => d[1]}
22
- stroke={$rGet(seriesData)}
23
- {curve}
24
- {defined}
25
- {tweened}
26
- {...line}
27
- />
28
- {/each}
29
- </g>
30
- {/if}
31
-
32
- <slot data={$data}>
33
- <g class="area-group">
34
- {#each chartDataArray($data) as seriesData}
35
- <Area
36
- data={seriesData}
37
- y0={(d) => d[0]}
38
- y1={(d) => d[1]}
39
- fill={$rGet(seriesData)}
40
- {curve}
41
- {defined}
42
- {opacity}
43
- {tweened}
44
- />
45
- {/each}
46
- </g>
47
- </slot>
@@ -1,28 +0,0 @@
1
- import { SvelteComponentTyped } from "svelte";
2
- import { type ComponentProps } from 'svelte';
3
- import type { tweened as tweenedStore } from 'svelte/motion';
4
- import type { CurveFactory } from 'd3-shape';
5
- import Spline from './Spline.svelte';
6
- declare const __propDef: {
7
- props: {
8
- curve?: CurveFactory | undefined;
9
- defined?: ComponentProps<Spline>["defined"] | undefined;
10
- opacity?: number;
11
- line?: boolean | any;
12
- tweened?: boolean | Parameters<typeof tweenedStore>[1];
13
- };
14
- events: {
15
- [evt: string]: CustomEvent<any>;
16
- };
17
- slots: {
18
- default: {
19
- data: any;
20
- };
21
- };
22
- };
23
- export type AreaStackProps = typeof __propDef.props;
24
- export type AreaStackEvents = typeof __propDef.events;
25
- export type AreaStackSlots = typeof __propDef.slots;
26
- export default class AreaStack extends SvelteComponentTyped<AreaStackProps, AreaStackEvents, AreaStackSlots> {
27
- }
28
- export {};
@@ -1,26 +0,0 @@
1
- <script>import { cls, format as formatUtil } from 'svelte-ux';
2
- export let label;
3
- /** Value to be formatted and displayed. Can also be passed as default slot */
4
- export let value = undefined;
5
- export let format = undefined;
6
- export let valueAlign = 'left';
7
- export let classes = {};
8
- </script>
9
-
10
- <div class={cls('label', classes.label)}>
11
- <slot name="label">{label}:</slot>
12
- </div>
13
-
14
- <div
15
- class={cls(
16
- 'value',
17
- {
18
- 'text-right': valueAlign === 'right',
19
- 'text-center': valueAlign === 'center',
20
- },
21
- classes.value,
22
- $$props.class
23
- )}
24
- >
25
- <slot>{format ? formatUtil(value, format) : value}</slot>
26
- </div>
@@ -1,4 +0,0 @@
1
- <script>import { cls } from 'svelte-ux';
2
- </script>
3
-
4
- <div class={cls('rounded bg-white/50 my-1 col-span-full h-px', $$props.class)} />