Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/layerchart/src/lib/components/Arc.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,8 @@
transform="translate({xOffset}, {yOffset})"
{...$$restProps}
on:click
on:mousemove
on:mouseleave
on:pointermove
on:pointerleave
/>

<slot value={$tweened_value} centroid={trackArcCentroid} {boundingBox} />
4 changes: 2 additions & 2 deletions packages/layerchart/src/lib/components/Area.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,6 @@
{...$$restProps}
class={cls('path-area', $$props.class)}
on:click
on:mousemove
on:mouseleave
on:pointermove
on:pointerleave
/>
4 changes: 2 additions & 2 deletions packages/layerchart/src/lib/components/Calendar.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@
width={cellWidth}
height={cellHeight}
fill={cell.color}
on:mousemove={(e) => tooltip?.show(e, cell.data)}
on:mouseleave={(e) => tooltip?.hide()}
on:pointermove={(e) => tooltip?.show(e, cell.data)}
on:pointerleave={(e) => tooltip?.hide()}
class="stroke-surface-content/5"
{...$$restProps}
/>
Expand Down
4 changes: 2 additions & 2 deletions packages/layerchart/src/lib/components/Circle.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,6 @@
class={cls($$props.fill == null && 'fill-surface-content')}
{...$$restProps}
on:click
on:mousemove
on:mouseleave
on:pointermove
on:pointerleave
/>
2 changes: 1 addition & 1 deletion packages/layerchart/src/lib/components/ClipPath.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
{#if disabled}
<slot />
{:else}
<g style:clip-path="url(#{id})" on:click on:mousemove on:mouseleave on:keydown>
<g style:clip-path="url(#{id})" on:click on:pointermove on:pointerleave on:keydown>
<slot {id} url="url(#{id})" {useId} />
</g>
{/if}
Expand Down
2 changes: 1 addition & 1 deletion packages/layerchart/src/lib/components/GeoCircle.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@
$: geojson = geoCircle().radius(radius).center(center).precision(precision)();
</script>

<GeoPath {geojson} {...$$restProps} on:mousemove on:mouseleave on:click />
<GeoPath {geojson} {...$$restProps} on:pointermove on:pointerleave on:click />
10 changes: 6 additions & 4 deletions packages/layerchart/src/lib/components/GeoPath.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -90,10 +90,12 @@
d={geoPath(geojson)}
{fill}
{stroke}
on:mousemove={(e) => tooltip?.show(e, geojson)}
on:mousemove
on:mouseleave={(e) => tooltip?.hide()}
on:mouseleave
on:pointerenter={(e) => tooltip?.show(e, geojson)}
on:pointerenter
on:pointermove={(e) => tooltip?.show(e, geojson)}
on:pointermove
on:pointerleave={(e) => tooltip?.hide()}
on:pointerleave
on:click={(event) => dispatch('click', { geoPath, event })}
on:click
class={cls($$props.fill == null && 'fill-transparent', $$props.class)}
Expand Down
2 changes: 1 addition & 1 deletion packages/layerchart/src/lib/components/Group.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,6 @@
}
</script>

<g {transform} {...$$restProps} on:click on:mousemove on:mouseleave>
<g {transform} {...$$restProps} on:click on:pointermove on:pointerleave>
<slot />
</g>
12 changes: 6 additions & 6 deletions packages/layerchart/src/lib/components/Hull.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@

const dispatch = createEventDispatcher<{
click: { points: [number, number][]; polygon: Delaunay.Polygon };
mousemove: {
event: MouseEvent;
pointermove: {
event: PointerEvent;
points: [number, number][];
polygon: Delaunay.Polygon;
};
Expand All @@ -52,8 +52,8 @@
geojson={polygon}
{curve}
class={cls('fill-transparent', classes.path)}
on:mousemove={(e) => dispatch('mousemove', { event: e, points, polygon })}
on:mouseleave
on:pointermove={(e) => dispatch('pointermove', { event: e, points, polygon })}
on:pointerleave
on:click={(e) => dispatch('click', { points, polygon })}
/>
{:else}
Expand All @@ -65,8 +65,8 @@
y={(d) => d[1]}
{curve}
class={cls('fill-transparent', classes.path)}
on:mousemove={(e) => dispatch('mousemove', { event: e, points, polygon })}
on:mouseleave
on:pointermove={(e) => dispatch('pointermove', { event: e, points, polygon })}
on:pointerleave
on:click={(e) => dispatch('click', { points, polygon })}
/>
{/if}
Expand Down
4 changes: 2 additions & 2 deletions packages/layerchart/src/lib/components/Line.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,6 @@
class={cls($$props.stroke === undefined && 'stroke-surface-content')}
{...$$restProps}
on:click
on:mousemove
on:mouseleave
on:pointermove
on:pointerleave
/>
8 changes: 4 additions & 4 deletions packages/layerchart/src/lib/components/Link.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@
d={$tweened_d}
fill="none"
on:click
on:mouseover
on:mousemove
on:mouseout
on:mouseleave
on:pointerover
on:pointermove
on:pointerout
on:pointerleave
{...$$restProps}
/>
4 changes: 2 additions & 2 deletions packages/layerchart/src/lib/components/Pie.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,8 @@
{cornerRadius}
{offset}
fill={$config.r ? $rGet(arc.data) : null}
on:mousemove={(e) => tooltip?.show(e, arc.data)}
on:mouseleave={(e) => tooltip?.hide()}
on:pointermove={(e) => tooltip?.show(e, arc.data)}
on:pointerleave={(e) => tooltip?.hide()}
/>
{/each}
</slot>
Expand Down
8 changes: 4 additions & 4 deletions packages/layerchart/src/lib/components/Rect.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@
class={cls($$props.fill == null && 'fill-surface-content')}
{...$$restProps}
on:click
on:mouseover
on:mousemove
on:mouseout
on:mouseleave
on:pointerover
on:pointermove
on:pointerout
on:pointerleave
/>
4 changes: 2 additions & 2 deletions packages/layerchart/src/lib/components/Spline.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,8 @@
class={cls('path-line fill-none', !$$props.stroke && 'stroke-surface-content', $$props.class)}
in:drawTransition|global={typeof draw === 'object' ? draw : undefined}
on:click
on:mousemove
on:mouseleave
on:pointermove
on:pointerleave
bind:this={pathEl}
/>

Expand Down
43 changes: 23 additions & 20 deletions packages/layerchart/src/lib/components/TooltipContext.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
x: number;
y: number;
data: any;
show(event: MouseEvent | TouchEvent, tooltipData?: any): any;
hide(event?: MouseEvent | TouchEvent);
show(e: PointerEvent, tooltipData?: any): void;
hide(e?: PointerEvent): void;
};

export type TooltipContext = Readable<TooltipContextValue>;
Expand Down Expand Up @@ -76,7 +76,7 @@
*/
export let findTooltipData: 'closest' | 'left' | 'right' = 'closest';

/** Similar to d3-selection's raise, re-insert the event.target as the last child of its parent, so to be the top-most element */
/** 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 */
export let raiseTarget = false;

/** quadtree search radius
Expand Down Expand Up @@ -140,12 +140,12 @@
}
}

function showTooltip(event: MouseEvent | TouchEvent, tooltipData?: any) {
function showTooltip(e: PointerEvent, tooltipData?: any) {
// Cancel hiding tooltip if from previous event loop
clearTimeout(hideTimeoutId);

const referenceNode = (event.target as Element).closest('.layercake-container');
const point = localPoint(referenceNode, event);
const referenceNode = (e.target as Element).closest('.layercake-container');
const point = localPoint(referenceNode, e);
const localX = point?.x ?? 0;
const localY = point?.y ?? 0;

Expand All @@ -159,7 +159,7 @@
}

case 'bisect-band': {
// `x` and `y` values at mouse/touch coordinate
// `x` and `y` values at pointer coordinate
const xValueAtPoint = scaleInvert($xScale, localX);
const yValueAtPoint = scaleInvert($yScale, localY);

Expand All @@ -184,7 +184,7 @@
}

case 'bisect-x': {
// `x` value at mouse/touch coordinate
// `x` value at pointer coordinate
const xValueAtPoint = scaleInvert($xScale, localX - $padding.left);

const index = bisectX($flatData, xValueAtPoint, 1);
Expand All @@ -195,7 +195,7 @@
}

case 'bisect-y': {
// `y` value at mouse/touch coordinate
// `y` value at pointer coordinate
const yValueAtPoint = scaleInvert($yScale, localY - $padding.top);

const index = bisectY($flatData, yValueAtPoint, 1);
Expand All @@ -209,7 +209,7 @@

if (tooltipData) {
if (raiseTarget) {
raise(event.target);
raise(e.target);
}

$tooltip = {
Expand Down Expand Up @@ -313,7 +313,6 @@
}
})
.sort(sortFunc('x'));
// console.log({ rects });
}
</script>

Expand All @@ -324,11 +323,13 @@
<div
style:width="{$width}px"
style:height="{$height}px"
class={cls('tooltip-trigger absolute', debug && 'bg-danger/10 outline outline-danger')}
on:touchstart={showTooltip}
on:touchmove={showTooltip}
on:mousemove={showTooltip}
on:mouseleave={hideTooltip}
class={cls(
'tooltip-trigger absolute touch-none',
debug && 'bg-danger/10 outline outline-danger'
)}
on:pointerenter={showTooltip}
on:pointermove={showTooltip}
on:pointerleave={hideTooltip}
on:click={(e) => {
onClick({ data: $tooltip?.data });
}}
Expand All @@ -337,8 +338,9 @@
{:else if mode === 'voronoi'}
<Svg>
<Voronoi
on:mousemove={(e) => showTooltip(e.detail.event, e.detail.data)}
on:mouseleave={hideTooltip}
on:pointerenter={(e) => showTooltip(e.detail.event, e.detail.data)}
on:pointermove={(e) => showTooltip(e.detail.event, e.detail.data)}
on:pointerleave={hideTooltip}
on:click={(e) => {
onClick({ data: e.detail.data });
}}
Expand All @@ -355,8 +357,9 @@
width={rect.width}
height={rect.height}
class={cls(debug ? 'fill-danger/10 stroke-danger' : 'fill-transparent')}
on:mousemove={(e) => showTooltip(e, rect.data)}
on:mouseleave={hideTooltip}
on:pointerenter={(e) => showTooltip(e, rect.data)}
on:pointermove={(e) => showTooltip(e, rect.data)}
on:pointerleave={hideTooltip}
on:click={(e) => {
onClick({ data: rect.data });
}}
Expand Down
28 changes: 16 additions & 12 deletions packages/layerchart/src/lib/components/Transform.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -68,28 +68,26 @@
}
}

function onMouseDown(e: MouseEvent & { currentTarget: SVGElement }) {
function onPointerDown(e: PointerEvent & { currentTarget: SVGElement }) {
if (disablePointer) return;

e.preventDefault();

dragging = true;
moved = false;
svgEl = e.currentTarget.ownerSVGElement; // capture for reference in mousemove event
svgEl = e.currentTarget.ownerSVGElement; // capture for reference in pointermove event
startPoint = localPoint(svgEl, e);
startTranslate = $translate;

window.addEventListener('mousemove', onMouseMove, { capture: true });
window.addEventListener('mouseup', onMouseUp);

dispatch('dragstart');
}

function onMouseMove(e: MouseEvent) {
function onPointerMove(e: PointerEvent) {
if (!dragging) return;

e.preventDefault(); // Stop text selection
e.stopPropagation(); // Stop tooltip from trigging (along with `capture: true`)
e.currentTarget.setPointerCapture(e.pointerId);

const endPoint = localPoint(svgEl, e);
const deltaX = endPoint.x - startPoint.x;
Expand All @@ -109,11 +107,8 @@
}
}

function onMouseUp(e: MouseEvent) {
function onPointerUp(e: PointerEvent) {
dragging = false;

window.removeEventListener('mousemove', onMouseMove);
window.removeEventListener('mouseup', onMouseUp);
dispatch('dragend');
}

Expand Down Expand Up @@ -188,7 +183,7 @@
}
}

function localPoint(svgEl: SVGSVGElement | null, e: MouseEvent) {
function localPoint(svgEl: SVGSVGElement | null, e: PointerEvent) {
if (svgEl) {
const screenCTM = svgEl.getScreenCTM();

Expand Down Expand Up @@ -230,13 +225,22 @@

<g
on:mousewheel={onWheel}
on:mousedown={onMouseDown}
on:pointerdown={onPointerDown}
on:pointermove={onPointerMove}
on:touchmove={(e) => {
// Touch events cause pointer events to be interrupted.
// Typically `touch-action: none` works, but doesn't appear to with SVG, but `preventDefault()` works here
// https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events#touch-action_css_property
e.preventDefault();
}}
on:pointerup={onPointerUp}
on:dblclick={onDoubleClick}
on:click|capture={onClick}
on:click
on:keydown
on:keyup
on:keypress
class="touch-none"
>
<rect
x={-$padding.left}
Expand Down
Loading