diff --git a/src/compiler/compile/nodes/Element.ts b/src/compiler/compile/nodes/Element.ts
index c17817a805..aebcdfb213 100644
--- a/src/compiler/compile/nodes/Element.ts
+++ b/src/compiler/compile/nodes/Element.ts
@@ -395,7 +395,7 @@ export default class Element extends Node {
component.slot_outlets.add(name);
}
- if (!(parent.type === 'InlineComponent' || (parent.type === 'Element' && /-/.test(parent.name)))) {
+ if (!(parent.type === 'InlineComponent' || within_custom_element(parent))) {
component.error(attribute, {
code: `invalid-slotted-content`,
message: `Element with a slot='...' attribute must be a child of a component or custom element`,
@@ -760,3 +760,12 @@ function should_have_attribute(
message: `A11y: <${name}> element should have ${article} ${sequence} attribute`
});
}
+
+function within_custom_element(parent: INode) {
+ while (parent) {
+ if (parent.type === 'InlineComponent') return false;
+ if (parent.type === 'Element' && /-/.test(parent.name)) return true;
+ parent = parent.parent;
+ }
+ return false;
+}
\ No newline at end of file
diff --git a/test/validator/samples/component-slotted-custom-element-2/errors.json b/test/validator/samples/component-slotted-custom-element-2/errors.json
new file mode 100644
index 0000000000..b2f39aa8d2
--- /dev/null
+++ b/test/validator/samples/component-slotted-custom-element-2/errors.json
@@ -0,0 +1,9 @@
+[
+ {
+ "code": "invalid-slotted-content",
+ "message": "Element with a slot='...' attribute must be a child of a component or custom element",
+ "start": { "line": 10, "column": 9, "character": 138 },
+ "end": { "line": 10, "column": 19, "character": 148 },
+ "pos": 138
+ }
+]
diff --git a/test/validator/samples/component-slotted-custom-element-2/input.svelte b/test/validator/samples/component-slotted-custom-element-2/input.svelte
new file mode 100644
index 0000000000..221659ca4d
--- /dev/null
+++ b/test/validator/samples/component-slotted-custom-element-2/input.svelte
@@ -0,0 +1,14 @@
+
+
+
+
+ {#if thing}
+
+ {/if}
+
+
\ No newline at end of file
diff --git a/test/validator/samples/component-slotted-custom-element/errors.json b/test/validator/samples/component-slotted-custom-element/errors.json
new file mode 100644
index 0000000000..0637a088a0
--- /dev/null
+++ b/test/validator/samples/component-slotted-custom-element/errors.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/test/validator/samples/component-slotted-custom-element/input.svelte b/test/validator/samples/component-slotted-custom-element/input.svelte
new file mode 100644
index 0000000000..e0e27834c1
--- /dev/null
+++ b/test/validator/samples/component-slotted-custom-element/input.svelte
@@ -0,0 +1,15 @@
+
+
+
+
+
+ {#if thing}
+
+ {/if}
+
+
\ No newline at end of file