layerchart 0.75.1 → 0.76.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -187,6 +187,7 @@ declare class __sveltets_Render<TData> {
187
187
  mode?: "bisect-x" | "bisect-y" | "band" | "bisect-band" | "bounds" | "voronoi" | "quadtree" | "manual";
188
188
  findTooltipData?: "closest" | "left" | "right";
189
189
  raiseTarget?: boolean;
190
+ locked?: boolean;
190
191
  radius?: number;
191
192
  debug?: boolean;
192
193
  onClick?: ({ data }: {
@@ -214,8 +214,8 @@
214
214
  yNice
215
215
  {radial}
216
216
  padding={radial ? undefined : defaultChartPadding(axis, legend)}
217
- tooltip={{ mode: 'bisect-x', onClick: onTooltipClick }}
218
217
  {...$$restProps}
218
+ tooltip={{ mode: 'bisect-x', onClick: onTooltipClick, ...$$props.tooltip, ...props.tooltip }}
219
219
  let:x
220
220
  let:xScale
221
221
  let:y
@@ -356,7 +356,8 @@
356
356
 
357
357
  <slot name="tooltip" {...slotProps}>
358
358
  <Tooltip.Root {...props.tooltip?.root} let:data>
359
- <Tooltip.Header {...props.tooltip?.header}>{format(x(data))}</Tooltip.Header>
359
+ <Tooltip.Header value={x(data)} {format} {...props.tooltip?.header} />
360
+
360
361
  <Tooltip.List {...props.tooltip?.list}>
361
362
  <!-- Reverse series order so tooltip items match stacks -->
362
363
  {@const seriesItems = stackSeries ? [...visibleSeries].reverse() : visibleSeries}
@@ -140,6 +140,7 @@
140
140
  list?: Partial<ComponentProps<Tooltip.List>>;
141
141
  item?: Partial<ComponentProps<Tooltip.Item>>;
142
142
  separator?: Partial<ComponentProps<Tooltip.Separator>>;
143
+ hideTotal?: boolean;
143
144
  };
144
145
  } = {};
145
146
 
@@ -279,8 +280,8 @@
279
280
  c={isVertical ? y : x}
280
281
  cRange={['hsl(var(--color-primary))']}
281
282
  padding={defaultChartPadding(axis, legend)}
282
- tooltip={{ mode: 'band', onClick: onTooltipClick }}
283
283
  {...$$restProps}
284
+ tooltip={{ mode: 'band', onClick: onTooltipClick, ...$$props.tooltip, ...props.tooltip }}
284
285
  let:x
285
286
  let:xScale
286
287
  let:y
@@ -410,9 +411,12 @@
410
411
 
411
412
  <slot name="tooltip" {...slotProps}>
412
413
  <Tooltip.Root {...props.tooltip?.root} let:data>
413
- <Tooltip.Header {...props.tooltip?.header}
414
- >{format(isVertical ? x(data) : y(data))}</Tooltip.Header
415
- >
414
+ <Tooltip.Header
415
+ value={isVertical ? x(data) : y(data)}
416
+ {format}
417
+ {...props.tooltip?.header}
418
+ />
419
+
416
420
  <Tooltip.List {...props.tooltip?.list}>
417
421
  <!-- Reverse series order so tooltip items match stacks -->
418
422
  {@const seriesItems = stackSeries ? [...visibleSeries].reverse() : visibleSeries}
@@ -429,7 +433,7 @@
429
433
  />
430
434
  {/each}
431
435
 
432
- {#if (stackSeries || groupSeries) && visibleSeries.length > 1}
436
+ {#if (stackSeries || groupSeries) && visibleSeries.length > 1 && !props.tooltip?.hideTotal}
433
437
  <Tooltip.Separator {...props.tooltip?.separator} />
434
438
 
435
439
  <Tooltip.Item
@@ -156,8 +156,8 @@
156
156
  yNice
157
157
  {radial}
158
158
  padding={radial ? undefined : defaultChartPadding(axis, legend)}
159
- tooltip={{ mode: 'bisect-x', onClick: onTooltipClick }}
160
159
  {...$$restProps}
160
+ tooltip={{ mode: 'bisect-x', onClick: onTooltipClick, ...$$props.tooltip, ...props.tooltip }}
161
161
  let:x
162
162
  let:xScale
163
163
  let:y
@@ -290,7 +290,7 @@
290
290
 
291
291
  <slot name="tooltip" {...slotProps}>
292
292
  <Tooltip.Root {...props.tooltip?.root} let:data>
293
- <Tooltip.Header {...props.tooltip?.header}>{format(x(data))}</Tooltip.Header>
293
+ <Tooltip.Header value={x(data)} {format} {...props.tooltip?.header} />
294
294
  <Tooltip.List {...props.tooltip?.list}>
295
295
  {#each visibleSeries as s}
296
296
  {@const seriesTooltipData = s.data ? findRelatedData(s.data, data, x) : data}
@@ -124,6 +124,7 @@ declare class __sveltets_Render<TData> {
124
124
  mode?: "bisect-x" | "bisect-y" | "band" | "bisect-band" | "bounds" | "voronoi" | "quadtree" | "manual";
125
125
  findTooltipData?: "closest" | "left" | "right";
126
126
  raiseTarget?: boolean;
127
+ locked?: boolean;
127
128
  radius?: number;
128
129
  debug?: boolean;
129
130
  onClick?: ({ data }: {
@@ -139,8 +139,8 @@
139
139
  {yScale}
140
140
  yNice
141
141
  padding={defaultChartPadding(axis, legend)}
142
- tooltip={{ mode: 'voronoi', onClick: onTooltipClick }}
143
142
  {...$$restProps}
143
+ tooltip={{ mode: 'voronoi', onClick: onTooltipClick, ...$$props.tooltip, ...props.tooltip }}
144
144
  let:x
145
145
  let:xScale
146
146
  let:y
@@ -246,9 +246,11 @@
246
246
  <slot name="tooltip" {...slotProps}>
247
247
  <Tooltip.Root {...props.tooltip?.root} let:data>
248
248
  {#if activeSeries?.key !== 'default'}
249
- <Tooltip.Header {...props.tooltip?.header} color={activeSeries?.color}>
250
- {activeSeries?.label ?? activeSeries?.key}
251
- </Tooltip.Header>
249
+ <Tooltip.Header
250
+ value={activeSeries?.label ?? activeSeries?.key}
251
+ color={activeSeries?.color}
252
+ {...props.tooltip?.header}
253
+ />
252
254
  {/if}
253
255
  <Tooltip.List {...props.tooltip?.list}>
254
256
  <Tooltip.Item
@@ -37,6 +37,9 @@
37
37
  /** Set to `false` to disable spring transitions */
38
38
  export let motion = true;
39
39
 
40
+ /** Allow pointer events. Disabled by default to reduce accidental selection, but useful to enable to allow interactdive tooltips (using `locked`) */
41
+ export let pointerEvents = false;
42
+
40
43
  export let classes: {
41
44
  root?: string;
42
45
  container?: string;
@@ -203,7 +206,7 @@
203
206
 
204
207
  {#if $tooltip.data}
205
208
  <div
206
- class={cls('absolute pointer-events-none z-50 select-none', classes.root)}
209
+ class={cls('absolute z-50 select-none', !pointerEvents && 'pointer-events-none', classes.root)}
207
210
  style:top="{$yPos}px"
208
211
  style:left="{$xPos}px"
209
212
  transition:fade={{ duration: 100 }}
@@ -10,6 +10,7 @@ declare const __propDef: {
10
10
  contained?: "container" | "window" | false | undefined;
11
11
  variant?: "default" | "invert" | "none" | undefined;
12
12
  motion?: boolean | undefined;
13
+ pointerEvents?: boolean | undefined;
13
14
  classes?: {
14
15
  root?: string;
15
16
  container?: string;
@@ -97,6 +97,9 @@
97
97
  /** Similar to d3-selection's raise, re-insert the e.target as the last child of its parent, so to be the top-most element */
98
98
  export let raiseTarget = false;
99
99
 
100
+ /** Lock tooltip (keep open, do not update on mouse movement). Allows for kicking on tooltip */
101
+ export let locked = false;
102
+
100
103
  /** quadtree search radius
101
104
  * @type {number}
102
105
  */
@@ -169,6 +172,11 @@
169
172
  // Cancel hiding tooltip if from previous event loop
170
173
  clearTimeout(hideTimeoutId);
171
174
 
175
+ if (locked) {
176
+ // Ignore (keep current position / data)
177
+ return;
178
+ }
179
+
172
180
  const referenceNode = (e.target as Element).closest('.layercake-container')!;
173
181
  const point = localPoint(referenceNode, e);
174
182
  const pointerX = point?.x ?? 0;
@@ -275,6 +283,11 @@
275
283
  }
276
284
 
277
285
  function hideTooltip() {
286
+ if (locked) {
287
+ // Ignore (keep open)
288
+ return;
289
+ }
290
+
278
291
  // Wait an event loop tick in case `showTooltip` is called immediately on another element, to allow tweeneing (ex. moving between bands/bars)
279
292
  hideTimeoutId = setTimeout(() => {
280
293
  $tooltip = { ...$tooltip, data: null };
@@ -369,7 +382,7 @@
369
382
  .sort(sortFunc('x'));
370
383
  }
371
384
 
372
- $: triggerPointEvents = ['bisect-x', 'bisect-y', 'bisect-band', 'quadtree'].includes(mode);
385
+ $: triggerPointerEvents = ['bisect-x', 'bisect-y', 'bisect-band', 'quadtree'].includes(mode);
373
386
  </script>
374
387
 
375
388
  <!-- svelte-ignore a11y-click-events-have-key-events -->
@@ -381,13 +394,13 @@
381
394
  style:left="{$padding.left}px"
382
395
  class={cls(
383
396
  'tooltip-trigger absolute touch-none',
384
- debug && triggerPointEvents && 'bg-danger/10 outline outline-danger'
397
+ debug && triggerPointerEvents && 'bg-danger/10 outline outline-danger'
385
398
  )}
386
- on:pointerenter={triggerPointEvents ? showTooltip : undefined}
387
- on:pointermove={triggerPointEvents ? showTooltip : undefined}
388
- on:pointerleave={triggerPointEvents ? hideTooltip : undefined}
399
+ on:pointerenter={triggerPointerEvents ? showTooltip : undefined}
400
+ on:pointermove={triggerPointerEvents ? showTooltip : undefined}
401
+ on:pointerleave={triggerPointerEvents ? hideTooltip : undefined}
389
402
  on:click={(e) => {
390
- if (triggerPointEvents) {
403
+ if (triggerPointerEvents) {
391
404
  onClick({ data: $tooltip?.data });
392
405
  }
393
406
  }}
@@ -19,6 +19,7 @@ declare const __propDef: {
19
19
  * @type {'closest' | 'left' | 'right'}
20
20
  */ findTooltipData?: "closest" | "left" | "right";
21
21
  /** Similar to d3-selection's raise, re-insert the e.target as the last child of its parent, so to be the top-most element */ raiseTarget?: boolean;
22
+ /** Lock tooltip (keep open, do not update on mouse movement). Allows for kicking on tooltip */ locked?: boolean;
22
23
  /** quadtree search radius
23
24
  * @type {number}
24
25
  */ radius?: number;
@@ -1,6 +1,9 @@
1
1
  <script lang="ts">
2
+ import { format as formatUtil, type FormatType } from '@layerstack/utils';
2
3
  import { cls } from '@layerstack/tailwind';
3
4
 
5
+ export let value: any = undefined;
6
+ export let format: FormatType | undefined = undefined;
4
7
  export let color: string | undefined = undefined;
5
8
 
6
9
  export let classes: {
@@ -23,5 +26,5 @@
23
26
  style:--color={color}
24
27
  ></div>
25
28
  {/if}
26
- <slot />
29
+ <slot>{format ? formatUtil(value, format) : value}</slot>
27
30
  </div>
@@ -1,7 +1,10 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
+ import { type FormatType } from '@layerstack/utils';
2
3
  declare const __propDef: {
3
4
  props: {
4
5
  [x: string]: any;
6
+ value?: any;
7
+ format?: FormatType | undefined;
5
8
  color?: string | undefined | undefined;
6
9
  classes?: {
7
10
  root?: string;
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "author": "Sean Lynch <techniq35@gmail.com>",
5
5
  "license": "MIT",
6
6
  "repository": "techniq/layerchart",
7
- "version": "0.75.1",
7
+ "version": "0.76.0",
8
8
  "devDependencies": {
9
9
  "@changesets/cli": "^2.27.10",
10
10
  "@mdi/js": "^7.4.47",