diff --git a/packages/svelte/src/internal/client/dom/elements/attributes.js b/packages/svelte/src/internal/client/dom/elements/attributes.js
index ec45e8cf0c..8bdd7d9311 100644
--- a/packages/svelte/src/internal/client/dom/elements/attributes.js
+++ b/packages/svelte/src/internal/client/dom/elements/attributes.js
@@ -431,7 +431,16 @@ function set_attributes(
// avoid using the setter
set_attribute(element, key, value);
} else if (key === 'autofocus') {
- autofocus(/** @type {HTMLElement} */ (element), Boolean(value));
+ if (renderer == null) {
+ autofocus(/** @type {HTMLElement} */ (element), Boolean(value));
+ } else {
+ // In custom renderer mode, just set autofocus as a regular attribute
+ if (value) {
+ set_attribute_op(element, key, value);
+ } else {
+ remove_attribute(element, key);
+ }
+ }
} else if (!is_custom_element && (key === '__value' || (key === 'value' && value != null))) {
// @ts-ignore We're not running this for custom elements because __value is actually
// how Lit stores the current value on the element, and messing with that would break things.
diff --git a/packages/svelte/tests/custom-renderers/samples/svelte-element-autofocus/_config.js b/packages/svelte/tests/custom-renderers/samples/svelte-element-autofocus/_config.js
new file mode 100644
index 0000000000..8d4602f7fb
--- /dev/null
+++ b/packages/svelte/tests/custom-renderers/samples/svelte-element-autofocus/_config.js
@@ -0,0 +1,18 @@
+import { test } from '../../test';
+
+export default test({
+ test({ assert, target }) {
+ // If we got here, the component mounted without crashing on document.body access.
+ // Verify autofocus is set as a regular attribute.
+ const input = target.children.find(
+ (/** @type {any} */ n) => n.type === 'element' && n.name === 'input'
+ );
+ assert.ok(input, 'input element should exist');
+ assert.equal(
+ input.attributes['autofocus'],
+ 'true',
+ 'autofocus should be set as a regular attribute'
+ );
+ assert.equal(input.attributes['value'], 'test', 'value should be set as a regular attribute');
+ }
+});
diff --git a/packages/svelte/tests/custom-renderers/samples/svelte-element-autofocus/main.svelte b/packages/svelte/tests/custom-renderers/samples/svelte-element-autofocus/main.svelte
new file mode 100644
index 0000000000..bea9f28141
--- /dev/null
+++ b/packages/svelte/tests/custom-renderers/samples/svelte-element-autofocus/main.svelte
@@ -0,0 +1,5 @@
+
+
+