diff --git a/.changeset/fix-brush-transform-blank-chart.md b/.changeset/fix-brush-transform-blank-chart.md new file mode 100644 index 000000000..4914c4de2 --- /dev/null +++ b/.changeset/fix-brush-transform-blank-chart.md @@ -0,0 +1,5 @@ +--- +'layerchart': patch +--- + +fix(Chart): Fix chart rendering blank when `brush` and `transform` are combined under Svelte's experimental async mode by lazy-loading interaction contexts via `$effect`/`{#if}` instead of nested `{#await import()}`. diff --git a/packages/layerchart/src/lib/components/Chart/Chart.base.svelte b/packages/layerchart/src/lib/components/Chart/Chart.base.svelte index a9c11090c..e59f1dbfb 100644 --- a/packages/layerchart/src/lib/components/Chart/Chart.base.svelte +++ b/packages/layerchart/src/lib/components/Chart/Chart.base.svelte @@ -425,6 +425,27 @@ }, }; }); + + // Lazy-load interaction contexts into state rather than nested `{#await import()}` + // blocks in the template. Nested awaits (and awaits that render a shared snippet + // across their pending/then branches) fail to resolve under Svelte's experimental + // `async` compiler mode, leaving the chart blank when `brush` and `transform` are + // combined. Loading via `$effect` + `{#if}` sidesteps `{#await}` entirely. An + // `$effect` (not `$derived.by`) is used deliberately: awaiting an `import()` inside + // a `$derived` would require consumers to compile with `experimental.async`. + let TransformContext = $state(); + let BrushContext = $state(); + + $effect(() => { + if (transform && !TransformContext) { + import('../TransformContext.svelte').then((m) => (TransformContext = m.default)); + } + }); + $effect(() => { + if (brush && !BrushContext) { + import('../BrushContext.svelte').then((m) => (BrushContext = m.default)); + } + }); {#if ssr === true || typeof window !== 'undefined'} @@ -445,7 +466,7 @@ {...restProps} > {#key chartState.isMounted} - {#if transform} + {#if transform && TransformContext} {@const { domainExtent: _de, @@ -455,30 +476,26 @@ translateExtent: _te, ...transformProps } = transform} - {#await import('../TransformContext.svelte')} + + {@render inner()} - {:then { default: TransformContext }} - - - {@render inner()} - - {/await} + {:else} {@render inner()} {/if} @@ -495,8 +512,9 @@ {/snippet} {#snippet inner()} - {#if brush} - {#await import('../BrushContext.svelte')} + {#if brush && BrushContext} + + {@render body()} - {:then { default: BrushContext }} - - - - - {@render body()} - - - {/await} + {:else}