From b45f47aea4c4c1ed05e75e4caa3cc9f899cb7ec0 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Thu, 30 Apr 2026 14:05:22 -0400 Subject: [PATCH 01/11] perf: Skip motion container allocation when `motion` prop is `undefined` --- .../skip-motion-alloc-when-undefined.md | 7 ++ .../lib/components/Arc/Arc.shared.svelte.ts | 19 ++-- .../lib/components/Area/Area.shared.svelte.ts | 27 +++-- .../components/Circle/Circle.shared.svelte.ts | 68 +++++++----- .../Ellipse/Ellipse.shared.svelte.ts | 80 ++++++++------ .../components/Group/Group.shared.svelte.ts | 23 ++-- .../components/Image/Image.shared.svelte.ts | 100 ++++++++++-------- .../lib/components/Line/Line.shared.svelte.ts | 81 ++++++++------ .../lib/components/Path/Path.shared.svelte.ts | 51 ++++----- .../lib/components/Pie/Pie.shared.svelte.ts | 11 +- .../Polygon/Polygon.shared.svelte.ts | 86 ++++++++------- .../lib/components/Rect/Rect.shared.svelte.ts | 77 ++++++++------ .../components/Spline/Spline.shared.svelte.ts | 17 +-- .../lib/components/Text/Text.shared.svelte.ts | 83 ++++++++------- 14 files changed, 424 insertions(+), 306 deletions(-) create mode 100644 .changeset/skip-motion-alloc-when-undefined.md diff --git a/.changeset/skip-motion-alloc-when-undefined.md b/.changeset/skip-motion-alloc-when-undefined.md new file mode 100644 index 000000000..483819087 --- /dev/null +++ b/.changeset/skip-motion-alloc-when-undefined.md @@ -0,0 +1,7 @@ +--- +'layerchart': patch +--- + +perf: Skip motion container allocation when `motion` prop is `undefined` + +Primitive state classes (`Circle`, `Group`, `Path`, `Rect`, `Line`, `Ellipse`, `Image`, `Text`, `Polygon`, `Arc`, `Pie`, `Area`, `Spline`) previously allocated 1–4 `createMotion` passthrough containers per instance even when no `motion` prop was provided. Containers are now lazily allocated only when the user opts in; otherwise the `motion*` getters read directly from props. Saves per-instance allocations and one layer of getter indirection on every render — most visible in mark-heavy scenes (e.g. force simulations with 100+ nodes/links rendering `Circle` and `Link` → `Path` → `Group`). diff --git a/packages/layerchart/src/lib/components/Arc/Arc.shared.svelte.ts b/packages/layerchart/src/lib/components/Arc/Arc.shared.svelte.ts index 5d64fdeb6..56d88ecc4 100644 --- a/packages/layerchart/src/lib/components/Arc/Arc.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Arc/Arc.shared.svelte.ts @@ -108,20 +108,25 @@ export class ArcState { trackRef = $state(); - #motionEndAngle!: ReturnType>; + // Only allocated when the user opts into animation via the `motion` prop; + // otherwise the getter reads `value` directly from props. + #motionEndAngle: ReturnType> | null = null; constructor(getProps: () => ArcProps) { this.#getProps = getProps; const initial = getProps(); - this.#motionEndAngle = createMotion( - initial.initialValue ?? 0, - () => getProps().value ?? 0, - initial.motion - ); + if (initial.motion !== undefined) { + this.#motionEndAngle = createMotion( + initial.initialValue ?? 0, + () => getProps().value ?? 0, + initial.motion + ); + } } get motionEndAngleValue() { - return this.#motionEndAngle.current; + if (this.#motionEndAngle) return this.#motionEndAngle.current; + return this.#getProps().value ?? 0; } range = $derived(this.#getProps().range ?? ([0, 360] as [number, number])); diff --git a/packages/layerchart/src/lib/components/Area/Area.shared.svelte.ts b/packages/layerchart/src/lib/components/Area/Area.shared.svelte.ts index 66d352069..e2ec203ff 100644 --- a/packages/layerchart/src/lib/components/Area/Area.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Area/Area.shared.svelte.ts @@ -56,7 +56,9 @@ export class AreaState { #getProps: () => AreaProps = () => ({}) as AreaProps; ctx: ChartState = getChartContext(); - #tweenState!: ReturnType>; + // Only allocated when the user opts into a tween via the `motion` prop; + // otherwise the getter reads `d` directly. + #tweenState: ReturnType> | null = null; constructor(getProps: () => AreaProps) { this.#getProps = getProps; @@ -78,14 +80,18 @@ export class AreaState { }); const extractedTween = extractTweenConfig(initial.motion); - const tweenOptions: ResolvedMotion | undefined = extractedTween - ? { - type: extractedTween.type, - options: { interpolate: interpolatePath, ...extractedTween.options }, - } - : undefined; - - this.#tweenState = createMotion(this.#defaultPathData(tweenOptions), () => this.d, tweenOptions); + if (extractedTween) { + const tweenOptions: ResolvedMotion = { + type: extractedTween.type, + options: { interpolate: interpolatePath, ...extractedTween.options }, + }; + + this.#tweenState = createMotion( + this.#defaultPathData(tweenOptions), + () => this.d, + tweenOptions + ); + } } series = $derived( @@ -185,7 +191,8 @@ export class AreaState { }); get tweenedPath() { - return this.#tweenState.current; + if (this.#tweenState) return this.#tweenState.current; + return this.d; } lineYAccessor = $derived.by(() => { diff --git a/packages/layerchart/src/lib/components/Circle/Circle.shared.svelte.ts b/packages/layerchart/src/lib/components/Circle/Circle.shared.svelte.ts index 4b1bf9029..6cc0290d0 100644 --- a/packages/layerchart/src/lib/components/Circle/Circle.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Circle/Circle.shared.svelte.ts @@ -186,11 +186,12 @@ export class CircleState { }); }); - // Pixel-mode motion sources. Initial values are captured at construction; - // subsequent updates come from the prop getters. - #motionCx!: ReturnType>; - #motionCy!: ReturnType>; - #motionR!: ReturnType>; + // Pixel-mode motion sources. Only allocated when the user opts into + // animation via the `motion` prop; otherwise the getters read directly + // from props. + #motionCx: ReturnType> | null = null; + #motionCy: ReturnType> | null = null; + #motionR: ReturnType> | null = null; // Static (non-data-driven) values used by SVG/HTML branches in pixel mode. staticFill = $derived( @@ -222,28 +223,31 @@ export class CircleState { this.#getProps = getProps; const initial = getProps(); - const initialCx = - initial.initialCx ?? (typeof initial.cx === 'number' ? initial.cx : 0); - const initialCy = - initial.initialCy ?? (typeof initial.cy === 'number' ? initial.cy : 0); - const initialR = - initial.initialR ?? (typeof initial.r === 'number' ? initial.r : 1); - this.#motionCx = createMotion( - initialCx, - () => (typeof getProps().cx === 'number' ? (getProps().cx as number) : 0), - initial.motion - ); - this.#motionCy = createMotion( - initialCy, - () => (typeof getProps().cy === 'number' ? (getProps().cy as number) : 0), - initial.motion - ); - this.#motionR = createMotion( - initialR, - () => (typeof getProps().r === 'number' ? (getProps().r as number) : 1), - initial.motion - ); + if (initial.motion !== undefined) { + const initialCx = + initial.initialCx ?? (typeof initial.cx === 'number' ? initial.cx : 0); + const initialCy = + initial.initialCy ?? (typeof initial.cy === 'number' ? initial.cy : 0); + const initialR = + initial.initialR ?? (typeof initial.r === 'number' ? initial.r : 1); + + this.#motionCx = createMotion( + initialCx, + () => (typeof getProps().cx === 'number' ? (getProps().cx as number) : 0), + initial.motion + ); + this.#motionCy = createMotion( + initialCy, + () => (typeof getProps().cy === 'number' ? (getProps().cy as number) : 0), + initial.motion + ); + this.#motionR = createMotion( + initialR, + () => (typeof getProps().r === 'number' ? (getProps().r as number) : 1), + initial.motion + ); + } this.#dataMotionMap = createDataMotionMap(initial.motion); if (this.#dataMotionMap) { @@ -266,13 +270,19 @@ export class CircleState { } get motionCx() { - return this.#motionCx.current; + if (this.#motionCx) return this.#motionCx.current; + const cx = this.#getProps().cx; + return typeof cx === 'number' ? cx : 0; } get motionCy() { - return this.#motionCy.current; + if (this.#motionCy) return this.#motionCy.current; + const cy = this.#getProps().cy; + return typeof cy === 'number' ? cy : 0; } get motionR() { - return this.#motionR.current; + if (this.#motionR) return this.#motionR.current; + const r = this.#getProps().r; + return typeof r === 'number' ? r : 1; } } diff --git a/packages/layerchart/src/lib/components/Ellipse/Ellipse.shared.svelte.ts b/packages/layerchart/src/lib/components/Ellipse/Ellipse.shared.svelte.ts index ed394dde6..8635fae72 100644 --- a/packages/layerchart/src/lib/components/Ellipse/Ellipse.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Ellipse/Ellipse.shared.svelte.ts @@ -119,23 +119,34 @@ export class EllipseState { }; } + // Pixel-mode motion sources. Only allocated when the user opts into + // animation via the `motion` prop; otherwise the getters read directly + // from props. #dataMotionMap: ReturnType = null; - #motionCx!: ReturnType>; - #motionCy!: ReturnType>; - #motionRx!: ReturnType>; - #motionRy!: ReturnType>; + #motionCx: ReturnType> | null = null; + #motionCy: ReturnType> | null = null; + #motionRx: ReturnType> | null = null; + #motionRy: ReturnType> | null = null; get motionCx() { - return this.#motionCx.current; + if (this.#motionCx) return this.#motionCx.current; + const cx = this.#getProps().cx; + return typeof cx === 'number' ? cx : 0; } get motionCy() { - return this.#motionCy.current; + if (this.#motionCy) return this.#motionCy.current; + const cy = this.#getProps().cy; + return typeof cy === 'number' ? cy : 0; } get motionRx() { - return this.#motionRx.current; + if (this.#motionRx) return this.#motionRx.current; + const rx = this.#getProps().rx; + return typeof rx === 'number' ? rx : 1; } get motionRy() { - return this.#motionRy.current; + if (this.#motionRy) return this.#motionRy.current; + const ry = this.#getProps().ry; + return typeof ry === 'number' ? ry : 1; } staticFill = $derived( @@ -173,31 +184,34 @@ export class EllipseState { this.#getProps = getProps; const initial = getProps(); - const initialCx = initial.initialCx ?? (typeof initial.cx === 'number' ? initial.cx : 0); - const initialCy = initial.initialCy ?? (typeof initial.cy === 'number' ? initial.cy : 0); - const initialRx = initial.initialRx ?? (typeof initial.rx === 'number' ? initial.rx : 1); - const initialRy = initial.initialRy ?? (typeof initial.ry === 'number' ? initial.ry : 1); - - this.#motionCx = createMotion( - initialCx, - () => (typeof getProps().cx === 'number' ? (getProps().cx as number) : 0), - initial.motion - ); - this.#motionCy = createMotion( - initialCy, - () => (typeof getProps().cy === 'number' ? (getProps().cy as number) : 0), - initial.motion - ); - this.#motionRx = createMotion( - initialRx, - () => (typeof getProps().rx === 'number' ? (getProps().rx as number) : 1), - initial.motion - ); - this.#motionRy = createMotion( - initialRy, - () => (typeof getProps().ry === 'number' ? (getProps().ry as number) : 1), - initial.motion - ); + + if (initial.motion !== undefined) { + const initialCx = initial.initialCx ?? (typeof initial.cx === 'number' ? initial.cx : 0); + const initialCy = initial.initialCy ?? (typeof initial.cy === 'number' ? initial.cy : 0); + const initialRx = initial.initialRx ?? (typeof initial.rx === 'number' ? initial.rx : 1); + const initialRy = initial.initialRy ?? (typeof initial.ry === 'number' ? initial.ry : 1); + + this.#motionCx = createMotion( + initialCx, + () => (typeof getProps().cx === 'number' ? (getProps().cx as number) : 0), + initial.motion + ); + this.#motionCy = createMotion( + initialCy, + () => (typeof getProps().cy === 'number' ? (getProps().cy as number) : 0), + initial.motion + ); + this.#motionRx = createMotion( + initialRx, + () => (typeof getProps().rx === 'number' ? (getProps().rx as number) : 1), + initial.motion + ); + this.#motionRy = createMotion( + initialRy, + () => (typeof getProps().ry === 'number' ? (getProps().ry as number) : 1), + initial.motion + ); + } this.#dataMotionMap = createDataMotionMap(initial.motion); if (this.#dataMotionMap) { diff --git a/packages/layerchart/src/lib/components/Group/Group.shared.svelte.ts b/packages/layerchart/src/lib/components/Group/Group.shared.svelte.ts index 9a5143e4b..6b02192f2 100644 --- a/packages/layerchart/src/lib/components/Group/Group.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Group/Group.shared.svelte.ts @@ -160,14 +160,18 @@ export class GroupState { }); #dataMotionMap: ReturnType = null; - #motionX!: ReturnType>; - #motionY!: ReturnType>; + // Pixel-mode motion sources. Only allocated when the user opts into + // animation via the `motion` prop; otherwise the getters return `trueX`/`trueY`. + #motionX: ReturnType> | null = null; + #motionY: ReturnType> | null = null; get motionX() { - return this.#motionX.current; + if (this.#motionX) return this.#motionX.current; + return this.trueX; } get motionY() { - return this.#motionY.current; + if (this.#motionY) return this.#motionY.current; + return this.trueY; } // Transform string for SVG/HTML pixel mode @@ -189,11 +193,14 @@ export class GroupState { this.#getProps = getProps; const initial = getProps(); - const initialX = initial.initialX ?? (typeof initial.x === 'number' ? initial.x : undefined); - const initialY = initial.initialY ?? (typeof initial.y === 'number' ? initial.y : undefined); - this.#motionX = createMotion(initialX, () => this.trueX, initial.motion); - this.#motionY = createMotion(initialY, () => this.trueY, initial.motion); + if (initial.motion !== undefined) { + const initialX = initial.initialX ?? (typeof initial.x === 'number' ? initial.x : undefined); + const initialY = initial.initialY ?? (typeof initial.y === 'number' ? initial.y : undefined); + + this.#motionX = createMotion(initialX, () => this.trueX, initial.motion); + this.#motionY = createMotion(initialY, () => this.trueY, initial.motion); + } this.#dataMotionMap = createDataMotionMap(initial.motion); if (this.#dataMotionMap) { diff --git a/packages/layerchart/src/lib/components/Image/Image.shared.svelte.ts b/packages/layerchart/src/lib/components/Image/Image.shared.svelte.ts index 49cb3784c..89f0ba12b 100644 --- a/packages/layerchart/src/lib/components/Image/Image.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Image/Image.shared.svelte.ts @@ -174,67 +174,79 @@ export class ImageState { typeof this.#getProps().rotate === 'number' ? (this.#getProps().rotate as number) : undefined ); + // Pixel-mode motion sources. Only allocated when the user opts into + // animation via the `motion` prop; otherwise the getters read directly + // from props. #dataMotionMap: ReturnType = null; - #motionX!: ReturnType>; - #motionY!: ReturnType>; - #motionWidth!: ReturnType>; - #motionHeight!: ReturnType>; + #motionX: ReturnType> | null = null; + #motionY: ReturnType> | null = null; + #motionWidth: ReturnType> | null = null; + #motionHeight: ReturnType> | null = null; get motionX() { - return this.#motionX.current; + if (this.#motionX) return this.#motionX.current; + const x = this.#getProps().x; + return typeof x === 'number' ? x : 0; } get motionY() { - return this.#motionY.current; + if (this.#motionY) return this.#motionY.current; + const y = this.#getProps().y; + return typeof y === 'number' ? y : 0; } get motionWidth() { - return this.#motionWidth.current; + if (this.#motionWidth) return this.#motionWidth.current; + return this.resolvedPixelWidth; } get motionHeight() { - return this.#motionHeight.current; + if (this.#motionHeight) return this.#motionHeight.current; + return this.resolvedPixelHeight; } constructor(getProps: () => ImageProps) { this.#getProps = getProps; const initial = getProps(); - const initialX = initial.initialX ?? (typeof initial.x === 'number' ? initial.x : 0); - const initialY = initial.initialY ?? (typeof initial.y === 'number' ? initial.y : 0); - const initialWidth = - initial.initialWidth ?? - (typeof initial.width === 'number' - ? initial.width - : typeof initial.r === 'number' - ? initial.r * 2 - : 16); - const initialHeight = - initial.initialHeight ?? - (typeof initial.height === 'number' - ? initial.height - : typeof initial.r === 'number' - ? initial.r * 2 - : 16); const motion = initial.motion; - this.#motionX = createMotion( - initialX, - () => (typeof getProps().x === 'number' ? (getProps().x as number) : 0), - motion === undefined ? undefined : parseMotionProp(motion, 'x') - ); - this.#motionY = createMotion( - initialY, - () => (typeof getProps().y === 'number' ? (getProps().y as number) : 0), - motion === undefined ? undefined : parseMotionProp(motion, 'y') - ); - this.#motionWidth = createMotion( - initialWidth, - () => this.resolvedPixelWidth, - motion === undefined ? undefined : parseMotionProp(motion, 'width') - ); - this.#motionHeight = createMotion( - initialHeight, - () => this.resolvedPixelHeight, - motion === undefined ? undefined : parseMotionProp(motion, 'height') - ); + if (motion !== undefined) { + const initialX = initial.initialX ?? (typeof initial.x === 'number' ? initial.x : 0); + const initialY = initial.initialY ?? (typeof initial.y === 'number' ? initial.y : 0); + const initialWidth = + initial.initialWidth ?? + (typeof initial.width === 'number' + ? initial.width + : typeof initial.r === 'number' + ? initial.r * 2 + : 16); + const initialHeight = + initial.initialHeight ?? + (typeof initial.height === 'number' + ? initial.height + : typeof initial.r === 'number' + ? initial.r * 2 + : 16); + + this.#motionX = createMotion( + initialX, + () => (typeof getProps().x === 'number' ? (getProps().x as number) : 0), + parseMotionProp(motion, 'x') + ); + this.#motionY = createMotion( + initialY, + () => (typeof getProps().y === 'number' ? (getProps().y as number) : 0), + parseMotionProp(motion, 'y') + ); + this.#motionWidth = createMotion( + initialWidth, + () => this.resolvedPixelWidth, + parseMotionProp(motion, 'width') + ); + this.#motionHeight = createMotion( + initialHeight, + () => this.resolvedPixelHeight, + parseMotionProp(motion, 'height') + ); + } this.#dataMotionMap = createDataMotionMap(motion as MotionOptions | undefined); if (this.#dataMotionMap) { diff --git a/packages/layerchart/src/lib/components/Line/Line.shared.svelte.ts b/packages/layerchart/src/lib/components/Line/Line.shared.svelte.ts index cf1b6d9c5..7fd340a61 100644 --- a/packages/layerchart/src/lib/components/Line/Line.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Line/Line.shared.svelte.ts @@ -200,24 +200,34 @@ export class LineState { dashArrayResolved = $derived(parseDashArray(this.#getProps().dashArray)); dashArrayAttr = $derived(this.dashArrayResolved ? this.dashArrayResolved.join(' ') : undefined); - // Pixel-mode motion sources + // Pixel-mode motion sources. Only allocated when the user opts into + // animation via the `motion` prop; otherwise the getters read directly + // from props. #dataMotionMap: ReturnType = null; - #motionX1!: ReturnType>; - #motionY1!: ReturnType>; - #motionX2!: ReturnType>; - #motionY2!: ReturnType>; + #motionX1: ReturnType> | null = null; + #motionY1: ReturnType> | null = null; + #motionX2: ReturnType> | null = null; + #motionY2: ReturnType> | null = null; get motionX1() { - return this.#motionX1.current; + if (this.#motionX1) return this.#motionX1.current; + const x1 = this.#getProps().x1; + return typeof x1 === 'number' ? x1 : 0; } get motionY1() { - return this.#motionY1.current; + if (this.#motionY1) return this.#motionY1.current; + const y1 = this.#getProps().y1; + return typeof y1 === 'number' ? y1 : 0; } get motionX2() { - return this.#motionX2.current; + if (this.#motionX2) return this.#motionX2.current; + const x2 = this.#getProps().x2; + return typeof x2 === 'number' ? x2 : 0; } get motionY2() { - return this.#motionY2.current; + if (this.#motionY2) return this.#motionY2.current; + const y2 = this.#getProps().y2; + return typeof y2 === 'number' ? y2 : 0; } // Static (non-data-driven) values for SVG/HTML pixel mode @@ -256,31 +266,34 @@ export class LineState { this.#getProps = getProps; const initial = getProps(); - const initialX1 = initial.initialX1 ?? (typeof initial.x1 === 'number' ? initial.x1 : 0); - const initialY1 = initial.initialY1 ?? (typeof initial.y1 === 'number' ? initial.y1 : 0); - const initialX2 = initial.initialX2 ?? (typeof initial.x2 === 'number' ? initial.x2 : 0); - const initialY2 = initial.initialY2 ?? (typeof initial.y2 === 'number' ? initial.y2 : 0); - - this.#motionX1 = createMotion( - initialX1, - () => (typeof getProps().x1 === 'number' ? (getProps().x1 as number) : 0), - initial.motion - ); - this.#motionY1 = createMotion( - initialY1, - () => (typeof getProps().y1 === 'number' ? (getProps().y1 as number) : 0), - initial.motion - ); - this.#motionX2 = createMotion( - initialX2, - () => (typeof getProps().x2 === 'number' ? (getProps().x2 as number) : 0), - initial.motion - ); - this.#motionY2 = createMotion( - initialY2, - () => (typeof getProps().y2 === 'number' ? (getProps().y2 as number) : 0), - initial.motion - ); + + if (initial.motion !== undefined) { + const initialX1 = initial.initialX1 ?? (typeof initial.x1 === 'number' ? initial.x1 : 0); + const initialY1 = initial.initialY1 ?? (typeof initial.y1 === 'number' ? initial.y1 : 0); + const initialX2 = initial.initialX2 ?? (typeof initial.x2 === 'number' ? initial.x2 : 0); + const initialY2 = initial.initialY2 ?? (typeof initial.y2 === 'number' ? initial.y2 : 0); + + this.#motionX1 = createMotion( + initialX1, + () => (typeof getProps().x1 === 'number' ? (getProps().x1 as number) : 0), + initial.motion + ); + this.#motionY1 = createMotion( + initialY1, + () => (typeof getProps().y1 === 'number' ? (getProps().y1 as number) : 0), + initial.motion + ); + this.#motionX2 = createMotion( + initialX2, + () => (typeof getProps().x2 === 'number' ? (getProps().x2 as number) : 0), + initial.motion + ); + this.#motionY2 = createMotion( + initialY2, + () => (typeof getProps().y2 === 'number' ? (getProps().y2 as number) : 0), + initial.motion + ); + } this.#dataMotionMap = createDataMotionMap(initial.motion); if (this.#dataMotionMap) { diff --git a/packages/layerchart/src/lib/components/Path/Path.shared.svelte.ts b/packages/layerchart/src/lib/components/Path/Path.shared.svelte.ts index 7e1113978..00fae0c29 100644 --- a/packages/layerchart/src/lib/components/Path/Path.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Path/Path.shared.svelte.ts @@ -78,11 +78,14 @@ export class PathState { // Contexts chartCtx: ChartState = getChartContext(); - // Path data tween source — the actual `d` attribute / canvas render input - #tweenedState!: ReturnType>; + // Path data tween source — the actual `d` attribute / canvas render input. + // Only allocated when the user opts into a tween via the `motion` prop; + // otherwise the getter reads `pathData` directly. + #tweenedState: ReturnType> | null = null; get tweenedPathData() { - return this.#tweenedState.current; + if (this.#tweenedState) return this.#tweenedState.current; + return this.#getProps().pathData; } // Re-key trigger for draw transitions @@ -93,28 +96,26 @@ export class PathState { const initial = getProps(); const extractedTween = extractTweenConfig(initial.motion); - const tweenedOptions: ResolvedMotion | undefined = extractedTween - ? { - type: extractedTween.type, - options: { interpolate: interpolatePath, ...extractedTween.options }, - } - : undefined; - - // Provide initial `0` baseline; only set on initial mount - const defaultPathData = (() => { - if (!tweenedOptions) { - // Fast initial render when not tweened - return ''; - } else if (initial.pathData) { - return flattenPathData( - initial.pathData, - Math.min(this.chartCtx.yScale(0) ?? this.chartCtx.yRange[0], this.chartCtx.yRange[0]) - ); - } - return ''; - })(); - - this.#tweenedState = createMotion(defaultPathData, () => getProps().pathData, tweenedOptions); + + if (extractedTween) { + const tweenedOptions: ResolvedMotion = { + type: extractedTween.type, + options: { interpolate: interpolatePath, ...extractedTween.options }, + }; + + const defaultPathData = initial.pathData + ? flattenPathData( + initial.pathData, + Math.min(this.chartCtx.yScale(0) ?? this.chartCtx.yRange[0], this.chartCtx.yRange[0]) + ) + : ''; + + this.#tweenedState = createMotion( + defaultPathData, + () => getProps().pathData, + tweenedOptions + ); + } // Re-trigger draw transition when path data changes $effect(() => { diff --git a/packages/layerchart/src/lib/components/Pie/Pie.shared.svelte.ts b/packages/layerchart/src/lib/components/Pie/Pie.shared.svelte.ts index 0283de0be..a46472e7c 100644 --- a/packages/layerchart/src/lib/components/Pie/Pie.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Pie/Pie.shared.svelte.ts @@ -49,11 +49,16 @@ export class PieState { #getProps: () => PieProps = () => ({}) as PieProps; ctx: ChartState = getChartContext(); - #motionEndAngle!: ReturnType>; + // Only allocated when the user opts into animation via the `motion` prop; + // otherwise the pie generator reads `endAngle` directly. + #motionEndAngle: ReturnType> | null = null; constructor(getProps: () => PieProps) { this.#getProps = getProps; - this.#motionEndAngle = createMotion(0, () => this.endAngle, getProps().motion); + const initial = getProps(); + if (initial.motion !== undefined) { + this.#motionEndAngle = createMotion(0, () => this.endAngle, initial.motion); + } } range = $derived(this.#getProps().range ?? ([0, 360] as [number, number])); @@ -77,7 +82,7 @@ export class PieState { (this.ctx.config.xRange ? min(this.ctx.config.xRange as number[]) : min(this.range))! ) ) - .endAngle(this.#motionEndAngle.current) + .endAngle(this.#motionEndAngle?.current ?? this.endAngle) .padAngle(props.padAngle ?? 0) .value(this.ctx.x); diff --git a/packages/layerchart/src/lib/components/Polygon/Polygon.shared.svelte.ts b/packages/layerchart/src/lib/components/Polygon/Polygon.shared.svelte.ts index 9833bb6ea..6e7c46eec 100644 --- a/packages/layerchart/src/lib/components/Polygon/Polygon.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Polygon/Polygon.shared.svelte.ts @@ -160,24 +160,33 @@ export class PolygonState { return roundedPolygonPath(pts, props.cornerRadius ?? 0); } - // Pixel-mode motion sources + // Pixel-mode motion sources. Only allocated when the user opts into + // animation via the `motion` prop; otherwise the getters read directly + // from props / pixelPathData. #dataMotionMap: ReturnType = null; - #motionCx!: ReturnType>; - #motionCy!: ReturnType>; - #motionR!: ReturnType>; - #tweenedState!: ReturnType>; + #motionCx: ReturnType> | null = null; + #motionCy: ReturnType> | null = null; + #motionR: ReturnType> | null = null; + #tweenedState: ReturnType> | null = null; get motionCx() { - return this.#motionCx.current; + if (this.#motionCx) return this.#motionCx.current; + const cx = this.#getProps().cx; + return typeof cx === 'number' ? cx : 0; } get motionCy() { - return this.#motionCy.current; + if (this.#motionCy) return this.#motionCy.current; + const cy = this.#getProps().cy; + return typeof cy === 'number' ? cy : 0; } get motionR() { - return this.#motionR.current; + if (this.#motionR) return this.#motionR.current; + const r = this.#getProps().r; + return typeof r === 'number' ? r : 1; } get tweenedPathData() { - return this.#tweenedState.current; + if (this.#tweenedState) return this.#tweenedState.current; + return this.pixelPathData; } // Pixel-mode polygon path string (depends on motion + transform props) @@ -232,38 +241,41 @@ export class PolygonState { this.#getProps = getProps; const initial = getProps(); - const initialCx = initial.initialCx ?? (typeof initial.cx === 'number' ? initial.cx : 0); - const initialCy = initial.initialCy ?? (typeof initial.cy === 'number' ? initial.cy : 0); - const initialR = initial.initialR ?? (typeof initial.r === 'number' ? initial.r : 1); - this.#motionCx = createMotion( - initialCx, - () => (typeof getProps().cx === 'number' ? (getProps().cx as number) : 0), - initial.motion - ); - this.#motionCy = createMotion( - initialCy, - () => (typeof getProps().cy === 'number' ? (getProps().cy as number) : 0), - initial.motion - ); - this.#motionR = createMotion( - initialR, - () => (typeof getProps().r === 'number' ? (getProps().r as number) : 1), - initial.motion - ); + if (initial.motion !== undefined) { + const initialCx = initial.initialCx ?? (typeof initial.cx === 'number' ? initial.cx : 0); + const initialCy = initial.initialCy ?? (typeof initial.cy === 'number' ? initial.cy : 0); + const initialR = initial.initialR ?? (typeof initial.r === 'number' ? initial.r : 1); - const extractedTween = extractTweenConfig(initial.motion); - const tweenedOptions: ResolvedMotion | undefined = extractedTween - ? { + this.#motionCx = createMotion( + initialCx, + () => (typeof getProps().cx === 'number' ? (getProps().cx as number) : 0), + initial.motion + ); + this.#motionCy = createMotion( + initialCy, + () => (typeof getProps().cy === 'number' ? (getProps().cy as number) : 0), + initial.motion + ); + this.#motionR = createMotion( + initialR, + () => (typeof getProps().r === 'number' ? (getProps().r as number) : 1), + initial.motion + ); + + const extractedTween = extractTweenConfig(initial.motion); + if (extractedTween) { + const tweenedOptions: ResolvedMotion = { type: extractedTween.type, options: { interpolate: interpolatePath, ...extractedTween.options }, - } - : undefined; - this.#tweenedState = createMotion( - null, - () => this.pixelPathData, - tweenedOptions - ); + }; + this.#tweenedState = createMotion( + null, + () => this.pixelPathData, + tweenedOptions + ); + } + } this.#dataMotionMap = createDataMotionMap(initial.motion); if (this.#dataMotionMap) { diff --git a/packages/layerchart/src/lib/components/Rect/Rect.shared.svelte.ts b/packages/layerchart/src/lib/components/Rect/Rect.shared.svelte.ts index 915c5fd72..b5f735100 100644 --- a/packages/layerchart/src/lib/components/Rect/Rect.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Rect/Rect.shared.svelte.ts @@ -301,24 +301,32 @@ export class RectState { ) || 0 ); - // Pixel-mode motion sources + // Pixel-mode motion sources. Only allocated when the user opts into + // animation via the `motion` prop; otherwise the getters read directly + // from props. #dataMotionMap: ReturnType = null; - #motionX!: ReturnType>; - #motionY!: ReturnType>; - #motionWidth!: ReturnType>; - #motionHeight!: ReturnType>; + #motionX: ReturnType> | null = null; + #motionY: ReturnType> | null = null; + #motionWidth: ReturnType> | null = null; + #motionHeight: ReturnType> | null = null; get motionX() { - return this.#motionX.current; + if (this.#motionX) return this.#motionX.current; + const x = this.#getProps().x; + return typeof x === 'number' ? x : 0; } get motionY() { - return this.#motionY.current; + if (this.#motionY) return this.#motionY.current; + const y = this.#getProps().y; + return typeof y === 'number' ? y : 0; } get motionWidth() { - return this.#motionWidth.current; + if (this.#motionWidth) return this.#motionWidth.current; + return this.#getProps().width ?? 0; } get motionHeight() { - return this.#motionHeight.current; + if (this.#motionHeight) return this.#motionHeight.current; + return this.#getProps().height ?? 0; } // Resolved per-corner radii (clamped to current bounds) @@ -387,32 +395,35 @@ export class RectState { this.#getProps = getProps; const initial = getProps(); - const initialX = initial.initialX ?? (typeof initial.x === 'number' ? initial.x : 0); - const initialY = initial.initialY ?? (typeof initial.y === 'number' ? initial.y : 0); - const initialWidth = initial.initialWidth ?? initial.width ?? 0; - const initialHeight = initial.initialHeight ?? initial.height ?? 0; const motion = initial.motion; - this.#motionX = createMotion( - initialX, - () => (typeof getProps().x === 'number' ? (getProps().x as number) : 0), - motion === undefined ? undefined : parseMotionProp(motion, 'x') - ); - this.#motionY = createMotion( - initialY, - () => (typeof getProps().y === 'number' ? (getProps().y as number) : 0), - motion === undefined ? undefined : parseMotionProp(motion, 'y') - ); - this.#motionWidth = createMotion( - initialWidth, - () => getProps().width ?? 0, - motion === undefined ? undefined : parseMotionProp(motion, 'width') - ); - this.#motionHeight = createMotion( - initialHeight, - () => getProps().height ?? 0, - motion === undefined ? undefined : parseMotionProp(motion, 'height') - ); + if (motion !== undefined) { + const initialX = initial.initialX ?? (typeof initial.x === 'number' ? initial.x : 0); + const initialY = initial.initialY ?? (typeof initial.y === 'number' ? initial.y : 0); + const initialWidth = initial.initialWidth ?? initial.width ?? 0; + const initialHeight = initial.initialHeight ?? initial.height ?? 0; + + this.#motionX = createMotion( + initialX, + () => (typeof getProps().x === 'number' ? (getProps().x as number) : 0), + parseMotionProp(motion, 'x') + ); + this.#motionY = createMotion( + initialY, + () => (typeof getProps().y === 'number' ? (getProps().y as number) : 0), + parseMotionProp(motion, 'y') + ); + this.#motionWidth = createMotion( + initialWidth, + () => getProps().width ?? 0, + parseMotionProp(motion, 'width') + ); + this.#motionHeight = createMotion( + initialHeight, + () => getProps().height ?? 0, + parseMotionProp(motion, 'height') + ); + } this.#dataMotionMap = createDataMotionMap(motion as MotionOptions | undefined); if (this.#dataMotionMap) { diff --git a/packages/layerchart/src/lib/components/Spline/Spline.shared.svelte.ts b/packages/layerchart/src/lib/components/Spline/Spline.shared.svelte.ts index 9ab2f8bc7..e65131d51 100644 --- a/packages/layerchart/src/lib/components/Spline/Spline.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Spline/Spline.shared.svelte.ts @@ -64,7 +64,9 @@ export class SplineState { ctx: ChartState = getChartContext(); geo: GeoState = getGeoContext(); - #tweenState!: ReturnType>; + // Only allocated when the user opts into a tween via the `motion` prop; + // `Spline.base.svelte` reads `c.d` directly otherwise (gated by `isTweened`). + #tweenState: ReturnType> | null = null; constructor(getProps: () => SplineProps) { this.#getProps = getProps; @@ -85,10 +87,12 @@ export class SplineState { }, }); - this.#tweenState = createMotion(this.#defaultPathData(), () => this.d, { - type: 'tween', - interpolate: interpolatePath, - }); + if (extractTweenConfig(initial.motion) != null) { + this.#tweenState = createMotion(this.#defaultPathData(), () => this.d, { + type: 'tween', + interpolate: interpolatePath, + }); + } } #getScaleValue( @@ -224,7 +228,8 @@ export class SplineState { isTweened = $derived(extractTweenConfig(this.#getProps().motion) != null); get tweenedPath() { - return this.#tweenState.current; + if (this.#tweenState) return this.#tweenState.current; + return this.d; } seriesOpacity = $derived.by(() => { diff --git a/packages/layerchart/src/lib/components/Text/Text.shared.svelte.ts b/packages/layerchart/src/lib/components/Text/Text.shared.svelte.ts index 081b726f5..13c758f1b 100644 --- a/packages/layerchart/src/lib/components/Text/Text.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Text/Text.shared.svelte.ts @@ -364,16 +364,22 @@ export class TextState { #dataMotionMap: ReturnType = null; - // Pixel-mode motion sources - #motionX!: ReturnType>; - #motionY!: ReturnType>; - #motionValue!: ReturnType>; + // Pixel-mode motion sources. Only allocated when the user opts into + // animation via the `motion` prop; otherwise the getters read directly + // from props. + #motionX: ReturnType> | null = null; + #motionY: ReturnType> | null = null; + #motionValue: ReturnType> | null = null; get motionX() { - return this.#motionX.current; + if (this.#motionX) return this.#motionX.current; + const x = this.#getProps().x; + return typeof x === 'number' || typeof x === 'string' ? x : 0; } get motionY() { - return this.#motionY.current; + if (this.#motionY) return this.#motionY.current; + const y = this.#getProps().y; + return typeof y === 'number' || typeof y === 'string' ? y : 0; } // Resolved width: for path text, defer to the (SVG-bound) pathRef length @@ -400,7 +406,7 @@ export class TextState { const motion = this.#getProps().motion; const format = this.#getProps().format; if (typeof value === 'function' || value == null) return ''; - if (typeof value === 'number' && motion) { + if (typeof value === 'number' && motion && this.#motionValue) { const v = this.#motionValue.current; // @ts-expect-error - improve format types return format ? formatValue(v, format) : String(v); @@ -541,38 +547,41 @@ export class TextState { this.#getProps = getProps; const initial = getProps(); - const _initialX: string | number = - initial.initialX ?? (typeof initial.x === 'function' ? 0 : (initial.x ?? 0)); - const _initialY: string | number = - initial.initialY ?? (typeof initial.y === 'function' ? 0 : (initial.y ?? 0)); - - this.#motionX = createMotion( - _initialX, - () => { - const x = getProps().x; - return typeof x === 'number' || typeof x === 'string' ? x : 0; - }, - initial.motion - ); - this.#motionY = createMotion( - _initialY, - () => { - const y = getProps().y; - return typeof y === 'number' || typeof y === 'string' ? y : 0; - }, - initial.motion - ); - - // Tween numeric values when motion is configured - this.#motionValue = createMotion( - typeof initial.value === 'number' ? initial.value : 0, - () => (typeof getProps().value === 'number' ? (getProps().value as number) : 0), - typeof initial.value === 'number' && initial.motion - ? typeof initial.motion === 'object' && 'type' in initial.motion + + if (initial.motion !== undefined) { + const _initialX: string | number = + initial.initialX ?? (typeof initial.x === 'function' ? 0 : (initial.x ?? 0)); + const _initialY: string | number = + initial.initialY ?? (typeof initial.y === 'function' ? 0 : (initial.y ?? 0)); + + this.#motionX = createMotion( + _initialX, + () => { + const x = getProps().x; + return typeof x === 'number' || typeof x === 'string' ? x : 0; + }, + initial.motion + ); + this.#motionY = createMotion( + _initialY, + () => { + const y = getProps().y; + return typeof y === 'number' || typeof y === 'string' ? y : 0; + }, + initial.motion + ); + + // Tween numeric values when motion is configured + this.#motionValue = createMotion( + typeof initial.value === 'number' ? initial.value : 0, + () => (typeof getProps().value === 'number' ? (getProps().value as number) : 0), + typeof initial.value === 'number' && + typeof initial.motion === 'object' && + 'type' in initial.motion ? initial.motion : undefined - : undefined - ); + ); + } this.#dataMotionMap = createDataMotionMap(initial.motion); if (this.#dataMotionMap) { From dc7de2e8a6e35f985ce29e6a001ad26dd543918c Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Thu, 30 Apr 2026 14:05:34 -0400 Subject: [PATCH 02/11] perf: Skip mark-info `$effect` for pixel-mode primitives --- .changeset/skip-empty-markinfo-effect.md | 9 +++++ .../layerchart/src/lib/states/chart.svelte.ts | 34 ++++++++++++++----- 2 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 .changeset/skip-empty-markinfo-effect.md diff --git a/.changeset/skip-empty-markinfo-effect.md b/.changeset/skip-empty-markinfo-effect.md new file mode 100644 index 000000000..7859c4c34 --- /dev/null +++ b/.changeset/skip-empty-markinfo-effect.md @@ -0,0 +1,9 @@ +--- +'layerchart': patch +--- + +perf: Skip mark-info `$effect` for pixel-mode primitives + +`registerComponent` now probes `markInfo()` once at construction; if the result is initially empty (pixel-mode primitives where `cx`/`cy`/`r`/etc. are numbers rather than string/function accessors), it skips creating the tracking `$effect` entirely. Saves one effect frame per primitive — adds up in mark-heavy scenes (force simulations, scatter plots with hundreds of nodes). + +Trade-off: a primitive that starts in pixel mode and later flips to data mode at runtime (e.g. `cx` mutates from a number to a string) will not register a mark. Mark mode is typically static; if a chart needs runtime data-mode marks, define an explicit `series` on the chart instead. diff --git a/packages/layerchart/src/lib/states/chart.svelte.ts b/packages/layerchart/src/lib/states/chart.svelte.ts index 9522f9ccb..146a2e584 100644 --- a/packages/layerchart/src/lib/states/chart.svelte.ts +++ b/packages/layerchart/src/lib/states/chart.svelte.ts @@ -87,6 +87,13 @@ export interface RegisterComponentOptions { /** Svelte context key for tracking the nearest parent ComponentNode. */ const _ParentNodeContext = new Context('ComponentTreeParent'); +/** Mark info is "empty" when none of the fields the chart uses for series / + * domain inference are populated. Pixel-mode primitives produce empty info + * since they have no string/function accessors and no own data. */ +function isEmptyMarkInfo(info: MarkInfo): boolean { + return !info.x && !info.y && !info.data && !info.color && !info.seriesKey && !info.label; +} + export class ChartState< TData = any, XScale extends AnyScale = AnyScale, @@ -222,14 +229,25 @@ export class ChartState< }); if (markInfo && !insideCompositeMark) { - $effect(() => { - const info = markInfo(); - // Skip registration for empty mark info (e.g. pixel-mode marks) - // to avoid unnecessary array push/splice and version bumps - if (!info.x && !info.y && !info.data && !info.color && !info.seriesKey && !info.label) - return; - return untrack(() => this.registerMark(info)); - }); + // Probe once at construction: if mark info is initially empty + // (pixel-mode primitives where cx/cy/r are numbers), skip the + // tracking $effect entirely. This is the common case for + // mark-heavy scenes (force simulations, scatter plots with + // pixel coordinates) and avoids one effect frame per primitive. + // + // Trade-off: a primitive that starts in pixel mode and later + // flips to data mode (e.g. cx changes from number to string at + // runtime) won't register a mark. This is uncommon — modes are + // typically static — but if needed, use explicit `series` on the + // chart instead of relying on implicit mark-derived series. + const initial = untrack(markInfo); + if (!isEmptyMarkInfo(initial)) { + $effect(() => { + const info = markInfo(); + if (isEmptyMarkInfo(info)) return; + return untrack(() => this.registerMark(info)); + }); + } } return node; From ee6b332332a2a5332b780b211a1a113a06bec2d5 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Thu, 30 Apr 2026 17:56:16 -0400 Subject: [PATCH 03/11] perf: Reduce per-tick reactive overhead in `Path` / `Link` (force-simulation graphs) --- .changeset/path-lazy-feature-allocation.md | 25 ++++ ...andle-full-circle--360-degree-range--1.png | Bin 0 -> 6580 bytes ...andle-full-circle--360-degree-range--2.png | Bin 0 -> 6580 bytes ...-handle-innerRadius-of-0--pie-slice--1.png | Bin 0 -> 4598 bytes ...-handle-innerRadius-of-0--pie-slice--2.png | Bin 0 -> 4598 bytes ...should-handle-negative-domain-values-1.png | Bin 0 -> 4598 bytes ...should-handle-negative-domain-values-2.png | Bin 0 -> 4598 bytes ...ndle-partial-arc--e-g---180-degrees--1.png | Bin 0 -> 4598 bytes ...ndle-partial-arc--e-g---180-degrees--2.png | Bin 0 -> 4598 bytes ...es-should-handle-value-at-max-domain-1.png | Bin 0 -> 6580 bytes ...es-should-handle-value-at-max-domain-2.png | Bin 0 -> 6580 bytes ...should-handle-value-below-domain-min-1.png | Bin 0 -> 3212 bytes ...should-handle-value-below-domain-min-2.png | Bin 0 -> 3212 bytes ...ld-handle-value-exceeding-domain-max-1.png | Bin 0 -> 6580 bytes ...ld-handle-value-exceeding-domain-max-2.png | Bin 0 -> 6580 bytes ...-edge-cases-should-handle-value-of-0-1.png | Bin 0 -> 2082 bytes ...-edge-cases-should-handle-value-of-0-2.png | Bin 0 -> 2082 bytes ...s-should-handle-pointer-enter-events-1.png | Bin 0 -> 4244 bytes ...s-should-handle-pointer-enter-events-2.png | Bin 0 -> 4244 bytes ...ts-should-handle-pointer-move-events-1.png | Bin 0 -> 4244 bytes ...ts-should-handle-pointer-move-events-2.png | Bin 0 -> 4244 bytes ...ents-should-handle-touch-move-events-1.png | Bin 0 -> 4598 bytes ...ents-should-handle-touch-move-events-2.png | Bin 0 -> 4598 bytes .../Arc-props-should-apply-custom-class-1.png | Bin 0 -> 4598 bytes .../Arc-props-should-apply-custom-class-2.png | Bin 0 -> 4598 bytes .../Arc-props-should-apply-fill-color-1.png | Bin 0 -> 4251 bytes .../Arc-props-should-apply-fill-color-2.png | Bin 0 -> 4251 bytes .../Arc-props-should-apply-fillOpacity-1.png | Bin 0 -> 4571 bytes .../Arc-props-should-apply-fillOpacity-2.png | Bin 0 -> 4571 bytes ...-should-apply-offset-to-arc-position-1.png | Bin 0 -> 4598 bytes ...-should-apply-offset-to-arc-position-2.png | Bin 0 -> 4598 bytes .../Arc-props-should-apply-opacity-1.png | Bin 0 -> 4431 bytes .../Arc-props-should-apply-opacity-2.png | Bin 0 -> 4431 bytes .../Arc-props-should-apply-stroke-color-1.png | Bin 0 -> 5508 bytes .../Arc-props-should-apply-stroke-color-2.png | Bin 0 -> 5508 bytes .../Arc-props-should-apply-strokeWidth-1.png | Bin 0 -> 5759 bytes .../Arc-props-should-apply-strokeWidth-2.png | Bin 0 -> 5759 bytes ...-should-apply-zero-offset-by-default-1.png | Bin 0 -> 4598 bytes ...-should-apply-zero-offset-by-default-2.png | Bin 0 -> 4598 bytes ...d-call-tooltip-hide-on-pointer-leave-1.png | Bin 0 -> 4244 bytes ...d-call-tooltip-hide-on-pointer-leave-2.png | Bin 0 -> 4244 bytes ...ltip-show-on-pointer-enter-with-data-1.png | Bin 0 -> 4244 bytes ...ltip-show-on-pointer-enter-with-data-2.png | Bin 0 -> 4244 bytes ...d-handle-custom-start-angle-in-range-1.png | Bin 0 -> 3376 bytes ...d-handle-custom-start-angle-in-range-2.png | Bin 0 -> 3376 bytes ...should-have-stroke--none--by-default-1.png | Bin 0 -> 4598 bytes ...should-have-stroke--none--by-default-2.png | Bin 0 -> 4598 bytes ...should-render-an-arc-path-with-value-1.png | Bin 0 -> 4598 bytes ...should-render-an-arc-path-with-value-2.png | Bin 0 -> 4598 bytes ...er-track-when-track-prop-is-provided-1.png | Bin 0 -> 4598 bytes ...er-track-when-track-prop-is-provided-2.png | Bin 0 -> 4598 bytes ...hould-render-track-with-custom-class-1.png | Bin 0 -> 4598 bytes ...hould-render-track-with-custom-class-2.png | Bin 0 -> 4598 bytes ...-render-track-with-trackCornerRadius-1.png | Bin 0 -> 4598 bytes ...-render-track-with-trackCornerRadius-2.png | Bin 0 -> 4598 bytes ...ould-render-track-with-trackEndAngle-1.png | Bin 0 -> 4598 bytes ...ould-render-track-with-trackEndAngle-2.png | Bin 0 -> 4598 bytes ...d-render-track-with-trackInnerRadius-1.png | Bin 0 -> 4598 bytes ...d-render-track-with-trackInnerRadius-2.png | Bin 0 -> 4598 bytes ...rackInnerRadius-and-trackOuterRadius-1.png | Bin 0 -> 4598 bytes ...rackInnerRadius-and-trackOuterRadius-2.png | Bin 0 -> 4598 bytes ...d-render-track-with-trackOuterRadius-1.png | Bin 0 -> 4598 bytes ...d-render-track-with-trackOuterRadius-2.png | Bin 0 -> 4598 bytes ...ould-render-track-with-trackPadAngle-1.png | Bin 0 -> 4598 bytes ...ould-render-track-with-trackPadAngle-2.png | Bin 0 -> 4598 bytes ...ld-render-track-with-trackStartAngle-1.png | Bin 0 -> 4598 bytes ...ld-render-track-with-trackStartAngle-2.png | Bin 0 -> 4598 bytes ...th-trackStartAngle-and-trackEndAngle-1.png | Bin 0 -> 4598 bytes ...th-trackStartAngle-and-trackEndAngle-2.png | Bin 0 -> 4598 bytes ...er-with-both-startAngle-and-endAngle-1.png | Bin 0 -> 3504 bytes ...er-with-both-startAngle-and-endAngle-2.png | Bin 0 -> 3504 bytes ...rops-should-render-with-cornerRadius-1.png | Bin 0 -> 4659 bytes ...rops-should-render-with-cornerRadius-2.png | Bin 0 -> 4659 bytes ...ops-should-render-with-custom-domain-1.png | Bin 0 -> 3504 bytes ...ops-should-render-with-custom-domain-2.png | Bin 0 -> 3504 bytes ...-render-with-custom-domain-and-range-1.png | Bin 0 -> 3504 bytes ...-render-with-custom-domain-and-range-2.png | Bin 0 -> 3504 bytes ...rops-should-render-with-custom-range-1.png | Bin 0 -> 3504 bytes ...rops-should-render-with-custom-range-2.png | Bin 0 -> 3504 bytes ...ould-render-with-endAngle-in-radians-1.png | Bin 0 -> 4598 bytes ...ould-render-with-endAngle-in-radians-2.png | Bin 0 -> 4598 bytes ...props-should-render-with-innerRadius-1.png | Bin 0 -> 5613 bytes ...props-should-render-with-innerRadius-2.png | Bin 0 -> 5613 bytes ...der-with-innerRadius-and-outerRadius-1.png | Bin 0 -> 4370 bytes ...der-with-innerRadius-and-outerRadius-2.png | Bin 0 -> 4370 bytes ...props-should-render-with-outerRadius-1.png | Bin 0 -> 3904 bytes ...props-should-render-with-outerRadius-2.png | Bin 0 -> 3904 bytes ...rc-props-should-render-with-padAngle-1.png | Bin 0 -> 5011 bytes ...rc-props-should-render-with-padAngle-2.png | Bin 0 -> 5011 bytes ...ld-render-with-startAngle-in-radians-1.png | Bin 0 -> 3376 bytes ...ld-render-with-startAngle-in-radians-2.png | Bin 0 -> 3376 bytes .../Arc-should-render-Arc-element-1.png | Bin 0 -> 4598 bytes .../Arc-should-render-Arc-element-2.png | Bin 0 -> 4598 bytes .../Arc-should-render-track-1.png | Bin 0 -> 4598 bytes .../Arc-should-render-track-2.png | Bin 0 -> 4598 bytes ...h-the-supplied-value-at-the-centroid-1.png | Bin 0 -> 6078 bytes ...h-the-supplied-value-at-the-centroid-2.png | Bin 0 -> 6078 bytes .../src/lib/components/Link/Link.base.svelte | 24 ++-- .../lib/components/Path/Path.canvas.svelte | 7 +- .../lib/components/Path/Path.shared.svelte.ts | 55 ++++--- .../src/lib/components/Path/Path.svg.svelte | 135 ++++++++++-------- .../lib/components/Trail/Trail.base.svelte | 17 ++- ...r-explicit-per-series-tooltip-values-1.png | Bin 0 -> 6161 bytes ...r-explicit-per-series-tooltip-values-2.png | Bin 0 -> 6161 bytes ...s-when-series-are-toggled-via-legend-1.png | Bin 7071 -> 10477 bytes ...identity-for-implicit-tooltip-series-1.png | Bin 9231 -> 7653 bytes ...identity-for-implicit-tooltip-series-2.png | Bin 9231 -> 7653 bytes 107 files changed, 169 insertions(+), 94 deletions(-) create mode 100644 .changeset/path-lazy-feature-allocation.md create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-full-circle--360-degree-range--1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-full-circle--360-degree-range--2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-innerRadius-of-0--pie-slice--1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-innerRadius-of-0--pie-slice--2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-negative-domain-values-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-negative-domain-values-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-partial-arc--e-g---180-degrees--1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-partial-arc--e-g---180-degrees--2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-at-max-domain-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-at-max-domain-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-below-domain-min-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-below-domain-min-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-exceeding-domain-max-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-exceeding-domain-max-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-of-0-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-of-0-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-events-should-handle-pointer-enter-events-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-events-should-handle-pointer-enter-events-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-events-should-handle-pointer-move-events-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-events-should-handle-pointer-move-events-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-events-should-handle-touch-move-events-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-events-should-handle-touch-move-events-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-custom-class-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-custom-class-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-fill-color-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-fill-color-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-fillOpacity-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-fillOpacity-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-offset-to-arc-position-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-offset-to-arc-position-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-opacity-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-opacity-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-stroke-color-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-stroke-color-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-strokeWidth-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-strokeWidth-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-zero-offset-by-default-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-zero-offset-by-default-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-call-tooltip-hide-on-pointer-leave-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-call-tooltip-hide-on-pointer-leave-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-call-tooltip-show-on-pointer-enter-with-data-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-call-tooltip-show-on-pointer-enter-with-data-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-handle-custom-start-angle-in-range-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-handle-custom-start-angle-in-range-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-have-stroke--none--by-default-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-have-stroke--none--by-default-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-an-arc-path-with-value-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-an-arc-path-with-value-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-when-track-prop-is-provided-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-when-track-prop-is-provided-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-custom-class-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-custom-class-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-trackCornerRadius-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-trackCornerRadius-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-trackEndAngle-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-trackEndAngle-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-trackInnerRadius-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-trackInnerRadius-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-trackInnerRadius-and-trackOuterRadius-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-trackInnerRadius-and-trackOuterRadius-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-trackOuterRadius-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-trackOuterRadius-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-trackPadAngle-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-trackPadAngle-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-trackStartAngle-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-trackStartAngle-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-trackStartAngle-and-trackEndAngle-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-track-with-trackStartAngle-and-trackEndAngle-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-both-startAngle-and-endAngle-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-both-startAngle-and-endAngle-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-cornerRadius-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-cornerRadius-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-domain-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-domain-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-domain-and-range-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-domain-and-range-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-range-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-range-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-endAngle-in-radians-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-endAngle-in-radians-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-innerRadius-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-innerRadius-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-innerRadius-and-outerRadius-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-innerRadius-and-outerRadius-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-outerRadius-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-outerRadius-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-padAngle-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-padAngle-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-startAngle-in-radians-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-startAngle-in-radians-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-should-render-Arc-element-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-should-render-Arc-element-2.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-should-render-track-1.png create mode 100644 packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-should-render-track-2.png create mode 100644 packages/layerchart/src/lib/components/ArcLabel/__screenshots__/ArcLabel.svelte.test.ts/ArcLabel-renders-a-text-element-with-the-supplied-value-at-the-centroid-1.png create mode 100644 packages/layerchart/src/lib/components/ArcLabel/__screenshots__/ArcLabel.svelte.test.ts/ArcLabel-renders-a-text-element-with-the-supplied-value-at-the-centroid-2.png create mode 100644 packages/layerchart/src/lib/components/charts/__screenshots__/ArcChart.svelte.test.ts/ArcChart-uses-the-chart-value-accessor-for-explicit-per-series-tooltip-values-1.png create mode 100644 packages/layerchart/src/lib/components/charts/__screenshots__/ArcChart.svelte.test.ts/ArcChart-uses-the-chart-value-accessor-for-explicit-per-series-tooltip-values-2.png diff --git a/.changeset/path-lazy-feature-allocation.md b/.changeset/path-lazy-feature-allocation.md new file mode 100644 index 000000000..e90076e9c --- /dev/null +++ b/.changeset/path-lazy-feature-allocation.md @@ -0,0 +1,25 @@ +--- +'layerchart': patch +--- + +perf: Reduce per-tick reactive overhead in `Path` / `Link` (force-simulation graphs) + +In mark-heavy scenes (force simulations with hundreds of links flowing through `Link → Path`) several reactive structures unconditionally subscribed every `` template updater to props that don't change on a tick, causing per-frame work to scale with the number of props × the number of marks. Each fix below is independent; together they take the lattice (n=20, 760 links) example from ~5–6 fps to ~9 fps during simulation. + +**`PathState.tweenedPathData` now reads only `pathData`, not all Path props.** +Pre-fix, the getter resolved `pathData` via `getProps()`, a function that constructs an object literal of every reactive Path prop. Each read of `tweenedPathData` (i.e. each per-tick `` update) therefore subscribed the updater to every Path prop and re-read all of them. `PathState` now takes a dedicated `getPathData` getter alongside `getProps`, and the hot-path tween / DOM read only touches `pathData`. `Path.svg.svelte` and `Path.canvas.svelte` pass them as separate getters. + +**`Link.base.svelte` passes a stable `getPathData` function rather than `motionPath.current` directly.** +Reading `motionPath.current` from `Link.base.svelte`'s template subscribed the entire `` block to every tick, forcing the parent's prop spread (`{...restProps}`) and `cls(...)` evaluation to re-run on every change. Passing a stable function reference moves the per-tick read inside ``'s own template, keeping `Link.base.svelte` stable. Requires the new `pathData?: string | (() => string)` form on `Path`. + +**`Path.svg.svelte` allocates `draw`-related state lazily.** + +- `endPoint = createControlledMotion(..., { type: 'none' })` was created for every `Path`, even when no `draw` transition was configured. Now only created when `draw` is set. +- The `$effect` that tracked `tweenedPathData` for `startContent` / `endContent` positioning ran on every `Path`, even when neither prop was provided. Now only registered when at least one is set. +- `drawKey` is only ever set when `draw` is configured, so the `{#key c.drawKey}` block is a no-op for paths without a draw transition. The block stays unconditional — splitting it behind `{#if draw}` showed no measurable benefit over leaving the inert subscription in place. + +**`Path.svg.svelte` extracts styling props out of `...rest`.** +`pathData`, `class`, `fill` / `fillOpacity` / `stroke` / `strokeOpacity` / `strokeWidth` / `opacity` and `motion` are now destructured out of `$props()` rather than left in `...rest`, so the `` element's `{...rest}` spread doesn't re-evaluate every frame when those props change (`pathData` changes on every force-sim tick; `class` is typically a fresh `cls(...)` string per parent render). + +**`Link.base.svelte` drops a redundant prop spread.** +Removed `{...extractLayerProps(restProps, 'lc-link')}` before `{...restProps}` — the call's only contribution (`class`) was being immediately overridden by the explicit `class={cls('lc-link', …)}` that follows, making the spread pure overhead. diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-full-circle--360-degree-range--1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-full-circle--360-degree-range--1.png new file mode 100644 index 0000000000000000000000000000000000000000..411366e7c145b7a7d5cde1b33fe8417a994f6e42 GIT binary patch literal 6580 zcmeI1`#aPB|HnmiBK59NL`Ww@i8*eB{AU zS-oj1g!4FQ22mI4BTZMy}*NLoZmqJY2w0do^0+mLtjL#S6h_lKI78G_2+_Trj8 zXY771eBsFC0h~;Sly|BG?#PR0h8i+AoV`S|K3`8c7W2qa+4SfUDXn|^td*3lWF@Xo zye*WuTOiz&htJWTczmme&Yg#@WSlRnsj8%{m5&f%Z%Z~l)N-pv7(rW$Ri(Ajau~0e z+uq(Y-~9%j%=ccmwM8tA8u6RODUW``76(eHeAXMxpSN!Hr|^48NTwBD_hWW;@O*Fk z0rFwp1PdppJ_=qh*!GNy%Gb^JSy>G}SDuN8^_Rlk`q0^Xd8Ttcd1BWynY(?5Nl3fM zhzLPq|7@x_|6zXlClqT@NJMmcgpAF#&l7e3z%)b-a5$VKB%ej*mxKo`4k8VOQ^h6l z(RF-N-@Zbn7IH|EiyeMgZ^{(@}L<4B40b_*EV7TicADFR^H`&W>{0$n6&!LJR*S(js1LKdK zFKFIiG2msp5tuRi{M$&HOYp*Ad8bXif91k=oxtD4@R8w1Mj^NW`S0)%Xqn(^TD&I# z`Fl2($opxHdCXpNujhCW($mAZ>jv!6X9>^^FDIvz%pT5>p|4IwP4UOmaJaiUTDrvZ zWDh2ZLFV&LVrf3RLs^SkOZDR1^r+cPrjJvJkDa}J&nL??QTHVz6f9qPApN^nd)<=L z^k&i2tV~#jd7VshS9D--gWihr_ z666QCi%(26_U2+|HWlQ*XnNf+?*jCI{>u3HUE|^?(W5I}H?6}K1JgCo&nf&7Io{GP z@?$;BW|{os-rz``dJVbFWvjNWS;r!L7#@vlI&pi)b3(}P~6&QyTH7yCs)uoPNwhg)|BK19D=|dTj+6yPZ3UiW?yytcE@OI zV@;KF(t}PYHCy~FjcXmPefCDpjgXxD!2HyVE^A*eh!oV`zb7GG@ya!I4NMjuT-g9t>bDkMO+Tr z+N?EROd^pOVGLCACER;vVPPQyP1l>F5h0_BR0GzakhuPxpGJJNtE=nwB4?*#`opb} zv!An@UP^n;uIi;$f^T4stva4789d_k^GpXl&sM$VkG0+QHbh;@4tr>4~Q-#~tHiOGB2&@3$nU z9Kcr%!EJD3VsSagf2C@o==k9Nl82sunCOmt_j9Ha48WbmuD)`u3gsMHvp8SgFrNLb z6g8ZZl426yurg5Q-T5hHXC#H*nliy03^(B}z_FEK+$XVat0+`JKmZU4PMCR)JY)pT zR3?({zK+EZMgpk@Ch@6EP?&oMtC|g{4*9orLYD3b`P>-z?zfd03Z|%X>mW5yZsO*r zYZo%2IDJc=Fm6ht$~eXISE`+(qnF{Y*saUwd#dnrkgmcUwaL49`fYM%vT2yS%s!!D_I71u1!%8FZEQwhx10N(9jC1c z=#80d)sRfaLgkZ%*|tm}$ii;>!=(Y4ROaB|Z3VL*J$cS7(Ab9RBtq$T$&~$}=>0&( z9D5^%2S&nJL;gb*M-O~oU0tn#DP5dKQp9B5+c-K-Yy1?H@TXUMskl^hg-h*(Ce|&W zyT8~0y~c{hJas$C(a_pwSB5VtR#ZT(&m-5m9aL?fKH=5wl2dW39t;n8zUh0WjY1>3 zF+NKlNRV_x7m!GU5r@6#AhseV_Zh=g!otE5Cv|uIajKW*7lW76d*Zv$Un0^FMWNQG zYChBt61vO$od%CWnur$!CO4l|2nh})TD|DN>VOP!dCucI5 z=h*5nAn7~K^$z6LbnL%?a23{#mResw_eeWhN|z{zHx@;qj(~7I2!D0uxB4Nc0%CimBj`K}ZZ`>&Q#AA5lD_$+$ zhKxk-?b_a06N_>4GFHx@7_8*xSNs#sZs(MLt1ve9LZJ-lffN56KX*CJ(LIQwA1$H_ zlhlnCz~)Hwr|I<#Jl(nP(e20}ae6{es+OORVe9m!2Kz(Ff3ve_jz}IBJY-MzuL<9= zy`(gCkO`BJM}QFU!l%k8CMZAk+MvbPti_>$aP7$QS0c3Xf(pe4 z2v-+G{MAULcB#4^J?8%&30M9V)w}&2D+C5JEz`bd{gHp|lVPCT$*RuB4kX0I#i@(a zB>=p9{%jm2df|j@@L)i6O5I<^w6zhuK?yRh;vTe!l2ysZxxCXidW*6l)5e- z@uy?D+_MxVo|5hB7X}@N4!&4l7}&*&Psq??k@cYM$H!V)TSeDDRo!UAb4P{%SBUL) zX2*K|vrWf42CBnQ0RBXG+l7W!kpEQmHKGRQvaeR%8S&WZc(U|rX0ZQYll&b_v5dxp zIG_;}(4i&RO1p6OfC@JYhax16=$I)CccE1J0O9P-PmZFO$d7~O;i1m{M25Ms9L zXLv<&Qqqy@lM)Ve-r=yOxT7LnXVvtRo4vCeyUL|CeGV%g4|-Vld{1?$v#rA1pq$4w zyl!{6?l`e#rZd|a2>Kv+a(*D4BGMIExmeMXp5x?uw*n6HoBAgSRIgUXlM-MhKr6IN zy;RWK0HF@$l@8AaGeo-b0X;TIm7D5PUH+$MCCI`24fCY5AB{dFRy_##>oJ(5NDz?2 zqc+O3G$IVkL&w^G#p_{{DUmWh%|pQ>cmlz{{jVT6u>lMik!bL2Q+?{oeL7u#g%C%q zVo?NX$;UbF*WJi?36?(O{G?6dT{1>bbpyGGe#^bes`WR#d>_0#J)JiX>jq;iJ8~U} z9UV7>{%CN!4i2j)aTY3=cE&OluTFS-dzY7&AA6m4jqcx(WsdF_{bTC2 znXET0AOHD4-+=OQ?ME2^3IGLZjVcTx>3HBHF3R7)SAu04LUdZ5wtA;N8o`!g&B=}o zSjJF>U4JsHFq{^*V~>nB4Hugq7yPg!f`qcumgx#`M_*;ioCjC$KjnDvl~KZR~Yd%-T-WnD?d*I-h`WO4hhHAMIL!US) z?y#vdTg4iF_-eu|fPCxpV_6f}x;d>Dc>o&@$` zH1Rgq%#vzR$XM{Kn26VN#cl=3<~94bWf<|)BY#j$=yJ?8A~vk^ljXLane>^4J`fPt zn5cnV zncQy3f}JG~9Y(shtm}0yP+@5a2)TLE+shLpXozob4f)M%2GeI*j}Q?N0lX~mWXEQ2 z0a@Sr+4msR0D6xQ<|FHp6mo*u~t_R+vfSDBd}RC9v#N-voYYEL<1WPjJX$ZYVz&VBoRN5 z0Dz#-%Z-v^p20I8-&noV4gl)9sqXzNlXC@R688tX(P;Ox3;SzB83=FH16j1V{4e7U?`P-)-E#6e~ zdEDfC8>=%DNZ^|`ndy8|rbIh(XoS(f^Q`=a2xoEBusVj98icxi&|0(Bgw~6Rz&X&RDpud{JgDc6^ML*GI@c4IV~% z1__gMM+!WmyGx3Ti*t$9{iOloD1ZW_A|*6JHU)S)z$Zr}Bo=dQIHu<2FS&ZA{CwZ4c`1T5Z?KNTB?C>ECGln;ZX@!@uJ2uO9w? tx^TCLKxv7;&{^dIn{{cFBgLnV{ literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-full-circle--360-degree-range--2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-full-circle--360-degree-range--2.png new file mode 100644 index 0000000000000000000000000000000000000000..411366e7c145b7a7d5cde1b33fe8417a994f6e42 GIT binary patch literal 6580 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 tx^TCLKxv7;&{^dIn{{cFBgLnV{ literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-innerRadius-of-0--pie-slice--1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-innerRadius-of-0--pie-slice--1.png new file mode 100644 index 0000000000000000000000000000000000000000..c39ea627b3e166abe3ba4d46dc70bf74fcb14a37 GIT binary patch literal 4598 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 tx^TCLKxv7;&{^dIn{{cFBgLnV{ literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-at-max-domain-2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-at-max-domain-2.png new file mode 100644 index 0000000000000000000000000000000000000000..411366e7c145b7a7d5cde1b33fe8417a994f6e42 GIT binary patch literal 6580 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 tx^TCLKxv7;&{^dIn{{cFBgLnV{ literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-below-domain-min-1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-below-domain-min-1.png new file mode 100644 index 0000000000000000000000000000000000000000..11ae1ff75c720b10e426886bc78396508cba3fcd GIT binary patch literal 3212 zcmeHKZBr9h7~Oz^2oe!1Dw4EP$6BK>OdTYUIBF0r2yIabBT9gQR6#%z37C+8N+ZUK z4r8bT31X_WY9+`ZB5!IcQC=1hK_Zk0f}2P}kR^!=3F*a8{R#cRmz}fEob${%cb|KA zZov=XAtWw>ZK+zGSopAWn znST0BzZ1umeZ0KsRhw3p(Bz!8HJ2B?+O;Bq8FuAq=t}1;B-*m|7rs1yLAq;^TR822 zOV#oQw`Zd%D=sUXzGkV4Ylf^r&ysF$`o#zf^fmn2n7WKa#t457Lu@gp<}6rpS+ixT z?Ph54oCWO+jk2POv}UVmX1r3JWB$i}d{msL{WMZZ3G68kgG9vOxQcghw;CN?!zeDt)oJA`NjWQX7EBx#-VMgXDNHaBY@CNv-e=`+*XKtn_1 zXxJr`7n;;LK*)NVS37h%IoByesvZ>iG-WBhIOj{X;O+S{kq4egy_ewxow z=WuchSZcnvr{{boB4dQjcP}X^5xRP)B22CV7|$<~%2eow_kt zrSSWLtPbGPZ#~`iXtN`pz|)iq9aj5G41MnkcckLmo@;rvNk09$xHSQi&O8dqy8^}J z!o+qq)!!t)D29<1g1Gx776clFlgp|*IyzLLMqCRGK{+N}G?%_77(x9-g9P!9C%0@p zMputtb#2|LlH$X3hJ%EubU06KOJCI`^0^=R7CfuPA#F>e2Yt{1BB;kkjanWB% zdR6p~1Wx&i%8Hgzk|pMgV^1aVytrs-GsamYlO>a1Bw z;HKmTbYpudmPv(4-Y$Yej(18apOLbSAkOZ_{s3`3$izS{Ju?DH07)mbJUd;SYJ(&~ z0nAR+AyQl>4JkS~Gkpwj_8>)79K+GiC^8=325WfnfQ^$xfIxxQQ7tf3&!+A($x}pd z#fQHO+`-t{r{uvEtpxF3J=nPpn8l?(*oE{Y;oA;rcvHH#x=oS@DTU;J6Sd>gQ^OE9 zlYB52_P(c&W11)JV?q$GS(84H^}Zc?-JRW9zFP<+QaJfP&$GHXYzH~*zHm&S4Fa(Q znxOGFgiO=X9EQGbNvrF+?dj8+?!1}`^dXpGmEs1volAF+RN8at?50(^xYwod>wJoi z+=D%m3y&~sUGDy>%H~gvzQ{A8m7AmPx!f&s_SibepVixs(~vG?Heg!2ZieleLl#mc zyUXD62&AimrRiBHFRaPJKrHNrg`;5Mc>Ev!8w}0hDq*wX`I;^O9Of?*_K+o8|E=4# RUKOZ7`+~!1_jWPP{0os!{Imc7 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-below-domain-min-2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-below-domain-min-2.png new file mode 100644 index 0000000000000000000000000000000000000000..11ae1ff75c720b10e426886bc78396508cba3fcd GIT binary patch literal 3212 zcmeHKZBr9h7~Oz^2oe!1Dw4EP$6BK>OdTYUIBF0r2yIabBT9gQR6#%z37C+8N+ZUK z4r8bT31X_WY9+`ZB5!IcQC=1hK_Zk0f}2P}kR^!=3F*a8{R#cRmz}fEob${%cb|KA zZov=XAtWw>ZK+zGSopAWn znST0BzZ1umeZ0KsRhw3p(Bz!8HJ2B?+O;Bq8FuAq=t}1;B-*m|7rs1yLAq;^TR822 zOV#oQw`Zd%D=sUXzGkV4Ylf^r&ysF$`o#zf^fmn2n7WKa#t457Lu@gp<}6rpS+ixT z?Ph54oCWO+jk2POv}UVmX1r3JWB$i}d{msL{WMZZ3G68kgG9vOxQcghw;CN?!zeDt)oJA`NjWQX7EBx#-VMgXDNHaBY@CNv-e=`+*XKtn_1 zXxJr`7n;;LK*)NVS37h%IoByesvZ>iG-WBhIOj{X;O+S{kq4egy_ewxow z=WuchSZcnvr{{boB4dQjcP}X^5xRP)B22CV7|$<~%2eow_kt zrSSWLtPbGPZ#~`iXtN`pz|)iq9aj5G41MnkcckLmo@;rvNk09$xHSQi&O8dqy8^}J z!o+qq)!!t)D29<1g1Gx776clFlgp|*IyzLLMqCRGK{+N}G?%_77(x9-g9P!9C%0@p zMputtb#2|LlH$X3hJ%EubU06KOJCI`^0^=R7CfuPA#F>e2Yt{1BB;kkjanWB% zdR6p~1Wx&i%8Hgzk|pMgV^1aVytrs-GsamYlO>a1Bw z;HKmTbYpudmPv(4-Y$Yej(18apOLbSAkOZ_{s3`3$izS{Ju?DH07)mbJUd;SYJ(&~ z0nAR+AyQl>4JkS~Gkpwj_8>)79K+GiC^8=325WfnfQ^$xfIxxQQ7tf3&!+A($x}pd z#fQHO+`-t{r{uvEtpxF3J=nPpn8l?(*oE{Y;oA;rcvHH#x=oS@DTU;J6Sd>gQ^OE9 zlYB52_P(c&W11)JV?q$GS(84H^}Zc?-JRW9zFP<+QaJfP&$GHXYzH~*zHm&S4Fa(Q znxOGFgiO=X9EQGbNvrF+?dj8+?!1}`^dXpGmEs1volAF+RN8at?50(^xYwod>wJoi z+=D%m3y&~sUGDy>%H~gvzQ{A8m7AmPx!f&s_SibepVixs(~vG?Heg!2ZieleLl#mc zyUXD62&AimrRiBHFRaPJKrHNrg`;5Mc>Ev!8w}0hDq*wX`I;^O9Of?*_K+o8|E=4# RUKOZ7`+~!1_jWPP{0os!{Imc7 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-exceeding-domain-max-1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-exceeding-domain-max-1.png new file mode 100644 index 0000000000000000000000000000000000000000..411366e7c145b7a7d5cde1b33fe8417a994f6e42 GIT binary patch literal 6580 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 tx^TCLKxv7;&{^dIn{{cFBgLnV{ literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-exceeding-domain-max-2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-exceeding-domain-max-2.png new file mode 100644 index 0000000000000000000000000000000000000000..411366e7c145b7a7d5cde1b33fe8417a994f6e42 GIT binary patch literal 6580 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 tx^TCLKxv7;&{^dIn{{cFBgLnV{ literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-of-0-1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-edge-cases-should-handle-value-of-0-1.png new file mode 100644 index 0000000000000000000000000000000000000000..47767d2f3db3e57c7b5cb7d5e6f5d4e0ed04e8ff GIT binary patch literal 2082 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 O6E9Elp32?FF8&)VmXkIB literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-events-should-handle-pointer-enter-events-2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-events-should-handle-pointer-enter-events-2.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb8fa9e207065179f9d687f15008eaa04fe1422 GIT binary patch literal 4244 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 O6E9Elp32?FF8&)VmXkIB literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-events-should-handle-pointer-move-events-1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-events-should-handle-pointer-move-events-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb8fa9e207065179f9d687f15008eaa04fe1422 GIT binary patch literal 4244 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 O6E9Elp32?FF8&)VmXkIB literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-events-should-handle-pointer-move-events-2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-events-should-handle-pointer-move-events-2.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb8fa9e207065179f9d687f15008eaa04fe1422 GIT binary patch literal 4244 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 O6E9Elp32?FF8&)VmXkIB literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-events-should-handle-touch-move-events-1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-events-should-handle-touch-move-events-1.png new file mode 100644 index 0000000000000000000000000000000000000000..c39ea627b3e166abe3ba4d46dc70bf74fcb14a37 GIT binary patch literal 4598 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 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-opacity-2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-opacity-2.png new file mode 100644 index 0000000000000000000000000000000000000000..a91127acc414c4615de6188420580a2e02e82562 GIT binary patch literal 4431 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 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-stroke-color-1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-stroke-color-1.png new file mode 100644 index 0000000000000000000000000000000000000000..62b4ce5815d83f161200b7feca526032388b7868 GIT binary patch literal 5508 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 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-stroke-color-2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-stroke-color-2.png new file mode 100644 index 0000000000000000000000000000000000000000..62b4ce5815d83f161200b7feca526032388b7868 GIT binary patch literal 5508 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 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-strokeWidth-1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-strokeWidth-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5d2cfa5a24e778b166473138c8f48c046ea0a2fa GIT binary patch literal 5759 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 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-strokeWidth-2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-strokeWidth-2.png new file mode 100644 index 0000000000000000000000000000000000000000..5d2cfa5a24e778b166473138c8f48c046ea0a2fa GIT binary patch literal 5759 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 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-zero-offset-by-default-1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-apply-zero-offset-by-default-1.png new file mode 100644 index 0000000000000000000000000000000000000000..c39ea627b3e166abe3ba4d46dc70bf74fcb14a37 GIT binary patch literal 4598 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 O6E9Elp32?FF8&)VmXkIB literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-call-tooltip-hide-on-pointer-leave-2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-call-tooltip-hide-on-pointer-leave-2.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb8fa9e207065179f9d687f15008eaa04fe1422 GIT binary patch literal 4244 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 O6E9Elp32?FF8&)VmXkIB literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-call-tooltip-show-on-pointer-enter-with-data-1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-call-tooltip-show-on-pointer-enter-with-data-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb8fa9e207065179f9d687f15008eaa04fe1422 GIT binary patch literal 4244 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 O6E9Elp32?FF8&)VmXkIB literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-call-tooltip-show-on-pointer-enter-with-data-2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-call-tooltip-show-on-pointer-enter-with-data-2.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb8fa9e207065179f9d687f15008eaa04fe1422 GIT binary patch literal 4244 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 O6E9Elp32?FF8&)VmXkIB literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-handle-custom-start-angle-in-range-1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-handle-custom-start-angle-in-range-1.png new file mode 100644 index 0000000000000000000000000000000000000000..99f913aa1b51d924ea8ceed5c42db18d36f88050 GIT binary patch literal 3376 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 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-both-startAngle-and-endAngle-2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-both-startAngle-and-endAngle-2.png new file mode 100644 index 0000000000000000000000000000000000000000..def6f8f4151d76ffbcfd460a809fd3cce8521f9c GIT binary patch literal 3504 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 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-cornerRadius-1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-cornerRadius-1.png new file mode 100644 index 0000000000000000000000000000000000000000..22888d83c45b826abb515835a76ec9fe8b9e1f85 GIT binary patch literal 4659 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 ayhLMQ%%5Iz-^~qVG>#ocAEMfxz4~wYb6Qsb literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-cornerRadius-2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-cornerRadius-2.png new file mode 100644 index 0000000000000000000000000000000000000000..22888d83c45b826abb515835a76ec9fe8b9e1f85 GIT binary patch literal 4659 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 ayhLMQ%%5Iz-^~qVG>#ocAEMfxz4~wYb6Qsb literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-domain-1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-domain-1.png new file mode 100644 index 0000000000000000000000000000000000000000..def6f8f4151d76ffbcfd460a809fd3cce8521f9c GIT binary patch literal 3504 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 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-domain-2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-domain-2.png new file mode 100644 index 0000000000000000000000000000000000000000..def6f8f4151d76ffbcfd460a809fd3cce8521f9c GIT binary patch literal 3504 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 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-domain-and-range-1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-domain-and-range-1.png new file mode 100644 index 0000000000000000000000000000000000000000..def6f8f4151d76ffbcfd460a809fd3cce8521f9c GIT binary patch literal 3504 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 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-domain-and-range-2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-domain-and-range-2.png new file mode 100644 index 0000000000000000000000000000000000000000..def6f8f4151d76ffbcfd460a809fd3cce8521f9c GIT binary patch literal 3504 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 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-range-1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-range-1.png new file mode 100644 index 0000000000000000000000000000000000000000..def6f8f4151d76ffbcfd460a809fd3cce8521f9c GIT binary patch literal 3504 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 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-range-2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-custom-range-2.png new file mode 100644 index 0000000000000000000000000000000000000000..def6f8f4151d76ffbcfd460a809fd3cce8521f9c GIT binary patch literal 3504 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 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-endAngle-in-radians-1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-endAngle-in-radians-1.png new file mode 100644 index 0000000000000000000000000000000000000000..c39ea627b3e166abe3ba4d46dc70bf74fcb14a37 GIT binary patch literal 4598 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 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-innerRadius-and-outerRadius-2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-innerRadius-and-outerRadius-2.png new file mode 100644 index 0000000000000000000000000000000000000000..bf11432e984a201f0f21e177cca02bf473f93903 GIT binary patch literal 4370 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 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-outerRadius-1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-outerRadius-1.png new file mode 100644 index 0000000000000000000000000000000000000000..2e63e6a7e3ce4b0aab4d74f942904fc9741216e6 GIT binary patch literal 3904 zcmeHKYdnHa@H@L*>D0AA#j7yFg zm$pka?vsrqsWEO-hQSox8M|@GeK7W#&bRaFeCkub-}~YJKI`(V^?#n{zt*~S8nRcA zRg;yHl2ULudE8Y>>K~`1q&Bg(Z332@Yjl#7l;VQJ@uO}rk;$uzb4);Fv{zcq!l%=ZodVr%ie>~d(L0? zBiIzApR4@;J^ zTkvlxl?r#^YIK(;CMI~TH&iEW&;(`)GCX{9`@ZrfvB)#5ZoIUtT+KZEV!>4mfks;V zG|=1A^D8&^nEvCRQw7H97 z5k32%%_4g0u(3R)x2;r=ur6A_(;$X`nseUMQ%=DKMN*TuDur>L30maz$+-B%>d--1 z#?L5Hk!~d_7VRHWFdLfTMvth(fhlEj%m}%rp`52(R-S*%5jAOW+^gxPjprc)Pg3=t zzo#-#0a?@C&b#P2BIr4|dd#^SgZo2`>rvtD)h|vj;|r{?v}m{cU0DW&MMXudbp)yy zs3DAOXeF>2g$BHKwGkp^4!sRJD z$BQz(4+7iqfjSrkoAq9{ppYi|J$!W6C`^Z^zqF>TuP&)_x-o%?;uU|hGI26fX6$O^ zMn1fWF~_v@6sw)h9ORRIv4qP> z&=al1<>o=RRA$E+JMqFhpG+%f^tw^K>MHyJ#LBs-s~5vt6b^cbEGau7)DC?y$cT>? z%ps8ZU$NboS;QNGEa7;79!nb4En~tZjkWjp+5aw?saMkJjSw{b4|;VRp>^DXmmXUH1`?zqd`1ugcO&XUbH?%w9@endOr=OK*{n z8M|*U+g?dzi<$}ZF8Yp^1{6HOo!6PEuTQ?m zEU9rXJL3+=^R6S%U9X5X6+J|_je_?8NtDDRs>*8Q!;_O!4bzL*K1Gn#h)6)Q2Js`N zbz>HKD}0)2hU3b9X0Qyfw8Y$)54W<7{C8oU&^{;k<=ZNUWVLNU4QBi2u1w?*&HyLA zd@`r_bNLSyuKMI3DR}kjaS9clTe@X0Bxrlbu} zkh&LYD_IH%G_7u(xTa2MjOf^(sa$_!9m5C#hl$UXS>mgP2TXwp2uAE|n<@|)E;zY> znATB-4MI83CND5VPg(1a(fMof(~KHA-F*!AG7d@y;=<<8gJ}@uJpU*gjyoAyECw=6 z;MRi<&M4AwGQn9POLaL$^AKc)6+Y{os{NQY-kIr4Hm_pEBT&t5%a|G5 z($L&Yt5RMh`y6qY3fG_Ylv$h^FQ>66zr6{OZ`*vjbb^iWSV>h3Sch?=2sCebY zW*`?{p|9lb+M|do9^VTj<@`74EG7m6$|4&q^i8%=PEJnyojv$sY0BKl z0jI3fM6dCL@dqAh8Wz>3&9KvOY3%BYyd%D^?sbr~^WYbE_865i(OS*xr!+{_TSBYu`1#^3~>>yKfA9W8fPD-x&Bm r8JJE2&)_Di`V`J2tS)4 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-outerRadius-2.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-outerRadius-2.png new file mode 100644 index 0000000000000000000000000000000000000000..2e63e6a7e3ce4b0aab4d74f942904fc9741216e6 GIT binary patch literal 3904 zcmeHKYdnHa@H@L*>D0AA#j7yFg zm$pka?vsrqsWEO-hQSox8M|@GeK7W#&bRaFeCkub-}~YJKI`(V^?#n{zt*~S8nRcA zRg;yHl2ULudE8Y>>K~`1q&Bg(Z332@Yjl#7l;VQJ@uO}rk;$uzb4);Fv{zcq!l%=ZodVr%ie>~d(L0? zBiIzApR4@;J^ zTkvlxl?r#^YIK(;CMI~TH&iEW&;(`)GCX{9`@ZrfvB)#5ZoIUtT+KZEV!>4mfks;V zG|=1A^D8&^nEvCRQw7H97 z5k32%%_4g0u(3R)x2;r=ur6A_(;$X`nseUMQ%=DKMN*TuDur>L30maz$+-B%>d--1 z#?L5Hk!~d_7VRHWFdLfTMvth(fhlEj%m}%rp`52(R-S*%5jAOW+^gxPjprc)Pg3=t zzo#-#0a?@C&b#P2BIr4|dd#^SgZo2`>rvtD)h|vj;|r{?v}m{cU0DW&MMXudbp)yy zs3DAOXeF>2g$BHKwGkp^4!sRJD z$BQz(4+7iqfjSrkoAq9{ppYi|J$!W6C`^Z^zqF>TuP&)_x-o%?;uU|hGI26fX6$O^ zMn1fWF~_v@6sw)h9ORRIv4qP> z&=al1<>o=RRA$E+JMqFhpG+%f^tw^K>MHyJ#LBs-s~5vt6b^cbEGau7)DC?y$cT>? z%ps8ZU$NboS;QNGEa7;79!nb4En~tZjkWjp+5aw?saMkJjSw{b4|;VRp>^DXmmXUH1`?zqd`1ugcO&XUbH?%w9@endOr=OK*{n z8M|*U+g?dzi<$}ZF8Yp^1{6HOo!6PEuTQ?m zEU9rXJL3+=^R6S%U9X5X6+J|_je_?8NtDDRs>*8Q!;_O!4bzL*K1Gn#h)6)Q2Js`N zbz>HKD}0)2hU3b9X0Qyfw8Y$)54W<7{C8oU&^{;k<=ZNUWVLNU4QBi2u1w?*&HyLA zd@`r_bNLSyuKMI3DR}kjaS9clTe@X0Bxrlbu} zkh&LYD_IH%G_7u(xTa2MjOf^(sa$_!9m5C#hl$UXS>mgP2TXwp2uAE|n<@|)E;zY> znATB-4MI83CND5VPg(1a(fMof(~KHA-F*!AG7d@y;=<<8gJ}@uJpU*gjyoAyECw=6 z;MRi<&M4AwGQn9POLaL$^AKc)6+Y{os{NQY-kIr4Hm_pEBT&t5%a|G5 z($L&Yt5RMh`y6qY3fG_Ylv$h^FQ>66zr6{OZ`*vjbb^iWSV>h3Sch?=2sCebY zW*`?{p|9lb+M|do9^VTj<@`74EG7m6$|4&q^i8%=PEJnyojv$sY0BKl z0jI3fM6dCL@dqAh8Wz>3&9KvOY3%BYyd%D^?sbr~^WYbE_865i(OS*xr!+{_TSBYu`1#^3~>>yKfA9W8fPD-x&Bm r8JJE2&)_Di`V`J2tS)4 literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-padAngle-1.png b/packages/layerchart/src/lib/components/Arc/__screenshots__/Arc.svelte.test.ts/Arc-props-should-render-with-padAngle-1.png new file mode 100644 index 0000000000000000000000000000000000000000..28b284611a49df0589216af776673a250883fbf9 GIT binary patch literal 5011 zcmeHL`CC)xw&qAHwNz}6BB%lGDYklx5G!Cv7;-BLMFeU=QIH@-jX+7z1Q3&uQ!G%6 zh!Y@?5Sh!Ah=ehaT%kfKu)`pOBoL8dCkzP?rjU@_56}JK{sHHw`}BG8?CkH`-?Y|x z*Sp@m?|$d)zVqY#AM5Gq?ezHeEWS;q`vwXSK}ezR5-J&4`{Ocpd5Y$Vr@<(XzPHq^n%h`LRVhx0rC}x$nG&f?})@Oed zD&y#55{YWF7~v50?7OU4jzHVb(k|cIXL}7|peLT;Y5i1Z?fQg?bpTm>quscXcskF; z$3-=ndq=z8jy2z;AFn|=NMHNL(!v3x=; zWtR(Bj?JipeRJuj*=X=6eWcDYPlKg4w8G_Q{M3pNG}O>8t87^_RhYVwZa z$j~jy+n)?vR!V)C)TIs%eRFoGGH^{=khZt&DU@|Iu#V8IS?UZ{j||06Sp|p5m5E;$ zkiNV?%B9bRT0{^O!Rsw1t8;IBP4zJ)#^#i{st9&NacQ$^qfW3{+2f1h^!_|Io|KOk z=J?X&;)d=Wx)SVWX^$m_b2h>eTi8&JLahSN22mGZ4K6w7kpgC9B`mExR=~UbGQo%X zZZ~C3ZhbES3ag>1S1W^ftM_c7;ifoJNFmwVz-j&M9b#N(;C2H8-BPAtPm&KzZcEyE zV6Sz+awU=0={c3`3EPLO%;kr(6E#JdxW*sfyr3wW>yBOl`^P$BC*?ea%WOsU9Gv70 zll$^E#qVCF7*p94!o6w0Ahz|@Q5+RT0gwaM+ zv&`$-x@B)%Y9l|{u_9Qzl=-jb=Z;8l(~l18S`ZeIw%OZi9)01N%}KmN_AVaf#jdTb z>6S~d)>6i0AE(9N<6!36rh+c;^MMbFc(DqeWK({CP@nhO3${N!T4yo%lfJ?E%7B$3 zB(2o%3~XOkrgUZVH)e`g!*$Qj!LReP#&Y&)Ep+SdrD;&G&(FJ`~SF8s9XNw~Dh4MVI57HDl*sxzf` zpwb~cR{bW2&{*pCU$Ec&BTpOEVjBHYpNvrkutl8uGaX!!y=3ost#(a-4CXtjCoV?g zEGhN)u+NF#6BCemWSk`v>u=kL(x=+CWuC+&>jsWY^4DJ>GfvW69x4}lQZMEG~)lh#qYu$lz`*zrfFVEY%zj*U4)K6)-_ zN-T_cJv8L+P?lwj*UtD0FsjMNo*%$ygd6D;(PpMQy7^=e8ZkCl8MuZ1zrPgYEJ^B5 zy>gvYe6>8VJ}N}!00#GJH`Peq+>1UMhI9X_`necH<8QoJ5+yoDF*bVSv7zg6Jj75d z1oRPZSWz_tUa*)GH&oAZD6zTz?Qt&K+7YC#+DK6&?*S>dm0laG7#k?}&xHEWpL7&^ zj51E2DAg;0oJJlLKfs;%VaKp|ZITC*ZOrXPLpylrEhrsf9N+WC@jbA>~128TPHB5T56 zEDWtJMx%|KqdKkY=0tTIZaS1_U{2R8iim>dtp;kusc{x@JG8&pt8$bk-8x5Tq3UJr z>W8*lrnEyKrk++Z#O>l5`h7M@nq?hW>!j?mEuxW)oR!0&X^|3sGdB&&%N#*BzBeQE zG|Wwa+Wj0kQcN-~95xPudqS-dTc;RoflBr~D~XvKJ{#b+)jKB^etZy+E7MNt}bj+81AWJkY!#Q7vx`pjz`n$su1?RAMX6w`cJM;ZC zuy~10dHV5f zu(qqBCj2@QlUx<`?(U(CA8zFM7$tOu0 zYJ;E@C=bRdvxlB!fCIH*$K*r5CO%dvIi<0#w9c#k3RBx|n2IX>4`=3=>ns zeG1ST;KDUwwjQ>3r6?zxw(#pWw!)5GSy=%Pj*FfXQDy-z)5Dy%eC^ByHEA!OH%pQs z+~j5D?5~2JkxcV4o9C{Y1d-3mwlP~jqG={9SjUPEdOh1tKM+y{DpFJwd zwvRYnB1I(OqoSV2<)6o#f{%VeqtX0>Y0yu#l zJqjx9Xs~_zX?&KbTnU6xv^4QeWKV@eF3@Swr0FNnO~8Akn(>XvL)bU6KT?!U-t%-x z%j)$(qNp~~ar$ZK=}fe6{5oH|!ijZW$|pJesuW^%pdv@eTu7AEu6frR094v(lt4Bp zVVU1mB8)=&3O!H~D#>j!)gy7^gG&zWBlbg=s;_iBdekDu6-+-J*(wwtZQs8AIB`sj zkbRNZV5ap_dPZ$-tav;GA*>ePnn(rW$mSy1NO$vafxvkTv91Ds&p95MjUwW96p_MFSO0txNNipK zq7K*Sg}G}_G3zL-M-u{%KsSD(AB8aS1Bg+`G{bv z=!Hv_ZkXUka@erdaGE#lhrfLJ?IEnnqf5dtN`y)~RWOULp05)uBqER4_o9s(7FrBZ z1o4G&mSmO@a4Bvo{lM`bpB^h}8?B~MQojg600Ww4GCsJc^-{Cc1X z4o0xwbth^fiIl+79O&+V6Ph=b5eT7S#`n(5$6KXwPF3mqrmxA{_G=&EJ*hJ+IgbQq!Jb)5$O#~HpZ?zg?g9)+s|y6 zvjqa3qeSJsAgWwrD4X0y=c#~`x}U|v%-CP47s%eIGud{sK2IbKh*F^H3|p@dO7zDT zl2Fu%0}=;7@P?M}oJt08OOG<`{1*Y~|3bB6z+6Ayb$9GW@3m4FAi7(mAPm-$RDN%%~rF+K%WJO;;Ov`OMhBnm-BZ0XHy;7+Y0fO#?nIdi}2Tdh8TQ8HxLos+4dHi zw+6;8F=XgxwBLH!x$rf{c+C=HI4g)2;zPwuI-(1$g+t-^DbUWmP zjDf?9|GYcHj4W?}`R|N5hq-s4eU+fxnuYTOf?&~nAt|YH2k&C~)@uiz89fN18G3|> zWs>aLE$Etr4-K=+cF`icSXjw~90EobpUFA~JOC_#9Hh@Bc8SOU?r(9X=cRnUzJbx6 z|Hxj;`se@FgMU?pzpj6I;NR{6EWS;q`vwXSK}ezR5-J&4`{Ocpd5Y$Vr@<(XzPHq^n%h`LRVhx0rC}x$nG&f?})@Oed zD&y#55{YWF7~v50?7OU4jzHVb(k|cIXL}7|peLT;Y5i1Z?fQg?bpTm>quscXcskF; z$3-=ndq=z8jy2z;AFn|=NMHNL(!v3x=; zWtR(Bj?JipeRJuj*=X=6eWcDYPlKg4w8G_Q{M3pNG}O>8t87^_RhYVwZa z$j~jy+n)?vR!V)C)TIs%eRFoGGH^{=khZt&DU@|Iu#V8IS?UZ{j||06Sp|p5m5E;$ zkiNV?%B9bRT0{^O!Rsw1t8;IBP4zJ)#^#i{st9&NacQ$^qfW3{+2f1h^!_|Io|KOk z=J?X&;)d=Wx)SVWX^$m_b2h>eTi8&JLahSN22mGZ4K6w7kpgC9B`mExR=~UbGQo%X zZZ~C3ZhbES3ag>1S1W^ftM_c7;ifoJNFmwVz-j&M9b#N(;C2H8-BPAtPm&KzZcEyE zV6Sz+awU=0={c3`3EPLO%;kr(6E#JdxW*sfyr3wW>yBOl`^P$BC*?ea%WOsU9Gv70 zll$^E#qVCF7*p94!o6w0Ahz|@Q5+RT0gwaM+ zv&`$-x@B)%Y9l|{u_9Qzl=-jb=Z;8l(~l18S`ZeIw%OZi9)01N%}KmN_AVaf#jdTb z>6S~d)>6i0AE(9N<6!36rh+c;^MMbFc(DqeWK({CP@nhO3${N!T4yo%lfJ?E%7B$3 zB(2o%3~XOkrgUZVH)e`g!*$Qj!LReP#&Y&)Ep+SdrD;&G&(FJ`~SF8s9XNw~Dh4MVI57HDl*sxzf` zpwb~cR{bW2&{*pCU$Ec&BTpOEVjBHYpNvrkutl8uGaX!!y=3ost#(a-4CXtjCoV?g zEGhN)u+NF#6BCemWSk`v>u=kL(x=+CWuC+&>jsWY^4DJ>GfvW69x4}lQZMEG~)lh#qYu$lz`*zrfFVEY%zj*U4)K6)-_ zN-T_cJv8L+P?lwj*UtD0FsjMNo*%$ygd6D;(PpMQy7^=e8ZkCl8MuZ1zrPgYEJ^B5 zy>gvYe6>8VJ}N}!00#GJH`Peq+>1UMhI9X_`necH<8QoJ5+yoDF*bVSv7zg6Jj75d z1oRPZSWz_tUa*)GH&oAZD6zTz?Qt&K+7YC#+DK6&?*S>dm0laG7#k?}&xHEWpL7&^ zj51E2DAg;0oJJlLKfs;%VaKp|ZITC*ZOrXPLpylrEhrsf9N+WC@jbA>~128TPHB5T56 zEDWtJMx%|KqdKkY=0tTIZaS1_U{2R8iim>dtp;kusc{x@JG8&pt8$bk-8x5Tq3UJr z>W8*lrnEyKrk++Z#O>l5`h7M@nq?hW>!j?mEuxW)oR!0&X^|3sGdB&&%N#*BzBeQE zG|Wwa+Wj0kQcN-~95xPudqS-dTc;RoflBr~D~XvKJ{#b+)jKB^etZy+E7MNt}bj+81AWJkY!#Q7vx`pjz`n$su1?RAMX6w`cJM;ZC zuy~10dHV5f zu(qqBCj2@QlUx<`?(U(CA8zFM7$tOu0 zYJ;E@C=bRdvxlB!fCIH*$K*r5CO%dvIi<0#w9c#k3RBx|n2IX>4`=3=>ns zeG1ST;KDUwwjQ>3r6?zxw(#pWw!)5GSy=%Pj*FfXQDy-z)5Dy%eC^ByHEA!OH%pQs z+~j5D?5~2JkxcV4o9C{Y1d-3mwlP~jqG={9SjUPEdOh1tKM+y{DpFJwd zwvRYnB1I(OqoSV2<)6o#f{%VeqtX0>Y0yu#l zJqjx9Xs~_zX?&KbTnU6xv^4QeWKV@eF3@Swr0FNnO~8Akn(>XvL)bU6KT?!U-t%-x z%j)$(qNp~~ar$ZK=}fe6{5oH|!ijZW$|pJesuW^%pdv@eTu7AEu6frR094v(lt4Bp zVVU1mB8)=&3O!H~D#>j!)gy7^gG&zWBlbg=s;_iBdekDu6-+-J*(wwtZQs8AIB`sj zkbRNZV5ap_dPZ$-tav;GA*>ePnn(rW$mSy1NO$vafxvkTv91Ds&p95MjUwW96p_MFSO0txNNipK zq7K*Sg}G}_G3zL-M-u{%KsSD(AB8aS1Bg+`G{bv z=!Hv_ZkXUka@erdaGE#lhrfLJ?IEnnqf5dtN`y)~RWOULp05)uBqER4_o9s(7FrBZ z1o4G&mSmO@a4Bvo{lM`bpB^h}8?B~MQojg600Ww4GCsJc^-{Cc1X z4o0xwbth^fiIl+79O&+V6Ph=b5eT7S#`n(5$6KXwPF3mqrmxA{_G=&EJ*hJ+IgbQq!Jb)5$O#~HpZ?zg?g9)+s|y6 zvjqa3qeSJsAgWwrD4X0y=c#~`x}U|v%-CP47s%eIGud{sK2IbKh*F^H3|p@dO7zDT zl2Fu%0}=;7@P?M}oJt08OOG<`{1*Y~|3bB6z+6Ayb$9GW@3m4FAi7(mAPm-$RDN%%~rF+K%WJO;;Ov`OMhBnm-BZ0XHy;7+Y0fO#?nIdi}2Tdh8TQ8HxLos+4dHi zw+6;8F=XgxwBLH!x$rf{c+C=HI4g)2;zPwuI-(1$g+t-^DbUWmP zjDf?9|GYcHj4W?}`R|N5hq-s4eU+fxnuYTOf?&~nAt|YH2k&C~)@uiz89fN18G3|> zWs>aLE$Etr4-K=+cF`icSXjw~90EobpUFA~JOC_#9Hh@Bc8SOU?r(9X=cRnUzJbx6 z|Hxj;`se@FgMU?pzpj6I;NR{6%3$1xvY!Z*S#uPvlYc^J!5K8cRW#LST$X=mm!sA7C~h=HrBWH;7o z1IEVk2!OvxUP93hR?v0Bn8hvj|BeZoi2RPQzBr8FSZEQMl^1F>FZ1@x{>H~8PK~sB zE1HrFheWKSRqeZX@8+x-yJ$!G+NuMj1s2~0%R5-|Z}=<2B{%*{)-?PlGFsMVpju4R zV~$S#;FbC~#Zj_7AhTS$(S1;ZX}|jR*>(N_EYB#oe~&$g@!kQ3wAp>7Z&PD?w#UPu z5uXM}EbpnHmPXLQJA<`@Nxg>~?43wjWF#(W7VddlP7{*Q*U&1~0+PmnscXOM%8^JU zv^G#WW?RA12`%zlEbm!2UI?oBtf)`6{4?F9tULV8PC(|OhyUuibZt}d2kWXq^xI(p z55Y<1p9Q6#thvtml~Mn+24qo0RoOlbl;(e%R4h1++c7&B>5BYs$c4&?%}yd z8GkOJht?j8eGSJlqWKP$GCI~+WW@s_J|iG(*w-h)zl=--Ea zsMU(N9KJ6oojmoRfiK8#~gdE2Y_jre9u48b9VN zF4{N($V6c+tYw_xIf{H3BycRtTw7ZkvW@}cUQQLOKx=E6`eqI;NIRz@n@q|WERXp4 z%veH&9&R11rAmQvx`hoo?gsSnwgWOlXmhH`sO}m7HSRm1ox|n0{n=>Oacp7Oo?~@@{1P zRu}3Qx`ik}CvXhS=8R7PS=G&%H~EJsIRw~gY}9KoQ|H?=oyt-O485?>mq;WwMo=c2 z*NfzZF$mV&3$}S2J)&o6))t2;P$JXVu?N9k9HQCignLcxPL$`1ul_2F8^qK^8z!2& za@^e_GvtLB^90k-h2TDqQ&iI;bwWiodv$4muo}ncC-nWacO}op{FXjYK;>XkBM5yi z0LlyIfwy$*p)O9G#5rN3JmHudlj~*`6$BTVFC54e2n0-ZHu|AYDX8>+C;CXX=$UjNn(AegUNzui%U_PQPt9QxiM( zL@c#loRpT+vF9I$8ds*pT+?VsNci=RR`EZTnJx}<>aJW>>U1S^;|0Fr-L0J-mf0pl zfHjaIXN1*#KiUM=z_M0EO@5ya<+e`9cQqM1-2$6dbm~^_m10z7F>Ag%LAri^GO7(9 zwGubpXsT?OXk3uvcFJ$3$Um1@e$4`_vp=C_nKYSoxftcH(P)+os*N5m@nfo#6OqS| z@2a{l+Rwx}^_LQMYcNhdr34bVL@BDTfG>{~tWDzDoPS&fo1IU1;^;Z3x}0u}+!KE7MTtKz$K&|al~?!5=vH442lk4-!Vy7W z>F*W5ybl5kAp(&|RTn$9KNmkg=0-NT%IT?yrS0jS_I+``7P0%RsM>dOmP5bAugR`@9P zi6ru@$tQ)%T{l7V1GT8A`1p7~^rH}Q%liyBlG5_&M*x?!(to$RVxf>eHSz$pp&3F| z1qpoD)lr~}Qr3+RcS2xfXJ9}$RJfeRMHdZ7mwOr$r>#Z`bT}dYG;#b^%p`W#)}Of5 z5NvfrTdm+$AN>EH4a`z-+}YTuK62<6aAUJM@IWErC~FUb6}kiDKu(%3$1xvY!Z*S#uPvlYc^J!5K8cRW#LST$X=mm!sA7C~h=HrBWH;7o z1IEVk2!OvxUP93hR?v0Bn8hvj|BeZoi2RPQzBr8FSZEQMl^1F>FZ1@x{>H~8PK~sB zE1HrFheWKSRqeZX@8+x-yJ$!G+NuMj1s2~0%R5-|Z}=<2B{%*{)-?PlGFsMVpju4R zV~$S#;FbC~#Zj_7AhTS$(S1;ZX}|jR*>(N_EYB#oe~&$g@!kQ3wAp>7Z&PD?w#UPu z5uXM}EbpnHmPXLQJA<`@Nxg>~?43wjWF#(W7VddlP7{*Q*U&1~0+PmnscXOM%8^JU zv^G#WW?RA12`%zlEbm!2UI?oBtf)`6{4?F9tULV8PC(|OhyUuibZt}d2kWXq^xI(p z55Y<1p9Q6#thvtml~Mn+24qo0RoOlbl;(e%R4h1++c7&B>5BYs$c4&?%}yd z8GkOJht?j8eGSJlqWKP$GCI~+WW@s_J|iG(*w-h)zl=--Ea zsMU(N9KJ6oojmoRfiK8#~gdE2Y_jre9u48b9VN zF4{N($V6c+tYw_xIf{H3BycRtTw7ZkvW@}cUQQLOKx=E6`eqI;NIRz@n@q|WERXp4 z%veH&9&R11rAmQvx`hoo?gsSnwgWOlXmhH`sO}m7HSRm1ox|n0{n=>Oacp7Oo?~@@{1P zRu}3Qx`ik}CvXhS=8R7PS=G&%H~EJsIRw~gY}9KoQ|H?=oyt-O485?>mq;WwMo=c2 z*NfzZF$mV&3$}S2J)&o6))t2;P$JXVu?N9k9HQCignLcxPL$`1ul_2F8^qK^8z!2& za@^e_GvtLB^90k-h2TDqQ&iI;bwWiodv$4muo}ncC-nWacO}op{FXjYK;>XkBM5yi z0LlyIfwy$*p)O9G#5rN3JmHudlj~*`6$BTVFC54e2n0-ZHu|AYDX8>+C;CXX=$UjNn(AegUNzui%U_PQPt9QxiM( zL@c#loRpT+vF9I$8ds*pT+?VsNci=RR`EZTnJx}<>aJW>>U1S^;|0Fr-L0J-mf0pl zfHjaIXN1*#KiUM=z_M0EO@5ya<+e`9cQqM1-2$6dbm~^_m10z7F>Ag%LAri^GO7(9 zwGubpXsT?OXk3uvcFJ$3$Um1@e$4`_vp=C_nKYSoxftcH(P)+os*N5m@nfo#6OqS| z@2a{l+Rwx}^_LQMYcNhdr34bVL@BDTfG>{~tWDzDoPS&fo1IU1;^;Z3x}0u}+!KE7MTtKz$K&|al~?!5=vH442lk4-!Vy7W z>F*W5ybl5kAp(&|RTn$9KNmkg=0-NT%IT?yrS0jS_I+``7P0%RsM>dOmP5bAugR`@9P zi6ru@$tQ)%T{l7V1GT8A`1p7~^rH}Q%liyBlG5_&M*x?!(to$RVxf>eHSz$pp&3F| z1qpoD)lr~}Qr3+RcS2xfXJ9}$RJfeRMHdZ7mwOr$r>#Z`bT}dYG;#b^%p`W#)}Of5 z5NvfrTdm+$AN>EH4a`z-+}YTuK62<6aAUJM@IWErC~FUb6}kiDKu(j&xT>gp*}3scu#)|2zR{W8Cf651*7DGqYhE4hn*^kSQoGpybosvZEKw?hwZ&j`UVH zFk{Z0EA7-LB5=KQDtl?|;dKpz1_k5p9#?4g)w&g#?5P_g@GN`8p(VV(?4zPe`@QDU z;vzQNLO497K2#w4kiO4zQ_&+a%;)oW$TZpV#X&`FkE9pJ7TOgyD-3bc_s@OHWh*O4 z+XJ)M`ALUz$^F6Fsr#qXsuu^sFy!F2`(5mesht>v?ir7Wn9^WQERsS%2EAC9_e(U~ ztk18lN>>EsZg`fqPtayBq$Pqid~yDrfrzbGYtfAvdiCmXbdQN(4-^s}(N~I>O!qkJ zMt38&OVxRpOj{7c)c`Ca*lkib+hnJZcJ!BrbkNY^=jCwRniNs3y#e?4>>@98*{zPL z_smfyZ#x&Cstmp6HorrSULLQEc`7@qczZNekFuO)9#)XJ{cQ@|-#$|-YN#e6yGWh( zhCanZ6$DTGW**JyWbH*^N8*~8zqtI@T|6FqnG>q|-j^xD_Ew)5#e*cq%$dBoZ+!qekw! z+4^ejqjSIX!I32Z&O+u)N&Vs}{4xn^6+ZNG4g{5DOP1Z(W>}YC?hi3t3$_hEI+~2K zS?G+Psb-q~3^BBmv|OpIRa59uKSyI(Lx~ExvmTk$Yr8uTA;F+% z<|gzMFFl`qq8V#zX)V8Vqa24E5mGluFl;Suo_kMw&+4bcW4b*&%KLrH zba#lF=vN;nd7oj3*-dYb$65(1THUfa=sG0Ta^z%bko|~N1VmNOhsC(H`Aq#}c&ypD zR#0YGQdjo3E_8UyGiHu#f$NsJ6`~3+ea!GFNS66U)qC&e=~RhE;za>f;l9@&68mz+ z9d?Prfyz8N31w9QPNB^ef6wBWT_hqbuHZtX?I z0~n7CG~5Df{)3tqAnMlyi31if^%4fO@^z95>Q&M7X43<>hSh2$$1vhCQ7efxN?EBB z!=H_uWaAp%$4s1Y(IcW(&i;8-le*H18!)~Pwo|NHjwX~>P=Qh4J#;2B;KYCe7qB5HG4PhP!V?+6Ty)9_v2zT) z`79{Q)9SX%K?GB}quPmLe_!n%5%`K$8BaOr?x5kCXx2zv7-2u%(I%@dm5c74 zkbNo{EjxoDd<&KW6XxCkB6xZ54xDQNXvj~w8bLxyX8;hvfnCw4N`hcp0OHOJPMd+K z5MO8BTzsRLnD1#;!h@(;=I2Nvqr*ko%f>ZuZg5y{v60$iV!rP>s~9_KRuPW9mf;h) z&-D>8AID82(H-Skzg4fGyWNmm;1The3}e@E3Q7_`{fuc5HR7-Bh`6(rh4&yNXJ0Bn zOe0l$c(?=qqqSmHocA3Gb^4Kq-4=k321HHRX%W8nvk#b0U2J6%TSFqL3IAhg?D_Ez zmz9~?D8goX^ZicrBo{qNwEHhd@I!=xl7g7`xaBC1V7doTxX0(SxKZZs!o-c1(bL_W zZy~D8JoKyyM1Aq_kG)_b*ma|ijaOK=I!lx8D9pNeUpaukLfJ0=&M^f5NtTu}le*B| z&jwzR<)3gSN_e<5G%+qN?pQNVXS(}UZao@9Jg&!)zO_cSh)Si15o#>R#1wI#P&-NKOjF>tw8I-uFD635zbjoWW zn^=hdgtG-y^~tL6{=j&l_bCU&G#r308h?|FiRbAg347UV(a9(fp;mFhY?U>3&AG`V#^~4JHgvYyEs7T(WvBDK-64WlV-zgCVMrn;ueh0Uz7E+ zXUaQl^RALmju)24sH|~sv5+6L+C2M^xwkJN@()o{` zOsvs95=!qP$HhP{2(dG?2Zp=ugaRDs*ml5!1*);pMkU6GlJIO08WCF=Y;vB2Qd|_g zXsMc6w~P7%GMlyzb?Eo;WE10D66y?SFlzZvvkUAnd+FS0P_kNDT7Wd~U=Y%&sHmvQ zpqoSW^$eI_0a#lH=(;`~wh94SaR0Zj9lbY}%U1}b-LZHdinxMpz#GU(5VpNW-z%**7%QiI(~u8L_%-{<$X#$qQ@c3MV`)WxcUJ_P9B(LhxMt@b?#VS2LyGzQ$>UZ4D% zFyYEq8hZ|$s^BRBMnJ3PFie6YtCmLMO#1Eo<`Ax=8h;N5dc9>!N zrZG6#aePcC`t+Ii>HAvr5)(3(K%2U$HUoa>NBfX2U=$v~?ax#$V502>gY> zpA&&iWx_IWIlxff1^hV?`2UYuZU-)H6bjS1TqiJDuT0fCm8ADxs)Z4qEnr2(j&xT>gp*}3scu#)|2zR{W8Cf651*7DGqYhE4hn*^kSQoGpybosvZEKw?hwZ&j`UVH zFk{Z0EA7-LB5=KQDtl?|;dKpz1_k5p9#?4g)w&g#?5P_g@GN`8p(VV(?4zPe`@QDU z;vzQNLO497K2#w4kiO4zQ_&+a%;)oW$TZpV#X&`FkE9pJ7TOgyD-3bc_s@OHWh*O4 z+XJ)M`ALUz$^F6Fsr#qXsuu^sFy!F2`(5mesht>v?ir7Wn9^WQERsS%2EAC9_e(U~ ztk18lN>>EsZg`fqPtayBq$Pqid~yDrfrzbGYtfAvdiCmXbdQN(4-^s}(N~I>O!qkJ zMt38&OVxRpOj{7c)c`Ca*lkib+hnJZcJ!BrbkNY^=jCwRniNs3y#e?4>>@98*{zPL z_smfyZ#x&Cstmp6HorrSULLQEc`7@qczZNekFuO)9#)XJ{cQ@|-#$|-YN#e6yGWh( zhCanZ6$DTGW**JyWbH*^N8*~8zqtI@T|6FqnG>q|-j^xD_Ew)5#e*cq%$dBoZ+!qekw! z+4^ejqjSIX!I32Z&O+u)N&Vs}{4xn^6+ZNG4g{5DOP1Z(W>}YC?hi3t3$_hEI+~2K zS?G+Psb-q~3^BBmv|OpIRa59uKSyI(Lx~ExvmTk$Yr8uTA;F+% z<|gzMFFl`qq8V#zX)V8Vqa24E5mGluFl;Suo_kMw&+4bcW4b*&%KLrH zba#lF=vN;nd7oj3*-dYb$65(1THUfa=sG0Ta^z%bko|~N1VmNOhsC(H`Aq#}c&ypD zR#0YGQdjo3E_8UyGiHu#f$NsJ6`~3+ea!GFNS66U)qC&e=~RhE;za>f;l9@&68mz+ z9d?Prfyz8N31w9QPNB^ef6wBWT_hqbuHZtX?I z0~n7CG~5Df{)3tqAnMlyi31if^%4fO@^z95>Q&M7X43<>hSh2$$1vhCQ7efxN?EBB z!=H_uWaAp%$4s1Y(IcW(&i;8-le*H18!)~Pwo|NHjwX~>P=Qh4J#;2B;KYCe7qB5HG4PhP!V?+6Ty)9_v2zT) z`79{Q)9SX%K?GB}quPmLe_!n%5%`K$8BaOr?x5kCXx2zv7-2u%(I%@dm5c74 zkbNo{EjxoDd<&KW6XxCkB6xZ54xDQNXvj~w8bLxyX8;hvfnCw4N`hcp0OHOJPMd+K z5MO8BTzsRLnD1#;!h@(;=I2Nvqr*ko%f>ZuZg5y{v60$iV!rP>s~9_KRuPW9mf;h) z&-D>8AID82(H-Skzg4fGyWNmm;1The3}e@E3Q7_`{fuc5HR7-Bh`6(rh4&yNXJ0Bn zOe0l$c(?=qqqSmHocA3Gb^4Kq-4=k321HHRX%W8nvk#b0U2J6%TSFqL3IAhg?D_Ez zmz9~?D8goX^ZicrBo{qNwEHhd@I!=xl7g7`xaBC1V7doTxX0(SxKZZs!o-c1(bL_W zZy~D8JoKyyM1Aq_kG)_b*ma|ijaOK=I!lx8D9pNeUpaukLfJ0=&M^f5NtTu}le*B| z&jwzR<)3gSN_e<5G%+qN?pQNVXS(}UZao@9Jg&!)zO_cSh)Si15o#>R#1wI#P&-NKOjF>tw8I-uFD635zbjoWW zn^=hdgtG-y^~tL6{=j&l_bCU&G#r308h?|FiRbAg347UV(a9(fp;mFhY?U>3&AG`V#^~4JHgvYyEs7T(WvBDK-64WlV-zgCVMrn;ueh0Uz7E+ zXUaQl^RALmju)24sH|~sv5+6L+C2M^xwkJN@()o{` zOsvs95=!qP$HhP{2(dG?2Zp=ugaRDs*ml5!1*);pMkU6GlJIO08WCF=Y;vB2Qd|_g zXsMc6w~P7%GMlyzb?Eo;WE10D66y?SFlzZvvkUAnd+FS0P_kNDT7Wd~U=Y%&sHmvQ zpqoSW^$eI_0a#lH=(;`~wh94SaR0Zj9lbY}%U1}b-LZHdinxMpz#GU(5VpNW-z%**7%QiI(~u8L_%-{<$X#$qQ@c3MV`)WxcUJ_P9B(LhxMt@b?#VS2LyGzQ$>UZ4D% zFyYEq8hZ|$s^BRBMnJ3PFie6YtCmLMO#1Eo<`Ax=8h;N5dc9>!N zrZG6#aePcC`t+Ii>HAvr5)(3(K%2U$HUoa>NBfX2U=$v~?ax#$V502>gY> zpA&&iWx_IWIlxff1^hV?`2UYuZU-)H6bjS1TqiJDuT0fCm8ADxs)Z4qEnr2(j&xT>gp*}3scu#)|2zR{W8Cf651*7DGqYhE4hn*^kSQoGpybosvZEKw?hwZ&j`UVH zFk{Z0EA7-LB5=KQDtl?|;dKpz1_k5p9#?4g)w&g#?5P_g@GN`8p(VV(?4zPe`@QDU z;vzQNLO497K2#w4kiO4zQ_&+a%;)oW$TZpV#X&`FkE9pJ7TOgyD-3bc_s@OHWh*O4 z+XJ)M`ALUz$^F6Fsr#qXsuu^sFy!F2`(5mesht>v?ir7Wn9^WQERsS%2EAC9_e(U~ ztk18lN>>EsZg`fqPtayBq$Pqid~yDrfrzbGYtfAvdiCmXbdQN(4-^s}(N~I>O!qkJ zMt38&OVxRpOj{7c)c`Ca*lkib+hnJZcJ!BrbkNY^=jCwRniNs3y#e?4>>@98*{zPL z_smfyZ#x&Cstmp6HorrSULLQEc`7@qczZNekFuO)9#)XJ{cQ@|-#$|-YN#e6yGWh( zhCanZ6$DTGW**JyWbH*^N8*~8zqtI@T|6FqnG>q|-j^xD_Ew)5#e*cq%$dBoZ+!qekw! z+4^ejqjSIX!I32Z&O+u)N&Vs}{4xn^6+ZNG4g{5DOP1Z(W>}YC?hi3t3$_hEI+~2K zS?G+Psb-q~3^BBmv|OpIRa59uKSyI(Lx~ExvmTk$Yr8uTA;F+% z<|gzMFFl`qq8V#zX)V8Vqa24E5mGluFl;Suo_kMw&+4bcW4b*&%KLrH zba#lF=vN;nd7oj3*-dYb$65(1THUfa=sG0Ta^z%bko|~N1VmNOhsC(H`Aq#}c&ypD zR#0YGQdjo3E_8UyGiHu#f$NsJ6`~3+ea!GFNS66U)qC&e=~RhE;za>f;l9@&68mz+ z9d?Prfyz8N31w9QPNB^ef6wBWT_hqbuHZtX?I z0~n7CG~5Df{)3tqAnMlyi31if^%4fO@^z95>Q&M7X43<>hSh2$$1vhCQ7efxN?EBB z!=H_uWaAp%$4s1Y(IcW(&i;8-le*H18!)~Pwo|NHjwX~>P=Qh4J#;2B;KYCe7qB5HG4PhP!V?+6Ty)9_v2zT) z`79{Q)9SX%K?GB}quPmLe_!n%5%`K$8BaOr?x5kCXx2zv7-2u%(I%@dm5c74 zkbNo{EjxoDd<&KW6XxCkB6xZ54xDQNXvj~w8bLxyX8;hvfnCw4N`hcp0OHOJPMd+K z5MO8BTzsRLnD1#;!h@(;=I2Nvqr*ko%f>ZuZg5y{v60$iV!rP>s~9_KRuPW9mf;h) z&-D>8AID82(H-Skzg4fGyWNmm;1The3}e@E3Q7_`{fuc5HR7-Bh`6(rh4&yNXJ0Bn zOe0l$c(?=qqqSmHocA3Gb^4Kq-4=k321HHRX%W8nvk#b0U2J6%TSFqL3IAhg?D_Ez zmz9~?D8goX^ZicrBo{qNwEHhd@I!=xl7g7`xaBC1V7doTxX0(SxKZZs!o-c1(bL_W zZy~D8JoKyyM1Aq_kG)_b*ma|ijaOK=I!lx8D9pNeUpaukLfJ0=&M^f5NtTu}le*B| z&jwzR<)3gSN_e<5G%+qN?pQNVXS(}UZao@9Jg&!)zO_cSh)Si15o#>R#1wI#P&-NKOjF>tw8I-uFD635zbjoWW zn^=hdgtG-y^~tL6{=j&l_bCU&G#r308h?|FiRbAg347UV(a9(fp;mFhY?U>3&AG`V#^~4JHgvYyEs7T(WvBDK-64WlV-zgCVMrn;ueh0Uz7E+ zXUaQl^RALmju)24sH|~sv5+6L+C2M^xwkJN@()o{` zOsvs95=!qP$HhP{2(dG?2Zp=ugaRDs*ml5!1*);pMkU6GlJIO08WCF=Y;vB2Qd|_g zXsMc6w~P7%GMlyzb?Eo;WE10D66y?SFlzZvvkUAnd+FS0P_kNDT7Wd~U=Y%&sHmvQ zpqoSW^$eI_0a#lH=(;`~wh94SaR0Zj9lbY}%U1}b-LZHdinxMpz#GU(5VpNW-z%**7%QiI(~u8L_%-{<$X#$qQ@c3MV`)WxcUJ_P9B(LhxMt@b?#VS2LyGzQ$>UZ4D% zFyYEq8hZ|$s^BRBMnJ3PFie6YtCmLMO#1Eo<`Ax=8h;N5dc9>!N zrZG6#aePcC`t+Ii>HAvr5)(3(K%2U$HUoa>NBfX2U=$v~?ax#$V502>gY> zpA&&iWx_IWIlxff1^hV?`2UYuZU-)H6bjS1TqiJDuT0fCm8ADxs)Z4qEnr2(j&xT>gp*}3scu#)|2zR{W8Cf651*7DGqYhE4hn*^kSQoGpybosvZEKw?hwZ&j`UVH zFk{Z0EA7-LB5=KQDtl?|;dKpz1_k5p9#?4g)w&g#?5P_g@GN`8p(VV(?4zPe`@QDU z;vzQNLO497K2#w4kiO4zQ_&+a%;)oW$TZpV#X&`FkE9pJ7TOgyD-3bc_s@OHWh*O4 z+XJ)M`ALUz$^F6Fsr#qXsuu^sFy!F2`(5mesht>v?ir7Wn9^WQERsS%2EAC9_e(U~ ztk18lN>>EsZg`fqPtayBq$Pqid~yDrfrzbGYtfAvdiCmXbdQN(4-^s}(N~I>O!qkJ zMt38&OVxRpOj{7c)c`Ca*lkib+hnJZcJ!BrbkNY^=jCwRniNs3y#e?4>>@98*{zPL z_smfyZ#x&Cstmp6HorrSULLQEc`7@qczZNekFuO)9#)XJ{cQ@|-#$|-YN#e6yGWh( zhCanZ6$DTGW**JyWbH*^N8*~8zqtI@T|6FqnG>q|-j^xD_Ew)5#e*cq%$dBoZ+!qekw! z+4^ejqjSIX!I32Z&O+u)N&Vs}{4xn^6+ZNG4g{5DOP1Z(W>}YC?hi3t3$_hEI+~2K zS?G+Psb-q~3^BBmv|OpIRa59uKSyI(Lx~ExvmTk$Yr8uTA;F+% z<|gzMFFl`qq8V#zX)V8Vqa24E5mGluFl;Suo_kMw&+4bcW4b*&%KLrH zba#lF=vN;nd7oj3*-dYb$65(1THUfa=sG0Ta^z%bko|~N1VmNOhsC(H`Aq#}c&ypD zR#0YGQdjo3E_8UyGiHu#f$NsJ6`~3+ea!GFNS66U)qC&e=~RhE;za>f;l9@&68mz+ z9d?Prfyz8N31w9QPNB^ef6wBWT_hqbuHZtX?I z0~n7CG~5Df{)3tqAnMlyi31if^%4fO@^z95>Q&M7X43<>hSh2$$1vhCQ7efxN?EBB z!=H_uWaAp%$4s1Y(IcW(&i;8-le*H18!)~Pwo|NHjwX~>P=Qh4J#;2B;KYCe7qB5HG4PhP!V?+6Ty)9_v2zT) z`79{Q)9SX%K?GB}quPmLe_!n%5%`K$8BaOr?x5kCXx2zv7-2u%(I%@dm5c74 zkbNo{EjxoDd<&KW6XxCkB6xZ54xDQNXvj~w8bLxyX8;hvfnCw4N`hcp0OHOJPMd+K z5MO8BTzsRLnD1#;!h@(;=I2Nvqr*ko%f>ZuZg5y{v60$iV!rP>s~9_KRuPW9mf;h) z&-D>8AID82(H-Skzg4fGyWNmm;1The3}e@E3Q7_`{fuc5HR7-Bh`6(rh4&yNXJ0Bn zOe0l$c(?=qqqSmHocA3Gb^4Kq-4=k321HHRX%W8nvk#b0U2J6%TSFqL3IAhg?D_Ez zmz9~?D8goX^ZicrBo{qNwEHhd@I!=xl7g7`xaBC1V7doTxX0(SxKZZs!o-c1(bL_W zZy~D8JoKyyM1Aq_kG)_b*ma|ijaOK=I!lx8D9pNeUpaukLfJ0=&M^f5NtTu}le*B| z&jwzR<)3gSN_e<5G%+qN?pQNVXS(}UZao@9Jg&!)zO_cSh)Si15o#>R#1wI#P&-NKOjF>tw8I-uFD635zbjoWW zn^=hdgtG-y^~tL6{=j&l_bCU&G#r308h?|FiRbAg347UV(a9(fp;mFhY?U>3&AG`V#^~4JHgvYyEs7T(WvBDK-64WlV-zgCVMrn;ueh0Uz7E+ zXUaQl^RALmju)24sH|~sv5+6L+C2M^xwkJN@()o{` zOsvs95=!qP$HhP{2(dG?2Zp=ugaRDs*ml5!1*);pMkU6GlJIO08WCF=Y;vB2Qd|_g zXsMc6w~P7%GMlyzb?Eo;WE10D66y?SFlzZvvkUAnd+FS0P_kNDT7Wd~U=Y%&sHmvQ zpqoSW^$eI_0a#lH=(;`~wh94SaR0Zj9lbY}%U1}b-LZHdinxMpz#GU(5VpNW-z%**7%QiI(~u8L_%-{<$X#$qQ@c3MV`)WxcUJ_P9B(LhxMt@b?#VS2LyGzQ$>UZ4D% zFyYEq8hZ|$s^BRBMnJ3PFie6YtCmLMO#1Eo<`Ax=8h;N5dc9>!N zrZG6#aePcC`t+Ii>HAvr5)(3(K%2U$HUoa>NBfX2U=$v~?ax#$V502>gY> zpA&&iWx_IWIlxff1^hV?`2UYuZU-)H6bjS1TqiJDuT0fCm8ADxs)Z4qEnr2(WoE_EXD^~Ap4@A*cX%G(auX-BGOIAr18tySpCULvr8ABhkxWAWH~(O1M7^ryG4x$S7Rs(XKN2SBNgrDm zq`RVQZ591KAG1omV17A+*PWu}LC1C&Zp0b)=ie+f5i{$Ai)o+Z8GM$wu5ojPO%s{3 zo1W8lg*W_cMhsnTF;nzM9hZY~*bbF`Qx6;;ipuQ=17|uj*asJwv?9j=7sOOIwD0}H zp?7H7nL2SB+6ZYG)NZFvLheY^bge7k*RBu0b);bqIpew@6yovC-Q($h94WuomHEw% zUBrOl`@#hp%YVRmquWB$3)J@dTO8ws%|o{6E5-P1Kkux=`^|n@-5Oo3=%i;9!-4`Q z!R~WXjl&5Nu?V3z{$~eay;OI^=hI|Myqta#_`pHCF5Yx|wL~n8aj#^M^byJDj+KxHAYBNYRBtaQQcs@LUk@KX-;1X1nA7_;1qsX`7qz7jP{q}!^qH7h6gwQeHd z98{ItVOL`9+FW0&R^2ep1*R{l8$e(_J=wc48t9sK(W~jXe9|BRrb!B2GIlJ!^&tgK z=988}o2_)17M#gDJ-Jqaqy7WtDkRi}^vyvWoZu3+)@LGXh?^fQiHbGj+_^v7okP+O ztP=~kF>)0RW?j(3+<_w2`DO)eG=ta>*$u^~UAW&3Ui_lpR2#BUH<$M|)U#2Njh)zR)Fk+R*m-C$CB&E{M+ddFo&Qu1Bp4-mgUvi_ObCsX zQA||7`D#;_B-hyxB^Rr|Sb^tFpDOQ!o^K~Yd4uk;B%`q4-#Did*uuU%^oK_~Rfs;1 zntwYw$ha>r_$f-u%M5cI}4hd6JxK$+5sWDkTvw?ZQd; zDDPe4E10DeIaO-Ce#L;qn8%;?2MZ>~hITmzK&%;lHyL75hOwu;#3y) z8UqIYtC_(fAHJf`d%KS8g6wPtu^gXK7}LS8PDUyPpNYuAZfep-1DF$yF-Y~bx{cbUQ}jDP_@H6* z=8HcKmwSbL`9pfKULxLmekyx;$0ad#o)*8{M9&<3HDX z-n}Vd>j&v=X#+*XXLdp*j&Y(G%{sl{uQR^vril8pUqv#;Tg&z0wIZNWi(@my*y7ut zp14W`17JrpwhU|-^b`P~HCJqharQ z5hx|Fl67{c0VVZ_E@tGdT@et+#^PuQD22t(2e|9t;W=9=oZjD|*y&KVJS%8@2#wTh zY!YUh$J#dsgp?!I_kmwQbSnUof-nlw}1Z?zYGljU!3Sb^Kj5cgQLfL}>7oQJ1 zfwwyCzTNcfu-EW=bG%l^(Dfr1?k%@zcYK{6(vCRi^X2b^vpk~W;&hs~O!4co4kMwu zeeuyAMAwCmq4DS#rnFMf(T$FjFyME-^jHH za;apD$dx3E3g_eEk zG?8r&6dE??RQv0f<%Vo5rVye{O1NY1@Ao9g@`w)F_d4Gso^{Oq(IfEFGX_*)$?Fs2uIW3}pXU>Mxg9z+pAxL{Y48+r#9g&`w< z24x6c>$9WeKU37d=>)0p)UYzJzk4Xb*U1oN*7Tq3WoG|78sE6fn--C1U_ z39=*;e+9zk_~F`{wj66KN;)B!epw^kkAhW&UmY1Ul1(e^Citn5NXhX_N8~N z@`9$J2PpS@au@G6RpQ8v@#8pngaZxZO#f9RSVK1UKo6)Up-b??nL zl%vKWPK!aLr?Ayk{7S22sZN+1&B3dqGJ(=OS`%{=_H(vg*W+|MsCvj;%a&8CciU4d zjUwlM0jWW6;23RGChQ;~eF?lYR<R!G9 z)~;ys04v89MB&ii`^7^UB9 zq+%snt?+7P7xZDIv~s8q@CJxlVG_CI(ygr|zb%$KaYfC=QPIiCMvU1cb%`N%R3B&DAszBEN zLg+8N&p%@5(dv=Uf*QLYBt@Xv!;?<$?rTy885nvT5AZGlwE2H2Q($GT8_tdb!)T+H8ZTI5o@`rH5{Km`aC5|#l4nP_nx za80%zuCevu^!;dmFSw~c5i|<_j5cRZUt%D)ERJ!U#dnLUA-Q3zAYw> z?01*UGY8zUtmew6AF5l92#PyYSSOepIf0mlreF5Gwf;$2yo@#$4gp4rKRygVmeZDk zd{|Ct8}g>WqCX1P7lg~7WWig(8v9Do9a3>BJmP|F8?8Xwz|@Y083p;J?DO|Gknm}! zaw}L>6wW z4tas)R|U0;NZEb;AQR7lTWW|m^6g7J`|{l4L%G~7K5skcvD0l6e(!_M)>%#U1DiXn zeRq=J-4?FZVZj0FS279>ns~gn#4@&-H0LZUQOLn_d`^10TNkwE?I1y3&*#=|Gr%Lj zTF-Z{GcUp-!y)A?OucA*e;i}n6=cw%he9uT(kF?&aK5w}2=GxiezwAWLbUCtA0A6n zDsVEhE6vK9Hh_SL?}UPZdP37-G$125b$dn;2{#a30FCB)squrE*R!rZ8+NNcOxDUTM9;qL=NTi!_5*k4pg>0w4 zO*b^hXL~LQVn3(my;LX5PXVxNMbtb0+GJ_0R{Fqz@gAW`$>+s)* zsB&x90vQSd>14T2n9?;s^E5&UfEnii{DyKM&@eNRyT%?|U|&J! zUk6X<01bHBGTGX4)lG8_c+{D~u^4FjglB*LkXliV-_}aAia5?7?TrG}{*wExb-ml5YrQ?_h>^^2iAZiKi|l4&cI6e10hMgto1%Euay7UYoX@avGzh1x#EQLN}ME+tXCa zBmF~WC#!##EP@FT%(GE7N7{JZExw$!R~8z4fCEnRS|{^NIjHww3Y1aMTW*j;ScZPv zzkvE{G>|1SGZu99Qjw=CTVLSU#%@j11fY8aZ$bAEju*>CKIY!)D8w7%l)mH!~0bSs+?W$0^j{ha0~~8P?*v0P!#2M>)~x;7O*RZs z0>Y1S$ixOb-A)`}85+APOx|641K>ISv=w+C>xTvY^Mfm31M(dQMi0OKjT3s@k*V=f zW3@k^u^Yk+!ydb1VQNwQDh98>2LotewmyP7aTJISptG7n2vx z1S5h&`NPUGPvvN(#~uC}B;b7BgT)y$mG>$@cSP;$gf^h1cm6|;VE(7)KmUIDKkGd1 z-~IS^KmHjf!~efZtds1Jl9EUw{`{~LoWk$gj@%tm(D7ArrjuhKxFTh43cpWoE_EXD^~Ap4@A*cX%G(auX-BGOIAr18tySpCULvr8ABhkxWAWH~(O1M7^ryG4x$S7Rs(XKN2SBNgrDm zq`RVQZ591KAG1omV17A+*PWu}LC1C&Zp0b)=ie+f5i{$Ai)o+Z8GM$wu5ojPO%s{3 zo1W8lg*W_cMhsnTF;nzM9hZY~*bbF`Qx6;;ipuQ=17|uj*asJwv?9j=7sOOIwD0}H zp?7H7nL2SB+6ZYG)NZFvLheY^bge7k*RBu0b);bqIpew@6yovC-Q($h94WuomHEw% zUBrOl`@#hp%YVRmquWB$3)J@dTO8ws%|o{6E5-P1Kkux=`^|n@-5Oo3=%i;9!-4`Q z!R~WXjl&5Nu?V3z{$~eay;OI^=hI|Myqta#_`pHCF5Yx|wL~n8aj#^M^byJDj+KxHAYBNYRBtaQQcs@LUk@KX-;1X1nA7_;1qsX`7qz7jP{q}!^qH7h6gwQeHd z98{ItVOL`9+FW0&R^2ep1*R{l8$e(_J=wc48t9sK(W~jXe9|BRrb!B2GIlJ!^&tgK z=988}o2_)17M#gDJ-Jqaqy7WtDkRi}^vyvWoZu3+)@LGXh?^fQiHbGj+_^v7okP+O ztP=~kF>)0RW?j(3+<_w2`DO)eG=ta>*$u^~UAW&3Ui_lpR2#BUH<$M|)U#2Njh)zR)Fk+R*m-C$CB&E{M+ddFo&Qu1Bp4-mgUvi_ObCsX zQA||7`D#;_B-hyxB^Rr|Sb^tFpDOQ!o^K~Yd4uk;B%`q4-#Did*uuU%^oK_~Rfs;1 zntwYw$ha>r_$f-u%M5cI}4hd6JxK$+5sWDkTvw?ZQd; zDDPe4E10DeIaO-Ce#L;qn8%;?2MZ>~hITmzK&%;lHyL75hOwu;#3y) z8UqIYtC_(fAHJf`d%KS8g6wPtu^gXK7}LS8PDUyPpNYuAZfep-1DF$yF-Y~bx{cbUQ}jDP_@H6* z=8HcKmwSbL`9pfKULxLmekyx;$0ad#o)*8{M9&<3HDX z-n}Vd>j&v=X#+*XXLdp*j&Y(G%{sl{uQR^vril8pUqv#;Tg&z0wIZNWi(@my*y7ut zp14W`17JrpwhU|-^b`P~HCJqharQ z5hx|Fl67{c0VVZ_E@tGdT@et+#^PuQD22t(2e|9t;W=9=oZjD|*y&KVJS%8@2#wTh zY!YUh$J#dsgp?!I_kmwQbSnUof-nlw}1Z?zYGljU!3Sb^Kj5cgQLfL}>7oQJ1 zfwwyCzTNcfu-EW=bG%l^(Dfr1?k%@zcYK{6(vCRi^X2b^vpk~W;&hs~O!4co4kMwu zeeuyAMAwCmq4DS#rnFMf(T$FjFyME-^jHH za;apD$dx3E3g_eEk zG?8r&6dE??RQv0f<%Vo5rVye{O1NY1@Ao9g@`w)F_d4Gso^{Oq(IfEFGX_*)$?Fs2uIW3}pXU>Mxg9z+pAxL{Y48+r#9g&`w< z24x6c>$9WeKU37d=>)0p)UYzJzk4Xb*U1oN*7Tq3WoG|78sE6fn--C1U_ z39=*;e+9zk_~F`{wj66KN;)B!epw^kkAhW&UmY1Ul1(e^Citn5NXhX_N8~N z@`9$J2PpS@au@G6RpQ8v@#8pngaZxZO#f9RSVK1UKo6)Up-b??nL zl%vKWPK!aLr?Ayk{7S22sZN+1&B3dqGJ(=OS`%{=_H(vg*W+|MsCvj;%a&8CciU4d zjUwlM0jWW6;23RGChQ;~eF?lYR<R!G9 z)~;ys04v89MB&ii`^7^UB9 zq+%snt?+7P7xZDIv~s8q@CJxlVG_CI(ygr|zb%$KaYfC=QPIiCMvU1cb%`N%R3B&DAszBEN zLg+8N&p%@5(dv=Uf*QLYBt@Xv!;?<$?rTy885nvT5AZGlwE2H2Q($GT8_tdb!)T+H8ZTI5o@`rH5{Km`aC5|#l4nP_nx za80%zuCevu^!;dmFSw~c5i|<_j5cRZUt%D)ERJ!U#dnLUA-Q3zAYw> z?01*UGY8zUtmew6AF5l92#PyYSSOepIf0mlreF5Gwf;$2yo@#$4gp4rKRygVmeZDk zd{|Ct8}g>WqCX1P7lg~7WWig(8v9Do9a3>BJmP|F8?8Xwz|@Y083p;J?DO|Gknm}! zaw}L>6wW z4tas)R|U0;NZEb;AQR7lTWW|m^6g7J`|{l4L%G~7K5skcvD0l6e(!_M)>%#U1DiXn zeRq=J-4?FZVZj0FS279>ns~gn#4@&-H0LZUQOLn_d`^10TNkwE?I1y3&*#=|Gr%Lj zTF-Z{GcUp-!y)A?OucA*e;i}n6=cw%he9uT(kF?&aK5w}2=GxiezwAWLbUCtA0A6n zDsVEhE6vK9Hh_SL?}UPZdP37-G$125b$dn;2{#a30FCB)squrE*R!rZ8+NNcOxDUTM9;qL=NTi!_5*k4pg>0w4 zO*b^hXL~LQVn3(my;LX5PXVxNMbtb0+GJ_0R{Fqz@gAW`$>+s)* zsB&x90vQSd>14T2n9?;s^E5&UfEnii{DyKM&@eNRyT%?|U|&J! zUk6X<01bHBGTGX4)lG8_c+{D~u^4FjglB*LkXliV-_}aAia5?7?TrG}{*wExb-ml5YrQ?_h>^^2iAZiKi|l4&cI6e10hMgto1%Euay7UYoX@avGzh1x#EQLN}ME+tXCa zBmF~WC#!##EP@FT%(GE7N7{JZExw$!R~8z4fCEnRS|{^NIjHww3Y1aMTW*j;ScZPv zzkvE{G>|1SGZu99Qjw=CTVLSU#%@j11fY8aZ$bAEju*>CKIY!)D8w7%l)mH!~0bSs+?W$0^j{ha0~~8P?*v0P!#2M>)~x;7O*RZs z0>Y1S$ixOb-A)`}85+APOx|641K>ISv=w+C>xTvY^Mfm31M(dQMi0OKjT3s@k*V=f zW3@k^u^Yk+!ydb1VQNwQDh98>2LotewmyP7aTJISptG7n2vx z1S5h&`NPUGPvvN(#~uC}B;b7BgT)y$mG>$@cSP;$gf^h1cm6|;VE(7)KmUIDKkGd1 z-~IS^KmHjf!~efZtds1Jl9EUw{`{~LoWk$gj@%tm(D7ArrjuhKxFTh43cp singlePathData, - tweenOptions ? tweenOptions : { type: 'none' } - ); + // Pass `tweenOptions` (possibly undefined) so `createMotion` takes its + // fast-path passthrough when no tween is configured — avoids allocating + // a MotionNone container + per-instance `$effect` that fires on every + // x1/y1/x2/y2 change. Critical for force-simulation graphs which can + // have hundreds of links updating on every tick. + const motionPath = createMotion('', () => singlePathData, tweenOptions); + + // Stable getter handed to `` instead of `motionPath.current`. + // Reading `motionPath.current` directly in the template would subscribe + // *this* component's template to per-tick updates, forcing the entire + // `` block to re-evaluate (and re-spread props) on every change. + // By passing a function reference, the per-tick `current` read happens + // inside ``'s own template — the parent stays stable. + const getPathData = () => motionPath.current; const arrayRows = $derived(isArrayMode ? data ?? ctx.data ?? [] : []); @@ -237,7 +245,6 @@ {markerStart} {markerMid} {markerEnd} - {...extractLayerProps(restProps, 'lc-link')} {...restProps} stroke={resolvedStroke} fill={resolvePerDatum(fillProp, d)} @@ -247,13 +254,12 @@ {/each} {:else} diff --git a/packages/layerchart/src/lib/components/Path/Path.canvas.svelte b/packages/layerchart/src/lib/components/Path/Path.canvas.svelte index d958a6e50..65454c1a0 100644 --- a/packages/layerchart/src/lib/components/Path/Path.canvas.svelte +++ b/packages/layerchart/src/lib/components/Path/Path.canvas.svelte @@ -9,9 +9,12 @@ import { createKey } from '$lib/utils/key.svelte.js'; import { PathState, type PathProps } from './Path.shared.svelte.js'; - let { ...rest }: PathProps = $props(); + let { pathData, ...rest }: PathProps = $props(); - const c = new PathState(() => rest as PathProps); + const c = new PathState( + () => pathData, + () => rest as PathProps + ); function render( ctx: CanvasRenderingContext2D, diff --git a/packages/layerchart/src/lib/components/Path/Path.shared.svelte.ts b/packages/layerchart/src/lib/components/Path/Path.shared.svelte.ts index 00fae0c29..a87b3f405 100644 --- a/packages/layerchart/src/lib/components/Path/Path.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Path/Path.shared.svelte.ts @@ -18,10 +18,15 @@ import type { draw as _drawTransition } from 'svelte/transition'; export type PathPropsWithoutHTML = { /** - * Pass `` explicitly instead of calculating - * from data / context + * The `d` attribute of the rendered ``. + * + * Accepts either a value (resolved at call site) or a function that + * returns the current value. Passing a function lets the parent avoid + * re-rendering its own template on every change to the path data — + * useful when a parent like `Link` / `Spline` / `Area` updates the + * path on every animation tick across hundreds of instances. */ - pathData?: string | undefined | null; + pathData?: string | undefined | null | (() => string | undefined | null); /** * Whether to animate the drawing of the path over time. @@ -69,11 +74,21 @@ export type PathPropsWithoutHTML = { export type PathProps = PathPropsWithoutHTML & Without, PathPropsWithoutHTML>; +/** Resolve `pathData` whether it was passed as a value or a getter function. */ +function resolvePathData(v: PathProps['pathData']): string | null | undefined { + return typeof v === 'function' ? v() : v; +} + /** * Reactive state shared by every per-layer Path variant. */ export class PathState { - #getProps: () => PathProps = () => ({}) as PathProps; + // Hot-path getter: reads only `pathData` (or invokes the function-getter form). + // Kept separate from the full-props getter so that the `` template + // updater does not subscribe to every Path prop on every read — critical for + // mark-heavy scenes (force-simulation graphs with hundreds of links updating + // per tick) where pre-fix each tween read re-evaluated all 15+ props. + #getPathData: () => string | null | undefined; // Contexts chartCtx: ChartState = getChartContext(); @@ -85,14 +100,25 @@ export class PathState { get tweenedPathData() { if (this.#tweenedState) return this.#tweenedState.current; - return this.#getProps().pathData; + return this.#getPathData(); } // Re-key trigger for draw transitions drawKey = $state(Symbol()); - constructor(getProps: () => PathProps) { - this.#getProps = getProps; + /** + * @param getPathData Hot-path getter — reads only `pathData`. Kept separate from + * `getProps` so the `` updater (and the canvas + * `tweenedPathData` consumer) does not subscribe to every + * Path prop on every tick. + * @param getProps Full-props getter — used for one-time / cold-path config + * (motion, draw). + */ + constructor( + getPathData: () => PathProps['pathData'], + getProps: () => PathProps = () => ({}) as PathProps + ) { + this.#getPathData = () => resolvePathData(getPathData()); const initial = getProps(); const extractedTween = extractTweenConfig(initial.motion); @@ -103,25 +129,22 @@ export class PathState { options: { interpolate: interpolatePath, ...extractedTween.options }, }; - const defaultPathData = initial.pathData + const initialResolved = resolvePathData(getPathData()); + const defaultPathData = initialResolved ? flattenPathData( - initial.pathData, + initialResolved, Math.min(this.chartCtx.yScale(0) ?? this.chartCtx.yRange[0], this.chartCtx.yRange[0]) ) : ''; - this.#tweenedState = createMotion( - defaultPathData, - () => getProps().pathData, - tweenedOptions - ); + this.#tweenedState = createMotion(defaultPathData, this.#getPathData, tweenedOptions); } // Re-trigger draw transition when path data changes $effect(() => { if (!getProps().draw) return; - // Touch dependency - void getProps().pathData; + // Touch dependency (resolves getter form too) + void this.#getPathData(); this.drawKey = Symbol(); }); } diff --git a/packages/layerchart/src/lib/components/Path/Path.svg.svelte b/packages/layerchart/src/lib/components/Path/Path.svg.svelte index 2f0cbb233..1cd062fa0 100644 --- a/packages/layerchart/src/lib/components/Path/Path.svg.svelte +++ b/packages/layerchart/src/lib/components/Path/Path.svg.svelte @@ -16,7 +16,7 @@ const uid = $props.id(); let { - pathRef: pathRefProp = $bindable(), + pathRef = $bindable(), marker, markerStart: markerStartProp, markerMid: markerMidProp, @@ -24,29 +24,35 @@ startContent, endContent, draw, + motion, + // Extracted out of `rest` so the `` element's `{...rest}` + // spread doesn't re-evaluate on every frame in mark-heavy scenes + // (force-simulation graphs with hundreds of links updating per tick). + // - `pathData`: changes every frame + // - `class`: parents typically pass `cls(...)` which produces a new + // string reference per parent render + // - styling props: explicit on the element below, no need to + // leak them through the spread + pathData: _pathData, + class: classProp, + fill: fillProp, + fillOpacity: fillOpacityProp, + stroke: strokeProp, + strokeOpacity: strokeOpacityProp, + strokeWidth: strokeWidthProp, + opacity: opacityProp, ...rest }: PathProps = $props(); + // Pass `pathData` as its own getter so the hot-path tween read only subscribes + // to `pathData` (which changes per tick on force sims) and not to every other + // Path prop. Pre-fix the per-tick `` updater re-read all 15+ props + // through `getProps()` on each force-sim tick × hundreds of paths. const c = new PathState( - () => - ({ - marker, - markerStart: markerStartProp, - markerMid: markerMidProp, - markerEnd: markerEndProp, - startContent, - endContent, - draw, - ...rest, - }) as PathProps + () => _pathData, + () => ({ draw, motion }) as PathProps ); - let pathRef = $state(); - - $effect.pre(() => { - pathRefProp = pathRef; - }); - const markerStart = $derived(markerStartProp ?? marker); const markerMid = $derived(markerMidProp ?? marker); const markerEnd = $derived(markerEndProp ?? marker); @@ -56,7 +62,6 @@ const markerEndId = $derived(markerEnd ? createId('marker-end', uid) : ''); const drawTransition = $derived(draw ? _drawTransition : () => ({})); - let startPoint = $state(); const endPointDuration = $derived.by(() => { @@ -70,60 +75,70 @@ return 800; }); - const endPoint = createControlledMotion( - undefined, - draw - ? { - type: 'tween', - duration: () => endPointDuration, - easing: typeof draw === 'object' && draw.easing ? draw.easing : cubicInOut, - interpolate() { - return (t: number) => { - const totalLength = pathRef?.getTotalLength() ?? 0; - const point = pathRef?.getPointAtLength(totalLength * t); - return point; - }; - }, - } - : { type: 'none' } - ); - - $effect(() => { - if (!startContent && !endContent) return; - // Track path data changes - void c.tweenedPathData; - if (!pathRef) return; - - tick().then(() => { + // Only allocate the controlled motion container when `draw` is configured; + // otherwise the per-Path `MotionNone` × hundreds of paths was a measurable + // mount-time cost in mark-heavy scenes. + const endPoint = draw + ? createControlledMotion(undefined, { + type: 'tween', + duration: () => endPointDuration, + easing: typeof draw === 'object' && draw.easing ? draw.easing : cubicInOut, + interpolate() { + return (t: number) => { + const totalLength = pathRef?.getTotalLength() ?? 0; + const point = pathRef?.getPointAtLength(totalLength * t); + return point; + }; + }, + }) + : null; + + // Only set up path-end tracking when startContent/endContent require it. + if (startContent || endContent) { + $effect(() => { + // Track path data changes + void c.tweenedPathData; if (!pathRef) return; - const totalLength = pathRef.getTotalLength(); - if (!totalLength) return; - startPoint = pathRef.getPointAtLength(0); - endPoint.target = pathRef.getPointAtLength(totalLength); + + tick().then(() => { + if (!pathRef) return; + const totalLength = pathRef.getTotalLength(); + if (!totalLength) return; + startPoint = pathRef.getPointAtLength(0); + if (endPoint) { + endPoint.target = pathRef.getPointAtLength(totalLength); + } + }); }); - }); + } {#key c.drawKey} - - - + {#if markerStart} + + {/if} + {#if markerMid} + + {/if} + {#if markerEnd} + + {/if} {#if startContent && startPoint} @@ -137,7 +152,7 @@ {/if} - {#if endContent && endPoint.current} + {#if endContent && endPoint?.current} {@render endContent({ point: endPoint.current, diff --git a/packages/layerchart/src/lib/components/Trail/Trail.base.svelte b/packages/layerchart/src/lib/components/Trail/Trail.base.svelte index db58b6b35..a000af1fd 100644 --- a/packages/layerchart/src/lib/components/Trail/Trail.base.svelte +++ b/packages/layerchart/src/lib/components/Trail/Trail.base.svelte @@ -122,12 +122,15 @@ return ''; } - const tweenState = createMotion(defaultPathData(), () => trailPath, { - type: 'tween', - interpolate: interpolatePath, - }); - - const isTweened = $derived(extractTweenConfig(motion) != null); + // Only allocate the tween container when the user opts into a tween via + // `motion`; otherwise the template reads `trailPath` directly. + const tweenState = + extractTweenConfig(motion) != null + ? createMotion(defaultPathData(), () => trailPath, { + type: 'tween', + interpolate: interpolatePath, + }) + : null; ctx.registerComponent({ name: 'Trail', @@ -137,7 +140,7 @@ {z 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 GM*I(bF`5zp literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/charts/__screenshots__/ArcChart.svelte.test.ts/ArcChart-uses-the-chart-value-accessor-for-explicit-per-series-tooltip-values-2.png b/packages/layerchart/src/lib/components/charts/__screenshots__/ArcChart.svelte.test.ts/ArcChart-uses-the-chart-value-accessor-for-explicit-per-series-tooltip-values-2.png new file mode 100644 index 0000000000000000000000000000000000000000..f0b57c0e45de1dcfe368122c89c101351b27aa27 GIT binary patch literal 6161 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 GM*I(bF`5zp literal 0 HcmV?d00001 diff --git a/packages/layerchart/src/lib/components/charts/__screenshots__/BarChart.svelte.test.ts/BarChart-legend-series-toggle-adjusts-group-scale-should-adjust-grouped-bar-widths-when-series-are-toggled-via-legend-1.png b/packages/layerchart/src/lib/components/charts/__screenshots__/BarChart.svelte.test.ts/BarChart-legend-series-toggle-adjusts-group-scale-should-adjust-grouped-bar-widths-when-series-are-toggled-via-legend-1.png index c32b4e82e0e1d502941deeae95f5522f8c801374..b4269dbc1e1ce6a8f1cdcbe1e21811d718784480 100644 GIT binary patch literal 10477 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 Ou(5QwRA%A*@ZSM^m!Mw& diff --git a/packages/layerchart/src/lib/components/charts/__screenshots__/PieChart.svelte.test.ts/PieChart-uses-hovered-slice-identity-for-implicit-tooltip-series-1.png b/packages/layerchart/src/lib/components/charts/__screenshots__/PieChart.svelte.test.ts/PieChart-uses-hovered-slice-identity-for-implicit-tooltip-series-1.png index c0597923d1e5f5f32b690d83357925700204521a..870f91099ddf31a8f15d27277a759f5c6d6483a9 100644 GIT binary patch literal 7653 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 BV`BgS literal 9231 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 U!oAar5h^Ofhb9kdbe-e=ACALl$N&HU diff --git a/packages/layerchart/src/lib/components/charts/__screenshots__/PieChart.svelte.test.ts/PieChart-uses-hovered-slice-identity-for-implicit-tooltip-series-2.png b/packages/layerchart/src/lib/components/charts/__screenshots__/PieChart.svelte.test.ts/PieChart-uses-hovered-slice-identity-for-implicit-tooltip-series-2.png index c0597923d1e5f5f32b690d83357925700204521a..870f91099ddf31a8f15d27277a759f5c6d6483a9 100644 GIT binary patch literal 7653 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 BV`BgS literal 9231 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 U!oAar5h^Ofhb9kdbe-e=ACALl$N&HU From df8602dbed02faf7a68466a20fd1142ee39c2918 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Thu, 30 Apr 2026 18:26:16 -0400 Subject: [PATCH 04/11] fix(Arc, RectClipPath, ChartClipPath): Restore on-mount tween animations --- .changeset/fix-tween-on-mount.md | 11 ++++ .../src/lib/components/Arc/Arc.base.svelte | 60 +++++++++++++++---- .../RectClipPath/RectClipPath.base.svelte | 26 +++++++- .../RectClipPath.shared.svelte.ts | 8 +++ 4 files changed, 93 insertions(+), 12 deletions(-) create mode 100644 .changeset/fix-tween-on-mount.md diff --git a/.changeset/fix-tween-on-mount.md b/.changeset/fix-tween-on-mount.md new file mode 100644 index 000000000..631e956d9 --- /dev/null +++ b/.changeset/fix-tween-on-mount.md @@ -0,0 +1,11 @@ +--- +'layerchart': patch +--- + +fix(Arc, RectClipPath, ChartClipPath): Restore on-mount tween animations + +Two related regressions introduced in the layer-component split (#848) prevented `motion` + `initial*` props from animating on mount. + +**`Arc`** — `motion`, `value`, `initialValue` and the rest of Arc's geometry props (`domain`, `range`, `startAngle`, `endAngle`, `innerRadius`, `outerRadius`, `cornerRadius`, `padAngle`, `track*`, `offset`) were not destructured in `Arc.base.svelte`, so they leaked through `{...restProps}` onto the inner ``. The forwarded `motion` made `Path` *also* tween the path-string on top of the end-angle tween that `ArcState` already drives, producing visibly wrong arcs (NaN coordinates, runaway radii). They are now extracted and passed explicitly to `ArcState`. + +**`RectClipPath` / `ChartClipPath`** — `motion`, `initialX`, `initialY`, `initialWidth`, `initialHeight` were declared on the type but never consumed: the path was a plain `$derived` of the static `x`/`y`/`width`/`height` props, so passing `` rendered the final width on mount with no animation. Each dimension now flows through its own `createMotion` (using the corresponding `initial*` value as the animation start), and the path is built from the animated values. diff --git a/packages/layerchart/src/lib/components/Arc/Arc.base.svelte b/packages/layerchart/src/lib/components/Arc/Arc.base.svelte index 8fd7d1d0b..adca12847 100644 --- a/packages/layerchart/src/lib/components/Arc/Arc.base.svelte +++ b/packages/layerchart/src/lib/components/Arc/Arc.base.svelte @@ -20,24 +20,66 @@ Path, ref: refProp = $bindable(), trackRef: trackRefProp = $bindable(), - fill, - fillOpacity, + // Override the `.lc-path` CSS stroke default so arcs don't get a visible outline stroke = 'none', - strokeWidth, - opacity, + // Arc-specific config — extracted out of `...restProps` so it doesn't + // leak onto ``. `motion` in particular would otherwise make Path + // also tween the path-string on top of the end-angle tween that + // `ArcState` already drives, producing visibly wrong arcs. + motion, + value, + initialValue, + domain, + range, + startAngle, + endAngle, + innerRadius, + outerRadius, + cornerRadius, + padAngle, + trackStartAngle, + trackEndAngle, + trackInnerRadius, + trackOuterRadius, + trackCornerRadius, + trackPadAngle, + offset, + // Pointer / tooltip wiring data, + tooltip, + track = false, onpointerenter = () => {}, onpointermove = () => {}, onpointerleave = () => {}, ontouchmove = () => {}, - tooltip, - track = false, children, class: className, ...restProps }: ArcBaseProps = $props(); - const c = new ArcState(() => ({ ...restProps, fill, fillOpacity, stroke, strokeWidth, opacity, data, tooltip, track }) as ArcProps); + const c = new ArcState( + () => + ({ + motion, + value, + initialValue, + domain, + range, + startAngle, + endAngle, + innerRadius, + outerRadius, + cornerRadius, + padAngle, + trackStartAngle, + trackEndAngle, + trackInnerRadius, + trackOuterRadius, + trackCornerRadius, + trackPadAngle, + offset, + }) as ArcProps + ); let ref = $state(); @@ -78,11 +120,7 @@ bind:pathRef={ref} pathData={c.arc()} transform="translate({c.xOffset}, {c.yOffset})" - {fill} - {fillOpacity} {stroke} - {strokeWidth} - {opacity} {...restProps} class={cls('lc-arc-line', className)} onpointerenter={onPointerEnter} diff --git a/packages/layerchart/src/lib/components/RectClipPath/RectClipPath.base.svelte b/packages/layerchart/src/lib/components/RectClipPath/RectClipPath.base.svelte index 91e6b39b2..93396a976 100644 --- a/packages/layerchart/src/lib/components/RectClipPath/RectClipPath.base.svelte +++ b/packages/layerchart/src/lib/components/RectClipPath/RectClipPath.base.svelte @@ -11,6 +11,7 @@ diff --git a/packages/layerchart/src/lib/components/RectClipPath/RectClipPath.shared.svelte.ts b/packages/layerchart/src/lib/components/RectClipPath/RectClipPath.shared.svelte.ts index 9c95db231..6f5763034 100644 --- a/packages/layerchart/src/lib/components/RectClipPath/RectClipPath.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/RectClipPath/RectClipPath.shared.svelte.ts @@ -9,12 +9,20 @@ export type BaseRectClipPathPropsWithoutHTML = { id?: string; /** The x position of the clipPath. @default 0 */ x?: number; + /** The initial x position (used as the animation start when `motion` is set). @default x */ + initialX?: number; /** The y position of the clipPath. @default 0 */ y?: number; + /** The initial y position (used as the animation start when `motion` is set). @default y */ + initialY?: number; /** The width of the clipPath. @required */ width: number; + /** The initial width (used as the animation start when `motion` is set). @default width */ + initialWidth?: number; /** The height of the clipPath. @required */ height: number; + /** The initial height (used as the animation start when `motion` is set). @default height */ + initialHeight?: number; /** Whether to disable clipping (show all). @default false */ disabled?: boolean; /** Invert the clip — content renders *outside* the rect. @default false */ From ad07aa9e1f9d9733e0c491feddd254b73966a080 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Thu, 30 Apr 2026 19:01:08 -0400 Subject: [PATCH 05/11] Force SVG for lattice example to verify delegation perf issue --- docs/src/examples/components/ForceSimulation/lattice.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/examples/components/ForceSimulation/lattice.svelte b/docs/src/examples/components/ForceSimulation/lattice.svelte index 0b5b1f386..70d185469 100644 --- a/docs/src/examples/components/ForceSimulation/lattice.svelte +++ b/docs/src/examples/components/ForceSimulation/lattice.svelte @@ -2,7 +2,7 @@ import { forceManyBody, forceLink } from 'd3-force'; import { curveLinear } from 'd3-shape'; - import { Chart, Circle, Link, Layer } from 'layerchart'; + import { Chart, Circle, Link, Layer } from 'layerchart/svg'; import { ForceSimulation } from 'layerchart/force'; // Generate lattice grid data From 9c0f7f6f6c26b74056068760a1087a4c93892e64 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Thu, 30 Apr 2026 19:07:50 -0400 Subject: [PATCH 06/11] Revert lattice svg force --- docs/src/examples/components/ForceSimulation/lattice.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/examples/components/ForceSimulation/lattice.svelte b/docs/src/examples/components/ForceSimulation/lattice.svelte index 70d185469..0b5b1f386 100644 --- a/docs/src/examples/components/ForceSimulation/lattice.svelte +++ b/docs/src/examples/components/ForceSimulation/lattice.svelte @@ -2,7 +2,7 @@ import { forceManyBody, forceLink } from 'd3-force'; import { curveLinear } from 'd3-shape'; - import { Chart, Circle, Link, Layer } from 'layerchart/svg'; + import { Chart, Circle, Link, Layer } from 'layerchart'; import { ForceSimulation } from 'layerchart/force'; // Generate lattice grid data From e7b23b3e4d692b7887eaaa0963509dbdaa47f0d2 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Thu, 30 Apr 2026 19:08:18 -0400 Subject: [PATCH 07/11] Improve bundle size warnings --- bundle-analyzer/generate-pr-comment.js | 55 +++++++++++++++++++++----- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/bundle-analyzer/generate-pr-comment.js b/bundle-analyzer/generate-pr-comment.js index 2de8c4a08..ccb112845 100644 --- a/bundle-analyzer/generate-pr-comment.js +++ b/bundle-analyzer/generate-pr-comment.js @@ -50,13 +50,30 @@ function formatPercent(percent) { return `${sign}${percent.toFixed(1)}%`; } -function getStatusIcon(status, sizeDiff) { +// Percent threshold above which a change is considered "large" (red/green). +// Smaller changes still count as significant (per the size/percent gates in +// analyzeChanges) but render as yellow to signal they're within tolerance. +const LARGE_CHANGE_THRESHOLD_PERCENT = 1; + +function getStatusIcon(status, sizeDiff, sizePercent) { if (status === "changed") { - return sizeDiff > 0 ? "\u{1F534}" : sizeDiff < 0 ? "\u{1F7E2}" : "\u27A1\uFE0F"; + if (sizeDiff === 0) return "\u27A1\uFE0F"; + if (Math.abs(sizePercent) < LARGE_CHANGE_THRESHOLD_PERCENT) { + return "\u{1F7E1}"; + } + return sizeDiff > 0 ? "\u{1F534}" : "\u{1F7E2}"; } return "\u27A1\uFE0F"; } +function isWarning(c) { + return ( + c.status === "changed" && + c.sizeDiff > 0 && + Math.abs(c.sizePercent) >= LARGE_CHANGE_THRESHOLD_PERCENT + ); +} + function analyzeChanges(prReport, targetReport) { /** @type {ScenarioDiff[]} */ const changes = []; @@ -207,6 +224,27 @@ function generateComment(changes, hasBaseline = true) { c.scenario.startsWith("component:") ); + // Warnings — significant size increases shown at the top, uncollapsed, so + // regressions are visible without expanding any sections. Items still appear + // in their normal group/components section below. + const warnings = changedItems.filter(isWarning); + if (warnings.length > 0) { + comment += `### ⚠️ Warnings (${warnings.length} significant size increase${warnings.length === 1 ? "" : "s"})\n\n`; + comment += "| Item | Current | New | Change |\n"; + comment += "|------|--------:|----:|-------:|\n"; + for (const w of warnings) { + const icon = getStatusIcon(w.status, w.sizeDiff, w.sizePercent); + const name = w.scenario.startsWith("component:") + ? w.scenario.replace("component:", "") + : w.scenario; + const current = `${formatKB(w.targetSize)} KB
${formatKB(w.targetGzipSize)} gz`; + const newSize = `${formatKB(w.currentSize)} KB
${formatKB(w.currentGzipSize)} gz`; + const change = `${formatDiff(w.sizeDiff)} KB (${formatPercent(w.sizePercent)})
${formatDiff(w.gzipSizeDiff)} gz (${formatPercent(w.gzipSizePercent)})`; + comment += `| ${icon} \`${name}\` | ${current} | ${newSize} | ${change} |\n`; + } + comment += "\n"; + } + if (changedScenarios.length > 0) { comment += "### Use-Case Scenarios\n\n"; @@ -221,20 +259,17 @@ function generateComment(changes, hasBaseline = true) { } const renderRow = (s) => { - const icon = getStatusIcon(s.status, s.sizeDiff); + const icon = getStatusIcon(s.status, s.sizeDiff, s.sizePercent); const current = `${formatKB(s.targetSize)} KB
${formatKB(s.targetGzipSize)} gz`; const newSize = `${formatKB(s.currentSize)} KB
${formatKB(s.currentGzipSize)} gz`; const change = `${formatDiff(s.sizeDiff)} KB (${formatPercent(s.sizePercent)})
${formatDiff(s.gzipSizeDiff)} gz (${formatPercent(s.gzipSizePercent)})`; return `| ${icon} \`${s.scenario}\` | ${current} | ${newSize} | ${change} |\n`; }; - // Base + Core groups expanded by default; other groups collapsed to keep - // the comment scannable. Each group shows the count of changed scenarios. - const expandedGroups = new Set(["Base (agnostic)", "Base (layer-specific)", "Core"]); - + // All groups collapsed by default — Warnings section above surfaces any + // notable regressions, so the detail tables don't need to be open. for (const [groupName, rows] of byGroup) { - const open = expandedGroups.has(groupName) ? " open" : ""; - comment += `\n`; + comment += `
\n`; comment += `${groupName} (${rows.length} changed)\n\n`; comment += "| Scenario | Current | New | Change |\n"; comment += "|----------|--------:|----:|-------:|\n"; @@ -251,7 +286,7 @@ function generateComment(changes, hasBaseline = true) { for (const c of changedComponents) { const name = c.scenario.replace("component:", ""); - const icon = getStatusIcon(c.status, c.sizeDiff); + const icon = getStatusIcon(c.status, c.sizeDiff, c.sizePercent); const current = `${formatKB(c.targetSize)} KB`; const newSize = `${formatKB(c.currentSize)} KB`; const change = `${formatDiff(c.sizeDiff)} KB (${formatPercent(c.sizePercent)})`; From 789b49bc16bd8e4ac5ecc37570097b9005b56792 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Thu, 30 Apr 2026 19:55:02 -0400 Subject: [PATCH 08/11] sort bundle scenarios by size desc --- bundle-analyzer/bundle-scenarios.ts | 14 ++++++++++---- bundle-analyzer/generate-pr-comment.js | 19 ++++++++++++++++--- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/bundle-analyzer/bundle-scenarios.ts b/bundle-analyzer/bundle-scenarios.ts index 43e032454..da93cfcd8 100644 --- a/bundle-analyzer/bundle-scenarios.ts +++ b/bundle-analyzer/bundle-scenarios.ts @@ -1749,28 +1749,30 @@ const INDIVIDUAL_COMPONENTS: string[] = [ 'AnnotationPoint', 'AnnotationRange', 'Arc', + 'ArcChart', 'ArcLabel', 'Area', + 'AreaChart', 'Axis', 'Bar', + 'BarChart', 'Bars', 'Blur', - 'BoxPlot', 'Bounds', + 'BoxPlot', 'BrushContext', 'Calendar', 'Canvas', 'Cell', 'Chart', + 'ChartClipPath', 'ChartCore', 'Chord', - 'ChartClipPath', 'Circle', 'CircleClipPath', 'CircleLegend', 'ClipPath', 'ColorRamp', - 'Connector', 'Contour', 'Dagre', 'Density', @@ -1778,6 +1780,7 @@ const INDIVIDUAL_COMPONENTS: string[] = [ 'ForceSimulation', 'Frame', 'GeoCircle', + 'GeoClipPath', 'GeoEdgeFade', 'GeoLegend', 'GeoPath', @@ -1799,6 +1802,7 @@ const INDIVIDUAL_COMPONENTS: string[] = [ 'Legend', 'Line', 'LinearGradient', + 'LineChart', 'Link', 'Month', 'MotionPath', @@ -1807,6 +1811,7 @@ const INDIVIDUAL_COMPONENTS: string[] = [ 'Path', 'Pattern', 'Pie', + 'PieChart', 'Point', 'Points', 'Polygon', @@ -1817,14 +1822,15 @@ const INDIVIDUAL_COMPONENTS: string[] = [ 'Ribbon', 'Rule', 'Sankey', + 'ScatterChart', 'Spline', 'Svg', 'Text', 'Threshold', 'TileImage', 'Tooltip', - 'TransformContext', 'Trail', + 'TransformContext', 'Tree', 'Treemap', 'Vector', diff --git a/bundle-analyzer/generate-pr-comment.js b/bundle-analyzer/generate-pr-comment.js index ccb112845..0f996498c 100644 --- a/bundle-analyzer/generate-pr-comment.js +++ b/bundle-analyzer/generate-pr-comment.js @@ -179,6 +179,9 @@ function generateComment(changes, hasBaseline = true) { if (!byGroup.has(g)) byGroup.set(g, []); byGroup.get(g).push(s); } + for (const rows of byGroup.values()) { + rows.sort((a, b) => b.currentSize - a.currentSize); + } const expandedGroups = new Set(["Base (agnostic)", "Base (layer-specific)", "Core"]); @@ -196,10 +199,13 @@ function generateComment(changes, hasBaseline = true) { } if (components.length > 0) { + const sortedComponents = [...components].sort( + (a, b) => b.currentSize - a.currentSize + ); comment += "
\nIndividual Components\n\n"; comment += "| Component | Size | Gzipped |\n"; comment += "|-----------|-----:|--------:|\n"; - for (const c of components) { + for (const c of sortedComponents) { const name = c.scenario.replace("component:", ""); comment += `| \`${name}\` | ${formatKB(c.currentSize)} KB | ${formatKB(c.currentGzipSize)} KB |\n`; } @@ -227,7 +233,9 @@ function generateComment(changes, hasBaseline = true) { // Warnings — significant size increases shown at the top, uncollapsed, so // regressions are visible without expanding any sections. Items still appear // in their normal group/components section below. - const warnings = changedItems.filter(isWarning); + const warnings = changedItems + .filter(isWarning) + .sort((a, b) => b.currentSize - a.currentSize); if (warnings.length > 0) { comment += `### ⚠️ Warnings (${warnings.length} significant size increase${warnings.length === 1 ? "" : "s"})\n\n`; comment += "| Item | Current | New | Change |\n"; @@ -249,7 +257,8 @@ function generateComment(changes, hasBaseline = true) { comment += "### Use-Case Scenarios\n\n"; // Group rows by `group` field, preserving insertion order. Scenarios - // without a `group` end up under "Other". + // without a `group` end up under "Other". Rows within each group are + // sorted by current size desc. /** @type {Map} */ const byGroup = new Map(); for (const s of changedScenarios) { @@ -257,6 +266,9 @@ function generateComment(changes, hasBaseline = true) { if (!byGroup.has(g)) byGroup.set(g, []); byGroup.get(g).push(s); } + for (const rows of byGroup.values()) { + rows.sort((a, b) => b.currentSize - a.currentSize); + } const renderRow = (s) => { const icon = getStatusIcon(s.status, s.sizeDiff, s.sizePercent); @@ -279,6 +291,7 @@ function generateComment(changes, hasBaseline = true) { } if (changedComponents.length > 0) { + changedComponents.sort((a, b) => b.currentSize - a.currentSize); comment += "
\nIndividual Components"; comment += ` (${changedComponents.length} changed)\n\n`; comment += "| Component | Current | New | Change |\n"; From 23068d73bd6b7506260f226414b7a6d008ba53d3 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Thu, 30 Apr 2026 20:14:46 -0400 Subject: [PATCH 09/11] sort warnings by change desc --- bundle-analyzer/generate-pr-comment.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundle-analyzer/generate-pr-comment.js b/bundle-analyzer/generate-pr-comment.js index 0f996498c..e48bf9794 100644 --- a/bundle-analyzer/generate-pr-comment.js +++ b/bundle-analyzer/generate-pr-comment.js @@ -235,7 +235,7 @@ function generateComment(changes, hasBaseline = true) { // in their normal group/components section below. const warnings = changedItems .filter(isWarning) - .sort((a, b) => b.currentSize - a.currentSize); + .sort((a, b) => b.sizeDiff - a.sizeDiff); if (warnings.length > 0) { comment += `### ⚠️ Warnings (${warnings.length} significant size increase${warnings.length === 1 ? "" : "s"})\n\n`; comment += "| Item | Current | New | Change |\n"; From 2abe20a3c36a8080f6f0fb55c2fe57ec72e3e12d Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Thu, 30 Apr 2026 20:46:04 -0400 Subject: [PATCH 10/11] Revert "perf: Skip motion container allocation when `motion` prop is `undefined`" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts b45f47aea. Empirical measurements on the lattice (n=20, 760 links) and tree force-simulation examples showed the call-site gating produced no measurable FPS difference vs. an unmodified `createMotion` — the fast path at `motion.svelte.ts:197-213` (passthrough returned when `motionProp === undefined`) already covers the no-motion case. | Example | Phase | Before | After (revert) | |----------|-------------|-----------|---------------:| | Lattice | steady sim | 6.46-6.53 | 6.52-6.58 | | Tree | active sim | 16.88-17.28 | 17.46-17.51 | The 728-line, 13-file diff added per-call-site gates and null-check fallbacks for an optimization that was already happening one layer down. Reverting restores the simpler unconditional construction. The Path.shared.svelte.ts merge keeps ee6b33233's `#getPathData` hot-path getter (which is independent of the motion-alloc question) and switches the initial-pathData resolution to `resolvePathData()` to handle the polymorphic `string | () => string` form added by that commit. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../skip-motion-alloc-when-undefined.md | 7 -- .../lib/components/Arc/Arc.shared.svelte.ts | 19 ++-- .../lib/components/Area/Area.shared.svelte.ts | 27 ++--- .../components/Circle/Circle.shared.svelte.ts | 68 +++++------- .../Ellipse/Ellipse.shared.svelte.ts | 80 ++++++-------- .../components/Group/Group.shared.svelte.ts | 23 ++-- .../components/Image/Image.shared.svelte.ts | 100 ++++++++---------- .../lib/components/Line/Line.shared.svelte.ts | 81 ++++++-------- .../lib/components/Path/Path.shared.svelte.ts | 50 +++++---- .../lib/components/Pie/Pie.shared.svelte.ts | 11 +- .../Polygon/Polygon.shared.svelte.ts | 86 +++++++-------- .../lib/components/Rect/Rect.shared.svelte.ts | 77 ++++++-------- .../components/Spline/Spline.shared.svelte.ts | 17 ++- .../lib/components/Text/Text.shared.svelte.ts | 83 +++++++-------- 14 files changed, 308 insertions(+), 421 deletions(-) delete mode 100644 .changeset/skip-motion-alloc-when-undefined.md diff --git a/.changeset/skip-motion-alloc-when-undefined.md b/.changeset/skip-motion-alloc-when-undefined.md deleted file mode 100644 index 483819087..000000000 --- a/.changeset/skip-motion-alloc-when-undefined.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'layerchart': patch ---- - -perf: Skip motion container allocation when `motion` prop is `undefined` - -Primitive state classes (`Circle`, `Group`, `Path`, `Rect`, `Line`, `Ellipse`, `Image`, `Text`, `Polygon`, `Arc`, `Pie`, `Area`, `Spline`) previously allocated 1–4 `createMotion` passthrough containers per instance even when no `motion` prop was provided. Containers are now lazily allocated only when the user opts in; otherwise the `motion*` getters read directly from props. Saves per-instance allocations and one layer of getter indirection on every render — most visible in mark-heavy scenes (e.g. force simulations with 100+ nodes/links rendering `Circle` and `Link` → `Path` → `Group`). diff --git a/packages/layerchart/src/lib/components/Arc/Arc.shared.svelte.ts b/packages/layerchart/src/lib/components/Arc/Arc.shared.svelte.ts index 56d88ecc4..5d64fdeb6 100644 --- a/packages/layerchart/src/lib/components/Arc/Arc.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Arc/Arc.shared.svelte.ts @@ -108,25 +108,20 @@ export class ArcState { trackRef = $state(); - // Only allocated when the user opts into animation via the `motion` prop; - // otherwise the getter reads `value` directly from props. - #motionEndAngle: ReturnType> | null = null; + #motionEndAngle!: ReturnType>; constructor(getProps: () => ArcProps) { this.#getProps = getProps; const initial = getProps(); - if (initial.motion !== undefined) { - this.#motionEndAngle = createMotion( - initial.initialValue ?? 0, - () => getProps().value ?? 0, - initial.motion - ); - } + this.#motionEndAngle = createMotion( + initial.initialValue ?? 0, + () => getProps().value ?? 0, + initial.motion + ); } get motionEndAngleValue() { - if (this.#motionEndAngle) return this.#motionEndAngle.current; - return this.#getProps().value ?? 0; + return this.#motionEndAngle.current; } range = $derived(this.#getProps().range ?? ([0, 360] as [number, number])); diff --git a/packages/layerchart/src/lib/components/Area/Area.shared.svelte.ts b/packages/layerchart/src/lib/components/Area/Area.shared.svelte.ts index e2ec203ff..66d352069 100644 --- a/packages/layerchart/src/lib/components/Area/Area.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Area/Area.shared.svelte.ts @@ -56,9 +56,7 @@ export class AreaState { #getProps: () => AreaProps = () => ({}) as AreaProps; ctx: ChartState = getChartContext(); - // Only allocated when the user opts into a tween via the `motion` prop; - // otherwise the getter reads `d` directly. - #tweenState: ReturnType> | null = null; + #tweenState!: ReturnType>; constructor(getProps: () => AreaProps) { this.#getProps = getProps; @@ -80,18 +78,14 @@ export class AreaState { }); const extractedTween = extractTweenConfig(initial.motion); - if (extractedTween) { - const tweenOptions: ResolvedMotion = { - type: extractedTween.type, - options: { interpolate: interpolatePath, ...extractedTween.options }, - }; - - this.#tweenState = createMotion( - this.#defaultPathData(tweenOptions), - () => this.d, - tweenOptions - ); - } + const tweenOptions: ResolvedMotion | undefined = extractedTween + ? { + type: extractedTween.type, + options: { interpolate: interpolatePath, ...extractedTween.options }, + } + : undefined; + + this.#tweenState = createMotion(this.#defaultPathData(tweenOptions), () => this.d, tweenOptions); } series = $derived( @@ -191,8 +185,7 @@ export class AreaState { }); get tweenedPath() { - if (this.#tweenState) return this.#tweenState.current; - return this.d; + return this.#tweenState.current; } lineYAccessor = $derived.by(() => { diff --git a/packages/layerchart/src/lib/components/Circle/Circle.shared.svelte.ts b/packages/layerchart/src/lib/components/Circle/Circle.shared.svelte.ts index 6cc0290d0..4b1bf9029 100644 --- a/packages/layerchart/src/lib/components/Circle/Circle.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Circle/Circle.shared.svelte.ts @@ -186,12 +186,11 @@ export class CircleState { }); }); - // Pixel-mode motion sources. Only allocated when the user opts into - // animation via the `motion` prop; otherwise the getters read directly - // from props. - #motionCx: ReturnType> | null = null; - #motionCy: ReturnType> | null = null; - #motionR: ReturnType> | null = null; + // Pixel-mode motion sources. Initial values are captured at construction; + // subsequent updates come from the prop getters. + #motionCx!: ReturnType>; + #motionCy!: ReturnType>; + #motionR!: ReturnType>; // Static (non-data-driven) values used by SVG/HTML branches in pixel mode. staticFill = $derived( @@ -223,31 +222,28 @@ export class CircleState { this.#getProps = getProps; const initial = getProps(); + const initialCx = + initial.initialCx ?? (typeof initial.cx === 'number' ? initial.cx : 0); + const initialCy = + initial.initialCy ?? (typeof initial.cy === 'number' ? initial.cy : 0); + const initialR = + initial.initialR ?? (typeof initial.r === 'number' ? initial.r : 1); - if (initial.motion !== undefined) { - const initialCx = - initial.initialCx ?? (typeof initial.cx === 'number' ? initial.cx : 0); - const initialCy = - initial.initialCy ?? (typeof initial.cy === 'number' ? initial.cy : 0); - const initialR = - initial.initialR ?? (typeof initial.r === 'number' ? initial.r : 1); - - this.#motionCx = createMotion( - initialCx, - () => (typeof getProps().cx === 'number' ? (getProps().cx as number) : 0), - initial.motion - ); - this.#motionCy = createMotion( - initialCy, - () => (typeof getProps().cy === 'number' ? (getProps().cy as number) : 0), - initial.motion - ); - this.#motionR = createMotion( - initialR, - () => (typeof getProps().r === 'number' ? (getProps().r as number) : 1), - initial.motion - ); - } + this.#motionCx = createMotion( + initialCx, + () => (typeof getProps().cx === 'number' ? (getProps().cx as number) : 0), + initial.motion + ); + this.#motionCy = createMotion( + initialCy, + () => (typeof getProps().cy === 'number' ? (getProps().cy as number) : 0), + initial.motion + ); + this.#motionR = createMotion( + initialR, + () => (typeof getProps().r === 'number' ? (getProps().r as number) : 1), + initial.motion + ); this.#dataMotionMap = createDataMotionMap(initial.motion); if (this.#dataMotionMap) { @@ -270,19 +266,13 @@ export class CircleState { } get motionCx() { - if (this.#motionCx) return this.#motionCx.current; - const cx = this.#getProps().cx; - return typeof cx === 'number' ? cx : 0; + return this.#motionCx.current; } get motionCy() { - if (this.#motionCy) return this.#motionCy.current; - const cy = this.#getProps().cy; - return typeof cy === 'number' ? cy : 0; + return this.#motionCy.current; } get motionR() { - if (this.#motionR) return this.#motionR.current; - const r = this.#getProps().r; - return typeof r === 'number' ? r : 1; + return this.#motionR.current; } } diff --git a/packages/layerchart/src/lib/components/Ellipse/Ellipse.shared.svelte.ts b/packages/layerchart/src/lib/components/Ellipse/Ellipse.shared.svelte.ts index 8635fae72..ed394dde6 100644 --- a/packages/layerchart/src/lib/components/Ellipse/Ellipse.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Ellipse/Ellipse.shared.svelte.ts @@ -119,34 +119,23 @@ export class EllipseState { }; } - // Pixel-mode motion sources. Only allocated when the user opts into - // animation via the `motion` prop; otherwise the getters read directly - // from props. #dataMotionMap: ReturnType = null; - #motionCx: ReturnType> | null = null; - #motionCy: ReturnType> | null = null; - #motionRx: ReturnType> | null = null; - #motionRy: ReturnType> | null = null; + #motionCx!: ReturnType>; + #motionCy!: ReturnType>; + #motionRx!: ReturnType>; + #motionRy!: ReturnType>; get motionCx() { - if (this.#motionCx) return this.#motionCx.current; - const cx = this.#getProps().cx; - return typeof cx === 'number' ? cx : 0; + return this.#motionCx.current; } get motionCy() { - if (this.#motionCy) return this.#motionCy.current; - const cy = this.#getProps().cy; - return typeof cy === 'number' ? cy : 0; + return this.#motionCy.current; } get motionRx() { - if (this.#motionRx) return this.#motionRx.current; - const rx = this.#getProps().rx; - return typeof rx === 'number' ? rx : 1; + return this.#motionRx.current; } get motionRy() { - if (this.#motionRy) return this.#motionRy.current; - const ry = this.#getProps().ry; - return typeof ry === 'number' ? ry : 1; + return this.#motionRy.current; } staticFill = $derived( @@ -184,34 +173,31 @@ export class EllipseState { this.#getProps = getProps; const initial = getProps(); - - if (initial.motion !== undefined) { - const initialCx = initial.initialCx ?? (typeof initial.cx === 'number' ? initial.cx : 0); - const initialCy = initial.initialCy ?? (typeof initial.cy === 'number' ? initial.cy : 0); - const initialRx = initial.initialRx ?? (typeof initial.rx === 'number' ? initial.rx : 1); - const initialRy = initial.initialRy ?? (typeof initial.ry === 'number' ? initial.ry : 1); - - this.#motionCx = createMotion( - initialCx, - () => (typeof getProps().cx === 'number' ? (getProps().cx as number) : 0), - initial.motion - ); - this.#motionCy = createMotion( - initialCy, - () => (typeof getProps().cy === 'number' ? (getProps().cy as number) : 0), - initial.motion - ); - this.#motionRx = createMotion( - initialRx, - () => (typeof getProps().rx === 'number' ? (getProps().rx as number) : 1), - initial.motion - ); - this.#motionRy = createMotion( - initialRy, - () => (typeof getProps().ry === 'number' ? (getProps().ry as number) : 1), - initial.motion - ); - } + const initialCx = initial.initialCx ?? (typeof initial.cx === 'number' ? initial.cx : 0); + const initialCy = initial.initialCy ?? (typeof initial.cy === 'number' ? initial.cy : 0); + const initialRx = initial.initialRx ?? (typeof initial.rx === 'number' ? initial.rx : 1); + const initialRy = initial.initialRy ?? (typeof initial.ry === 'number' ? initial.ry : 1); + + this.#motionCx = createMotion( + initialCx, + () => (typeof getProps().cx === 'number' ? (getProps().cx as number) : 0), + initial.motion + ); + this.#motionCy = createMotion( + initialCy, + () => (typeof getProps().cy === 'number' ? (getProps().cy as number) : 0), + initial.motion + ); + this.#motionRx = createMotion( + initialRx, + () => (typeof getProps().rx === 'number' ? (getProps().rx as number) : 1), + initial.motion + ); + this.#motionRy = createMotion( + initialRy, + () => (typeof getProps().ry === 'number' ? (getProps().ry as number) : 1), + initial.motion + ); this.#dataMotionMap = createDataMotionMap(initial.motion); if (this.#dataMotionMap) { diff --git a/packages/layerchart/src/lib/components/Group/Group.shared.svelte.ts b/packages/layerchart/src/lib/components/Group/Group.shared.svelte.ts index 6b02192f2..9a5143e4b 100644 --- a/packages/layerchart/src/lib/components/Group/Group.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Group/Group.shared.svelte.ts @@ -160,18 +160,14 @@ export class GroupState { }); #dataMotionMap: ReturnType = null; - // Pixel-mode motion sources. Only allocated when the user opts into - // animation via the `motion` prop; otherwise the getters return `trueX`/`trueY`. - #motionX: ReturnType> | null = null; - #motionY: ReturnType> | null = null; + #motionX!: ReturnType>; + #motionY!: ReturnType>; get motionX() { - if (this.#motionX) return this.#motionX.current; - return this.trueX; + return this.#motionX.current; } get motionY() { - if (this.#motionY) return this.#motionY.current; - return this.trueY; + return this.#motionY.current; } // Transform string for SVG/HTML pixel mode @@ -193,14 +189,11 @@ export class GroupState { this.#getProps = getProps; const initial = getProps(); + const initialX = initial.initialX ?? (typeof initial.x === 'number' ? initial.x : undefined); + const initialY = initial.initialY ?? (typeof initial.y === 'number' ? initial.y : undefined); - if (initial.motion !== undefined) { - const initialX = initial.initialX ?? (typeof initial.x === 'number' ? initial.x : undefined); - const initialY = initial.initialY ?? (typeof initial.y === 'number' ? initial.y : undefined); - - this.#motionX = createMotion(initialX, () => this.trueX, initial.motion); - this.#motionY = createMotion(initialY, () => this.trueY, initial.motion); - } + this.#motionX = createMotion(initialX, () => this.trueX, initial.motion); + this.#motionY = createMotion(initialY, () => this.trueY, initial.motion); this.#dataMotionMap = createDataMotionMap(initial.motion); if (this.#dataMotionMap) { diff --git a/packages/layerchart/src/lib/components/Image/Image.shared.svelte.ts b/packages/layerchart/src/lib/components/Image/Image.shared.svelte.ts index 89f0ba12b..49cb3784c 100644 --- a/packages/layerchart/src/lib/components/Image/Image.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Image/Image.shared.svelte.ts @@ -174,79 +174,67 @@ export class ImageState { typeof this.#getProps().rotate === 'number' ? (this.#getProps().rotate as number) : undefined ); - // Pixel-mode motion sources. Only allocated when the user opts into - // animation via the `motion` prop; otherwise the getters read directly - // from props. #dataMotionMap: ReturnType = null; - #motionX: ReturnType> | null = null; - #motionY: ReturnType> | null = null; - #motionWidth: ReturnType> | null = null; - #motionHeight: ReturnType> | null = null; + #motionX!: ReturnType>; + #motionY!: ReturnType>; + #motionWidth!: ReturnType>; + #motionHeight!: ReturnType>; get motionX() { - if (this.#motionX) return this.#motionX.current; - const x = this.#getProps().x; - return typeof x === 'number' ? x : 0; + return this.#motionX.current; } get motionY() { - if (this.#motionY) return this.#motionY.current; - const y = this.#getProps().y; - return typeof y === 'number' ? y : 0; + return this.#motionY.current; } get motionWidth() { - if (this.#motionWidth) return this.#motionWidth.current; - return this.resolvedPixelWidth; + return this.#motionWidth.current; } get motionHeight() { - if (this.#motionHeight) return this.#motionHeight.current; - return this.resolvedPixelHeight; + return this.#motionHeight.current; } constructor(getProps: () => ImageProps) { this.#getProps = getProps; const initial = getProps(); + const initialX = initial.initialX ?? (typeof initial.x === 'number' ? initial.x : 0); + const initialY = initial.initialY ?? (typeof initial.y === 'number' ? initial.y : 0); + const initialWidth = + initial.initialWidth ?? + (typeof initial.width === 'number' + ? initial.width + : typeof initial.r === 'number' + ? initial.r * 2 + : 16); + const initialHeight = + initial.initialHeight ?? + (typeof initial.height === 'number' + ? initial.height + : typeof initial.r === 'number' + ? initial.r * 2 + : 16); const motion = initial.motion; - if (motion !== undefined) { - const initialX = initial.initialX ?? (typeof initial.x === 'number' ? initial.x : 0); - const initialY = initial.initialY ?? (typeof initial.y === 'number' ? initial.y : 0); - const initialWidth = - initial.initialWidth ?? - (typeof initial.width === 'number' - ? initial.width - : typeof initial.r === 'number' - ? initial.r * 2 - : 16); - const initialHeight = - initial.initialHeight ?? - (typeof initial.height === 'number' - ? initial.height - : typeof initial.r === 'number' - ? initial.r * 2 - : 16); - - this.#motionX = createMotion( - initialX, - () => (typeof getProps().x === 'number' ? (getProps().x as number) : 0), - parseMotionProp(motion, 'x') - ); - this.#motionY = createMotion( - initialY, - () => (typeof getProps().y === 'number' ? (getProps().y as number) : 0), - parseMotionProp(motion, 'y') - ); - this.#motionWidth = createMotion( - initialWidth, - () => this.resolvedPixelWidth, - parseMotionProp(motion, 'width') - ); - this.#motionHeight = createMotion( - initialHeight, - () => this.resolvedPixelHeight, - parseMotionProp(motion, 'height') - ); - } + this.#motionX = createMotion( + initialX, + () => (typeof getProps().x === 'number' ? (getProps().x as number) : 0), + motion === undefined ? undefined : parseMotionProp(motion, 'x') + ); + this.#motionY = createMotion( + initialY, + () => (typeof getProps().y === 'number' ? (getProps().y as number) : 0), + motion === undefined ? undefined : parseMotionProp(motion, 'y') + ); + this.#motionWidth = createMotion( + initialWidth, + () => this.resolvedPixelWidth, + motion === undefined ? undefined : parseMotionProp(motion, 'width') + ); + this.#motionHeight = createMotion( + initialHeight, + () => this.resolvedPixelHeight, + motion === undefined ? undefined : parseMotionProp(motion, 'height') + ); this.#dataMotionMap = createDataMotionMap(motion as MotionOptions | undefined); if (this.#dataMotionMap) { diff --git a/packages/layerchart/src/lib/components/Line/Line.shared.svelte.ts b/packages/layerchart/src/lib/components/Line/Line.shared.svelte.ts index 7fd340a61..cf1b6d9c5 100644 --- a/packages/layerchart/src/lib/components/Line/Line.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Line/Line.shared.svelte.ts @@ -200,34 +200,24 @@ export class LineState { dashArrayResolved = $derived(parseDashArray(this.#getProps().dashArray)); dashArrayAttr = $derived(this.dashArrayResolved ? this.dashArrayResolved.join(' ') : undefined); - // Pixel-mode motion sources. Only allocated when the user opts into - // animation via the `motion` prop; otherwise the getters read directly - // from props. + // Pixel-mode motion sources #dataMotionMap: ReturnType = null; - #motionX1: ReturnType> | null = null; - #motionY1: ReturnType> | null = null; - #motionX2: ReturnType> | null = null; - #motionY2: ReturnType> | null = null; + #motionX1!: ReturnType>; + #motionY1!: ReturnType>; + #motionX2!: ReturnType>; + #motionY2!: ReturnType>; get motionX1() { - if (this.#motionX1) return this.#motionX1.current; - const x1 = this.#getProps().x1; - return typeof x1 === 'number' ? x1 : 0; + return this.#motionX1.current; } get motionY1() { - if (this.#motionY1) return this.#motionY1.current; - const y1 = this.#getProps().y1; - return typeof y1 === 'number' ? y1 : 0; + return this.#motionY1.current; } get motionX2() { - if (this.#motionX2) return this.#motionX2.current; - const x2 = this.#getProps().x2; - return typeof x2 === 'number' ? x2 : 0; + return this.#motionX2.current; } get motionY2() { - if (this.#motionY2) return this.#motionY2.current; - const y2 = this.#getProps().y2; - return typeof y2 === 'number' ? y2 : 0; + return this.#motionY2.current; } // Static (non-data-driven) values for SVG/HTML pixel mode @@ -266,34 +256,31 @@ export class LineState { this.#getProps = getProps; const initial = getProps(); - - if (initial.motion !== undefined) { - const initialX1 = initial.initialX1 ?? (typeof initial.x1 === 'number' ? initial.x1 : 0); - const initialY1 = initial.initialY1 ?? (typeof initial.y1 === 'number' ? initial.y1 : 0); - const initialX2 = initial.initialX2 ?? (typeof initial.x2 === 'number' ? initial.x2 : 0); - const initialY2 = initial.initialY2 ?? (typeof initial.y2 === 'number' ? initial.y2 : 0); - - this.#motionX1 = createMotion( - initialX1, - () => (typeof getProps().x1 === 'number' ? (getProps().x1 as number) : 0), - initial.motion - ); - this.#motionY1 = createMotion( - initialY1, - () => (typeof getProps().y1 === 'number' ? (getProps().y1 as number) : 0), - initial.motion - ); - this.#motionX2 = createMotion( - initialX2, - () => (typeof getProps().x2 === 'number' ? (getProps().x2 as number) : 0), - initial.motion - ); - this.#motionY2 = createMotion( - initialY2, - () => (typeof getProps().y2 === 'number' ? (getProps().y2 as number) : 0), - initial.motion - ); - } + const initialX1 = initial.initialX1 ?? (typeof initial.x1 === 'number' ? initial.x1 : 0); + const initialY1 = initial.initialY1 ?? (typeof initial.y1 === 'number' ? initial.y1 : 0); + const initialX2 = initial.initialX2 ?? (typeof initial.x2 === 'number' ? initial.x2 : 0); + const initialY2 = initial.initialY2 ?? (typeof initial.y2 === 'number' ? initial.y2 : 0); + + this.#motionX1 = createMotion( + initialX1, + () => (typeof getProps().x1 === 'number' ? (getProps().x1 as number) : 0), + initial.motion + ); + this.#motionY1 = createMotion( + initialY1, + () => (typeof getProps().y1 === 'number' ? (getProps().y1 as number) : 0), + initial.motion + ); + this.#motionX2 = createMotion( + initialX2, + () => (typeof getProps().x2 === 'number' ? (getProps().x2 as number) : 0), + initial.motion + ); + this.#motionY2 = createMotion( + initialY2, + () => (typeof getProps().y2 === 'number' ? (getProps().y2 as number) : 0), + initial.motion + ); this.#dataMotionMap = createDataMotionMap(initial.motion); if (this.#dataMotionMap) { diff --git a/packages/layerchart/src/lib/components/Path/Path.shared.svelte.ts b/packages/layerchart/src/lib/components/Path/Path.shared.svelte.ts index a87b3f405..c47d85626 100644 --- a/packages/layerchart/src/lib/components/Path/Path.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Path/Path.shared.svelte.ts @@ -93,14 +93,11 @@ export class PathState { // Contexts chartCtx: ChartState = getChartContext(); - // Path data tween source — the actual `d` attribute / canvas render input. - // Only allocated when the user opts into a tween via the `motion` prop; - // otherwise the getter reads `pathData` directly. - #tweenedState: ReturnType> | null = null; + // Path data tween source — the actual `d` attribute / canvas render input + #tweenedState!: ReturnType>; get tweenedPathData() { - if (this.#tweenedState) return this.#tweenedState.current; - return this.#getPathData(); + return this.#tweenedState.current; } // Re-key trigger for draw transitions @@ -122,23 +119,30 @@ export class PathState { const initial = getProps(); const extractedTween = extractTweenConfig(initial.motion); - - if (extractedTween) { - const tweenedOptions: ResolvedMotion = { - type: extractedTween.type, - options: { interpolate: interpolatePath, ...extractedTween.options }, - }; - - const initialResolved = resolvePathData(getPathData()); - const defaultPathData = initialResolved - ? flattenPathData( - initialResolved, - Math.min(this.chartCtx.yScale(0) ?? this.chartCtx.yRange[0], this.chartCtx.yRange[0]) - ) - : ''; - - this.#tweenedState = createMotion(defaultPathData, this.#getPathData, tweenedOptions); - } + const tweenedOptions: ResolvedMotion | undefined = extractedTween + ? { + type: extractedTween.type, + options: { interpolate: interpolatePath, ...extractedTween.options }, + } + : undefined; + + // Provide initial `0` baseline; only set on initial mount + const defaultPathData = (() => { + if (!tweenedOptions) { + // Fast initial render when not tweened + return ''; + } + const resolved = resolvePathData(getPathData()); + if (resolved) { + return flattenPathData( + resolved, + Math.min(this.chartCtx.yScale(0) ?? this.chartCtx.yRange[0], this.chartCtx.yRange[0]) + ); + } + return ''; + })(); + + this.#tweenedState = createMotion(defaultPathData, this.#getPathData, tweenedOptions); // Re-trigger draw transition when path data changes $effect(() => { diff --git a/packages/layerchart/src/lib/components/Pie/Pie.shared.svelte.ts b/packages/layerchart/src/lib/components/Pie/Pie.shared.svelte.ts index a46472e7c..0283de0be 100644 --- a/packages/layerchart/src/lib/components/Pie/Pie.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Pie/Pie.shared.svelte.ts @@ -49,16 +49,11 @@ export class PieState { #getProps: () => PieProps = () => ({}) as PieProps; ctx: ChartState = getChartContext(); - // Only allocated when the user opts into animation via the `motion` prop; - // otherwise the pie generator reads `endAngle` directly. - #motionEndAngle: ReturnType> | null = null; + #motionEndAngle!: ReturnType>; constructor(getProps: () => PieProps) { this.#getProps = getProps; - const initial = getProps(); - if (initial.motion !== undefined) { - this.#motionEndAngle = createMotion(0, () => this.endAngle, initial.motion); - } + this.#motionEndAngle = createMotion(0, () => this.endAngle, getProps().motion); } range = $derived(this.#getProps().range ?? ([0, 360] as [number, number])); @@ -82,7 +77,7 @@ export class PieState { (this.ctx.config.xRange ? min(this.ctx.config.xRange as number[]) : min(this.range))! ) ) - .endAngle(this.#motionEndAngle?.current ?? this.endAngle) + .endAngle(this.#motionEndAngle.current) .padAngle(props.padAngle ?? 0) .value(this.ctx.x); diff --git a/packages/layerchart/src/lib/components/Polygon/Polygon.shared.svelte.ts b/packages/layerchart/src/lib/components/Polygon/Polygon.shared.svelte.ts index 6e7c46eec..9833bb6ea 100644 --- a/packages/layerchart/src/lib/components/Polygon/Polygon.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Polygon/Polygon.shared.svelte.ts @@ -160,33 +160,24 @@ export class PolygonState { return roundedPolygonPath(pts, props.cornerRadius ?? 0); } - // Pixel-mode motion sources. Only allocated when the user opts into - // animation via the `motion` prop; otherwise the getters read directly - // from props / pixelPathData. + // Pixel-mode motion sources #dataMotionMap: ReturnType = null; - #motionCx: ReturnType> | null = null; - #motionCy: ReturnType> | null = null; - #motionR: ReturnType> | null = null; - #tweenedState: ReturnType> | null = null; + #motionCx!: ReturnType>; + #motionCy!: ReturnType>; + #motionR!: ReturnType>; + #tweenedState!: ReturnType>; get motionCx() { - if (this.#motionCx) return this.#motionCx.current; - const cx = this.#getProps().cx; - return typeof cx === 'number' ? cx : 0; + return this.#motionCx.current; } get motionCy() { - if (this.#motionCy) return this.#motionCy.current; - const cy = this.#getProps().cy; - return typeof cy === 'number' ? cy : 0; + return this.#motionCy.current; } get motionR() { - if (this.#motionR) return this.#motionR.current; - const r = this.#getProps().r; - return typeof r === 'number' ? r : 1; + return this.#motionR.current; } get tweenedPathData() { - if (this.#tweenedState) return this.#tweenedState.current; - return this.pixelPathData; + return this.#tweenedState.current; } // Pixel-mode polygon path string (depends on motion + transform props) @@ -241,41 +232,38 @@ export class PolygonState { this.#getProps = getProps; const initial = getProps(); + const initialCx = initial.initialCx ?? (typeof initial.cx === 'number' ? initial.cx : 0); + const initialCy = initial.initialCy ?? (typeof initial.cy === 'number' ? initial.cy : 0); + const initialR = initial.initialR ?? (typeof initial.r === 'number' ? initial.r : 1); - if (initial.motion !== undefined) { - const initialCx = initial.initialCx ?? (typeof initial.cx === 'number' ? initial.cx : 0); - const initialCy = initial.initialCy ?? (typeof initial.cy === 'number' ? initial.cy : 0); - const initialR = initial.initialR ?? (typeof initial.r === 'number' ? initial.r : 1); - - this.#motionCx = createMotion( - initialCx, - () => (typeof getProps().cx === 'number' ? (getProps().cx as number) : 0), - initial.motion - ); - this.#motionCy = createMotion( - initialCy, - () => (typeof getProps().cy === 'number' ? (getProps().cy as number) : 0), - initial.motion - ); - this.#motionR = createMotion( - initialR, - () => (typeof getProps().r === 'number' ? (getProps().r as number) : 1), - initial.motion - ); + this.#motionCx = createMotion( + initialCx, + () => (typeof getProps().cx === 'number' ? (getProps().cx as number) : 0), + initial.motion + ); + this.#motionCy = createMotion( + initialCy, + () => (typeof getProps().cy === 'number' ? (getProps().cy as number) : 0), + initial.motion + ); + this.#motionR = createMotion( + initialR, + () => (typeof getProps().r === 'number' ? (getProps().r as number) : 1), + initial.motion + ); - const extractedTween = extractTweenConfig(initial.motion); - if (extractedTween) { - const tweenedOptions: ResolvedMotion = { + const extractedTween = extractTweenConfig(initial.motion); + const tweenedOptions: ResolvedMotion | undefined = extractedTween + ? { type: extractedTween.type, options: { interpolate: interpolatePath, ...extractedTween.options }, - }; - this.#tweenedState = createMotion( - null, - () => this.pixelPathData, - tweenedOptions - ); - } - } + } + : undefined; + this.#tweenedState = createMotion( + null, + () => this.pixelPathData, + tweenedOptions + ); this.#dataMotionMap = createDataMotionMap(initial.motion); if (this.#dataMotionMap) { diff --git a/packages/layerchart/src/lib/components/Rect/Rect.shared.svelte.ts b/packages/layerchart/src/lib/components/Rect/Rect.shared.svelte.ts index b5f735100..915c5fd72 100644 --- a/packages/layerchart/src/lib/components/Rect/Rect.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Rect/Rect.shared.svelte.ts @@ -301,32 +301,24 @@ export class RectState { ) || 0 ); - // Pixel-mode motion sources. Only allocated when the user opts into - // animation via the `motion` prop; otherwise the getters read directly - // from props. + // Pixel-mode motion sources #dataMotionMap: ReturnType = null; - #motionX: ReturnType> | null = null; - #motionY: ReturnType> | null = null; - #motionWidth: ReturnType> | null = null; - #motionHeight: ReturnType> | null = null; + #motionX!: ReturnType>; + #motionY!: ReturnType>; + #motionWidth!: ReturnType>; + #motionHeight!: ReturnType>; get motionX() { - if (this.#motionX) return this.#motionX.current; - const x = this.#getProps().x; - return typeof x === 'number' ? x : 0; + return this.#motionX.current; } get motionY() { - if (this.#motionY) return this.#motionY.current; - const y = this.#getProps().y; - return typeof y === 'number' ? y : 0; + return this.#motionY.current; } get motionWidth() { - if (this.#motionWidth) return this.#motionWidth.current; - return this.#getProps().width ?? 0; + return this.#motionWidth.current; } get motionHeight() { - if (this.#motionHeight) return this.#motionHeight.current; - return this.#getProps().height ?? 0; + return this.#motionHeight.current; } // Resolved per-corner radii (clamped to current bounds) @@ -395,35 +387,32 @@ export class RectState { this.#getProps = getProps; const initial = getProps(); + const initialX = initial.initialX ?? (typeof initial.x === 'number' ? initial.x : 0); + const initialY = initial.initialY ?? (typeof initial.y === 'number' ? initial.y : 0); + const initialWidth = initial.initialWidth ?? initial.width ?? 0; + const initialHeight = initial.initialHeight ?? initial.height ?? 0; const motion = initial.motion; - if (motion !== undefined) { - const initialX = initial.initialX ?? (typeof initial.x === 'number' ? initial.x : 0); - const initialY = initial.initialY ?? (typeof initial.y === 'number' ? initial.y : 0); - const initialWidth = initial.initialWidth ?? initial.width ?? 0; - const initialHeight = initial.initialHeight ?? initial.height ?? 0; - - this.#motionX = createMotion( - initialX, - () => (typeof getProps().x === 'number' ? (getProps().x as number) : 0), - parseMotionProp(motion, 'x') - ); - this.#motionY = createMotion( - initialY, - () => (typeof getProps().y === 'number' ? (getProps().y as number) : 0), - parseMotionProp(motion, 'y') - ); - this.#motionWidth = createMotion( - initialWidth, - () => getProps().width ?? 0, - parseMotionProp(motion, 'width') - ); - this.#motionHeight = createMotion( - initialHeight, - () => getProps().height ?? 0, - parseMotionProp(motion, 'height') - ); - } + this.#motionX = createMotion( + initialX, + () => (typeof getProps().x === 'number' ? (getProps().x as number) : 0), + motion === undefined ? undefined : parseMotionProp(motion, 'x') + ); + this.#motionY = createMotion( + initialY, + () => (typeof getProps().y === 'number' ? (getProps().y as number) : 0), + motion === undefined ? undefined : parseMotionProp(motion, 'y') + ); + this.#motionWidth = createMotion( + initialWidth, + () => getProps().width ?? 0, + motion === undefined ? undefined : parseMotionProp(motion, 'width') + ); + this.#motionHeight = createMotion( + initialHeight, + () => getProps().height ?? 0, + motion === undefined ? undefined : parseMotionProp(motion, 'height') + ); this.#dataMotionMap = createDataMotionMap(motion as MotionOptions | undefined); if (this.#dataMotionMap) { diff --git a/packages/layerchart/src/lib/components/Spline/Spline.shared.svelte.ts b/packages/layerchart/src/lib/components/Spline/Spline.shared.svelte.ts index e65131d51..9ab2f8bc7 100644 --- a/packages/layerchart/src/lib/components/Spline/Spline.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Spline/Spline.shared.svelte.ts @@ -64,9 +64,7 @@ export class SplineState { ctx: ChartState = getChartContext(); geo: GeoState = getGeoContext(); - // Only allocated when the user opts into a tween via the `motion` prop; - // `Spline.base.svelte` reads `c.d` directly otherwise (gated by `isTweened`). - #tweenState: ReturnType> | null = null; + #tweenState!: ReturnType>; constructor(getProps: () => SplineProps) { this.#getProps = getProps; @@ -87,12 +85,10 @@ export class SplineState { }, }); - if (extractTweenConfig(initial.motion) != null) { - this.#tweenState = createMotion(this.#defaultPathData(), () => this.d, { - type: 'tween', - interpolate: interpolatePath, - }); - } + this.#tweenState = createMotion(this.#defaultPathData(), () => this.d, { + type: 'tween', + interpolate: interpolatePath, + }); } #getScaleValue( @@ -228,8 +224,7 @@ export class SplineState { isTweened = $derived(extractTweenConfig(this.#getProps().motion) != null); get tweenedPath() { - if (this.#tweenState) return this.#tweenState.current; - return this.d; + return this.#tweenState.current; } seriesOpacity = $derived.by(() => { diff --git a/packages/layerchart/src/lib/components/Text/Text.shared.svelte.ts b/packages/layerchart/src/lib/components/Text/Text.shared.svelte.ts index 13c758f1b..081b726f5 100644 --- a/packages/layerchart/src/lib/components/Text/Text.shared.svelte.ts +++ b/packages/layerchart/src/lib/components/Text/Text.shared.svelte.ts @@ -364,22 +364,16 @@ export class TextState { #dataMotionMap: ReturnType = null; - // Pixel-mode motion sources. Only allocated when the user opts into - // animation via the `motion` prop; otherwise the getters read directly - // from props. - #motionX: ReturnType> | null = null; - #motionY: ReturnType> | null = null; - #motionValue: ReturnType> | null = null; + // Pixel-mode motion sources + #motionX!: ReturnType>; + #motionY!: ReturnType>; + #motionValue!: ReturnType>; get motionX() { - if (this.#motionX) return this.#motionX.current; - const x = this.#getProps().x; - return typeof x === 'number' || typeof x === 'string' ? x : 0; + return this.#motionX.current; } get motionY() { - if (this.#motionY) return this.#motionY.current; - const y = this.#getProps().y; - return typeof y === 'number' || typeof y === 'string' ? y : 0; + return this.#motionY.current; } // Resolved width: for path text, defer to the (SVG-bound) pathRef length @@ -406,7 +400,7 @@ export class TextState { const motion = this.#getProps().motion; const format = this.#getProps().format; if (typeof value === 'function' || value == null) return ''; - if (typeof value === 'number' && motion && this.#motionValue) { + if (typeof value === 'number' && motion) { const v = this.#motionValue.current; // @ts-expect-error - improve format types return format ? formatValue(v, format) : String(v); @@ -547,41 +541,38 @@ export class TextState { this.#getProps = getProps; const initial = getProps(); - - if (initial.motion !== undefined) { - const _initialX: string | number = - initial.initialX ?? (typeof initial.x === 'function' ? 0 : (initial.x ?? 0)); - const _initialY: string | number = - initial.initialY ?? (typeof initial.y === 'function' ? 0 : (initial.y ?? 0)); - - this.#motionX = createMotion( - _initialX, - () => { - const x = getProps().x; - return typeof x === 'number' || typeof x === 'string' ? x : 0; - }, - initial.motion - ); - this.#motionY = createMotion( - _initialY, - () => { - const y = getProps().y; - return typeof y === 'number' || typeof y === 'string' ? y : 0; - }, - initial.motion - ); - - // Tween numeric values when motion is configured - this.#motionValue = createMotion( - typeof initial.value === 'number' ? initial.value : 0, - () => (typeof getProps().value === 'number' ? (getProps().value as number) : 0), - typeof initial.value === 'number' && - typeof initial.motion === 'object' && - 'type' in initial.motion + const _initialX: string | number = + initial.initialX ?? (typeof initial.x === 'function' ? 0 : (initial.x ?? 0)); + const _initialY: string | number = + initial.initialY ?? (typeof initial.y === 'function' ? 0 : (initial.y ?? 0)); + + this.#motionX = createMotion( + _initialX, + () => { + const x = getProps().x; + return typeof x === 'number' || typeof x === 'string' ? x : 0; + }, + initial.motion + ); + this.#motionY = createMotion( + _initialY, + () => { + const y = getProps().y; + return typeof y === 'number' || typeof y === 'string' ? y : 0; + }, + initial.motion + ); + + // Tween numeric values when motion is configured + this.#motionValue = createMotion( + typeof initial.value === 'number' ? initial.value : 0, + () => (typeof getProps().value === 'number' ? (getProps().value as number) : 0), + typeof initial.value === 'number' && initial.motion + ? typeof initial.motion === 'object' && 'type' in initial.motion ? initial.motion : undefined - ); - } + : undefined + ); this.#dataMotionMap = createDataMotionMap(initial.motion); if (this.#dataMotionMap) { From bec6a05607e490f50cb1f5b1a0785f38b868a4b7 Mon Sep 17 00:00:00 2001 From: Sean Lynch Date: Thu, 30 Apr 2026 20:52:22 -0400 Subject: [PATCH 11/11] fix(SeriesState): Avoid `derived_inert` crash when chart unmounts under a `` --- .changeset/fix-series-state-effect-root.md | 7 ++++++ .../src/lib/states/series.svelte.test.ts | 12 ++++++---- .../src/lib/states/series.svelte.ts | 24 ++++++++----------- 3 files changed, 25 insertions(+), 18 deletions(-) create mode 100644 .changeset/fix-series-state-effect-root.md diff --git a/.changeset/fix-series-state-effect-root.md b/.changeset/fix-series-state-effect-root.md new file mode 100644 index 000000000..74f51974a --- /dev/null +++ b/.changeset/fix-series-state-effect-root.md @@ -0,0 +1,7 @@ +--- +'layerchart': patch +--- + +fix(SeriesState): Avoid `derived_inert` crash when chart unmounts under a `` + +The `selectedKeys` sync effect was wrapped in `$effect.root`, creating an isolated scope that survived chart unmount. When the parent chart was destroyed (e.g. an example reloading inside the docs `` after an async `$derived` re-evaluated), the `#series` derived became inert while the orphaned effect kept reading it — producing `Reading a derived belonging to a now-destroyed effect may result in stale values` warnings followed by `TypeError: e.some is not a function`. The effect now lives in the constructor, scoped to the component that instantiated `SeriesState`, so it is torn down with the chart. diff --git a/packages/layerchart/src/lib/states/series.svelte.test.ts b/packages/layerchart/src/lib/states/series.svelte.test.ts index 16efcecf9..6ea76e123 100644 --- a/packages/layerchart/src/lib/states/series.svelte.test.ts +++ b/packages/layerchart/src/lib/states/series.svelte.test.ts @@ -17,10 +17,14 @@ const series = [ ]; function createSeriesState(seriesData = series as any[], stackConfig: any = null) { - return new SeriesState( - () => seriesData, - () => stackConfig - ); + let state: SeriesState; + $effect.root(() => { + state = new SeriesState( + () => seriesData, + () => stackConfig + ); + }); + return state!; } describe('SeriesState', () => { diff --git a/packages/layerchart/src/lib/states/series.svelte.ts b/packages/layerchart/src/lib/states/series.svelte.ts index 46866b031..32e563df6 100644 --- a/packages/layerchart/src/lib/states/series.svelte.ts +++ b/packages/layerchart/src/lib/states/series.svelte.ts @@ -24,20 +24,6 @@ export class SeriesState { selectedKeys: SelectionState; - /** - * Reactively syncs selectedKeys when series `selected` props change. - * When any series explicitly sets `selected: false`, the remaining series - * (with `selected` undefined or true) are pre-selected. - */ - #_syncSelectedFromProps = $effect.root(() => { - $effect(() => { - const keys = SeriesState.#selectedKeysFromSeries(this.#series); - if (keys) { - this.selectedKeys.current = keys; - } - }); - }); - /** * The current highlight series key for the chart. */ @@ -53,6 +39,16 @@ export class SeriesState { // Compute initial selectedKeys synchronously from series `selected` props const initialKeys = SeriesState.#selectedKeysFromSeries(getSeries()); this.selectedKeys = new SelectionState({ initial: initialKeys ?? undefined }); + + // Reactively sync selectedKeys when series `selected` props change. + // When any series explicitly sets `selected: false`, the remaining series + // (with `selected` undefined or true) are pre-selected. + $effect(() => { + const keys = SeriesState.#selectedKeysFromSeries(this.#series); + if (keys) { + this.selectedKeys.current = keys; + } + }); } /**