diff --git a/.changeset/shaggy-comics-fail.md b/.changeset/shaggy-comics-fail.md
new file mode 100644
index 0000000000..981a25c978
--- /dev/null
+++ b/.changeset/shaggy-comics-fail.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: `append_styles` in an effect to make them available on mount
diff --git a/packages/svelte/src/internal/client/dom/css.js b/packages/svelte/src/internal/client/dom/css.js
index 52be36aa1f..8e6faa0e32 100644
--- a/packages/svelte/src/internal/client/dom/css.js
+++ b/packages/svelte/src/internal/client/dom/css.js
@@ -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
diff --git a/packages/svelte/tests/runtime-browser/custom-elements-samples/host-rune-access-injected-css/_config.js b/packages/svelte/tests/runtime-browser/custom-elements-samples/host-rune-access-injected-css/_config.js
new file mode 100644
index 0000000000..99a223492b
--- /dev/null
+++ b/packages/svelte/tests/runtime-browser/custom-elements-samples/host-rune-access-injected-css/_config.js
@@ -0,0 +1,21 @@
+import { test } from '../../assert';
+const tick = () => Promise.resolve();
+
+export default test({
+ async test({ assert, target }) {
+ target.innerHTML = '';
+ /** @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('
+
+
+
+
+
+
\ No newline at end of file