fix: `append_styles` in an effect to make them available on mount

pull/16509/head
paoloricciuti 1 month ago
parent 39ee7cf4c2
commit 59a379596c

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: `append_styles` in an effect to make them available on mount

@ -1,6 +1,6 @@
import { DEV } from 'esm-env';
import { queue_micro_task } from './task.js';
import { register_style } from '../dev/css.js';
import { effect } from '../reactivity/effects.js';
/**
* @param {Node} anchor
@ -8,7 +8,7 @@ import { register_style } from '../dev/css.js';
*/
export function append_styles(anchor, css) {
// Use `queue_micro_task` to ensure `anchor` is in the DOM, otherwise getRootNode() will yield wrong results
queue_micro_task(() => {
effect(() => {
var root = anchor.getRootNode();
var target = /** @type {ShadowRoot} */ (root).host

@ -0,0 +1,21 @@
import { test } from '../../assert';
const tick = () => Promise.resolve();
export default test({
async test({ assert, target }) {
target.innerHTML = '<custom-element></custom-element>';
/** @type {any} */
const el = target.querySelector('custom-element');
/** @type {string} */
let html = '';
const handle_evt = (e) => (html = e.detail);
el.addEventListener('html', handle_evt);
await tick();
await tick();
await tick();
assert.ok(html.includes('<style'));
}
});

@ -0,0 +1,16 @@
<svelte:options css="injected" customElement="custom-element"/>
<script lang="ts">
$effect(() => {
$host().dispatchEvent(new CustomEvent("html", { detail: $host().shadowRoot?.innerHTML }));
})
</script>
<button class="btn">btn</button>
<style >
.btn {
width: 123px;
height: 123px;
}
</style>
Loading…
Cancel
Save