diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/AnimateDirective.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/AnimateDirective.js
index 3b4f7007be..e1e431cc8b 100644
--- a/packages/svelte/src/compiler/phases/2-analyze/visitors/AnimateDirective.js
+++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/AnimateDirective.js
@@ -7,6 +7,10 @@ import * as e from '../../../errors.js';
* @param {Context} context
*/
export function AnimateDirective(node, context) {
+ if (context.state.analysis.custom_renderer) {
+ e.incompatible_with_custom_renderer(node, '`animate:`');
+ }
+
context.next({ ...context.state, expression: node.metadata.expression });
if (node.metadata.expression.has_await) {
diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/BindDirective.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/BindDirective.js
index ab541703a0..5701ed438d 100644
--- a/packages/svelte/src/compiler/phases/2-analyze/visitors/BindDirective.js
+++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/BindDirective.js
@@ -27,6 +27,9 @@ export function BindDirective(node, context) {
parent?.type === 'SvelteDocument' ||
parent?.type === 'SvelteBody'
) {
+ if (context.state.analysis.custom_renderer) {
+ e.incompatible_with_custom_renderer(node, '`bind:`');
+ }
if (node.name in binding_properties) {
const property = binding_properties[node.name];
if (property.valid_elements && !property.valid_elements.includes(parent.name)) {
diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/TransitionDirective.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/TransitionDirective.js
index e50e28a04c..01a6229088 100644
--- a/packages/svelte/src/compiler/phases/2-analyze/visitors/TransitionDirective.js
+++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/TransitionDirective.js
@@ -9,6 +9,11 @@ import { mark_subtree_dynamic } from './shared/fragment.js';
* @param {Context} context
*/
export function TransitionDirective(node, context) {
+ if (context.state.analysis.custom_renderer) {
+ const directive = node.intro && node.outro ? '`transition:`' : node.intro ? '`in:`' : '`out:`';
+ e.incompatible_with_custom_renderer(node, directive);
+ }
+
mark_subtree_dynamic(context.path);
context.next({ ...context.state, expression: node.metadata.expression });
diff --git a/packages/svelte/tests/custom-renderers/samples/animate-directive/_config.js b/packages/svelte/tests/custom-renderers/samples/animate-directive/_config.js
new file mode 100644
index 0000000000..31225d6a4b
--- /dev/null
+++ b/packages/svelte/tests/custom-renderers/samples/animate-directive/_config.js
@@ -0,0 +1,5 @@
+import { test } from '../../test';
+
+export default test({
+ compile_error: '`animate:` is not compatible with `customRenderer`'
+});
diff --git a/packages/svelte/tests/custom-renderers/samples/animate-directive/main.svelte b/packages/svelte/tests/custom-renderers/samples/animate-directive/main.svelte
new file mode 100644
index 0000000000..ee05d573c6
--- /dev/null
+++ b/packages/svelte/tests/custom-renderers/samples/animate-directive/main.svelte
@@ -0,0 +1,9 @@
+
+
+{#each items as item (item)}
+
{item}
+{/each}
diff --git a/packages/svelte/tests/custom-renderers/samples/bind-component/Child.svelte b/packages/svelte/tests/custom-renderers/samples/bind-component/Child.svelte
new file mode 100644
index 0000000000..ac9ec4cabb
--- /dev/null
+++ b/packages/svelte/tests/custom-renderers/samples/bind-component/Child.svelte
@@ -0,0 +1,5 @@
+
+
+{value}
diff --git a/packages/svelte/tests/custom-renderers/samples/bind-component/_config.js b/packages/svelte/tests/custom-renderers/samples/bind-component/_config.js
new file mode 100644
index 0000000000..b653297599
--- /dev/null
+++ b/packages/svelte/tests/custom-renderers/samples/bind-component/_config.js
@@ -0,0 +1,5 @@
+import { test } from '../../test';
+
+export default test({
+ html: 'hello'
+});
diff --git a/packages/svelte/tests/custom-renderers/samples/bind-component/main.svelte b/packages/svelte/tests/custom-renderers/samples/bind-component/main.svelte
new file mode 100644
index 0000000000..f81a6a32b5
--- /dev/null
+++ b/packages/svelte/tests/custom-renderers/samples/bind-component/main.svelte
@@ -0,0 +1,7 @@
+
+
+
diff --git a/packages/svelte/tests/custom-renderers/samples/bind-directive/_config.js b/packages/svelte/tests/custom-renderers/samples/bind-directive/_config.js
new file mode 100644
index 0000000000..fcba387f65
--- /dev/null
+++ b/packages/svelte/tests/custom-renderers/samples/bind-directive/_config.js
@@ -0,0 +1,5 @@
+import { test } from '../../test';
+
+export default test({
+ compile_error: '`bind:` is not compatible with `customRenderer`'
+});
diff --git a/packages/svelte/tests/custom-renderers/samples/bind-directive/main.svelte b/packages/svelte/tests/custom-renderers/samples/bind-directive/main.svelte
new file mode 100644
index 0000000000..e19ec21bee
--- /dev/null
+++ b/packages/svelte/tests/custom-renderers/samples/bind-directive/main.svelte
@@ -0,0 +1,5 @@
+
+
+
diff --git a/packages/svelte/tests/custom-renderers/samples/in-directive/_config.js b/packages/svelte/tests/custom-renderers/samples/in-directive/_config.js
new file mode 100644
index 0000000000..1da5d37f9d
--- /dev/null
+++ b/packages/svelte/tests/custom-renderers/samples/in-directive/_config.js
@@ -0,0 +1,5 @@
+import { test } from '../../test';
+
+export default test({
+ compile_error: '`in:` is not compatible with `customRenderer`'
+});
diff --git a/packages/svelte/tests/custom-renderers/samples/in-directive/main.svelte b/packages/svelte/tests/custom-renderers/samples/in-directive/main.svelte
new file mode 100644
index 0000000000..1345e1a3af
--- /dev/null
+++ b/packages/svelte/tests/custom-renderers/samples/in-directive/main.svelte
@@ -0,0 +1,5 @@
+
+
+content
diff --git a/packages/svelte/tests/custom-renderers/samples/out-directive/_config.js b/packages/svelte/tests/custom-renderers/samples/out-directive/_config.js
new file mode 100644
index 0000000000..1e35712b96
--- /dev/null
+++ b/packages/svelte/tests/custom-renderers/samples/out-directive/_config.js
@@ -0,0 +1,5 @@
+import { test } from '../../test';
+
+export default test({
+ compile_error: '`out:` is not compatible with `customRenderer`'
+});
diff --git a/packages/svelte/tests/custom-renderers/samples/out-directive/main.svelte b/packages/svelte/tests/custom-renderers/samples/out-directive/main.svelte
new file mode 100644
index 0000000000..9b9d676393
--- /dev/null
+++ b/packages/svelte/tests/custom-renderers/samples/out-directive/main.svelte
@@ -0,0 +1,5 @@
+
+
+content
diff --git a/packages/svelte/tests/custom-renderers/samples/transition-directive/_config.js b/packages/svelte/tests/custom-renderers/samples/transition-directive/_config.js
new file mode 100644
index 0000000000..70f59a5886
--- /dev/null
+++ b/packages/svelte/tests/custom-renderers/samples/transition-directive/_config.js
@@ -0,0 +1,5 @@
+import { test } from '../../test';
+
+export default test({
+ compile_error: '`transition:` is not compatible with `customRenderer`'
+});
diff --git a/packages/svelte/tests/custom-renderers/samples/transition-directive/main.svelte b/packages/svelte/tests/custom-renderers/samples/transition-directive/main.svelte
new file mode 100644
index 0000000000..021567e97c
--- /dev/null
+++ b/packages/svelte/tests/custom-renderers/samples/transition-directive/main.svelte
@@ -0,0 +1,5 @@
+
+
+content