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.
Files changed (80) hide show
  1. package/dist/components/Arc.svelte +8 -7
  2. package/dist/components/Arc.svelte.test.js +1 -1
  3. package/dist/components/ArcLabel.svelte +1 -1
  4. package/dist/components/Axis.svelte +10 -2
  5. package/dist/components/Axis.svelte.d.ts +8 -2
  6. package/dist/components/Bar.svelte +10 -38
  7. package/dist/components/Circle.svelte +23 -3
  8. package/dist/components/Circle.svelte.d.ts +6 -0
  9. package/dist/components/CircleClipPath.svelte +13 -31
  10. package/dist/components/CircleClipPath.svelte.d.ts +7 -1
  11. package/dist/components/ClipPath.svelte +64 -21
  12. package/dist/components/ClipPath.svelte.d.ts +21 -12
  13. package/dist/components/Connector.svelte +18 -0
  14. package/dist/components/Connector.svelte.d.ts +5 -0
  15. package/dist/components/GeoClipPath.svelte +72 -0
  16. package/dist/components/GeoClipPath.svelte.d.ts +35 -0
  17. package/dist/components/Grid.svelte +15 -4
  18. package/dist/components/Grid.svelte.d.ts +14 -4
  19. package/dist/components/Highlight.svelte +1 -0
  20. package/dist/components/Hull.svelte +20 -2
  21. package/dist/components/Hull.svelte.d.ts +2 -2
  22. package/dist/components/Line.svelte +30 -3
  23. package/dist/components/Line.svelte.d.ts +7 -0
  24. package/dist/components/Link.svelte +9 -0
  25. package/dist/components/Pie.svelte +8 -2
  26. package/dist/components/Rect.svelte +98 -7
  27. package/dist/components/Rect.svelte.d.ts +13 -1
  28. package/dist/components/RectClipPath.svelte +11 -15
  29. package/dist/components/RectClipPath.svelte.d.ts +6 -0
  30. package/dist/components/Text.svelte +70 -16
  31. package/dist/components/Text.svelte.d.ts +10 -0
  32. package/dist/components/Tree.svelte +7 -3
  33. package/dist/components/charts/BarChart.svelte.test.js +1 -1
  34. package/dist/components/charts/DefaultTooltip.svelte.test.js +18 -18
  35. package/dist/components/charts/LineChart.svelte.test.js +1 -1
  36. package/dist/components/charts/PieChart.svelte.test.js +2 -2
  37. package/dist/components/charts/__screenshots__/BarChart.svelte.test.ts/BarChart-series-tooltip-should-use-explicit-series-colors--not-color-scale-1.png +0 -0
  38. package/dist/components/charts/__screenshots__/BarChart.svelte.test.ts/BarChart-series-tooltip-should-use-explicit-series-colors--not-color-scale-2.png +0 -0
  39. 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
  40. 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
  41. 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
  42. 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
  43. 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
  44. 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
  45. 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
  46. 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
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. 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
  53. 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
  54. 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
  55. 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
  56. 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
  57. package/dist/components/charts/__screenshots__/PieChart.svelte.test.ts/PieChart-uses-hovered-slice-identity-for-implicit-tooltip-series-1.png +0 -0
  58. package/dist/components/charts/__screenshots__/PieChart.svelte.test.ts/PieChart-uses-hovered-slice-identity-for-implicit-tooltip-series-2.png +0 -0
  59. package/dist/components/index.d.ts +2 -0
  60. package/dist/components/index.js +2 -0
  61. package/dist/components/tooltip/Tooltip.svelte +145 -29
  62. package/dist/components/tooltip/Tooltip.svelte.d.ts +16 -0
  63. package/dist/components/tooltip/Tooltip.svelte.test.d.ts +1 -0
  64. package/dist/components/tooltip/Tooltip.svelte.test.js +294 -0
  65. package/dist/components/tooltip/__screenshots__/Tooltip.svelte.test.ts/Tooltip-portal-should-portal-tooltip-to-a-custom-selector-target-1.png +0 -0
  66. package/dist/components/tooltip/__screenshots__/Tooltip.svelte.test.ts/Tooltip-portal-should-portal-tooltip-to-a-custom-selector-target-2.png +0 -0
  67. package/dist/components/tooltip/__screenshots__/Tooltip.svelte.test.ts/Tooltip-portal-should-render-tooltip-inline-when-portal-is-false-1.png +0 -0
  68. package/dist/components/tooltip/__screenshots__/Tooltip.svelte.test.ts/Tooltip-portal-should-render-tooltip-inline-when-portal-is-false-2.png +0 -0
  69. package/dist/utils/__screenshots__/canvas.svelte.test.ts/renderPathData-composes-element-opacity-with-inherited-globalAlpha--Group-opacity--1.png +0 -0
  70. package/dist/utils/__screenshots__/canvas.svelte.test.ts/renderPathData-composes-element-opacity-with-inherited-globalAlpha--Group-opacity--2.png +0 -0
  71. package/dist/utils/canvas.d.ts +2 -0
  72. package/dist/utils/canvas.js +13 -7
  73. package/dist/utils/canvas.svelte.test.js +55 -0
  74. package/dist/utils/connectorUtils.d.ts +13 -0
  75. package/dist/utils/connectorUtils.js +120 -1
  76. package/dist/utils/path.d.ts +19 -0
  77. package/dist/utils/path.js +72 -0
  78. package/dist/utils/rect.svelte.d.ts +18 -0
  79. package/dist/utils/rect.svelte.js +33 -0
  80. package/package.json +13 -13
@@ -1,5 +1,5 @@
1
1
  <script lang="ts" module>
2
- import Rect, { type RectPropsWithoutHTML } from './Rect.svelte';
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
- function canvasClip(ctx: CanvasRenderingContext2D) {
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} {canvasClip} {canvasClipDeps}>
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
- for (let index = 0; index < wordsByLines.length; index++) {
674
- const line = wordsByLines[index];
675
- const text = line.words.join(' ');
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
- const xPos = baseX;
678
- const yPos = baseY + index * effectiveLineHeight;
705
+ const xPos = baseX;
706
+ const yPos = baseY + index * effectiveLineHeight;
679
707
 
680
- renderText(ctx, text, { x: xPos, y: yPos }, styles);
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
- {#each wordsByLines as line, index}
810
- <tspan
811
- x={motionX.current}
812
- dy={index === 0 ? startDy : getPixelValue(lineHeight)}
813
- class="lc-text-tspan"
814
- >
815
- {line.words.join(' ')}
816
- </tspan>
817
- {/each}
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
- {textValue}
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 = d3Tree<T>().size(
53
- orientation === 'horizontal' ? [ctx.height, ctx.width] : [ctx.width, ctx.height]
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 = container.querySelectorAll('.lc-tooltip-item-color');
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 = container.querySelector('.lc-tooltip-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 = container.querySelectorAll('.lc-tooltip-item-root');
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 = container.querySelectorAll('.lc-tooltip-item-label');
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 = container.querySelectorAll('.lc-tooltip-item-color');
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 = container.querySelectorAll('.lc-tooltip-item-root');
96
+ const items = document.querySelectorAll('.lc-tooltip-item-root');
97
97
  expect(items.length).toBe(4);
98
98
  });
99
- const items = Array.from(container.querySelectorAll('.lc-tooltip-item-root'));
100
- const labels = Array.from(container.querySelectorAll('.lc-tooltip-item-label'));
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 = container.querySelectorAll('.lc-tooltip-item-root');
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 = container.querySelector('.lc-tooltip-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 = container.querySelectorAll('.lc-tooltip-item-root');
158
+ const items = document.querySelectorAll('.lc-tooltip-item-root');
159
159
  expect(items.length).toBe(4);
160
- const labels = container.querySelectorAll('.lc-tooltip-item-label');
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 = container.querySelectorAll('.lc-tooltip-item-root');
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(container.querySelectorAll('.lc-tooltip-item-label')).map((l) => l.textContent?.trim());
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 = container.querySelectorAll('.lc-tooltip-item-root');
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(container.querySelectorAll('.lc-tooltip-item-label')).map((l) => l.textContent?.trim());
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 = container.querySelector('.lc-tooltip-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 = container.querySelectorAll('.lc-tooltip-item-root');
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 = container.querySelector('.lc-tooltip-item-color');
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 = container.querySelector('.lc-tooltip-item-label');
31
- const tooltipValue = container.querySelector('.lc-tooltip-item-value');
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
  });
@@ -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';
@@ -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';