layerchart 2.0.0-next.4 → 2.0.0-next.40

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 (179) hide show
  1. package/dist/components/AnnotationLine.svelte +15 -2
  2. package/dist/components/AnnotationPoint.svelte +29 -11
  3. package/dist/components/AnnotationRange.svelte +18 -4
  4. package/dist/components/Arc.svelte +5 -5
  5. package/dist/components/Area.svelte +10 -2
  6. package/dist/components/Axis.svelte +175 -58
  7. package/dist/components/Axis.svelte.d.ts +23 -6
  8. package/dist/components/Bar.svelte +20 -15
  9. package/dist/components/Bar.svelte.d.ts +2 -2
  10. package/dist/components/Bars.svelte +4 -4
  11. package/dist/components/Blur.svelte +7 -6
  12. package/dist/components/Blur.svelte.d.ts +2 -5
  13. package/dist/components/BrushContext.svelte +45 -45
  14. package/dist/components/Calendar.svelte +31 -10
  15. package/dist/components/Calendar.svelte.d.ts +2 -1
  16. package/dist/components/Chart.svelte +76 -27
  17. package/dist/components/Chart.svelte.d.ts +26 -8
  18. package/dist/components/ChartClipPath.svelte +1 -1
  19. package/dist/components/Circle.svelte +44 -3
  20. package/dist/components/CircleClipPath.svelte +8 -1
  21. package/dist/components/ClipPath.svelte +1 -2
  22. package/dist/components/ColorRamp.svelte +1 -1
  23. package/dist/components/ComputedStyles.svelte +9 -2
  24. package/dist/components/Connector.svelte +3 -3
  25. package/dist/components/Connector.svelte.d.ts +1 -1
  26. package/dist/components/Ellipse.svelte +228 -0
  27. package/dist/components/Ellipse.svelte.d.ts +64 -0
  28. package/dist/components/ForceSimulation.svelte +184 -50
  29. package/dist/components/ForceSimulation.svelte.d.ts +95 -21
  30. package/dist/components/Frame.svelte +1 -1
  31. package/dist/components/GeoCircle.svelte +1 -1
  32. package/dist/components/GeoEdgeFade.svelte +1 -1
  33. package/dist/components/GeoPath.svelte +30 -8
  34. package/dist/components/GeoPoint.svelte +4 -5
  35. package/dist/components/GeoSpline.svelte +5 -5
  36. package/dist/components/GeoSpline.svelte.d.ts +1 -1
  37. package/dist/components/GeoTile.svelte +1 -1
  38. package/dist/components/Graticule.svelte +5 -5
  39. package/dist/components/Grid.svelte +60 -63
  40. package/dist/components/Group.svelte +13 -8
  41. package/dist/components/Group.svelte.d.ts +10 -3
  42. package/dist/components/Highlight.svelte +55 -28
  43. package/dist/components/Highlight.svelte.d.ts +4 -0
  44. package/dist/components/Hull.svelte +12 -5
  45. package/dist/components/Labels.svelte +24 -13
  46. package/dist/components/Labels.svelte.d.ts +12 -5
  47. package/dist/components/Legend.svelte +143 -70
  48. package/dist/components/Legend.svelte.d.ts +12 -8
  49. package/dist/components/Line.svelte +40 -3
  50. package/dist/components/LinearGradient.svelte +35 -4
  51. package/dist/components/Link.svelte +1 -1
  52. package/dist/components/Marker.svelte +37 -26
  53. package/dist/components/MonthPath.svelte +26 -12
  54. package/dist/components/MonthPath.svelte.d.ts +4 -3
  55. package/dist/components/MotionPath.svelte +1 -1
  56. package/dist/components/Pack.svelte.d.ts +10 -3
  57. package/dist/components/Partition.svelte.d.ts +10 -3
  58. package/dist/components/Pattern.svelte +5 -5
  59. package/dist/components/Pie.svelte +1 -2
  60. package/dist/components/Points.svelte +11 -72
  61. package/dist/components/Points.svelte.d.ts +1 -8
  62. package/dist/components/Polygon.svelte +309 -0
  63. package/dist/components/Polygon.svelte.d.ts +115 -0
  64. package/dist/components/RadialGradient.svelte +4 -6
  65. package/dist/components/Rect.svelte +55 -5
  66. package/dist/components/Rect.svelte.d.ts +2 -2
  67. package/dist/components/RectClipPath.svelte +4 -3
  68. package/dist/components/RectClipPath.svelte.d.ts +2 -2
  69. package/dist/components/Rule.svelte +167 -77
  70. package/dist/components/Rule.svelte.d.ts +7 -2
  71. package/dist/components/Spline.svelte +59 -28
  72. package/dist/components/Spline.svelte.d.ts +12 -4
  73. package/dist/components/Text.svelte +121 -73
  74. package/dist/components/Text.svelte.d.ts +6 -0
  75. package/dist/components/TileImage.svelte +19 -4
  76. package/dist/components/TransformContext.svelte +9 -3
  77. package/dist/components/TransformControls.svelte +89 -38
  78. package/dist/components/Tree.svelte.d.ts +10 -3
  79. package/dist/components/Treemap.svelte +63 -26
  80. package/dist/components/Treemap.svelte.d.ts +21 -14
  81. package/dist/components/Voronoi.svelte +12 -13
  82. package/dist/components/charts/ArcChart.svelte +43 -71
  83. package/dist/components/charts/ArcChart.svelte.d.ts +10 -3
  84. package/dist/components/charts/AreaChart.svelte +29 -59
  85. package/dist/components/charts/AreaChart.svelte.d.ts +10 -3
  86. package/dist/components/charts/BarChart.svelte +79 -71
  87. package/dist/components/charts/BarChart.svelte.d.ts +10 -3
  88. package/dist/components/charts/DefaultTooltip.svelte +3 -3
  89. package/dist/components/charts/DefaultTooltip.svelte.d.ts +1 -1
  90. package/dist/components/charts/LineChart.svelte +69 -75
  91. package/dist/components/charts/LineChart.svelte.d.ts +21 -8
  92. package/dist/components/charts/PieChart.svelte +44 -71
  93. package/dist/components/charts/PieChart.svelte.d.ts +10 -3
  94. package/dist/components/charts/ScatterChart.svelte +10 -39
  95. package/dist/components/charts/ScatterChart.svelte.d.ts +10 -3
  96. package/dist/components/charts/utils.svelte.d.ts +1 -19
  97. package/dist/components/charts/utils.svelte.js +7 -35
  98. package/dist/components/index.d.ts +4 -0
  99. package/dist/components/index.js +5 -1
  100. package/dist/components/layout/Canvas.svelte +96 -69
  101. package/dist/components/layout/Canvas.svelte.d.ts +6 -0
  102. package/dist/components/layout/Html.svelte +15 -9
  103. package/dist/components/layout/Layer.svelte +6 -4
  104. package/dist/components/layout/Layer.svelte.d.ts +6 -4
  105. package/dist/components/layout/Svg.svelte +19 -11
  106. package/dist/components/layout/WebGL.svelte +26 -6
  107. package/dist/components/layout/WebGL.svelte.d.ts +5 -2
  108. package/dist/components/tooltip/Tooltip.svelte +65 -27
  109. package/dist/components/tooltip/Tooltip.svelte.d.ts +10 -3
  110. package/dist/components/tooltip/TooltipContext.svelte +167 -54
  111. package/dist/components/tooltip/TooltipContext.svelte.d.ts +19 -5
  112. package/dist/components/tooltip/TooltipHeader.svelte +32 -18
  113. package/dist/components/tooltip/TooltipHeader.svelte.d.ts +3 -3
  114. package/dist/components/tooltip/TooltipItem.svelte +46 -37
  115. package/dist/components/tooltip/TooltipItem.svelte.d.ts +3 -3
  116. package/dist/components/tooltip/TooltipList.svelte +12 -10
  117. package/dist/components/tooltip/TooltipSeparator.svelte +18 -10
  118. package/dist/components/tooltip/tooltipMetaContext.d.ts +2 -2
  119. package/dist/docs/Blockquote.svelte +6 -4
  120. package/dist/docs/Blockquote.svelte.d.ts +4 -19
  121. package/dist/docs/Code.svelte +70 -28
  122. package/dist/docs/Code.svelte.d.ts +9 -24
  123. package/dist/docs/Header1.svelte +4 -2
  124. package/dist/docs/Header1.svelte.d.ts +4 -28
  125. package/dist/docs/Json.svelte +11 -3
  126. package/dist/docs/Json.svelte.d.ts +9 -21
  127. package/dist/docs/Layout.svelte +10 -7
  128. package/dist/docs/Layout.svelte.d.ts +4 -19
  129. package/dist/docs/Link.svelte +7 -3
  130. package/dist/docs/Link.svelte.d.ts +4 -38
  131. package/dist/docs/Preview.svelte +22 -23
  132. package/dist/docs/Preview.svelte.d.ts +5 -6
  133. package/dist/docs/TilesetField.svelte +20 -19
  134. package/dist/docs/TilesetField.svelte.d.ts +5 -22
  135. package/dist/docs/ViewSourceButton.svelte +10 -7
  136. package/dist/docs/ViewSourceButton.svelte.d.ts +7 -21
  137. package/dist/states/series.svelte.d.ts +30 -0
  138. package/dist/states/series.svelte.js +54 -0
  139. package/dist/styles/daisyui-5.css +6 -0
  140. package/dist/styles/shadcn-svelte.css +11 -0
  141. package/dist/styles/skeleton-3.css +15 -0
  142. package/dist/utils/arcText.svelte.js +4 -4
  143. package/dist/utils/array.d.ts +11 -0
  144. package/dist/utils/array.js +23 -0
  145. package/dist/utils/array.test.d.ts +1 -0
  146. package/dist/utils/array.test.js +200 -0
  147. package/dist/utils/attributes.d.ts +3 -13
  148. package/dist/utils/attributes.js +4 -18
  149. package/dist/utils/canvas.d.ts +77 -0
  150. package/dist/utils/canvas.js +105 -41
  151. package/dist/utils/common.d.ts +9 -0
  152. package/dist/utils/common.js +18 -1
  153. package/dist/utils/common.test.js +26 -1
  154. package/dist/utils/genData.d.ts +22 -8
  155. package/dist/utils/genData.js +34 -14
  156. package/dist/utils/graph/dagre.d.ts +4 -4
  157. package/dist/utils/graph/dagre.js +5 -7
  158. package/dist/utils/index.d.ts +1 -0
  159. package/dist/utils/index.js +1 -0
  160. package/dist/utils/math.d.ts +17 -0
  161. package/dist/utils/math.js +17 -0
  162. package/dist/utils/path.d.ts +10 -0
  163. package/dist/utils/path.js +30 -0
  164. package/dist/utils/rect.svelte.d.ts +2 -2
  165. package/dist/utils/rect.svelte.js +73 -1
  166. package/dist/utils/scales.svelte.d.ts +9 -3
  167. package/dist/utils/scales.svelte.js +47 -4
  168. package/dist/utils/shape.d.ts +43 -0
  169. package/dist/utils/shape.js +59 -0
  170. package/dist/utils/stack.js +1 -1
  171. package/dist/utils/string.d.ts +49 -0
  172. package/dist/utils/string.js +4 -2
  173. package/dist/utils/ticks.d.ts +15 -4
  174. package/dist/utils/ticks.js +140 -159
  175. package/dist/utils/ticks.test.js +16 -26
  176. package/dist/utils/treemap.d.ts +1 -1
  177. package/dist/utils/types.d.ts +15 -2
  178. package/package.json +35 -35
  179. package/dist/utils/object.js +0 -2
@@ -64,6 +64,13 @@
64
64
  */
65
65
  ignoreTransform?: boolean;
66
66
 
67
+ /**
68
+ * Disable the hit canvas (useful when animations are playing)
69
+ *
70
+ * @default false
71
+ */
72
+ disableHitCanvas?: boolean;
73
+
67
74
  /**
68
75
  * Show the hit canvas for debugging purposes.
69
76
  *
@@ -142,15 +149,14 @@
142
149
 
143
150
  <script lang="ts">
144
151
  import { onMount, untrack, type Snippet } from 'svelte';
145
- import { cls } from '@layerstack/tailwind';
146
152
  import { Logger, localPoint } from '@layerstack/utils';
147
- import { darkColorScheme } from '@layerstack/svelte-stores';
153
+ import { MediaQueryPresets } from '@layerstack/svelte-state';
148
154
 
149
155
  import { setRenderContext } from '../Chart.svelte';
150
156
  import { getTransformContext } from '../TransformContext.svelte';
151
157
  import { getPixelColor, scaleCanvas, type ComputedStylesOptions } from '../../utils/canvas.js';
152
158
  import { getColorStr, rgbColorGenerator } from '../../utils/color.js';
153
- import { Context } from 'runed';
159
+ import { Context, useMutationObserver, watch } from 'runed';
154
160
  import type {
155
161
  HTMLCanvasAttributes,
156
162
  MouseEventHandler,
@@ -159,7 +165,6 @@
159
165
  } from 'svelte/elements';
160
166
  import type { Without } from '../../utils/types.js';
161
167
  import { getChartContext } from '../Chart.svelte';
162
- import { layerClass } from '../../utils/attributes.js';
163
168
 
164
169
  let {
165
170
  ref: refProp = $bindable(),
@@ -171,6 +176,7 @@
171
176
  fallback,
172
177
  center = false,
173
178
  ignoreTransform = false,
179
+ disableHitCanvas = false,
174
180
  class: className,
175
181
  children,
176
182
  onclick,
@@ -256,6 +262,23 @@
256
262
  * end HitCanvas
257
263
  */
258
264
 
265
+ // Invalidate/redraw if color scheme changes, either via browser `prefers-color-scheme` (including emulation) or by changing `<html class="dark">` or `<html data-theme="...">`
266
+ const { dark } = new MediaQueryPresets();
267
+ watch(
268
+ () => dark.current,
269
+ () => {
270
+ canvasContext.invalidate();
271
+ }
272
+ );
273
+ useMutationObserver(
274
+ () => document.documentElement,
275
+ () => canvasContext.invalidate(),
276
+ {
277
+ attributes: true,
278
+ attributeFilter: ['class', 'data-theme'],
279
+ }
280
+ );
281
+
259
282
  onMount(() => {
260
283
  context = ref?.getContext('2d', { willReadFrequently }) as CanvasRenderingContext2D;
261
284
 
@@ -263,22 +286,7 @@
263
286
  willReadFrequently: false, // Explicitly set to `false` to resolve pixel artifacts between fill and stroke with the same color (issue #372)
264
287
  }) as CanvasRenderingContext2D;
265
288
 
266
- // Invalidate/redraw if color scheme changes, either via browser `prefers-color-scheme` (including emulation) or by changing `<html class="dark">` or `<html data-theme="...">`
267
- darkColorScheme.subscribe(() => {
268
- canvasContext.invalidate();
269
- });
270
-
271
- const observer = new MutationObserver(() => {
272
- canvasContext.invalidate();
273
- });
274
-
275
- observer.observe(document.documentElement, {
276
- attributes: true,
277
- attributeFilter: ['class', 'data-theme'],
278
- });
279
-
280
289
  return () => {
281
- observer.disconnect();
282
290
  if (frameId) {
283
291
  cancelAnimationFrame(frameId);
284
292
  }
@@ -336,45 +344,53 @@
336
344
  context.restore();
337
345
  }
338
346
 
339
- // sync hit canvas with main canvas
347
+ /*
348
+ * Sync hit canvas with main canvas
349
+ */
340
350
  if (hitCanvasContext) {
341
- // scale hit canvas to match main canvas
342
- scaleCanvas(hitCanvasContext, ctx.containerWidth, ctx.containerHeight);
343
- hitCanvasContext.clearRect(0, 0, ctx.containerWidth, ctx.containerHeight);
344
-
345
- // reset and sync transform to the state after retainState components
346
- hitCanvasContext.resetTransform();
347
- hitCanvasContext.setTransform(mainTransformAfterRetain);
348
-
349
- // reset color generator
350
- colorGenerator = rgbColorGenerator();
351
-
352
351
  const inactiveMoving = !activeCanvas && transformCtx.moving;
353
-
354
- // render retainState components on hit canvas (e.g., Group)
355
- for (const c of retainStateComponents) {
356
- const componentHasEvents = c.events && Object.values(c.events).filter((d) => d).length > 0;
357
-
358
- if (componentHasEvents && !inactiveMoving && !transformCtx.dragging) {
359
- // since the transform was already applied via setTransform, skip rendering
360
- // the retainState component's transform again; proceed to its children
361
- continue;
352
+ if (disableHitCanvas || transformCtx.dragging || inactiveMoving) {
353
+ // Skip rendering hit canvas
354
+ hitCanvasContext.clearRect(0, 0, ctx.containerWidth, ctx.containerHeight);
355
+ } else {
356
+ // scale hit canvas to match main canvas
357
+ scaleCanvas(hitCanvasContext, ctx.containerWidth, ctx.containerHeight);
358
+ hitCanvasContext.clearRect(0, 0, ctx.containerWidth, ctx.containerHeight);
359
+
360
+ // reset and sync transform to the state after retainState components
361
+ hitCanvasContext.resetTransform();
362
+ hitCanvasContext.setTransform(mainTransformAfterRetain);
363
+
364
+ // reset color generator
365
+ colorGenerator = rgbColorGenerator();
366
+
367
+ // render retainState components on hit canvas (e.g., Group)
368
+ for (const c of retainStateComponents) {
369
+ const componentHasEvents =
370
+ c.events && Object.values(c.events).filter((d) => d).length > 0;
371
+
372
+ if (componentHasEvents) {
373
+ // since the transform was already applied via setTransform, skip rendering
374
+ // the retainState component's transform again; proceed to its children
375
+ continue;
376
+ }
362
377
  }
363
- }
364
378
 
365
- // render non-retainState components on hit canvas
366
- for (const c of nonRetainStateComponents) {
367
- const componentHasEvents = c.events && Object.values(c.events).filter((d) => d).length > 0;
379
+ // render non-retainState components on hit canvas
380
+ for (const c of nonRetainStateComponents) {
381
+ const componentHasEvents =
382
+ c.events && Object.values(c.events).filter((d) => d).length > 0;
368
383
 
369
- if (componentHasEvents && !inactiveMoving && !transformCtx.dragging) {
370
- const color = getColorStr(colorGenerator.next().value);
371
- const styleOverrides = { styles: { fill: color, stroke: color, _fillOpacity: 0.1 } };
384
+ if (componentHasEvents) {
385
+ const color = getColorStr(colorGenerator.next().value);
386
+ const styleOverrides = { styles: { fill: color, stroke: color, _fillOpacity: 0.1 } };
372
387
 
373
- hitCanvasContext.save();
374
- c.render(hitCanvasContext, styleOverrides);
375
- hitCanvasContext.restore();
388
+ hitCanvasContext.save();
389
+ c.render(hitCanvasContext, styleOverrides);
390
+ hitCanvasContext.restore();
376
391
 
377
- componentByColor.set(color, c);
392
+ componentByColor.set(color, c);
393
+ }
378
394
  }
379
395
  }
380
396
  }
@@ -435,12 +451,8 @@
435
451
  <canvas
436
452
  bind:this={ref}
437
453
  style:z-index={zIndex}
438
- class={cls(
439
- layerClass('layout-canvas'),
440
- 'absolute top-0 left-0 w-full h-full',
441
- pointerEvents === false && 'pointer-events-none',
442
- className
443
- )}
454
+ class={['lc-layout-canvas', className]}
455
+ class:disablePointerEvents={pointerEvents === false}
444
456
  onclick={(e) => {
445
457
  const component = getPointerComponent(e);
446
458
  component?.events?.click?.(e);
@@ -489,17 +501,32 @@
489
501
  </canvas>
490
502
 
491
503
  <!-- Hit canvas used for hidden context -->
492
- <canvas
493
- bind:this={hitCanvasElement}
494
- class={cls(
495
- layerClass('hit-canvas'),
496
- 'layerchart-hitcanvas',
497
- 'absolute top-0 left-0 w-full h-full',
498
- 'pointer-events-none', // events all handled by main canvas
499
- // '[image-rendering:pixelated]', // https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering
500
- 'border border-danger',
501
- !debug && 'opacity-0'
502
- )}
503
- ></canvas>
504
+ <canvas bind:this={hitCanvasElement} class="lc-hit-canvas" class:debug></canvas>
504
505
 
505
506
  {@render children?.({ ref, canvasContext: context })}
507
+
508
+ <style>
509
+ @layer base {
510
+ :where(.lc-layout-canvas) {
511
+ position: absolute;
512
+ inset: 0;
513
+
514
+ &.disablePointerEvents {
515
+ pointer-events: none;
516
+ }
517
+ }
518
+
519
+ :where(.lc-hit-canvas) {
520
+ position: absolute;
521
+ inset: 0;
522
+ pointer-events: none; /* events handled by main canvas */
523
+ image-rendering: pixelated; /* https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering */
524
+
525
+ opacity: 0;
526
+ &.debug {
527
+ border: 1px solid var(--color-danger, red);
528
+ opacity: 1;
529
+ }
530
+ }
531
+ }
532
+ </style>
@@ -55,6 +55,12 @@ export type CanvasPropsWithoutHTML = {
55
55
  * @default false
56
56
  */
57
57
  ignoreTransform?: boolean;
58
+ /**
59
+ * Disable the hit canvas (useful when animations are playing)
60
+ *
61
+ * @default false
62
+ */
63
+ disableHitCanvas?: boolean;
58
64
  /**
59
65
  * Show the hit canvas for debugging purposes.
60
66
  *
@@ -46,11 +46,9 @@
46
46
  </script>
47
47
 
48
48
  <script lang="ts">
49
- import { cls } from '@layerstack/tailwind';
50
49
  import { getTransformContext } from '../TransformContext.svelte';
51
50
 
52
51
  import { getChartContext, setRenderContext } from '../Chart.svelte';
53
- import { layerClass } from '../../utils/attributes.js';
54
52
 
55
53
  let {
56
54
  ref: refProp = $bindable(),
@@ -90,16 +88,11 @@
90
88
 
91
89
  <div
92
90
  bind:this={ref}
93
- class={cls(
94
- layerClass('layout-html'),
95
- 'absolute top-0 left-0',
96
- pointerEvents === false && 'pointer-events-none',
97
- className
98
- )}
91
+ class={['lc-layout-html', className]}
92
+ class:disablePointerEvents={pointerEvents === false}
99
93
  style:transform
100
94
  style:transform-origin="top left"
101
95
  style:z-index={zIndex}
102
- style:pointer-events={pointerEvents === false ? 'none' : null}
103
96
  style:top="{ctx.padding.top}px"
104
97
  style:bottom="{ctx.padding.bottom}px"
105
98
  style:left="{ctx.padding.left}px"
@@ -112,3 +105,16 @@
112
105
  >
113
106
  {@render children?.({ ref })}
114
107
  </div>
108
+
109
+ <style>
110
+ @layer base {
111
+ :where(.lc-layout-html) {
112
+ position: absolute;
113
+ inset: 0;
114
+
115
+ &.disablePointerEvents {
116
+ pointer-events: none;
117
+ }
118
+ }
119
+ }
120
+ </style>
@@ -3,17 +3,19 @@
3
3
 
4
4
  export type CanvasLayerProps = {
5
5
  type: 'canvas';
6
- } & Omit<ComponentProps<typeof Canvas>, 'type'>;
6
+ } & Omit<ComponentProps<typeof Canvas>, 'type' | 'onpointermove'>;
7
7
 
8
8
  export type HtmlLayerProps = {
9
9
  type: 'html';
10
- } & Omit<ComponentProps<typeof Html>, 'type'>;
10
+ } & Omit<ComponentProps<typeof Html>, 'type' | 'onpointermove'>;
11
11
 
12
12
  export type SvgLayerProps = {
13
13
  type: 'svg';
14
- } & Omit<ComponentProps<typeof Svg>, 'type'>;
14
+ } & Omit<ComponentProps<typeof Svg>, 'type' | 'onpointermove'>;
15
15
 
16
- export type LayerProps = CanvasLayerProps | HtmlLayerProps | SvgLayerProps;
16
+ export type LayerProps = (CanvasLayerProps | HtmlLayerProps | SvgLayerProps) & {
17
+ onpointermove?: (e: PointerEvent) => void;
18
+ };
17
19
  </script>
18
20
 
19
21
  <script lang="ts">
@@ -1,14 +1,16 @@
1
1
  import type { ComponentProps } from 'svelte';
2
2
  export type CanvasLayerProps = {
3
3
  type: 'canvas';
4
- } & Omit<ComponentProps<typeof Canvas>, 'type'>;
4
+ } & Omit<ComponentProps<typeof Canvas>, 'type' | 'onpointermove'>;
5
5
  export type HtmlLayerProps = {
6
6
  type: 'html';
7
- } & Omit<ComponentProps<typeof Html>, 'type'>;
7
+ } & Omit<ComponentProps<typeof Html>, 'type' | 'onpointermove'>;
8
8
  export type SvgLayerProps = {
9
9
  type: 'svg';
10
- } & Omit<ComponentProps<typeof Svg>, 'type'>;
11
- export type LayerProps = CanvasLayerProps | HtmlLayerProps | SvgLayerProps;
10
+ } & Omit<ComponentProps<typeof Svg>, 'type' | 'onpointermove'>;
11
+ export type LayerProps = (CanvasLayerProps | HtmlLayerProps | SvgLayerProps) & {
12
+ onpointermove?: (e: PointerEvent) => void;
13
+ };
12
14
  import Canvas from './Canvas.svelte';
13
15
  import Html from './Html.svelte';
14
16
  import Svg from './Svg.svelte';
@@ -63,11 +63,9 @@
63
63
  </script>
64
64
 
65
65
  <script lang="ts">
66
- import { cls } from '@layerstack/tailwind';
67
66
  import { getTransformContext } from '../TransformContext.svelte';
68
67
 
69
68
  import { getChartContext, setRenderContext } from '../Chart.svelte';
70
- import { layerClass } from '../../utils/attributes.js';
71
69
 
72
70
  let {
73
71
  ref: refProp = $bindable(),
@@ -114,19 +112,15 @@
114
112
  width={ctx.containerWidth}
115
113
  height={ctx.containerHeight}
116
114
  style:z-index={zIndex}
117
- class={cls(
118
- layerClass('layout-svg'),
119
- 'absolute top-0 left-0 overflow-visible',
120
- pointerEvents === false && 'pointer-events-none',
121
- className
122
- )}
115
+ class={['lc-layout-svg', className]}
116
+ class:disablePointerEvents={pointerEvents === false}
123
117
  role="figure"
124
118
  {...restProps}
125
119
  >
126
120
  {#if typeof title === 'function'}
127
121
  {@render title()}
128
122
  {:else if title}
129
- <title class={layerClass('layout-svg-title')}>{title}</title>
123
+ <title class="lc-layout-svg-title">{title}</title>
130
124
  {/if}
131
125
 
132
126
  <defs>
@@ -135,11 +129,11 @@
135
129
 
136
130
  <g
137
131
  bind:this={innerRef}
138
- class={layerClass('layout-svg-g')}
132
+ class="lc-layout-svg-g"
139
133
  transform="translate({ctx.padding.left}, {ctx.padding.top})"
140
134
  >
141
135
  {#if transform}
142
- <g {transform} class={layerClass('layout-svg-g-transform')}>
136
+ <g {transform} class="lc-layout-svg-g-transform">
143
137
  {@render children?.({ ref })}
144
138
  </g>
145
139
  {:else}
@@ -147,3 +141,17 @@
147
141
  {/if}
148
142
  </g>
149
143
  </svg>
144
+
145
+ <style>
146
+ @layer base {
147
+ :where(.lc-layout-svg) {
148
+ position: absolute;
149
+ inset: 0;
150
+ overflow: visible; /* match html and allow viewing outside of bounds (useful for axis that leak and general debugging)*/
151
+
152
+ &.disablePointerEvents {
153
+ pointer-events: none;
154
+ }
155
+ }
156
+ }
157
+ </style>
@@ -1,5 +1,9 @@
1
1
  <script lang="ts" module>
2
- export type WebGLProps = {
2
+ import type { Snippet } from 'svelte';
3
+ import type { Without } from '../../utils/types.js';
4
+ import type { HTMLCanvasAttributes } from 'svelte/elements';
5
+
6
+ export type WebGLPropsWithoutHTML = {
3
7
  /**
4
8
  * A reference to the `<canvas>` element.
5
9
  *
@@ -44,6 +48,9 @@
44
48
  >;
45
49
  };
46
50
 
51
+ export type WebGLProps = WebGLPropsWithoutHTML &
52
+ Without<HTMLCanvasAttributes, WebGLPropsWithoutHTML>;
53
+
47
54
  export type WebGLContextValue = {
48
55
  gl: WebGLRenderingContext | null;
49
56
  };
@@ -61,10 +68,9 @@
61
68
  </script>
62
69
 
63
70
  <script lang="ts">
64
- import { onMount, type Snippet } from 'svelte';
71
+ import { onMount } from 'svelte';
65
72
  import { getChartContext } from '../Chart.svelte';
66
73
  import { Context } from 'runed';
67
- import { extractLayerProps } from '../../utils/attributes.js';
68
74
 
69
75
  let {
70
76
  context = $bindable(),
@@ -73,6 +79,7 @@
73
79
  fallback = '',
74
80
  pointerEvents = true,
75
81
  zIndex = 0,
82
+ class: className,
76
83
  children,
77
84
  ...restProps
78
85
  }: WebGLProps = $props();
@@ -116,14 +123,14 @@
116
123
 
117
124
  <canvas
118
125
  bind:this={ref}
126
+ class={['lc-layout-webgl', className]}
127
+ class:disablePointerEvents={pointerEvents === false}
119
128
  style:z-index={zIndex}
120
- style:pointer-events={pointerEvents === false ? 'none' : null}
121
129
  style:top={ctx.padding.top + 'px'}
122
130
  style:right={ctx.padding.right + 'px'}
123
131
  style:bottom={ctx.padding.bottom + 'px'}
124
132
  style:left={ctx.padding.left + 'px'}
125
- style="width:100%;height:100%;position:absolute;"
126
- {...extractLayerProps(restProps, 'layout-webgl')}
133
+ {...restProps}
127
134
  >
128
135
  {#if typeof fallback === 'function'}
129
136
  {@render fallback()}
@@ -133,3 +140,16 @@
133
140
  </canvas>
134
141
 
135
142
  {@render children?.({ ref, webGLContext: context })}
143
+
144
+ <style>
145
+ @layer base {
146
+ :where(.lc-layout-webgl) {
147
+ position: absolute;
148
+ inset: 0;
149
+
150
+ &.disablePointerEvents {
151
+ pointer-events: none;
152
+ }
153
+ }
154
+ }
155
+ </style>
@@ -1,4 +1,7 @@
1
- export type WebGLProps = {
1
+ import type { Snippet } from 'svelte';
2
+ import type { Without } from '../../utils/types.js';
3
+ import type { HTMLCanvasAttributes } from 'svelte/elements';
4
+ export type WebGLPropsWithoutHTML = {
2
5
  /**
3
6
  * A reference to the `<canvas>` element.
4
7
  *
@@ -39,12 +42,12 @@ export type WebGLProps = {
39
42
  }
40
43
  ]>;
41
44
  };
45
+ export type WebGLProps = WebGLPropsWithoutHTML & Without<HTMLCanvasAttributes, WebGLPropsWithoutHTML>;
42
46
  export type WebGLContextValue = {
43
47
  gl: WebGLRenderingContext | null;
44
48
  };
45
49
  export declare function setWebGLContext(context: WebGLContextValue): WebGLContextValue;
46
50
  export declare function getWebGLContext(): WebGLContextValue;
47
- import { type Snippet } from 'svelte';
48
51
  declare const WebGl: import("svelte").Component<WebGLProps, {}, "ref" | "context">;
49
52
  type WebGl = ReturnType<typeof WebGl>;
50
53
  export default WebGl;
@@ -162,7 +162,6 @@
162
162
  import { getTooltipContext } from './TooltipContext.svelte';
163
163
  import { createMotion, type MotionProp } from '../../utils/motion.svelte.js';
164
164
  import { untrack, type Snippet } from 'svelte';
165
- import { layerClass } from '../../utils/attributes.js';
166
165
 
167
166
  let {
168
167
  anchor = 'top-left',
@@ -359,13 +358,8 @@
359
358
  {#if tooltipCtx.data}
360
359
  <div
361
360
  {...props.root}
362
- class={cls(
363
- layerClass('tooltip-root'),
364
- 'absolute z-50 select-none',
365
- !pointerEvents && 'pointer-events-none',
366
- classes.root,
367
- props.root?.class
368
- )}
361
+ class={cls('lc-tooltip-root', classes.root, props.root?.class)}
362
+ class:disablePointerEvents={pointerEvents === false}
369
363
  style:top="{motionY.current}px"
370
364
  style:left="{motionX.current}px"
371
365
  transition:fade={{ duration: 100 }}
@@ -381,30 +375,74 @@
381
375
  >
382
376
  <div
383
377
  {...props.container}
384
- class={cls(
385
- layerClass('tooltip-container'),
386
- variant !== 'none' && ['text-sm py-1 px-2 h-full rounded-sm elevation-1'],
387
- {
388
- default: [
389
- 'bg-surface-100/90 dark:bg-surface-300/90 backdrop-filter backdrop-blur-[2px] text-surface-content',
390
- '[&_.label]:text-surface-content/75',
391
- ],
392
- invert: [
393
- 'bg-surface-content/90 backdrop-filter backdrop-blur-[2px] text-surface-100 border border-surface-content',
394
- '[&_.label]:text-surface-100/50',
395
- ],
396
- none: '',
397
- }[variant],
398
- classes.container,
399
- props.container?.class,
400
- className
401
- )}
378
+ class={cls('lc-tooltip-container', classes.container, props.container?.class, className)}
379
+ data-variant={variant}
402
380
  >
403
381
  {#if children}
404
- <div {...props.content} class={cls(layerClass('tooltip-content'), classes.content)}>
382
+ <div {...props.content} class={cls('lc-tooltip-content', classes.content)}>
405
383
  {@render children({ data: tooltipCtx.data, payload: tooltipCtx.payload })}
406
384
  </div>
407
385
  {/if}
408
386
  </div>
409
387
  </div>
410
388
  {/if}
389
+
390
+ <style>
391
+ @layer component {
392
+ :where(.lc-tooltip-root) {
393
+ position: absolute;
394
+ z-index: 50;
395
+ user-select: none;
396
+
397
+ &.disablePointerEvents {
398
+ pointer-events: none;
399
+ }
400
+ }
401
+
402
+ :where(.lc-tooltip-container) {
403
+ &:not([data-variant='none']) {
404
+ font-size: 0.875rem;
405
+ line-height: 1.25rem;
406
+ padding: 4px 8px;
407
+ height: 100%;
408
+ border-radius: 0.25rem; /* rounded-sm */
409
+ box-shadow: /* elevation-1 */
410
+ 0px 2px 1px -1px hsl(0 0% 0% / 20%),
411
+ 0px 1px 1px 0px hsl(0 0% 0% / 14%),
412
+ 0px 1px 3px 0px hsl(0 0% 0% / 12%);
413
+ /* STYLE-TODO: vendor prefix (-webkit?) */
414
+ backdrop-filter: blur(2px);
415
+ }
416
+
417
+ &[data-variant='default'] {
418
+ color: var(--color-surface-content, currentColor);
419
+ background-color: color-mix(
420
+ in oklab,
421
+ light-dark(var(--color-surface-100, white), var(--color-surface-300, black)) 90%,
422
+ transparent
423
+ );
424
+
425
+ :global(& .label) {
426
+ color: color-mix(in oklab, var(--color-surface-content, currentColor) 75%, transparent);
427
+ }
428
+ }
429
+
430
+ &[data-variant='invert'] {
431
+ color: var(--color-surface-100, light-dark(white, black));
432
+ background-color: color-mix(
433
+ in oklab,
434
+ var(--color-surface-content, currentColor) 90%,
435
+ transparent
436
+ );
437
+
438
+ :global(& .label) {
439
+ color: color-mix(
440
+ in oklab,
441
+ var(--color-surface-100, light-dark(white, black)) 50%,
442
+ transparent
443
+ );
444
+ }
445
+ }
446
+ }
447
+ }
448
+ </style>
@@ -134,10 +134,17 @@ export type TooltipProps<T = any> = TooltipPropsWithoutHTML<T> & Without<HTMLAtt
134
134
  import { type ChartContextValue } from '../Chart.svelte';
135
135
  import { type MotionProp } from '../../utils/motion.svelte.js';
136
136
  import { type Snippet } from 'svelte';
137
+ declare function $$render<T = any>(): {
138
+ props: TooltipProps<T>;
139
+ exports: {};
140
+ bindings: "rootRef";
141
+ slots: {};
142
+ events: {};
143
+ };
137
144
  declare class __sveltets_Render<T = any> {
138
- props(): TooltipProps<T>;
139
- events(): {};
140
- slots(): {};
145
+ props(): ReturnType<typeof $$render<T>>['props'];
146
+ events(): ReturnType<typeof $$render<T>>['events'];
147
+ slots(): ReturnType<typeof $$render<T>>['slots'];
141
148
  bindings(): "rootRef";
142
149
  exports(): {};
143
150
  }