Skip to content

Commit 6655f2c

Browse files
feat: better dynamic component css props (#11792)
* feat: better dynamic component css props * chore: fix tests * chore: remove anchor from `$.component` * chore: better old test fixing * changeset --------- Co-authored-by: Rich Harris <hello@rich-harris.dev>
1 parent f57836c commit 6655f2c

File tree

6 files changed

+32
-20
lines changed

6 files changed

+32
-20
lines changed

.changeset/smart-spiders-fetch.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"svelte": patch
3+
---
4+
5+
feat: always create wrapper `<div>` for `<svelte:component>` with CSS custom properties

packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -916,6 +916,27 @@ function serialize_inline_component(node, component_name, context) {
916916
);
917917
}
918918

919+
if (node.type === 'SvelteComponent') {
920+
const prev = fn;
921+
fn = (node_id) => {
922+
let component = b.call(
923+
'$.component',
924+
b.thunk(/** @type {import('estree').Expression} */ (context.visit(node.expression))),
925+
b.arrow(
926+
[b.id(component_name)],
927+
b.block([
928+
b.stmt(
929+
context.state.options.dev
930+
? b.call('$.validate_dynamic_component', b.thunk(prev(node_id)))
931+
: prev(node_id)
932+
)
933+
])
934+
)
935+
);
936+
return component;
937+
};
938+
}
939+
919940
if (Object.keys(custom_css_props).length > 0) {
920941
const prev = fn;
921942
fn = (node_id) =>
@@ -2938,7 +2959,6 @@ export const template_visitors = {
29382959
b.stmt(
29392960
b.call(
29402961
'$.component',
2941-
context.state.node,
29422962
// TODO use untrack here to not update when binding changes?
29432963
// Would align with Svelte 4 behavior, but it's arguably nicer/expected to update this
29442964
b.thunk(
@@ -2962,19 +2982,8 @@ export const template_visitors = {
29622982
context.state.template.push('<!>');
29632983

29642984
let component = serialize_inline_component(node, '$$component', context);
2965-
if (context.state.options.dev) {
2966-
component = b.stmt(b.call('$.validate_dynamic_component', b.thunk(b.block([component]))));
2967-
}
2968-
context.state.init.push(
2969-
b.stmt(
2970-
b.call(
2971-
'$.component',
2972-
context.state.node,
2973-
b.thunk(/** @type {import('estree').Expression} */ (context.visit(node.expression))),
2974-
b.arrow([b.id('$$component')], b.block([component]))
2975-
)
2976-
)
2977-
);
2985+
2986+
context.state.init.push(component);
29782987
},
29792988
Attribute(node, context) {
29802989
if (is_event_attribute(node)) {

packages/svelte/src/internal/client/dom/blocks/svelte-component.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@ import { block, branch, pause_effect } from '../../reactivity/effects.js';
55
/**
66
* @template P
77
* @template {(props: P) => void} C
8-
* @param {Comment} anchor
98
* @param {() => C} get_component
109
* @param {(component: C) => import('#client').Dom | void} render_fn
1110
* @returns {void}
1211
*/
13-
export function component(anchor, get_component, render_fn) {
12+
export function component(get_component, render_fn) {
1413
/** @type {C} */
1514
let component;
1615

packages/svelte/tests/runtime-browser/samples/svelte-component-css-custom-properties/_config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export default test({
6161
component.componentName = 'Slider2';
6262
assert_slider_2();
6363
component.componentName = undefined;
64-
assert.equal(window.document.querySelector('div'), null);
64+
assert.equal(window.document.querySelector('div')?.firstElementChild, null);
6565
component.componentName = 'Slider1';
6666
assert_slider_1();
6767
}

packages/svelte/tests/runtime-browser/samples/svelte-component-css-custom-properties2/_config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export default test({
6363
component.componentName = 'Slider2';
6464
assert_slider_2();
6565
component.componentName = undefined;
66-
assert.equal(window.document.querySelector('div'), null);
66+
assert.equal(window.document.querySelector('div')?.firstElementChild, null);
6767
component.componentName = 'Slider1';
6868
assert_slider_1();
6969
}

packages/svelte/tests/runtime-browser/samples/svelte-self-css-custom-properties2/_config.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ export default test({
3535
const nest_track_color1 = target.querySelector('#nest-component1 span');
3636
const nest_rail_color2 = target.querySelector('#nest-component2 p');
3737
const nest_track_color2 = target.querySelector('#nest-component2 span');
38-
3938
assert_ok(rail_color1);
4039
assert_ok(track_color1);
4140
assert_ok(rail_color2);
@@ -96,7 +95,7 @@ export default test({
9695
component.componentName = 'Slider2';
9796
assert_slider_2();
9897
component.componentName = undefined;
99-
assert.equal(window.document.querySelector('div'), null);
98+
assert.equal(window.document.querySelector('div')?.firstElementChild, null);
10099
component.componentName = 'Slider1';
101100
assert_slider_1();
102101
}

0 commit comments

Comments
 (0)