layerchart 2.0.0-next.53 → 2.0.0-next.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Arc.svelte +8 -7
- package/dist/components/Arc.svelte.test.js +1 -1
- package/dist/components/ArcLabel.svelte +1 -1
- package/dist/components/Axis.svelte +10 -2
- package/dist/components/Axis.svelte.d.ts +8 -2
- package/dist/components/Bar.svelte +10 -38
- package/dist/components/Circle.svelte +23 -3
- package/dist/components/Circle.svelte.d.ts +6 -0
- package/dist/components/CircleClipPath.svelte +13 -31
- package/dist/components/CircleClipPath.svelte.d.ts +7 -1
- package/dist/components/ClipPath.svelte +64 -21
- package/dist/components/ClipPath.svelte.d.ts +21 -12
- package/dist/components/Connector.svelte +18 -0
- package/dist/components/Connector.svelte.d.ts +5 -0
- package/dist/components/GeoClipPath.svelte +72 -0
- package/dist/components/GeoClipPath.svelte.d.ts +35 -0
- package/dist/components/Grid.svelte +15 -4
- package/dist/components/Grid.svelte.d.ts +14 -4
- package/dist/components/Highlight.svelte +1 -0
- package/dist/components/Hull.svelte +20 -2
- package/dist/components/Hull.svelte.d.ts +2 -2
- package/dist/components/Line.svelte +30 -3
- package/dist/components/Line.svelte.d.ts +7 -0
- package/dist/components/Link.svelte +9 -0
- package/dist/components/Pie.svelte +8 -2
- package/dist/components/Rect.svelte +98 -7
- package/dist/components/Rect.svelte.d.ts +13 -1
- package/dist/components/RectClipPath.svelte +11 -15
- package/dist/components/RectClipPath.svelte.d.ts +6 -0
- package/dist/components/Text.svelte +70 -16
- package/dist/components/Text.svelte.d.ts +10 -0
- package/dist/components/Tree.svelte +7 -3
- package/dist/components/charts/BarChart.svelte.test.js +1 -1
- package/dist/components/charts/DefaultTooltip.svelte.test.js +18 -18
- package/dist/components/charts/LineChart.svelte.test.js +1 -1
- package/dist/components/charts/PieChart.svelte.test.js +2 -2
- package/dist/components/charts/__screenshots__/BarChart.svelte.test.ts/BarChart-series-tooltip-should-use-explicit-series-colors--not-color-scale-1.png +0 -0
- package/dist/components/charts/__screenshots__/BarChart.svelte.test.ts/BarChart-series-tooltip-should-use-explicit-series-colors--not-color-scale-2.png +0 -0
- package/dist/components/charts/__screenshots__/DefaultTooltip.svelte.test.ts/DefaultTooltip-AreaChart--multi-series--quadtree-x-mode--should-fade-non-highlighted-tooltip-series-items-on-hover-1.png +0 -0
- package/dist/components/charts/__screenshots__/DefaultTooltip.svelte.test.ts/DefaultTooltip-AreaChart--multi-series--quadtree-x-mode--should-fade-non-highlighted-tooltip-series-items-on-hover-2.png +0 -0
- package/dist/components/charts/__screenshots__/DefaultTooltip.svelte.test.ts/DefaultTooltip-AreaChart--multi-series--quadtree-x-mode--should-show-header-and-all-series-items-1.png +0 -0
- package/dist/components/charts/__screenshots__/DefaultTooltip.svelte.test.ts/DefaultTooltip-AreaChart--multi-series--quadtree-x-mode--should-show-header-and-all-series-items-2.png +0 -0
- package/dist/components/charts/__screenshots__/DefaultTooltip.svelte.test.ts/DefaultTooltip-AreaChart--multi-series--quadtree-x-mode--should-show-series-colors-in-tooltip-items-1.png +0 -0
- package/dist/components/charts/__screenshots__/DefaultTooltip.svelte.test.ts/DefaultTooltip-AreaChart--multi-series--quadtree-x-mode--should-show-series-colors-in-tooltip-items-2.png +0 -0
- package/dist/components/charts/__screenshots__/DefaultTooltip.svelte.test.ts/DefaultTooltip-AreaChart--multi-series--quadtree-x-mode--should-show-single-series-without-total-1.png +0 -0
- package/dist/components/charts/__screenshots__/DefaultTooltip.svelte.test.ts/DefaultTooltip-AreaChart--multi-series--quadtree-x-mode--should-show-single-series-without-total-2.png +0 -0
- package/dist/components/charts/__screenshots__/DefaultTooltip.svelte.test.ts/DefaultTooltip-LineChart--multi-series--quadtree-x-mode--should-show-header-and-all-series-items-1.png +0 -0
- package/dist/components/charts/__screenshots__/DefaultTooltip.svelte.test.ts/DefaultTooltip-LineChart--multi-series--quadtree-x-mode--should-show-header-and-all-series-items-2.png +0 -0
- package/dist/components/charts/__screenshots__/DefaultTooltip.svelte.test.ts/DefaultTooltip-ScatterChart--single-point--quadtree-mode--should-show-series-header-for-multi-series-1.png +0 -0
- package/dist/components/charts/__screenshots__/DefaultTooltip.svelte.test.ts/DefaultTooltip-ScatterChart--single-point--quadtree-mode--should-show-series-header-for-multi-series-2.png +0 -0
- package/dist/components/charts/__screenshots__/DefaultTooltip.svelte.test.ts/DefaultTooltip-ScatterChart--single-point--quadtree-mode--should-show-x--y--and-r-items-when-r-is-configured-1.png +0 -0
- package/dist/components/charts/__screenshots__/DefaultTooltip.svelte.test.ts/DefaultTooltip-ScatterChart--single-point--quadtree-mode--should-show-x--y--and-r-items-when-r-is-configured-2.png +0 -0
- package/dist/components/charts/__screenshots__/DefaultTooltip.svelte.test.ts/DefaultTooltip-ScatterChart--single-point--quadtree-mode--should-show-x-and-y-items-in-tooltip-1.png +0 -0
- package/dist/components/charts/__screenshots__/DefaultTooltip.svelte.test.ts/DefaultTooltip-ScatterChart--single-point--quadtree-mode--should-show-x-and-y-items-in-tooltip-2.png +0 -0
- package/dist/components/charts/__screenshots__/LineChart.svelte.test.ts/LineChart-tooltip-should-prefer-cScale-color-over-default-series-color-when-cScale-is-explicitly-provided-1.png +0 -0
- package/dist/components/charts/__screenshots__/LineChart.svelte.test.ts/LineChart-tooltip-should-prefer-cScale-color-over-default-series-color-when-cScale-is-explicitly-provided-2.png +0 -0
- package/dist/components/charts/__screenshots__/PieChart.svelte.test.ts/PieChart-uses-hovered-slice-identity-for-implicit-tooltip-series-1.png +0 -0
- package/dist/components/charts/__screenshots__/PieChart.svelte.test.ts/PieChart-uses-hovered-slice-identity-for-implicit-tooltip-series-2.png +0 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.js +2 -0
- package/dist/components/tooltip/Tooltip.svelte +145 -29
- package/dist/components/tooltip/Tooltip.svelte.d.ts +16 -0
- package/dist/components/tooltip/Tooltip.svelte.test.d.ts +1 -0
- package/dist/components/tooltip/Tooltip.svelte.test.js +294 -0
- package/dist/components/tooltip/__screenshots__/Tooltip.svelte.test.ts/Tooltip-portal-should-portal-tooltip-to-a-custom-selector-target-1.png +0 -0
- package/dist/components/tooltip/__screenshots__/Tooltip.svelte.test.ts/Tooltip-portal-should-portal-tooltip-to-a-custom-selector-target-2.png +0 -0
- package/dist/components/tooltip/__screenshots__/Tooltip.svelte.test.ts/Tooltip-portal-should-render-tooltip-inline-when-portal-is-false-1.png +0 -0
- package/dist/components/tooltip/__screenshots__/Tooltip.svelte.test.ts/Tooltip-portal-should-render-tooltip-inline-when-portal-is-false-2.png +0 -0
- package/dist/utils/__screenshots__/canvas.svelte.test.ts/renderPathData-composes-element-opacity-with-inherited-globalAlpha--Group-opacity--1.png +0 -0
- package/dist/utils/__screenshots__/canvas.svelte.test.ts/renderPathData-composes-element-opacity-with-inherited-globalAlpha--Group-opacity--2.png +0 -0
- package/dist/utils/canvas.d.ts +2 -0
- package/dist/utils/canvas.js +13 -7
- package/dist/utils/canvas.svelte.test.js +55 -0
- package/dist/utils/connectorUtils.d.ts +13 -0
- package/dist/utils/connectorUtils.js +120 -1
- package/dist/utils/path.d.ts +19 -0
- package/dist/utils/path.js +72 -0
- package/dist/utils/rect.svelte.d.ts +18 -0
- package/dist/utils/rect.svelte.js +33 -0
- package/package.json +13 -13
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script lang="ts" module>
|
|
2
|
-
import
|
|
2
|
+
import { type RectPropsWithoutHTML } from './Rect.svelte';
|
|
3
3
|
import type { CommonEvents, Without } from '../utils/types.js';
|
|
4
4
|
import type { SVGAttributes } from 'svelte/elements';
|
|
5
5
|
import type { Snippet } from 'svelte';
|
|
@@ -45,6 +45,13 @@
|
|
|
45
45
|
*/
|
|
46
46
|
disabled?: boolean;
|
|
47
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Invert the clip — content renders *outside* the rect.
|
|
50
|
+
*
|
|
51
|
+
* @default false
|
|
52
|
+
*/
|
|
53
|
+
invert?: boolean;
|
|
54
|
+
|
|
48
55
|
/**
|
|
49
56
|
* The default children snippet which provides
|
|
50
57
|
* the id and url for the clipPath.
|
|
@@ -65,7 +72,6 @@
|
|
|
65
72
|
<script lang="ts">
|
|
66
73
|
import ClipPath from './ClipPath.svelte';
|
|
67
74
|
import { createId } from '../utils/createId.js';
|
|
68
|
-
import { extractLayerProps } from '../utils/attributes.js';
|
|
69
75
|
import type { MotionProp } from '../utils/motion.svelte.js';
|
|
70
76
|
|
|
71
77
|
const uid = $props.id();
|
|
@@ -77,24 +83,14 @@
|
|
|
77
83
|
width,
|
|
78
84
|
height,
|
|
79
85
|
disabled = false,
|
|
86
|
+
invert = false,
|
|
80
87
|
children: childrenProp,
|
|
81
|
-
...restProps
|
|
82
88
|
}: RectClipPathProps = $props();
|
|
83
89
|
|
|
84
|
-
|
|
85
|
-
ctx.beginPath();
|
|
86
|
-
ctx.rect(x, y, width, height);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function canvasClipDeps() {
|
|
90
|
-
return [x, y, width, height];
|
|
91
|
-
}
|
|
90
|
+
const path = $derived(`M${x},${y} h${width} v${height} h${-width} Z`);
|
|
92
91
|
</script>
|
|
93
92
|
|
|
94
|
-
<ClipPath {id} {disabled} {
|
|
95
|
-
{#snippet clip()}
|
|
96
|
-
<Rect {x} {y} {width} {height} {...extractLayerProps(restProps, 'lc-clip-path-rect')} />
|
|
97
|
-
{/snippet}
|
|
93
|
+
<ClipPath {id} {disabled} {invert} {path}>
|
|
98
94
|
{#snippet children({ url })}
|
|
99
95
|
{@render childrenProp?.({ id, url })}
|
|
100
96
|
{/snippet}
|
|
@@ -37,6 +37,12 @@ export type BaseRectClipPathPropsWithoutHTML = {
|
|
|
37
37
|
* @default false
|
|
38
38
|
*/
|
|
39
39
|
disabled?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Invert the clip — content renders *outside* the rect.
|
|
42
|
+
*
|
|
43
|
+
* @default false
|
|
44
|
+
*/
|
|
45
|
+
invert?: boolean;
|
|
40
46
|
/**
|
|
41
47
|
* The default children snippet which provides
|
|
42
48
|
* the id and url for the clipPath.
|
|
@@ -24,6 +24,11 @@
|
|
|
24
24
|
return false;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
export type TextSegment = {
|
|
28
|
+
value: string | number;
|
|
29
|
+
class?: string;
|
|
30
|
+
};
|
|
31
|
+
|
|
27
32
|
export type TextPropsWithoutHTML = {
|
|
28
33
|
/**
|
|
29
34
|
* Text value to render.
|
|
@@ -36,6 +41,13 @@
|
|
|
36
41
|
*/
|
|
37
42
|
value?: string | number | ((d: any) => string | number);
|
|
38
43
|
|
|
44
|
+
/**
|
|
45
|
+
* Array of styled text segments for inline mixed styling.
|
|
46
|
+
* Each segment has its own value and optional class.
|
|
47
|
+
* Mutually exclusive with `value`.
|
|
48
|
+
*/
|
|
49
|
+
segments?: TextSegment[];
|
|
50
|
+
|
|
39
51
|
/**
|
|
40
52
|
* Maximum width to occupy (approximate as words are not split)
|
|
41
53
|
*/
|
|
@@ -256,6 +268,7 @@
|
|
|
256
268
|
|
|
257
269
|
let {
|
|
258
270
|
value,
|
|
271
|
+
segments,
|
|
259
272
|
x = 0,
|
|
260
273
|
initialX,
|
|
261
274
|
y = 0,
|
|
@@ -670,14 +683,30 @@
|
|
|
670
683
|
const textAlign = textAnchor === 'middle' ? 'center' : textAnchor === 'end' ? 'end' : 'start';
|
|
671
684
|
ctx.textAlign = textAlign;
|
|
672
685
|
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
const
|
|
686
|
+
if (segments) {
|
|
687
|
+
let xOffset = baseX;
|
|
688
|
+
for (const segment of segments) {
|
|
689
|
+
const segStyles = getTextStyles(undefined, undefined, undefined, undefined, undefined, segment.class);
|
|
690
|
+
const text = String(segment.value);
|
|
691
|
+
// Set font before rendering and measuring so width is accurate
|
|
692
|
+
const segComputedStyles = getComputedStyles(ctx.canvas, segStyles);
|
|
693
|
+
const fontWeight = segComputedStyles.fontWeight || '';
|
|
694
|
+
const fontSize = segComputedStyles.fontSize || '10px';
|
|
695
|
+
const fontFamily = segComputedStyles.fontFamily || 'sans-serif';
|
|
696
|
+
ctx.font = `${fontWeight} ${fontSize} ${fontFamily}`.trim();
|
|
697
|
+
renderText(ctx, text, { x: xOffset, y: baseY }, segStyles);
|
|
698
|
+
xOffset += ctx.measureText(text).width;
|
|
699
|
+
}
|
|
700
|
+
} else {
|
|
701
|
+
for (let index = 0; index < wordsByLines.length; index++) {
|
|
702
|
+
const line = wordsByLines[index];
|
|
703
|
+
const text = line.words.join(' ');
|
|
676
704
|
|
|
677
|
-
|
|
678
|
-
|
|
705
|
+
const xPos = baseX;
|
|
706
|
+
const yPos = baseY + index * effectiveLineHeight;
|
|
679
707
|
|
|
680
|
-
|
|
708
|
+
renderText(ctx, text, { x: xPos, y: yPos }, styles);
|
|
709
|
+
}
|
|
681
710
|
}
|
|
682
711
|
|
|
683
712
|
ctx.restore();
|
|
@@ -708,6 +737,7 @@
|
|
|
708
737
|
dataMode,
|
|
709
738
|
dataMode ? resolvedItems : null,
|
|
710
739
|
value,
|
|
740
|
+
segments,
|
|
711
741
|
motionX.current,
|
|
712
742
|
motionY.current,
|
|
713
743
|
fillKey!.current,
|
|
@@ -806,15 +836,26 @@
|
|
|
806
836
|
opacity={staticOpacity}
|
|
807
837
|
class={['lc-text', staticClassName]}
|
|
808
838
|
>
|
|
809
|
-
{#
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
839
|
+
{#if segments}
|
|
840
|
+
{#each segments as segment, index (index)}
|
|
841
|
+
<tspan
|
|
842
|
+
dy={index === 0 ? startDy : 0}
|
|
843
|
+
class={['lc-text-tspan', segment.class]}
|
|
844
|
+
>
|
|
845
|
+
{segment.value}
|
|
846
|
+
</tspan>
|
|
847
|
+
{/each}
|
|
848
|
+
{:else}
|
|
849
|
+
{#each wordsByLines as line, index (index)}
|
|
850
|
+
<tspan
|
|
851
|
+
x={motionX.current}
|
|
852
|
+
dy={index === 0 ? startDy : getPixelValue(lineHeight)}
|
|
853
|
+
class="lc-text-tspan"
|
|
854
|
+
>
|
|
855
|
+
{line.words.join(' ')}
|
|
856
|
+
</tspan>
|
|
857
|
+
{/each}
|
|
858
|
+
{/if}
|
|
818
859
|
</text>
|
|
819
860
|
{/if}
|
|
820
861
|
</svg>
|
|
@@ -823,6 +864,9 @@
|
|
|
823
864
|
{#if dataMode}
|
|
824
865
|
{#each resolvedItems as item (item.key)}
|
|
825
866
|
{@const text = resolveTextValue(item.d)}
|
|
867
|
+
{@const resolvedFill = resolveColorProp(fill, item.d, chartCtx.cScale)}
|
|
868
|
+
{@const resolvedFillOpacity = resolveStyleProp(fillOpacity, item.d)}
|
|
869
|
+
{@const resolvedOpacity = resolveStyleProp(opacity, item.d)}
|
|
826
870
|
{@const resolvedClass = resolveStyleProp(className, item.d)}
|
|
827
871
|
{@const translateX = textAnchor === 'middle' ? '-50%' : textAnchor === 'end' ? '-100%' : '0%'}
|
|
828
872
|
{@const translateY =
|
|
@@ -840,6 +884,8 @@
|
|
|
840
884
|
{textAnchor === 'middle' ? 'center' : textAnchor === 'end' ? 'right' : 'left'}"
|
|
841
885
|
style:white-space="pre-wrap"
|
|
842
886
|
style:line-height={lineHeight}
|
|
887
|
+
style:color={resolvedFill}
|
|
888
|
+
style:opacity={resolvedOpacity ?? resolvedFillOpacity}
|
|
843
889
|
class={['lc-text', resolvedClass]}
|
|
844
890
|
>
|
|
845
891
|
{text}
|
|
@@ -862,9 +908,17 @@
|
|
|
862
908
|
{textAnchor === 'middle' ? 'center' : textAnchor === 'end' ? 'right' : 'left'}"
|
|
863
909
|
style:white-space="pre-wrap"
|
|
864
910
|
style:line-height={lineHeight}
|
|
911
|
+
style:color={staticFill}
|
|
912
|
+
style:opacity={staticOpacity ?? staticFillOpacity}
|
|
865
913
|
class={['lc-text', staticClassName]}
|
|
866
914
|
>
|
|
867
|
-
{
|
|
915
|
+
{#if segments}
|
|
916
|
+
{#each segments as segment}
|
|
917
|
+
<span class={segment.class}>{segment.value}</span>
|
|
918
|
+
{/each}
|
|
919
|
+
{:else}
|
|
920
|
+
{textValue}
|
|
921
|
+
{/if}
|
|
868
922
|
</div>
|
|
869
923
|
{/if}
|
|
870
924
|
{/if}
|
|
@@ -9,6 +9,10 @@ import type { FormatType, FormatConfig } from '@layerstack/utils';
|
|
|
9
9
|
* Strings are data props unless they look like CSS values (e.g. "50%", "1em").
|
|
10
10
|
*/
|
|
11
11
|
export declare function isTextDataProp(value: any): boolean;
|
|
12
|
+
export type TextSegment = {
|
|
13
|
+
value: string | number;
|
|
14
|
+
class?: string;
|
|
15
|
+
};
|
|
12
16
|
export type TextPropsWithoutHTML = {
|
|
13
17
|
/**
|
|
14
18
|
* Text value to render.
|
|
@@ -20,6 +24,12 @@ export type TextPropsWithoutHTML = {
|
|
|
20
24
|
* @default 0
|
|
21
25
|
*/
|
|
22
26
|
value?: string | number | ((d: any) => string | number);
|
|
27
|
+
/**
|
|
28
|
+
* Array of styled text segments for inline mixed styling.
|
|
29
|
+
* Each segment has its own value and optional class.
|
|
30
|
+
* Mutually exclusive with `value`.
|
|
31
|
+
*/
|
|
32
|
+
segments?: TextSegment[];
|
|
23
33
|
/**
|
|
24
34
|
* Maximum width to occupy (approximate as words are not split)
|
|
25
35
|
*/
|
|
@@ -49,9 +49,13 @@
|
|
|
49
49
|
const ctx = getChartContext();
|
|
50
50
|
|
|
51
51
|
const treeData = $derived.by(() => {
|
|
52
|
-
const _tree =
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
const _tree = ctx.radial
|
|
53
|
+
? d3Tree<T>()
|
|
54
|
+
.size([2 * Math.PI, Math.min(ctx.width, ctx.height) / 2])
|
|
55
|
+
.separation((a, b) => (a.parent === b.parent ? 1 : 2) / a.depth)
|
|
56
|
+
: d3Tree<T>().size(
|
|
57
|
+
orientation === 'horizontal' ? [ctx.height, ctx.width] : [ctx.width, ctx.height]
|
|
58
|
+
);
|
|
55
59
|
|
|
56
60
|
if (nodeSize) {
|
|
57
61
|
_tree.nodeSize(nodeSize);
|
|
@@ -254,7 +254,7 @@ describe('BarChart', () => {
|
|
|
254
254
|
tooltipRect.dispatchEvent(new PointerEvent('pointerenter', eventInit));
|
|
255
255
|
tooltipRect.dispatchEvent(new PointerEvent('pointermove', eventInit));
|
|
256
256
|
await vi.waitFor(() => {
|
|
257
|
-
const colorDots =
|
|
257
|
+
const colorDots = document.querySelectorAll('.lc-tooltip-item-color');
|
|
258
258
|
expect(colorDots.length).toBe(4);
|
|
259
259
|
const colors = Array.from(colorDots).map((dot) => dot.style.getPropertyValue('--color'));
|
|
260
260
|
expect(colors).toEqual([
|
|
@@ -50,14 +50,14 @@ describe('DefaultTooltip', () => {
|
|
|
50
50
|
await expect.element(tooltipCtx).toBeInTheDocument();
|
|
51
51
|
triggerTooltip(tooltipCtx);
|
|
52
52
|
await vi.waitFor(() => {
|
|
53
|
-
// Should have a header
|
|
54
|
-
const header =
|
|
53
|
+
// Should have a header (portaled to body)
|
|
54
|
+
const header = document.querySelector('.lc-tooltip-header');
|
|
55
55
|
expect(header).not.toBeNull();
|
|
56
56
|
// Should have 4 tooltip items (3 series + 1 total)
|
|
57
|
-
const items =
|
|
57
|
+
const items = document.querySelectorAll('.lc-tooltip-item-root');
|
|
58
58
|
expect(items.length).toBe(4);
|
|
59
59
|
// Labels should match series keys + total
|
|
60
|
-
const labels =
|
|
60
|
+
const labels = document.querySelectorAll('.lc-tooltip-item-label');
|
|
61
61
|
expect(labels.length).toBe(4);
|
|
62
62
|
const labelTexts = Array.from(labels).map((l) => l.textContent?.trim());
|
|
63
63
|
expect(labelTexts).toEqual(['apples', 'bananas', 'oranges', 'total']);
|
|
@@ -75,7 +75,7 @@ describe('DefaultTooltip', () => {
|
|
|
75
75
|
await expect.element(tooltipCtx).toBeInTheDocument();
|
|
76
76
|
triggerTooltip(tooltipCtx);
|
|
77
77
|
await vi.waitFor(() => {
|
|
78
|
-
const colorDots =
|
|
78
|
+
const colorDots = document.querySelectorAll('.lc-tooltip-item-color');
|
|
79
79
|
expect(colorDots.length).toBe(3);
|
|
80
80
|
const colors = Array.from(colorDots).map((dot) => dot.style.getPropertyValue('--color'));
|
|
81
81
|
expect(colors).toEqual(['rgb(255, 0, 0)', 'rgb(0, 128, 0)', 'rgb(255, 165, 0)']);
|
|
@@ -93,11 +93,11 @@ describe('DefaultTooltip', () => {
|
|
|
93
93
|
await expect.element(tooltipCtx).toBeInTheDocument();
|
|
94
94
|
triggerTooltip(tooltipCtx);
|
|
95
95
|
await vi.waitFor(() => {
|
|
96
|
-
const items =
|
|
96
|
+
const items = document.querySelectorAll('.lc-tooltip-item-root');
|
|
97
97
|
expect(items.length).toBe(4);
|
|
98
98
|
});
|
|
99
|
-
const items = Array.from(
|
|
100
|
-
const labels = Array.from(
|
|
99
|
+
const items = Array.from(document.querySelectorAll('.lc-tooltip-item-root'));
|
|
100
|
+
const labels = Array.from(document.querySelectorAll('.lc-tooltip-item-label'));
|
|
101
101
|
triggerPointerEvent(items[0], 'pointerenter');
|
|
102
102
|
await vi.waitFor(() => {
|
|
103
103
|
expect(items[0].dataset.highlighted).toBe('true');
|
|
@@ -133,7 +133,7 @@ describe('DefaultTooltip', () => {
|
|
|
133
133
|
await expect.element(tooltipCtx).toBeInTheDocument();
|
|
134
134
|
triggerTooltip(tooltipCtx);
|
|
135
135
|
await vi.waitFor(() => {
|
|
136
|
-
const items =
|
|
136
|
+
const items = document.querySelectorAll('.lc-tooltip-item-root');
|
|
137
137
|
// 1 series item, no total
|
|
138
138
|
expect(items.length).toBe(1);
|
|
139
139
|
});
|
|
@@ -152,12 +152,12 @@ describe('DefaultTooltip', () => {
|
|
|
152
152
|
await expect.element(tooltipCtx).toBeInTheDocument();
|
|
153
153
|
triggerTooltip(tooltipCtx);
|
|
154
154
|
await vi.waitFor(() => {
|
|
155
|
-
const header =
|
|
155
|
+
const header = document.querySelector('.lc-tooltip-header');
|
|
156
156
|
expect(header).not.toBeNull();
|
|
157
157
|
// 3 series + 1 total = 4 items
|
|
158
|
-
const items =
|
|
158
|
+
const items = document.querySelectorAll('.lc-tooltip-item-root');
|
|
159
159
|
expect(items.length).toBe(4);
|
|
160
|
-
const labels =
|
|
160
|
+
const labels = document.querySelectorAll('.lc-tooltip-item-label');
|
|
161
161
|
const labelTexts = Array.from(labels).map((l) => l.textContent?.trim());
|
|
162
162
|
expect(labelTexts).toEqual(['apples', 'bananas', 'oranges', 'total']);
|
|
163
163
|
});
|
|
@@ -176,10 +176,10 @@ describe('DefaultTooltip', () => {
|
|
|
176
176
|
await expect.element(tooltipCtx).toBeInTheDocument();
|
|
177
177
|
triggerTooltip(tooltipCtx);
|
|
178
178
|
await vi.waitFor(() => {
|
|
179
|
-
const items =
|
|
179
|
+
const items = document.querySelectorAll('.lc-tooltip-item-root');
|
|
180
180
|
// Should show x and y items
|
|
181
181
|
expect(items.length).toBe(2);
|
|
182
|
-
const labels = Array.from(
|
|
182
|
+
const labels = Array.from(document.querySelectorAll('.lc-tooltip-item-label')).map((l) => l.textContent?.trim());
|
|
183
183
|
expect(labels).toEqual(['x', 'y']);
|
|
184
184
|
});
|
|
185
185
|
});
|
|
@@ -196,10 +196,10 @@ describe('DefaultTooltip', () => {
|
|
|
196
196
|
await expect.element(tooltipCtx).toBeInTheDocument();
|
|
197
197
|
triggerTooltip(tooltipCtx);
|
|
198
198
|
await vi.waitFor(() => {
|
|
199
|
-
const items =
|
|
199
|
+
const items = document.querySelectorAll('.lc-tooltip-item-root');
|
|
200
200
|
// Should show x, y, and r items
|
|
201
201
|
expect(items.length).toBe(3);
|
|
202
|
-
const labels = Array.from(
|
|
202
|
+
const labels = Array.from(document.querySelectorAll('.lc-tooltip-item-label')).map((l) => l.textContent?.trim());
|
|
203
203
|
expect(labels).toEqual(['x', 'y', 'size']);
|
|
204
204
|
});
|
|
205
205
|
});
|
|
@@ -219,11 +219,11 @@ describe('DefaultTooltip', () => {
|
|
|
219
219
|
triggerTooltip(tooltipCtx);
|
|
220
220
|
await vi.waitFor(() => {
|
|
221
221
|
// Should show a header with the series name
|
|
222
|
-
const header =
|
|
222
|
+
const header = document.querySelector('.lc-tooltip-header');
|
|
223
223
|
expect(header).not.toBeNull();
|
|
224
224
|
expect(header.textContent).not.toBe('');
|
|
225
225
|
// Should show x and y items
|
|
226
|
-
const items =
|
|
226
|
+
const items = document.querySelectorAll('.lc-tooltip-item-root');
|
|
227
227
|
expect(items.length).toBe(2);
|
|
228
228
|
});
|
|
229
229
|
});
|
|
@@ -33,7 +33,7 @@ describe('LineChart', () => {
|
|
|
33
33
|
tooltipRect.dispatchEvent(new PointerEvent('pointerenter', eventInit));
|
|
34
34
|
tooltipRect.dispatchEvent(new PointerEvent('pointermove', eventInit));
|
|
35
35
|
await vi.waitFor(() => {
|
|
36
|
-
const colorDot =
|
|
36
|
+
const colorDot = document.querySelector('.lc-tooltip-item-color');
|
|
37
37
|
expect(colorDot).not.toBeNull();
|
|
38
38
|
const color = colorDot.style.getPropertyValue('--color');
|
|
39
39
|
// Should NOT be the default series color
|
|
@@ -27,8 +27,8 @@ describe('PieChart', () => {
|
|
|
27
27
|
arc.dispatchEvent(new PointerEvent('pointerenter', eventInit));
|
|
28
28
|
arc.dispatchEvent(new PointerEvent('pointermove', eventInit));
|
|
29
29
|
await vi.waitFor(() => {
|
|
30
|
-
const tooltipLabel =
|
|
31
|
-
const tooltipValue =
|
|
30
|
+
const tooltipLabel = document.querySelector('.lc-tooltip-item-label');
|
|
31
|
+
const tooltipValue = document.querySelector('.lc-tooltip-item-value');
|
|
32
32
|
expect(tooltipLabel?.textContent).toContain('chrome');
|
|
33
33
|
expect(tooltipValue?.textContent).toContain('275');
|
|
34
34
|
});
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -66,6 +66,8 @@ export { default as GeoProjection } from './GeoProjection.svelte';
|
|
|
66
66
|
export * from './GeoProjection.svelte';
|
|
67
67
|
export { default as GeoEdgeFade } from './GeoEdgeFade.svelte';
|
|
68
68
|
export * from './GeoEdgeFade.svelte';
|
|
69
|
+
export { default as GeoClipPath } from './GeoClipPath.svelte';
|
|
70
|
+
export * from './GeoClipPath.svelte';
|
|
69
71
|
export { default as GeoPath } from './GeoPath.svelte';
|
|
70
72
|
export * from './GeoPath.svelte';
|
|
71
73
|
export { default as GeoPoint } from './GeoPoint.svelte';
|
package/dist/components/index.js
CHANGED
|
@@ -66,6 +66,8 @@ export { default as GeoProjection } from './GeoProjection.svelte';
|
|
|
66
66
|
export * from './GeoProjection.svelte';
|
|
67
67
|
export { default as GeoEdgeFade } from './GeoEdgeFade.svelte';
|
|
68
68
|
export * from './GeoEdgeFade.svelte';
|
|
69
|
+
export { default as GeoClipPath } from './GeoClipPath.svelte';
|
|
70
|
+
export * from './GeoClipPath.svelte';
|
|
69
71
|
export { default as GeoPath } from './GeoPath.svelte';
|
|
70
72
|
export * from './GeoPath.svelte';
|
|
71
73
|
export { default as GeoPoint } from './GeoPoint.svelte';
|