svelteplot 0.0.1-alpha.9 → 0.1.3-next.12

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 (251) hide show
  1. package/LICENSE.md +5 -0
  2. package/README.md +3 -35
  3. package/dist/Mark.svelte +292 -0
  4. package/dist/Mark.svelte.d.ts +22 -0
  5. package/dist/Plot.svelte +148 -156
  6. package/dist/Plot.svelte.d.ts +15 -15
  7. package/dist/constants.d.ts +15 -0
  8. package/dist/constants.js +110 -0
  9. package/dist/core/Facet.svelte +59 -0
  10. package/dist/core/Facet.svelte.d.ts +18 -0
  11. package/dist/core/FacetAxes.svelte +66 -0
  12. package/dist/core/FacetAxes.svelte.d.ts +4 -0
  13. package/dist/core/FacetGrid.svelte +86 -0
  14. package/dist/core/FacetGrid.svelte.d.ts +13 -0
  15. package/dist/core/Plot.svelte +568 -0
  16. package/dist/core/Plot.svelte.d.ts +14 -0
  17. package/dist/helpers/arrowPath.d.ts +14 -0
  18. package/dist/helpers/arrowPath.js +129 -0
  19. package/dist/helpers/autoProjection.d.ts +19 -0
  20. package/dist/helpers/autoProjection.js +87 -0
  21. package/dist/helpers/autoScales.d.ts +23 -0
  22. package/dist/helpers/autoScales.js +203 -0
  23. package/dist/helpers/autoTicks.d.ts +3 -0
  24. package/dist/helpers/autoTicks.js +40 -0
  25. package/dist/helpers/autoTimeFormat.d.ts +2 -2
  26. package/dist/helpers/autoTimeFormat.js +34 -5
  27. package/dist/helpers/callWithProps.d.ts +8 -0
  28. package/dist/helpers/callWithProps.js +13 -0
  29. package/dist/helpers/colors.js +17 -2
  30. package/dist/helpers/curves.d.ts +3 -0
  31. package/dist/helpers/curves.js +42 -0
  32. package/dist/helpers/data.d.ts +9 -0
  33. package/dist/helpers/data.js +16 -0
  34. package/dist/helpers/facets.d.ts +12 -0
  35. package/dist/helpers/facets.js +49 -0
  36. package/dist/helpers/formats.d.ts +3 -0
  37. package/dist/helpers/formats.js +3 -0
  38. package/dist/helpers/getBaseStyles.d.ts +7 -2
  39. package/dist/helpers/getBaseStyles.js +34 -10
  40. package/dist/helpers/getLogTicks.js +5 -5
  41. package/dist/helpers/group.d.ts +6 -0
  42. package/dist/helpers/group.js +53 -0
  43. package/dist/helpers/index.d.ts +18 -0
  44. package/dist/helpers/index.js +55 -0
  45. package/dist/helpers/isRawValue.d.ts +2 -0
  46. package/dist/helpers/isRawValue.js +5 -0
  47. package/dist/helpers/isValid.d.ts +6 -0
  48. package/dist/helpers/isValid.js +6 -0
  49. package/dist/helpers/math.d.ts +19 -0
  50. package/dist/helpers/math.js +116 -0
  51. package/dist/helpers/mergeDeep.d.ts +1 -1
  52. package/dist/helpers/noise.d.ts +1 -0
  53. package/dist/helpers/noise.js +72 -0
  54. package/dist/helpers/projection.d.ts +33 -0
  55. package/dist/helpers/projection.js +100 -0
  56. package/dist/helpers/reduce.d.ts +10 -0
  57. package/dist/helpers/reduce.js +85 -0
  58. package/dist/helpers/regressionLoess.d.ts +12 -0
  59. package/dist/helpers/regressionLoess.js +47 -0
  60. package/dist/helpers/removeIdenticalLines.d.ts +8 -1
  61. package/dist/helpers/removeIdenticalLines.js +14 -7
  62. package/dist/helpers/resolve.d.ts +21 -0
  63. package/dist/helpers/resolve.js +156 -0
  64. package/dist/helpers/roundedRect.d.ts +9 -0
  65. package/dist/helpers/roundedRect.js +31 -0
  66. package/dist/helpers/scales.d.ts +42 -0
  67. package/dist/helpers/scales.js +311 -0
  68. package/dist/helpers/time.d.ts +6 -0
  69. package/dist/helpers/time.js +282 -0
  70. package/dist/helpers/typeChecks.d.ts +8 -5
  71. package/dist/helpers/typeChecks.js +27 -6
  72. package/dist/index.d.ts +49 -1
  73. package/dist/index.js +53 -2
  74. package/dist/marks/Area.svelte +146 -0
  75. package/dist/marks/Area.svelte.d.ts +30 -0
  76. package/dist/marks/AreaX.svelte +27 -0
  77. package/dist/marks/AreaX.svelte.d.ts +12 -0
  78. package/dist/marks/AreaY.svelte +38 -0
  79. package/dist/marks/AreaY.svelte.d.ts +19 -0
  80. package/dist/marks/Arrow.svelte +139 -0
  81. package/dist/marks/Arrow.svelte.d.ts +44 -0
  82. package/dist/marks/AxisX.svelte +198 -93
  83. package/dist/marks/AxisX.svelte.d.ts +17 -16
  84. package/dist/marks/AxisY.svelte +176 -62
  85. package/dist/marks/AxisY.svelte.d.ts +17 -14
  86. package/dist/marks/BarX.svelte +93 -0
  87. package/dist/marks/BarX.svelte.d.ts +4 -0
  88. package/dist/marks/BarY.svelte +103 -0
  89. package/dist/marks/BarY.svelte.d.ts +25 -0
  90. package/dist/marks/BollingerX.svelte +44 -0
  91. package/dist/marks/BollingerX.svelte.d.ts +18 -0
  92. package/dist/marks/BollingerY.svelte +39 -0
  93. package/dist/marks/BollingerY.svelte.d.ts +18 -0
  94. package/dist/marks/BoxX.svelte +89 -0
  95. package/dist/marks/BoxX.svelte.d.ts +4 -0
  96. package/dist/marks/BoxY.svelte +110 -0
  97. package/dist/marks/BoxY.svelte.d.ts +29 -0
  98. package/dist/marks/Cell.svelte +110 -0
  99. package/dist/marks/Cell.svelte.d.ts +16 -0
  100. package/dist/marks/CellX.svelte +24 -0
  101. package/dist/marks/CellX.svelte.d.ts +3 -0
  102. package/dist/marks/CellY.svelte +24 -0
  103. package/dist/marks/CellY.svelte.d.ts +3 -0
  104. package/dist/marks/ColorLegend.svelte +148 -27
  105. package/dist/marks/ColorLegend.svelte.d.ts +12 -13
  106. package/dist/marks/CustomMark.svelte +43 -0
  107. package/dist/marks/CustomMark.svelte.d.ts +16 -0
  108. package/dist/marks/CustomMarkHTML.svelte +103 -0
  109. package/dist/marks/CustomMarkHTML.svelte.d.ts +17 -0
  110. package/dist/marks/DifferenceY.svelte +144 -0
  111. package/dist/marks/DifferenceY.svelte.d.ts +30 -0
  112. package/dist/marks/Dot.svelte +128 -73
  113. package/dist/marks/Dot.svelte.d.ts +24 -14
  114. package/dist/marks/DotX.svelte +15 -3
  115. package/dist/marks/DotX.svelte.d.ts +8 -16
  116. package/dist/marks/DotY.svelte +8 -3
  117. package/dist/marks/DotY.svelte.d.ts +5 -17
  118. package/dist/marks/Frame.svelte +39 -31
  119. package/dist/marks/Frame.svelte.d.ts +7 -14
  120. package/dist/marks/Geo.svelte +102 -0
  121. package/dist/marks/Geo.svelte.d.ts +10 -0
  122. package/dist/marks/Graticule.svelte +28 -0
  123. package/dist/marks/Graticule.svelte.d.ts +9 -0
  124. package/dist/marks/GridX.svelte +67 -36
  125. package/dist/marks/GridX.svelte.d.ts +7 -18
  126. package/dist/marks/GridY.svelte +64 -25
  127. package/dist/marks/GridY.svelte.d.ts +7 -14
  128. package/dist/marks/HTMLTooltip.svelte +91 -0
  129. package/dist/marks/HTMLTooltip.svelte.d.ts +11 -0
  130. package/dist/marks/Line.svelte +219 -58
  131. package/dist/marks/Line.svelte.d.ts +30 -14
  132. package/dist/marks/LineX.svelte +8 -8
  133. package/dist/marks/LineX.svelte.d.ts +4 -17
  134. package/dist/marks/LineY.svelte +7 -8
  135. package/dist/marks/LineY.svelte.d.ts +4 -17
  136. package/dist/marks/Link.svelte +180 -0
  137. package/dist/marks/Link.svelte.d.ts +21 -0
  138. package/dist/marks/Pointer.svelte +126 -0
  139. package/dist/marks/Pointer.svelte.d.ts +23 -0
  140. package/dist/marks/Rect.svelte +103 -0
  141. package/dist/marks/Rect.svelte.d.ts +15 -0
  142. package/dist/marks/RectX.svelte +33 -0
  143. package/dist/marks/RectX.svelte.d.ts +15 -0
  144. package/dist/marks/RectY.svelte +33 -0
  145. package/dist/marks/RectY.svelte.d.ts +15 -0
  146. package/dist/marks/RegressionX.svelte +26 -0
  147. package/dist/marks/RegressionX.svelte.d.ts +4 -0
  148. package/dist/marks/RegressionY.svelte +26 -0
  149. package/dist/marks/RegressionY.svelte.d.ts +4 -0
  150. package/dist/marks/RuleX.svelte +52 -28
  151. package/dist/marks/RuleX.svelte.d.ts +14 -14
  152. package/dist/marks/RuleY.svelte +52 -28
  153. package/dist/marks/RuleY.svelte.d.ts +14 -14
  154. package/dist/marks/Sphere.svelte +8 -0
  155. package/dist/marks/Sphere.svelte.d.ts +51 -0
  156. package/dist/marks/Spike.svelte +15 -0
  157. package/dist/marks/Spike.svelte.d.ts +4 -0
  158. package/dist/marks/SymbolLegend.svelte +27 -12
  159. package/dist/marks/SymbolLegend.svelte.d.ts +8 -14
  160. package/dist/marks/Text.svelte +189 -0
  161. package/dist/marks/Text.svelte.d.ts +26 -0
  162. package/dist/marks/TickX.svelte +89 -0
  163. package/dist/marks/TickX.svelte.d.ts +22 -0
  164. package/dist/marks/TickY.svelte +90 -0
  165. package/dist/marks/TickY.svelte.d.ts +22 -0
  166. package/dist/marks/Vector.svelte +219 -0
  167. package/dist/marks/Vector.svelte.d.ts +31 -0
  168. package/dist/marks/helpers/BaseAxisX.svelte +210 -0
  169. package/dist/marks/helpers/BaseAxisX.svelte.d.ts +24 -0
  170. package/dist/marks/helpers/BaseAxisY.svelte +187 -0
  171. package/dist/marks/helpers/BaseAxisY.svelte.d.ts +23 -0
  172. package/dist/marks/helpers/CanvasLayer.svelte +38 -0
  173. package/dist/marks/helpers/CanvasLayer.svelte.d.ts +13 -0
  174. package/dist/marks/helpers/DotCanvas.svelte +184 -0
  175. package/dist/marks/helpers/DotCanvas.svelte.d.ts +11 -0
  176. package/dist/marks/helpers/GeoCanvas.svelte +165 -0
  177. package/dist/marks/helpers/GeoCanvas.svelte.d.ts +13 -0
  178. package/dist/marks/helpers/GroupMultiple.svelte +17 -0
  179. package/dist/marks/helpers/GroupMultiple.svelte.d.ts +9 -0
  180. package/dist/marks/helpers/Marker.svelte +93 -0
  181. package/dist/marks/helpers/Marker.svelte.d.ts +10 -0
  182. package/dist/marks/helpers/MarkerPath.svelte +141 -0
  183. package/dist/marks/helpers/MarkerPath.svelte.d.ts +44 -0
  184. package/dist/marks/helpers/Regression.svelte +174 -0
  185. package/dist/marks/helpers/Regression.svelte.d.ts +26 -0
  186. package/dist/marks/helpers/events.d.ts +8 -0
  187. package/dist/marks/helpers/events.js +74 -0
  188. package/dist/transforms/bin.d.ts +51 -0
  189. package/dist/transforms/bin.js +171 -0
  190. package/dist/transforms/bollinger.d.ts +21 -0
  191. package/dist/transforms/bollinger.js +53 -0
  192. package/dist/transforms/centroid.d.ts +9 -0
  193. package/dist/transforms/centroid.js +13 -0
  194. package/dist/transforms/facet.d.ts +1 -0
  195. package/dist/transforms/facet.js +1 -0
  196. package/dist/transforms/filter.d.ts +2 -0
  197. package/dist/transforms/filter.js +8 -0
  198. package/dist/transforms/group.d.ts +66 -0
  199. package/dist/transforms/group.js +109 -0
  200. package/dist/transforms/interval.d.ts +11 -0
  201. package/dist/transforms/interval.js +34 -0
  202. package/dist/transforms/jitter.d.ts +1 -0
  203. package/dist/transforms/jitter.js +1 -0
  204. package/dist/transforms/map.d.ts +10 -0
  205. package/dist/transforms/map.js +89 -0
  206. package/dist/transforms/normalize.d.ts +9 -0
  207. package/dist/transforms/normalize.js +86 -0
  208. package/dist/transforms/recordize.d.ts +15 -0
  209. package/dist/transforms/recordize.js +78 -0
  210. package/dist/transforms/rename.d.ts +14 -0
  211. package/dist/transforms/rename.js +42 -0
  212. package/dist/transforms/select.d.ts +35 -0
  213. package/dist/transforms/select.js +55 -0
  214. package/dist/transforms/shift.d.ts +13 -0
  215. package/dist/transforms/shift.js +45 -0
  216. package/dist/transforms/sort.d.ts +28 -0
  217. package/dist/transforms/sort.js +66 -0
  218. package/dist/transforms/stack.d.ts +10 -0
  219. package/dist/transforms/stack.js +110 -0
  220. package/dist/transforms/window.d.ts +24 -0
  221. package/dist/transforms/window.js +73 -0
  222. package/dist/types.d.ts +625 -188
  223. package/dist/ui/Checkbox.svelte +6 -0
  224. package/dist/ui/Checkbox.svelte.d.ts +13 -0
  225. package/dist/ui/RadioInput.svelte +27 -0
  226. package/dist/ui/RadioInput.svelte.d.ts +9 -0
  227. package/dist/ui/Select.svelte +27 -0
  228. package/dist/ui/Select.svelte.d.ts +9 -0
  229. package/dist/ui/Slider.svelte +47 -0
  230. package/dist/ui/Slider.svelte.d.ts +11 -0
  231. package/dist/ui/Spiral.svelte +46 -0
  232. package/dist/ui/Spiral.svelte.d.ts +15 -0
  233. package/dist/ui/index.d.ts +4 -0
  234. package/dist/ui/index.js +4 -0
  235. package/package.json +81 -42
  236. package/LICENSE +0 -11
  237. package/dist/classes/Channel.svelte.js +0 -74
  238. package/dist/classes/Mark.svelte.js +0 -17
  239. package/dist/classes/Plot.svelte.js +0 -98
  240. package/dist/contants.d.ts +0 -3
  241. package/dist/contants.js +0 -40
  242. package/dist/helpers/GroupMultiple.svelte +0 -8
  243. package/dist/helpers/GroupMultiple.svelte.d.ts +0 -19
  244. package/dist/helpers/createScale.d.ts +0 -5
  245. package/dist/helpers/createScale.js +0 -57
  246. package/dist/helpers/resolveChannel.d.ts +0 -2
  247. package/dist/helpers/resolveChannel.js +0 -28
  248. package/dist/helpers/wrapArray.d.ts +0 -2
  249. package/dist/helpers/wrapArray.js +0 -4
  250. package/dist/marks/BaseMark.svelte +0 -22
  251. package/dist/marks/BaseMark.svelte.d.ts +0 -19
@@ -0,0 +1,102 @@
1
+ <script lang="ts">
2
+ import { getContext } from 'svelte';
3
+ import type { DataRecord, PlotContext, BaseMarkProps } from '../types.js';
4
+ import Mark from '../Mark.svelte';
5
+ import { geoPath } from 'd3-geo';
6
+ import { resolveChannel, resolveProp, resolveScaledStyles } from '../helpers/resolve.js';
7
+ import { getUsedScales } from '../helpers/scales.js';
8
+ import callWithProps from '../helpers/callWithProps.js';
9
+ import { sort } from '../index.js';
10
+ import { testFilter } from '../helpers/index.js';
11
+ import { addEventHandlers } from './helpers/events.js';
12
+ import GeoCanvas from './helpers/GeoCanvas.svelte';
13
+
14
+ const { getPlotState } = getContext<PlotContext>('svelteplot');
15
+ const plot = $derived(getPlotState());
16
+
17
+ type GeoMarkProps = {
18
+ data: DataRecord[];
19
+ geoType?: 'sphere' | 'graticule';
20
+ dragRotate: boolean;
21
+ canvas: boolean;
22
+ } & BaseMarkProps;
23
+
24
+ let {
25
+ data = [{}],
26
+ canvas = false,
27
+ geoType,
28
+ dragRotate,
29
+ class: className = null,
30
+ ...options
31
+ }: GeoMarkProps = $props();
32
+
33
+ const path = $derived(
34
+ callWithProps(geoPath, [plot.scales.projection], {
35
+ ...(options.r
36
+ ? { pointRadius: (d) => plot.scales.r.fn(resolveChannel('r', d, options)) }
37
+ : { pointRadius: 3 })
38
+ })
39
+ );
40
+
41
+ const args = $derived(
42
+ sort({
43
+ data,
44
+ ...(options.r ? { sort: { channel: '-r' } } : {}),
45
+ ...options
46
+ })
47
+ );
48
+ const preferStroke = new Set(['MultiLineString', 'LineString']);
49
+
50
+ const { getTestFacet } = getContext<FacetContext>('svelteplot/facet');
51
+ const testFacet = $derived(getTestFacet());
52
+ </script>
53
+
54
+ <Mark
55
+ type="geo"
56
+ channels={['fill', 'stroke', 'opacity', 'fillOpacity', 'strokeOpacity', 'r']}
57
+ {...args}>
58
+ {#snippet children({ mark, usedScales })}
59
+ <g
60
+ aria-label="geo"
61
+ class={['geo', geoType && `geo-${geoType}`, className]}
62
+ style="fill:currentColor">
63
+ {#if canvas}
64
+ <GeoCanvas data={args.data} {mark} {plot} {testFacet} {usedScales} {path} />
65
+ {:else}
66
+ {#each args.data as datum}
67
+ {#if testFilter(datum, mark.options) && testFacet(datum, mark.options)}
68
+ {#snippet el(datum)}
69
+ {@const title = resolveProp(args.title, datum, '')}
70
+ {@const geometry = resolveProp(args.geometry, datum, datum)}
71
+ <path
72
+ d={path(geometry)}
73
+ style={resolveScaledStyles(
74
+ datum,
75
+ args,
76
+ usedScales,
77
+ plot,
78
+ preferStroke.has(geometry.type) ? 'stroke' : 'fill'
79
+ )}
80
+ use:addEventHandlers={{
81
+ getPlotState,
82
+ options: args,
83
+ datum
84
+ }}>
85
+ {#if title}<title>{title}</title>{/if}
86
+ </path>
87
+ {/snippet}
88
+ {#if options.href}
89
+ <a
90
+ href={resolveProp(args.href, datum, '')}
91
+ target={resolveProp(args.target, datum, '_self')}>
92
+ {@render el(datum)}
93
+ </a>
94
+ {:else}
95
+ {@render el(datum)}
96
+ {/if}
97
+ {/if}
98
+ {/each}
99
+ {/if}
100
+ </g>
101
+ {/snippet}
102
+ </Mark>
@@ -0,0 +1,10 @@
1
+ import type { DataRecord, BaseMarkProps } from '../types.js';
2
+ type GeoMarkProps = {
3
+ data: DataRecord[];
4
+ geoType?: 'sphere' | 'graticule';
5
+ dragRotate: boolean;
6
+ canvas: boolean;
7
+ } & BaseMarkProps;
8
+ declare const Geo: import("svelte").Component<GeoMarkProps, {}, "">;
9
+ type Geo = ReturnType<typeof Geo>;
10
+ export default Geo;
@@ -0,0 +1,28 @@
1
+ <script lang="ts">
2
+ import Geo from './Geo.svelte';
3
+ import { geoGraticule } from 'd3-geo';
4
+ import type { DefaultOptions, BaseMarkProps } from '../types.js';
5
+
6
+ import { getContext } from 'svelte';
7
+
8
+ const DEFAULTS = {
9
+ graticuleStep: 10,
10
+ ...getContext<Partial<DefaultOptions>>('svelteplot/defaults')
11
+ };
12
+
13
+ type GraticuleMarkProps = BaseMarkProps & {
14
+ step?: number;
15
+ stepX?: number;
16
+ stepY?: number;
17
+ };
18
+
19
+ let { step = DEFAULTS.graticuleStep, stepX, stepY, ...options }: GraticuleMarkProps = $props();
20
+
21
+ let graticule = $derived.by(() => {
22
+ const graticule = geoGraticule();
23
+ graticule.stepMinor([stepX || step, stepY || step]);
24
+ return graticule;
25
+ });
26
+ </script>
27
+
28
+ <Geo data={[graticule()]} {...options} geoType="graticule" preferStroke />
@@ -0,0 +1,9 @@
1
+ import type { BaseMarkProps } from '../types.js';
2
+ type GraticuleMarkProps = BaseMarkProps & {
3
+ step?: number;
4
+ stepX?: number;
5
+ stepY?: number;
6
+ };
7
+ declare const Graticule: import("svelte").Component<GraticuleMarkProps, {}, "">;
8
+ type Graticule = ReturnType<typeof Graticule>;
9
+ export default Graticule;
@@ -1,42 +1,73 @@
1
- <script>import { getContext } from "svelte";
2
- import { get } from "underscore";
3
- import BaseMark from "./BaseMark.svelte";
4
- import resolveChannel from "../helpers/resolveChannel.js";
5
- import getBaseStyles from "../helpers/getBaseStyles.js";
6
- const BaseMark_GridX = BaseMark;
7
- const plot = getContext("svelteplot");
8
- let {
9
- ticks = [],
10
- y1 = null,
11
- y2 = null,
12
- automatic = false,
13
- ...styleProps
14
- } = $props();
15
- let autoTickCount = $derived(plot.plotWidth / get(plot, "options.x.tickSpacing", 80));
16
- let autoTicks = $derived(
17
- ticks.length > 0 ? ticks : get(plot, "options.x.ticks", plot.xScale.ticks(autoTickCount))
18
- );
1
+ <script lang="ts">
2
+ import { getContext } from 'svelte';
3
+ import Mark from '../Mark.svelte';
4
+ import type { PlotContext, BaseMarkProps, RawValue } from '../types.js';
5
+ import { resolveChannel, resolveScaledStyles } from '../helpers/resolve.js';
6
+ import { autoTicks } from '../helpers/autoTicks.js';
7
+ import { getUsedScales } from '../helpers/scales.js';
8
+ import { testFilter } from '../helpers/index.js';
9
+
10
+ type GrixXMarkProps = BaseMarkProps & {
11
+ data?: RawValue[];
12
+ automatic?: boolean;
13
+ };
14
+
15
+ let { data = [], automatic = false, ...options }: GrixXMarkProps = $props();
16
+
17
+ const { getPlotState } = getContext<PlotContext>('svelteplot');
18
+ let plot = $derived(getPlotState());
19
+
20
+ let autoTickCount = $derived(
21
+ Math.max(3, Math.round(plot.facetWidth / plot.options.x.tickSpacing))
22
+ );
23
+
24
+ let ticks: RawValue[] = $derived(
25
+ data.length > 0
26
+ ? // use custom tick values if user passed any as prop
27
+ data
28
+ : // use custom scale tick values if user passed any as plot scale option
29
+ autoTicks(
30
+ plot.scales.x.type,
31
+ plot.options.x.ticks,
32
+ plot.options.x.interval,
33
+ plot.scales.x.domain,
34
+ plot.scales.x.fn,
35
+ autoTickCount
36
+ )
37
+ );
19
38
  </script>
20
39
 
21
- <BaseMark_GridX type="grid-x" data={ticks} channels={['x']} {y1} {y2} {automatic}>
22
- <g class="grid-x">
23
- {#each autoTicks as tick, t}
24
- <g class="x-tick" transform="translate({plot.xScale(tick)},{plot.margins.top})">
25
- <line
26
- class="grid"
27
- style={getBaseStyles(tick, styleProps)}
28
- y1={y1 ? plot.yScale(resolveChannel('y', tick, y1)) : 0}
29
- y2={y2
30
- ? plot.yScale(resolveChannel('y', tick, y2))
31
- : plot.height - plot.margins.top - plot.margins.bottom}
32
- />
33
- </g>
34
- {/each}
35
- </g>
36
- </BaseMark_GridX>
40
+ <Mark
41
+ type="gridX"
42
+ data={data.length ? data.map((tick) => ({ __x: tick })) : []}
43
+ channels={['y1', 'y2', 'x', 'stroke', 'strokeOpacity']}
44
+ {...{ ...options, x: '__x' }}
45
+ {automatic}>
46
+ {#snippet children({ usedScales })}
47
+ <g class="grid-x">
48
+ {#each ticks as tick}
49
+ {#if testFilter(tick, options)}
50
+ {@const x =
51
+ plot.scales.x.fn(tick) +
52
+ (plot.scales.x.type === 'band' ? plot.scales.x.fn.bandwidth() * 0.5 : 0)}
53
+ {@const y1_ = resolveChannel('y1', tick, options)}
54
+ {@const y2_ = resolveChannel('y2', tick, options)}
55
+ {@const y1 = options.y1 != null ? plot.scales.y.fn(y1_) : 0}
56
+ {@const y2 = options.y2 != null ? plot.scales.y.fn(y2_) : plot.facetHeight}
57
+ <line
58
+ transform="translate({x},{plot.options.marginTop})"
59
+ style={resolveScaledStyles(tick, options, usedScales, plot, 'stroke')}
60
+ {y1}
61
+ {y2} />
62
+ {/if}
63
+ {/each}
64
+ </g>
65
+ {/snippet}
66
+ </Mark>
37
67
 
38
68
  <style>
39
- .x-tick line.grid {
40
- stroke: #d9d9d9;
69
+ line {
70
+ stroke: currentColor;
71
+ stroke-opacity: 0.2;
41
72
  }
42
73
  </style>
@@ -1,19 +1,8 @@
1
- import { SvelteComponent } from "svelte";
2
- import type { GridOptions } from '../types.js';
3
- declare const __propDef: {
4
- props: Partial<import("../types.js").MarkProps> & GridOptions & {
5
- y1?: import("../types.js").ChannelAccessor | undefined;
6
- y2?: import("../types.js").ChannelAccessor | undefined;
7
- automatic?: boolean | undefined;
8
- };
9
- events: {
10
- [evt: string]: CustomEvent<any>;
11
- };
12
- slots: {};
1
+ import type { BaseMarkProps, RawValue } from '../types.js';
2
+ type GrixXMarkProps = BaseMarkProps & {
3
+ data?: RawValue[];
4
+ automatic?: boolean;
13
5
  };
14
- export type GridXProps = typeof __propDef.props;
15
- export type GridXEvents = typeof __propDef.events;
16
- export type GridXSlots = typeof __propDef.slots;
17
- export default class GridX extends SvelteComponent<GridXProps, GridXEvents, GridXSlots> {
18
- }
19
- export {};
6
+ declare const GridX: import("svelte").Component<GrixXMarkProps, {}, "">;
7
+ type GridX = ReturnType<typeof GridX>;
8
+ export default GridX;
@@ -1,31 +1,70 @@
1
- <script>import { getContext } from "svelte";
2
- import BaseMark from "./BaseMark.svelte";
3
- import getBaseStyles from "../helpers/getBaseStyles.js";
4
- import { get } from "underscore";
5
- const plot = getContext("svelteplot");
6
- let { ticks = [], automatic = false, ...styleProps } = $props();
7
- let autoTickCount = $derived(plot.plotHeight / get(plot, "options.y.tickSpacing", 80));
8
- let autoTicks = $derived(
9
- ticks.length > 0 ? ticks : get(plot, "options.y.ticks", plot.yScale.ticks(autoTickCount))
10
- );
1
+ <script lang="ts">
2
+ import { getContext } from 'svelte';
3
+ import Mark from '../Mark.svelte';
4
+ import type { PlotContext, BaseMarkProps, RawValue, DataRecord } from '../types.js';
5
+ import { resolveChannel, resolveScaledStyles } from '../helpers/resolve.js';
6
+ import { autoTicks } from '../helpers/autoTicks.js';
7
+ import { getUsedScales } from '../helpers/scales.js';
8
+ import { testFilter } from '../helpers/index.js';
9
+
10
+ type GridYMarkProps = BaseMarkProps & { data?: RawValue[]; automatic?: boolean };
11
+
12
+ let { data = [], automatic = false, ...options }: GridYMarkProps = $props();
13
+
14
+ const { getPlotState } = getContext<PlotContext>('svelteplot');
15
+ let plot = $derived(getPlotState());
16
+
17
+ let autoTickCount = $derived(
18
+ Math.max(2, Math.round(plot.facetHeight / plot.options.y.tickSpacing))
19
+ );
20
+
21
+ let ticks: RawValue[] = $derived(
22
+ data.length > 0
23
+ ? // use custom tick values if user passed any as prop
24
+ data
25
+ : // use custom scale tick values if user passed any as plot scale option
26
+ autoTicks(
27
+ plot.scales.y.type,
28
+ plot.options.y.ticks,
29
+ plot.options.y.interval,
30
+ plot.scales.y.domain,
31
+ plot.scales.y.fn,
32
+ autoTickCount
33
+ )
34
+ );
11
35
  </script>
12
36
 
13
- <BaseMark type="grid-y" data={ticks} channels={['y']} {automatic}>
14
- <g class="grid-y">
15
- {#each autoTicks as tick}
16
- <g class="y-tick" transform="translate({plot.margins.left},{plot.yScale(tick)})">
17
- <line
18
- style={getBaseStyles(tick, styleProps)}
19
- class="grid"
20
- x2={plot.width - plot.margins.right - plot.margins.left}
21
- />
22
- </g>
23
- {/each}
24
- </g>
25
- </BaseMark>
37
+ <Mark
38
+ type="gridY"
39
+ data={data.length ? data.map((tick) => ({ ___orig___: tick })) : []}
40
+ channels={['x1', 'x2', 'y', 'stroke', 'strokeOpacity']}
41
+ {...{ ...options, y: '___orig___' }}
42
+ {automatic}>
43
+ {#snippet children({ usedScales })}
44
+ <g class="grid-y">
45
+ {#each ticks as tick}
46
+ {#if testFilter(tick, options)}
47
+ {@const y =
48
+ plot.scales.y.fn(tick) +
49
+ (plot.scales.y.type === 'band' ? plot.scales.y.fn.bandwidth() * 0.5 : 0)}
50
+ {@const x1_ = resolveChannel('x1', tick, options)}
51
+ {@const x2_ = resolveChannel('x2', tick, options)}
52
+ {@const x1 = options.x1 != null ? plot.scales.x.fn(x1_) : 0}
53
+ {@const x2 = options.x2 != null ? plot.scales.x.fn(x2_) : plot.facetWidth}
54
+ <line
55
+ transform="translate({plot.options.marginLeft},{y})"
56
+ style={resolveScaledStyles(tick, options, usedScales, plot, 'stroke')}
57
+ {x1}
58
+ {x2} />
59
+ {/if}
60
+ {/each}
61
+ </g>
62
+ {/snippet}
63
+ </Mark>
26
64
 
27
65
  <style>
28
- .y-tick line.grid {
29
- stroke: #d9d9d9;
66
+ line {
67
+ stroke: currentColor;
68
+ stroke-opacity: 0.2;
30
69
  }
31
70
  </style>
@@ -1,15 +1,8 @@
1
- import { SvelteComponent } from "svelte";
2
- import type { GridYMarkProps } from '../types.js';
3
- declare const __propDef: {
4
- props: GridYMarkProps;
5
- events: {
6
- [evt: string]: CustomEvent<any>;
7
- };
8
- slots: {};
1
+ import type { BaseMarkProps, RawValue } from '../types.js';
2
+ type GridYMarkProps = BaseMarkProps & {
3
+ data?: RawValue[];
4
+ automatic?: boolean;
9
5
  };
10
- export type GridYProps = typeof __propDef.props;
11
- export type GridYEvents = typeof __propDef.events;
12
- export type GridYSlots = typeof __propDef.slots;
13
- export default class GridY extends SvelteComponent<GridYProps, GridYEvents, GridYSlots> {
14
- }
15
- export {};
6
+ declare const GridY: import("svelte").Component<GridYMarkProps, {}, "">;
7
+ type GridY = ReturnType<typeof GridY>;
8
+ export default GridY;
@@ -0,0 +1,91 @@
1
+ <!--
2
+ @component
3
+ For showing custom HTML tooltips positioned at x/y coordinates
4
+ -->
5
+ <script module lang="ts">
6
+ import type { ChannelAccessor, DataRow } from '../types.js';
7
+
8
+ export type HTMLTooltipMarkProps = {
9
+ data: DataRow[];
10
+ x?: ChannelAccessor;
11
+ y?: ChannelAccessor;
12
+ r?: ChannelAccessor;
13
+ };
14
+ </script>
15
+
16
+ <script lang="ts">
17
+ import { getContext } from 'svelte';
18
+ import type { PlotContext } from '../types.js';
19
+
20
+ const { getPlotState } = getContext<PlotContext>('svelteplot');
21
+ let plot = $derived(getPlotState());
22
+
23
+ import { resolveChannel } from '../helpers/resolve.js';
24
+ import { quadtree } from 'd3-quadtree';
25
+ import { projectX, projectY } from '../helpers/scales.js';
26
+
27
+ let { data, x, y, r, children }: HTMLTooltipMarkProps = $props();
28
+
29
+ let datum = $state(false);
30
+ let tooltipX = $state();
31
+ let tooltipY = $state();
32
+
33
+ function onMouseMove(evt: MouseEvent) {
34
+ const pt = tree.find(evt.layerX, evt.layerY, 25);
35
+ if (pt) {
36
+ tooltipX = resolveChannel('x', pt, { x, y, r });
37
+ tooltipY = resolveChannel('y', pt, { x, y, r });
38
+ datum = pt;
39
+ } else {
40
+ datum = false;
41
+ }
42
+ }
43
+
44
+ $effect(() => {
45
+ // plot.body?.addEventListener('mouseenter', onMouseEnter);
46
+ // plot.body?.addEventListener('mouseleave', onMouseLeave);
47
+ plot.body?.addEventListener('mousemove', onMouseMove);
48
+
49
+ return () => {
50
+ // plot.body?.removeEventListener('mouseenter', onMouseEnter);
51
+ // plot.body?.removeEventListener('mouseleave', onMouseLeave);
52
+ plot.body?.removeEventListener('mousemove', onMouseMove);
53
+ };
54
+ });
55
+
56
+ let tree = $derived(
57
+ quadtree()
58
+ .x((d) => projectX('x', plot.scales, resolveChannel('x', d, { x, y, r })))
59
+ .y((d) => projectY('y', plot.scales, resolveChannel('y', d, { x, y, r })))
60
+ .addAll(data)
61
+ );
62
+ </script>
63
+
64
+ <div
65
+ class={['tooltip', { hide: !datum }]}
66
+ style:left="{tooltipX ? projectX('x', plot.scales, tooltipX) : 0}px"
67
+ style:top="{tooltipY ? projectY('y', plot.scales, tooltipY) : 0}px">
68
+ <div class="tooltip-body">
69
+ {@render children({ datum })}
70
+ </div>
71
+ </div>
72
+
73
+ <style>
74
+ div.tooltip {
75
+ background: white;
76
+ background: var(--svelteplot-tooltip-bg);
77
+ border: 1px solid #ccc;
78
+ border-color: var(--svelteplot-tooltip-border);
79
+ font-size: 13px;
80
+ padding: 1ex 1em;
81
+ border-radius: 3px;
82
+ box-shadow:
83
+ rgba(50, 50, 93, 0.25) 0px 2px 5px -1px,
84
+ rgba(0, 0, 0, 0.3) 0px 1px 3px -1px;
85
+ position: absolute;
86
+ pointer-events: none;
87
+ }
88
+ .tooltip.hide {
89
+ display: none;
90
+ }
91
+ </style>
@@ -0,0 +1,11 @@
1
+ import type { ChannelAccessor, DataRow } from '../types.js';
2
+ export type HTMLTooltipMarkProps = {
3
+ data: DataRow[];
4
+ x?: ChannelAccessor;
5
+ y?: ChannelAccessor;
6
+ r?: ChannelAccessor;
7
+ };
8
+ /** For showing custom HTML tooltips positioned at x/y coordinates */
9
+ declare const HtmlTooltip: import("svelte").Component<HTMLTooltipMarkProps, {}, "">;
10
+ type HtmlTooltip = ReturnType<typeof HtmlTooltip>;
11
+ export default HtmlTooltip;