Repository: sveltejs/eslint-plugin-svelte
Pull request #1011 (2025-01-12 07:24:22)

breaking: deprecate the `svelte/no-dynamic-slot-name` rule
Since a compile error occurs in all versions of Svelte (3, 4, and 5), isn’t this rule unnecessary?

## Svelte5
https://svelte.dev/playground/hello-world?version=5.17.3#H4sIAAAAAAAAE22NzUrEMBRGX-V6N6NDY_axU6goulC70J0R6TRXCWRuSnL9GUqfwoUbn84nkSAOgm4P5zvfhNxvCA2eUwgRXmIKDvbJeSF3gBU--EAZze2Esh2LVwBWP6t2HA_zMwUpbN1n-o8PkYVYMhqs85D8KI1lAL0EysGzwLepOSq35X7jB5VDFFVaBixSSjFZhKUusyFyFri-6G7ur9rLU1jBYt27xZHlWu_qlus9peDz4w3Ouu4ElGos16UKpbqy-Bijswj6t_wOx-1fF6bd2Qy6wQqFXgWNpCea7-YvjJVwy0IBAAA=

## Svelte4
https://svelte.dev/playground/hello-world?version=4.2.19#H4sIAAAAAAAAE22NzUrEMBRGX-V6N6NDY_axU6goulC70J0R6TRXCWRuSnL9GUqfwoUbn84nkSAOgm4P5zvfhNxvCA2eUwgRXmIKDvbJeSF3gBU--EAZze2Esh2LVwBWP6t2HA_zMwUpbN1n-o8PkYVYMhqs85D8KI1lAL0EysGzwLepOSq35X7jB5VDFFVaBixSSjFZhKUusyFyFri-6G7ur9rLU1jBYt27xZHlWu_qlus9peDz4w3Ouu4ElGos16UKpbqy-Bijswj6t_wOx-1fd9p9zaAbrFDoVdBIeqL5bv4Cu-KH80EBAAA=

## Svelte3
https://svelte.dev/playground/hello-world?version=3.59.2#H4sIAAAAAAAAE22NzUrEMBRGX-V6N6NDY_axU6goulC70J0R6TRXCWRuSnL9GUqfwoUbn84nkSAOgm4P5zvfhNxvCA2eUwgRXmIKDvbJeSF3gBU--EAZze2Esh2LVwBWP6t2HA_zMwUpbN1n-o8PkYVYMhqs85D8KI1lAL0EysGzwLepOSq35X7jB5VDFFVaBixSSjFZhKUusyFyFri-6G7ur9rLU1jBYt27xZHlWu_qlus9peDz4w3Ouu4ElGos16UKpbqy-Bijswj6t_wOx-1fF6bd2Qy6wQqFXgWNpCea7-YvjJVwy0IBAAA=

changeset-bot[bot]: ###  ⚠️  No Changeset found

Latest commit: 99e340e927b4d65020ef71ea624ab18615a78aa5

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. **If these changes should result in a version bump, you need to add a changeset.**

<details><summary>This PR includes no changesets</summary>

  When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

</details>

[Click here to learn what changesets are, and how to add one](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md).

[Click here if you're a maintainer who wants to add a changeset to this PR](https://github.com/sveltejs/eslint-plugin-svelte/new/chore/no-dynamic-slot-name?filename=.changeset/swift-masks-compare.md&value=---%0A%22eslint-plugin-svelte%22%3A%20patch%0A---%0A%0Abreaking%3A%20deprecate%20the%20%60svelte%2Fno-dynamic-slot-name%60%20rule%0A)


pkg-pr-new[bot]: 
[Open in Stackblitz](https://pkg.pr.new/template/0a82b6da-663e-49e4-9b52-2f4d7f88769c)


```
npm i https://pkg.pr.new/eslint-plugin-svelte@1011
```


_commit: <a href="https://github.com/sveltejs/eslint-plugin-svelte/runs/35485605918"><code>99e340e</code></a>_

ota-meshi: Thank you for this PR!

The valid-compile rule assumes this rule exists and excludes it from reporting.
Could you please remove it from the valid-compile rule's exclusion list?

https://github.com/sveltejs/eslint-plugin-svelte/blob/568ef529792e598f3b0ff39b30a4df2fbc106dd2/packages/eslint-plugin-svelte/src/rules/valid-compile.ts#L9-L12
baseballyama: Ohhhhhhh
baseballyama: > Thank you for this PR!
> 
> The valid-compile rule assumes this rule exists and excludes it from reporting. Could you please remove it from the valid-compile rule's exclusion list?
> 
> https://github.com/sveltejs/eslint-plugin-svelte/blob/568ef529792e598f3b0ff39b30a4df2fbc106dd2/packages/eslint-plugin-svelte/src/rules/valid-compile.ts#L9-L12

Did!: https://github.com/sveltejs/eslint-plugin-svelte/pull/1011/commits/aef695b652a4a8be5ff8e0f0b7ebb82c6af262bb

Patch:
diff --git a/.changeset/brown-dots-change.md b/.changeset/brown-dots-change.md
new file mode 100644
index 0000000..dfa797d
--- /dev/null
+++ b/.changeset/brown-dots-change.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': minor
+---
+
+feat: add Svelte 5 support to `no-not-function-handler`
diff --git a/.changeset/real-birds-move.md b/.changeset/real-birds-move.md
new file mode 100644
index 0000000..82f0200
--- /dev/null
+++ b/.changeset/real-birds-move.md
@@ -0,0 +1,5 @@
+---
+'eslint-plugin-svelte': major
+---
+
+breaking: deprecate the `svelte/no-dynamic-slot-name` rule
diff --git a/README.md b/README.md
index ac522d6..9ebcfd4 100644
--- a/README.md
+++ b/README.md
@@ -325,7 +325,6 @@ These rules relate to possible syntax or logic errors in Svelte code:
 | [svelte/no-dupe-on-directives](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-dupe-on-directives/) | disallow duplicate `on:` directives |  |
 | [svelte/no-dupe-style-properties](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-dupe-style-properties/) | disallow duplicate style properties | :star: |
 | [svelte/no-dupe-use-directives](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-dupe-use-directives/) | disallow duplicate `use:` directives |  |
-| [svelte/no-dynamic-slot-name](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-dynamic-slot-name/) | disallow dynamic slot name | :star::wrench: |
 | [svelte/no-not-function-handler](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-not-function-handler/) | disallow use of not function in event handler | :star: |
 | [svelte/no-object-in-text-mustaches](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-object-in-text-mustaches/) | disallow objects in text mustache interpolation | :star: |
 | [svelte/no-raw-special-elements](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-raw-special-elements/) | Checks for invalid raw HTML elements | :wrench: |
@@ -445,6 +444,7 @@ These rules relate to this plugin works:
 | Rule ID | Replaced by |
 |:--------|:------------|
 | [svelte/@typescript-eslint/no-unnecessary-condition](https://sveltejs.github.io/eslint-plugin-svelte/rules/@typescript-eslint/no-unnecessary-condition/) | This rule is no longer needed when using svelte-eslint-parser>=v0.19.0. |
+| [svelte/no-dynamic-slot-name](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-dynamic-slot-name/) | Now Svelte compiler itself throws an compile error. |
 | [svelte/no-goto-without-base](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-goto-without-base/) | [svelte/no-navigation-without-base](https://sveltejs.github.io/eslint-plugin-svelte/rules/no-navigation-without-base/) |
 
 <!--RULES_TABLE_END-->
diff --git a/docs-svelte-kit/package.json b/docs-svelte-kit/package.json
index 9d86cdb..5ef0b0d 100644
--- a/docs-svelte-kit/package.json
+++ b/docs-svelte-kit/package.json
@@ -59,6 +59,7 @@
     "svelte": "^5.2.10",
     "svelte-adapter-ghpages": "0.2.2",
     "twoslash-eslint": "^0.2.12",
+    "twoslash-protocol": "^0.2.12",
     "util": "^0.12.5",
     "vite": "^6.0.1",
     "vite-plugin-svelte-md": "^0.1.7"
diff --git a/docs-svelte-kit/src/site.css b/docs-svelte-kit/src/site.css
index 9f848c9..d92d253 100644
--- a/docs-svelte-kit/src/site.css
+++ b/docs-svelte-kit/src/site.css
@@ -1,55 +1,66 @@
 /* @import "prismjs/themes/prism"; */
-@import "prismjs/themes/prism-tomorrow";
-@import "@shikijs/twoslash/style-rich.css";
+@import 'prismjs/themes/prism-tomorrow';
+@import '@shikijs/twoslash/style-rich.css';
 
 .twoslash .twoslash-popup-container {
-  transform: translateY(2em);
-  white-space: pre-wrap;
+	transform: translateY(2em);
+	white-space: pre-wrap;
+	margin-right: 32px;
+}
+
+.twoslash .twoslash-error > span:not(.twoslash-popup-container):not(:has(*)) {
+	/*
+	Since elements with no content have a width of zero and no wavy line is displayed,
+	we specify a minimum width to display the wavy line.
+	e.g. https://sveltejs.github.io/eslint-plugin-svelte/rules/html-closing-bracket-new-line/
+	*/
+	min-width: 6px;
+	display: inline-block;
 }
 
 /* theme */
 :root {
-  --primary-color: #ffffff;
-  --secondary-color: #676778;
-  --tertiary-color: #edf0f8;
-  --background-without-opacity: rgba(255, 255, 255, 0.95);
+	--primary-color: #ffffff;
+	--secondary-color: #676778;
+	--tertiary-color: #edf0f8;
+	--background-without-opacity: rgba(255, 255, 255, 0.95);
 }
 
 /*** markdown ***/
 
 :not(pre) > code {
-  padding: 0.1rem 0.4rem 0;
-  margin: 0 0.2rem;
-  background: #e5eef5;
-  position: relative;
-  border-radius: 0.3em;
-  white-space: nowrap;
-  color: #444;
-  -webkit-font-smoothing: initial;
+	padding: 0.1rem 0.4rem 0;
+	margin: 0 0.2rem;
+	background: #e5eef5;
+	position: relative;
+	border-radius: 0.3em;
+	white-space: nowrap;
+	color: #444;
+	-webkit-font-smoothing: initial;
 }
 
 blockquote {
-  padding: 1rem;
-  color: #09f;
-  border: 1px solid #40b3ff;
-  margin: 1.6rem 2.4rem 2.4rem;
-  padding: 0.5rem 2.4rem;
-  border-radius: 0.4rem;
+	padding: 1rem;
+	color: #09f;
+	border: 1px solid #40b3ff;
+	margin: 1.6rem 2.4rem 2.4rem;
+	padding: 0.5rem 2.4rem;
+	border-radius: 0.4rem;
 }
 blockquote p {
-  color: #09f;
+	color: #09f;
 }
 
 table {
-  margin: 0 0 2em;
-  width: 100%;
-  font-size: var(--h5);
+	margin: 0 0 2em;
+	width: 100%;
+	font-size: var(--h5);
 }
 td,
 th {
-  text-align: left;
-  border-bottom: 1px solid rgba(0 0 0 / 0.1);
-  padding: 0.4rem 0.8rem 0.4rem 0;
+	text-align: left;
+	border-bottom: 1px solid rgba(0 0 0 / 0.1);
+	padding: 0.4rem 0.8rem 0.4rem 0;
 }
 
 /* header */
@@ -58,89 +69,89 @@ h3,
 h4,
 h5,
 h6 {
-  font-weight: 400;
-  color: var(--heading-color);
+	font-weight: 400;
+	color: var(--heading-color);
 }
 
 h2 {
-  font-size: 1.2rem;
+	font-size: 1.2rem;
 }
 h3,
 h4,
 h5,
 h6 {
-  font-size: 1rem;
+	font-size: 1rem;
 }
 
 /*** custom container ***/
 
 .custom-block .custom-block-title {
-  font-weight: 600;
-  margin-bottom: -0.4rem;
+	font-weight: 600;
+	margin-bottom: -0.4rem;
 }
 
 .custom-block.danger,
 .custom-block.tip,
 .custom-block.warning {
-  padding: 0.1rem 1.5rem;
-  border-left-width: 4px;
-  border-left-style: solid;
-  margin: 1rem 0;
+	padding: 0.1rem 1.5rem;
+	border-left-width: 4px;
+	border-left-style: solid;
+	margin: 1rem 0;
 }
 
 .custom-block.tip {
-  background-color: #f3f5f7;
-  border-color: #42b983;
+	background-color: #f3f5f7;
+	border-color: #42b983;
 }
 
 .custom-block.warning {
-  background-color: rgba(255, 229, 100, 0.3);
-  border-color: #e7c000;
-  color: #6b5900;
+	background-color: rgba(255, 229, 100, 0.3);
+	border-color: #e7c000;
+	color: #6b5900;
 }
 
 .custom-block.warning .custom-block-title {
-  color: #b29400;
+	color: #b29400;
 }
 
 .custom-block.warning a {
-  color: #2c3e50;
+	color: #2c3e50;
 }
 
 .custom-block.danger {
-  background-color: #ffe6e6;
-  border-color: #c00;
-  color: #4d0000;
+	background-color: #ffe6e6;
+	border-color: #c00;
+	color: #4d0000;
 }
 
 .custom-block.danger .custom-block-title {
-  color: #900;
+	color: #900;
 }
 
 .custom-block.danger a {
-  color: #2c3e50;
+	color: #2c3e50;
 }
 
 .custom-block.details {
-  display: block;
-  position: relative;
-  border-radius: 2px;
-  margin: 1.6em 0;
-  padding: 1.6em;
-  background-color: #eee;
+	display: block;
+	position: relative;
+	border-radius: 2px;
+	margin: 1.6em 0;
+	padding: 1.6em;
+	background-color: #eee;
 }
 
 .custom-block.details h4 {
-  margin-top: 0;
+	margin-top: 0;
 }
 
 .custom-block.details figure:last-child,
 .custom-block.details p:last-child {
-  margin-bottom: 0;
-  padding-bottom: 0;
+	margin-bottom: 0;
+	padding-bottom: 0;
 }
 
 .custom-block.details summary {
-  outline: none;
-  cursor: pointer;
+	outline: none;
+	cursor: pointer;
 }
diff --git a/docs-svelte-kit/tools/vite-plugin-svelte-md-option.mts b/docs-svelte-kit/tools/vite-plugin-svelte-md-option.mts
index 7bb2b61..c2e2793 100644
--- a/docs-svelte-kit/tools/vite-plugin-svelte-md-option.mts
+++ b/docs-svelte-kit/tools/vite-plugin-svelte-md-option.mts
@@ -9,9 +9,12 @@ import containerPluginOption from './markdown-it-container-option.mjs';
 import slugify from '@sindresorhus/slugify';
 import type { Options } from 'vite-plugin-svelte-md';
 import { createTwoslasher as createTwoslasherESLint } from 'twoslash-eslint';
+import { type TwoslashGenericFunction } from 'twoslash-protocol';
 import Shiki from '@shikijs/markdown-it';
 import plugin from 'eslint-plugin-svelte';
 import { transformerTwoslash } from '@shikijs/twoslash';
+import tsParser from '@typescript-eslint/parser';
+import path from 'path';
 
 const shikiPlugin = await Shiki({
 	theme: 'dark-plus',
@@ -27,10 +30,33 @@ const shikiPlugin = await Shiki({
 			},
 			explicitTrigger: false,
 			// Pass the custom twoslasher
-			twoslasher: createTwoslasherESLint({
-				eslintConfig: [...plugin.configs['flat/base']],
-				includeDocs: false
-			}),
+			twoslasher: adjustTwoslasherESLint(
+				createTwoslasherESLint({
+					eslintConfig: [
+						...plugin.configs['flat/base'],
+						{
+							files: ['**/*.svelte'],
+							languageOptions: {
+								parserOptions: {
+									parser: {
+										ts: tsParser
+									}
+								}
+							},
+							settings: {
+								svelte: {
+									kit: {
+										files: {
+											routes: ''
+										}
+									}
+								}
+							}
+						}
+					],
+					includeDocs: false
+				})
+			),
 			rendererRich: {
 				errorRendering: 'hover'
 			}
@@ -38,6 +64,14 @@ const shikiPlugin = await Shiki({
 	]
 });
 
+function adjustTwoslasherESLint(base: TwoslashGenericFunction): TwoslashGenericFunction {
+	// Change the file name to `+page` to make the rules for Svelte Kit work.
+	return (code, file, options) => {
+		const filename = file?.includes('.') ? file : `+page.${file ?? 'ts'}`;
+		return base(code, path.join(process.cwd(), filename), options);
+	};
+}
+
 export default (options: { baseUrl: string; root: string }): Options => ({
 	wrapperClasses: [],
 	markdownItOptions: {
diff --git a/docs/rules.md b/docs/rules.md
index f6f5a9f..5e710c5 100644
--- a/docs/rules.md
+++ b/docs/rules.md
@@ -14,25 +14,24 @@ sidebarDepth: 0
 
 These rules relate to possible syntax or logic errors in Svelte code:
 
-| Rule ID                                                                                          | Description                                                                                                                            |                |
-| :----------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------- | :------------- |
-| [svelte/infinite-reactive-loop](./rules/infinite-reactive-loop.md)                               | Svelte runtime prevents calling the same reactive statement twice in a microtask. But between different microtask, it doesn't prevent. |                |
-| [svelte/no-dom-manipulating](./rules/no-dom-manipulating.md)                                     | disallow DOM manipulating                                                                                                              |                |
-| [svelte/no-dupe-else-if-blocks](./rules/no-dupe-else-if-blocks.md)                               | disallow duplicate conditions in `{#if}` / `{:else if}` chains                                                                         | :star:         |
-| [svelte/no-dupe-on-directives](./rules/no-dupe-on-directives.md)                                 | disallow duplicate `on:` directives                                                                                                    |                |
-| [svelte/no-dupe-style-properties](./rules/no-dupe-style-properties.md)                           | disallow duplicate style properties                                                                                                    | :star:         |
-| [svelte/no-dupe-use-directives](./rules/no-dupe-use-directives.md)                               | disallow duplicate `use:` directives                                                                                                   |                |
-| [svelte/no-dynamic-slot-name](./rules/no-dynamic-slot-name.md)                                   | disallow dynamic slot name                                                                                                             | :star::wrench: |
-| [svelte/no-not-function-handler](./rules/no-not-function-handler.md)                             | disallow use of not function in event handler                                                                                          | :star:         |
-| [svelte/no-object-in-text-mustaches](./rules/no-object-in-text-mustaches.md)                     | disallow objects in text mustache interpolation                                                                                        | :star:         |
-| [svelte/no-raw-special-elements](./rules/no-raw-special-elements.md)                             | Checks for invalid raw HTML elements                                                                                                   | :wrench:       |
-| [svelte/no-reactive-reassign](./rules/no-reactive-reassign.md)                                   | disallow reassigning reactive values                                                                                                   |                |
-| [svelte/no-shorthand-style-property-overrides](./rules/no-shorthand-style-property-overrides.md) | disallow shorthand style properties that override related longhand properties                                                          | :star:         |
-| [svelte/no-store-async](./rules/no-store-async.md)                                               | disallow using async/await inside svelte stores because it causes issues with the auto-unsubscribing features                          |                |
-| [svelte/no-unknown-style-directive-property](./rules/no-unknown-style-directive-property.md)     | disallow unknown `style:property`                                                                                                      | :star:         |
-| [svelte/require-store-callbacks-use-set-param](./rules/require-store-callbacks-use-set-param.md) | store callbacks must use `set` param                                                                                                   |                |
-| [svelte/require-store-reactive-access](./rules/require-store-reactive-access.md)                 | disallow to use of the store itself as an operand. Need to use $ prefix or get function.                                               | :wrench:       |
-| [svelte/valid-compile](./rules/valid-compile.md)                                                 | disallow warnings when compiling.                                                                                                      | :star:         |
+| Rule ID                                                                                          | Description                                                                                                                            |          |
+| :----------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------- | :------- |
+| [svelte/infinite-reactive-loop](./rules/infinite-reactive-loop.md)                               | Svelte runtime prevents calling the same reactive statement twice in a microtask. But between different microtask, it doesn't prevent. |          |
+| [svelte/no-dom-manipulating](./rules/no-dom-manipulating.md)                                     | disallow DOM manipulating                                                                                                              |          |
+| [svelte/no-dupe-else-if-blocks](./rules/no-dupe-else-if-blocks.md)                               | disallow duplicate conditions in `{#if}` / `{:else if}` chains                                                                         | :star:   |
+| [svelte/no-dupe-on-directives](./rules/no-dupe-on-directives.md)                                 | disallow duplicate `on:` directives                                                                                                    |          |
+| [svelte/no-dupe-style-properties](./rules/no-dupe-style-properties.md)                           | disallow duplicate style properties                                                                                                    | :star:   |
+| [svelte/no-dupe-use-directives](./rules/no-dupe-use-directives.md)                               | disallow duplicate `use:` directives                                                                                                   |          |
+| [svelte/no-not-function-handler](./rules/no-not-function-handler.md)                             | disallow use of not function in event handler                                                                                          | :star:   |
+| [svelte/no-object-in-text-mustaches](./rules/no-object-in-text-mustaches.md)                     | disallow objects in text mustache interpolation                                                                                        | :star:   |
+| [svelte/no-raw-special-elements](./rules/no-raw-special-elements.md)                             | Checks for invalid raw HTML elements                                                                                                   | :wrench: |
+| [svelte/no-reactive-reassign](./rules/no-reactive-reassign.md)                                   | disallow reassigning reactive values                                                                                                   |          |
+| [svelte/no-shorthand-style-property-overrides](./rules/no-shorthand-style-property-overrides.md) | disallow shorthand style properties that override related longhand properties                                                          | :star:   |
+| [svelte/no-store-async](./rules/no-store-async.md)                                               | disallow using async/await inside svelte stores because it causes issues with the auto-unsubscribing features                          |          |
+| [svelte/no-unknown-style-directive-property](./rules/no-unknown-style-directive-property.md)     | disallow unknown `style:property`                                                                                                      | :star:   |
+| [svelte/require-store-callbacks-use-set-param](./rules/require-store-callbacks-use-set-param.md) | store callbacks must use `set` param                                                                                                   |          |
+| [svelte/require-store-reactive-access](./rules/require-store-reactive-access.md)                 | disallow to use of the store itself as an operand. Need to use $ prefix or get function.                                               | :wrench: |
+| [svelte/valid-compile](./rules/valid-compile.md)                                                 | disallow warnings when compiling.                                                                                                      | :star:   |
 
 ## Security Vulnerability
 
@@ -142,4 +141,5 @@ These rules relate to this plugin works:
 | Rule ID                                                                                                      | Replaced by                                                                |
 | :----------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------- |
 | [svelte/@typescript-eslint/no-unnecessary-condition](./rules/@typescript-eslint/no-unnecessary-condition.md) | This rule is no longer needed when using svelte-eslint-parser>=v0.19.0.    |
+| [svelte/no-dynamic-slot-name](./rules/no-dynamic-slot-name.md)                                               | Now Svelte compiler itself throws an compile error.                        |
 | [svelte/no-goto-without-base](./rules/no-goto-without-base.md)                                               | [svelte/no-navigation-without-base](./rules/no-navigation-without-base.md) |
diff --git a/docs/rules/no-dynamic-slot-name.md b/docs/rules/no-dynamic-slot-name.md
index f9a84df..805e5e9 100644
--- a/docs/rules/no-dynamic-slot-name.md
+++ b/docs/rules/no-dynamic-slot-name.md
@@ -10,7 +10,7 @@ since: 'v0.14.0'
 
 > disallow dynamic slot name
 
-- :gear: This rule is included in `"plugin:svelte/recommended"`.
+- :warning: This rule was **deprecated**. Now Svelte compiler itself throws an compile error.
 - :wrench: The `--fix` option on the [command line](https://eslint.org/docs/user-guide/command-line-interface#fixing-problems) can automatically fix some of the problems reported by this rule.
 
 ## :book: Rule Details
diff --git a/docs/rules/no-export-load-in-svelte-module-in-kit-pages.md b/docs/rules/no-export-load-in-svelte-module-in-kit-pages.md
index 654bde4..45bf702 100644
--- a/docs/rules/no-export-load-in-svelte-module-in-kit-pages.md
+++ b/docs/rules/no-export-load-in-svelte-module-in-kit-pages.md
@@ -16,20 +16,6 @@ This rule reports unexpected exported `load` function at `<script context="modul
 At SvelteKit v1.0.0-next.405, `load` function has been moved into a separate file — `+page.js` for pages, `+layout.js` for layouts.
 And the API has changed.
 
-<script>
-  const config = {
-    settings: {
-      svelte: {
-        kit: {
-          files: {
-            routes: "",
-          },
-        },
-      },
-    },
-  }
-</script>
-
 <!--eslint-skip-->
 
 ```svelte
diff --git a/docs/rules/no-inner-declarations.md b/docs/rules/no-inner-declarations.md
index ee1e0e5..43d69f2 100644
--- a/docs/rules/no-inner-declarations.md
+++ b/docs/rules/no-inner-declarations.md
@@ -25,7 +25,7 @@ This rule supports [svelte-eslint-parser]'s AST.
 
 ```svelte
 <script>
-  /* eslint svelte/no-inner-declarations: "error" */
+  /* eslint svelte/no-inner-declarations: ["error", "functions", { blockScopedFunctions: "disallow" }] */
 
   /* ✓ GOOD */
   function doSomething() {}
@@ -47,7 +47,8 @@ This rule supports [svelte-eslint-parser]'s AST.
 {
   "svelte/no-inner-declarations": [
     "error",
-    "functions" // or "both"
+    "functions", // or "both"
+    { "blockScopedFunctions": "allow" }
   ]
 }
 ```
diff --git a/docs/rules/no-not-function-handler.md b/docs/rules/no-not-function-handler.md
index 3162a42..c1736a0 100644
--- a/docs/rules/no-not-function-handler.md
+++ b/docs/rules/no-not-function-handler.md
@@ -29,16 +29,16 @@ If you use a non-function value for the event handler, it event handler will not
 </script>
 
 <!-- ✓ GOOD -->
-<button on:click={foo} />
+<button onclick={foo} />
 <button
-  on:click={() => {
+  onclick={() => {
     /*  */
   }}
 />
 
 <!-- ✗ BAD -->
-<button on:click={{ foo }} />
-<button on:click={bar} />
+<button onclick={{ foo }} />
+<button onclick={bar} />
 ```
 
 ## :wrench: Options
diff --git a/docs/rules/valid-prop-names-in-kit-pages.md b/docs/rules/valid-prop-names-in-kit-pages.md
index 2043bb6..0400848 100644
--- a/docs/rules/valid-prop-names-in-kit-pages.md
+++ b/docs/rules/valid-prop-names-in-kit-pages.md
@@ -15,17 +15,6 @@ since: 'v2.12.0'
 This rule reports unexpected exported variables at `<script>`.<br>
 At SvelteKit v1.0.0-next.405, instead of having multiple props corresponding to the props returned from a load function, page components now have a single data prop.
 
-<script>
-  const config = {settings: {
-    kit: {
-      files: {
-        routes: "",
-      },
-    },
-  },
-  }
-</script>
-
 <!--eslint-skip-->
 
 ```svelte
diff --git a/packages/eslint-plugin-svelte/src/configs/flat/recommended.ts b/packages/eslint-plugin-svelte/src/configs/flat/recommended.ts
index 5e3110e..278704d 100644
--- a/packages/eslint-plugin-svelte/src/configs/flat/recommended.ts
+++ b/packages/eslint-plugin-svelte/src/configs/flat/recommended.ts
@@ -14,7 +14,6 @@ const config: Linter.Config[] = [
 			'svelte/no-at-html-tags': 'error',
 			'svelte/no-dupe-else-if-blocks': 'error',
 			'svelte/no-dupe-style-properties': 'error',
-			'svelte/no-dynamic-slot-name': 'error',
 			'svelte/no-inner-declarations': 'error',
 			'svelte/no-not-function-handler': 'error',
 			'svelte/no-object-in-text-mustaches': 'error',
diff --git a/packages/eslint-plugin-svelte/src/rule-types.ts b/packages/eslint-plugin-svelte/src/rule-types.ts
index 3b3e4ea..30f15c1 100644
--- a/packages/eslint-plugin-svelte/src/rule-types.ts
+++ b/packages/eslint-plugin-svelte/src/rule-types.ts
@@ -137,6 +137,7 @@ export interface RuleOptions {
   /**
    * disallow dynamic slot name
    * @see https://sveltejs.github.io/eslint-plugin-svelte/rules/no-dynamic-slot-name/
+   * @deprecated
    */
   'svelte/no-dynamic-slot-name'?: Linter.RuleEntry<[]>
   /**
diff --git a/packages/eslint-plugin-svelte/src/rules/no-dynamic-slot-name.ts b/packages/eslint-plugin-svelte/src/rules/no-dynamic-slot-name.ts
index 7b266be..bb30f0f 100644
--- a/packages/eslint-plugin-svelte/src/rules/no-dynamic-slot-name.ts
+++ b/packages/eslint-plugin-svelte/src/rules/no-dynamic-slot-name.ts
@@ -13,15 +13,19 @@ export default createRule('no-dynamic-slot-name', {
 		docs: {
 			description: 'disallow dynamic slot name',
 			category: 'Possible Errors',
-			recommended: true
+			recommended: false
 		},
 		fixable: 'code',
+		deprecated: true,
 		schema: [],
 		messages: {
 			unexpected: '`<slot>` name cannot be dynamic.',
 			requireValue: '`<slot>` name requires a value.'
 		},
-		type: 'problem'
+		type: 'problem',
+		replacedBy: {
+			note: 'Now Svelte compiler itself throws an compile error.'
+		}
 	},
 	create(context) {
 		const sourceCode = getSourceCode(context);
diff --git a/packages/eslint-plugin-svelte/src/rules/no-not-function-handler.ts b/packages/eslint-plugin-svelte/src/rules/no-not-function-handler.ts
index 7b46c3d..84394c7 100644
--- a/packages/eslint-plugin-svelte/src/rules/no-not-function-handler.ts
+++ b/packages/eslint-plugin-svelte/src/rules/no-not-function-handler.ts
@@ -2,6 +2,7 @@ import type { AST } from 'svelte-eslint-parser';
 import type { TSESTree } from '@typescript-eslint/types';
 import { createRule } from '../utils/index.js';
 import { findVariable } from '../utils/ast-utils.js';
+import { EVENT_NAMES } from '../utils/events.js';
 
 const PHRASES = {
 	ObjectExpression: 'object',
@@ -95,6 +96,18 @@ export default createRule('no-not-function-handler', {
 					return;
 				}
 				verify(node.expression);
+			},
+			SvelteAttribute(node) {
+				if (node.key.type === 'SvelteName' && EVENT_NAMES.includes(node.key.name)) {
+					const { value } = node;
+					if (Array.isArray(value)) {
+						for (const v of value) {
+							if (v.type === 'SvelteMustacheTag') {
+								verify(v.expression);
+							}
+						}
+					}
+				}
 			}
 		};
 	}
diff --git a/packages/eslint-plugin-svelte/src/rules/valid-compile.ts b/packages/eslint-plugin-svelte/src/rules/valid-compile.ts
index 21203a5..178fe3b 100644
--- a/packages/eslint-plugin-svelte/src/rules/valid-compile.ts
+++ b/packages/eslint-plugin-svelte/src/rules/valid-compile.ts
@@ -4,13 +4,7 @@ import { getSvelteCompileWarnings } from '../shared/svelte-compile-warns/index.j
 import { getSourceCode } from '../utils/compat.js';
 import type { Position } from 'svelte-eslint-parser/lib/ast/common.js';
 
-const ignores: string[] = [
-	'missing-declaration',
-	// Svelte v4
-	'dynamic-slot-name',
-	// Svelte v5
-	'invalid-slot-name'
-] as const;
+const ignores: string[] = ['missing-declaration'] as const;
 
 const unusedSelectorWarnings: string[] = ['css_unused_selector', 'css-unused-selector'] as const;
 
diff --git a/packages/eslint-plugin-svelte/src/utils/events.ts b/packages/eslint-plugin-svelte/src/utils/events.ts
new file mode 100644
index 0000000..d9950db
--- /dev/null
+++ b/packages/eslint-plugin-svelte/src/utils/events.ts
@@ -0,0 +1,369 @@
+// see: https://github.com/sveltejs/svelte/blob/a129592e5b248a734a68da6e9028941803a3d063/packages/svelte/elements.d.ts#L83
+export const EVENT_NAMES: string[] = [
+	// Clipboard Events
+	'on:copy',
+	'oncopy',
+	'oncopycapture',
+	'on:cut',
+	'oncut',
+	'oncutcapture',
+	'on:paste',
+	'onpaste',
+	'onpastecapture',
+
+	// Composition Events
+	'on:compositionend',
+	'oncompositionend',
+	'oncompositionendcapture',
+	'on:compositionstart',
+	'oncompositionstart',
+	'oncompositionstartcapture',
+	'on:compositionupdate',
+	'oncompositionupdate',
+	'oncompositionupdatecapture',
+
+	// Focus Events
+	'on:focus',
+	'onfocus',
+	'onfocuscapture',
+	'on:focusin',
+	'onfocusin',
+	'onfocusincapture',
+	'on:focusout',
+	'onfocusout',
+	'onfocusoutcapture',
+	'on:blur',
+	'onblur',
+	'onblurcapture',
+
+	// Form Events
+	'on:change',
+	'onchange',
+	'onchangecapture',
+	'on:beforeinput',
+	'onbeforeinput',
+	'onbeforeinputcapture',
+	// oninput can be either an InputEvent or an Event, depending on the target element (input, textarea etc).
+	'on:input',
+	'oninput',
+	'oninputcapture',
+	'on:reset',
+	'onreset',
+	'onresetcapture',
+	'on:submit',
+	'onsubmit',
+	'onsubmitcapture',
+	'on:invalid',
+	'oninvalid',
+	'oninvalidcapture',
+	'on:formdata',
+	'onformdata',
+	'onformdatacapture',
+
+	// Image Events
+	'on:load',
+	'onload',
+	'onloadcapture',
+	'on:error',
+	'onerror',
+	'onerrorcapture',
+
+	// Popover Events
+	'on:beforetoggle',
+	'onbeforetoggle',
+	'onbeforetogglecapture',
+	'on:toggle',
+	'ontoggle',
+	'ontogglecapture',
+
+	// Content visibility Events
+	'on:contentvisibilityautostatechange',
+	'oncontentvisibilityautostatechange',
+	'oncontentvisibilityautostatechangecapture',
+	// Keyboard Events
+	'on:keydown',
+	'onkeydown',
+	'onkeydowncapture',
+	'on:keypress',
+	'onkeypress',
+	'onkeypresscapture',
+	'on:keyup',
+	'onkeyup',
+	'onkeyupcapture',
+
+	// Media Events
+	'on:abort',
+	'onabort',
+	'onabortcapture',
+	'on:canplay',
+	'oncanplay',
+	'oncanplaycapture',
+	'on:canplaythrough',
+	'oncanplaythrough',
+	'oncanplaythroughcapture',
+	'on:cuechange',
+	'oncuechange',
+	'oncuechangecapture',
+	'on:durationchange',
+	'ondurationchange',
+	'ondurationchangecapture',
+	'on:emptied',
+	'onemptied',
+	'onemptiedcapture',
+	'on:encrypted',
+	'onencrypted',
+	'onencryptedcapture',
+	'on:ended',
+	'onended',
+	'onendedcapture',
+	'on:loadeddata',
+	'onloadeddata',
+	'onloadeddatacapture',
+	'on:loadedmetadata',
+	'onloadedmetadata',
+	'onloadedmetadatacapture',
+	'on:loadstart',
+	'onloadstart',
+	'onloadstartcapture',
+	'on:pause',
+	'onpause',
+	'onpausecapture',
+	'on:play',
+	'onplay',
+	'onplaycapture',
+	'on:playing',
+	'onplaying',
+	'onplayingcapture',
+	'on:progress',
+	'onprogress',
+	'onprogresscapture',
+	'on:ratechange',
+	'onratechange',
+	'onratechangecapture',
+	'on:seeked',
+	'onseeked',
+	'onseekedcapture',
+	'on:seeking',
+	'onseeking',
+	'onseekingcapture',
+	'on:stalled',
+	'onstalled',
+	'onstalledcapture',
+	'on:suspend',
+	'onsuspend',
+	'onsuspendcapture',
+	'on:timeupdate',
+	'ontimeupdate',
+	'ontimeupdatecapture',
+	'on:volumechange',
+	'onvolumechange',
+	'onvolumechangecapture',
+	'on:waiting',
+	'onwaiting',
+	'onwaitingcapture',
+
+	// MouseEvents
+	'on:auxclick',
+	'onauxclick',
+	'onauxclickcapture',
+	'on:click',
+	'onclick',
+	'onclickcapture',
+	'on:contextmenu',
+	'oncontextmenu',
+	'oncontextmenucapture',
+	'on:dblclick',
+	'ondblclick',
+	'ondblclickcapture',
+	'on:drag',
+	'ondrag',
+	'ondragcapture',
+	'on:dragend',
+	'ondragend',
+	'ondragendcapture',
+	'on:dragenter',
+	'ondragenter',
+	'ondragentercapture',
+	'on:dragexit',
+	'ondragexit',
+	'ondragexitcapture',
+	'on:dragleave',
+	'ondragleave',
+	'ondragleavecapture',
+	'on:dragover',
+	'ondragover',
+	'ondragovercapture',
+	'on:dragstart',
+	'ondragstart',
+	'ondragstartcapture',
+	'on:drop',
+	'ondrop',
+	'ondropcapture',
+	'on:mousedown',
+	'onmousedown',
+	'onmousedowncapture',
+	'on:mouseenter',
+	'onmouseenter',
+	'on:mouseleave',
+	'onmouseleave',
+	'on:mousemove',
+	'onmousemove',
+	'onmousemovecapture',
+	'on:mouseout',
+	'onmouseout',
+	'onmouseoutcapture',
+	'on:mouseover',
+	'onmouseover',
+	'onmouseovercapture',
+	'on:mouseup',
+	'onmouseup',
+	'onmouseupcapture',
+
+	// Selection Events
+	'on:select',
+	'onselect',
+	'onselectcapture',
+	'on:selectionchange',
+	'onselectionchange',
+	'onselectionchangecapture',
+	'on:selectstart',
+	'onselectstart',
+	'onselectstartcapture',
+
+	// Touch Events
+	'on:touchcancel',
+	'ontouchcancel',
+	'ontouchcancelcapture',
+	'on:touchend',
+	'ontouchend',
+	'ontouchendcapture',
+	'on:touchmove',
+	'ontouchmove',
+	'ontouchmovecapture',
+	'on:touchstart',
+	'ontouchstart',
+	'ontouchstartcapture',
+
+	// Pointer Events
+	'on:gotpointercapture',
+	'ongotpointercapture',
+	'ongotpointercapturecapture',
+	'on:pointercancel',
+	'onpointercancel',
+	'onpointercancelcapture',
+	'on:pointerdown',
+	'onpointerdown',
+	'onpointerdowncapture',
+	'on:pointerenter',
+	'onpointerenter',
+	'onpointerentercapture',
+	'on:pointerleave',
+	'onpointerleave',
+	'onpointerleavecapture',
+	'on:pointermove',
+	'onpointermove',
+	'onpointermovecapture',
+	'on:pointerout',
+	'onpointerout',
+	'onpointeroutcapture',
+	'on:pointerover',
+	'onpointerover',
+	'onpointerovercapture',
+	'on:pointerup',
+	'onpointerup',
+	'onpointerupcapture',
+	'on:lostpointercapture',
+	'onlostpointercapture',
+	'onlostpointercapturecapture',
+
+	// Gamepad Events
+	'on:gamepadconnected',
+	'ongamepadconnected',
+	'on:gamepaddisconnected',
+	'ongamepaddisconnected',
+
+	// UI Events
+	'on:scroll',
+	'onscroll',
+	'onscrollcapture',
+	'on:scrollend',
+	'onscrollend',
+	'onscrollendcapture',
+	'on:resize',
+	'onresize',
+	'onresizecapture',
+
+	// Wheel Events
+	'on:wheel',
+	'onwheel',
+	'onwheelcapture',
+
+	// Animation Events
+	'on:animationstart',
+	'onanimationstart',
+	'onanimationstartcapture',
+	'on:animationend',
+	'onanimationend',
+	'onanimationendcapture',
+	'on:animationiteration',
+	'onanimationiteration',
+	'onanimationiterationcapture',
+
+	// Transition Events
+	'on:transitionstart',
+	'ontransitionstart',
+	'ontransitionstartcapture',
+	'on:transitionrun',
+	'ontransitionrun',
+	'ontransitionruncapture',
+	'on:transitionend',
+	'ontransitionend',
+	'ontransitionendcapture',
+	'on:transitioncancel',
+	'ontransitioncancel',
+	'ontransitioncancelcapture',
+
+	// Svelte Transition Events
+	'on:outrostart',
+	'onoutrostart',
+	'onoutrostartcapture',
+	'on:outroend',
+	'onoutroend',
+	'onoutroendcapture',
+	'on:introstart',
+	'onintrostart',
+	'onintrostartcapture',
+	'on:introend',
+	'onintroend',
+	'onintroendcapture',
+
+	// Message Events
+	'on:message',
+	'onmessage',
+	'onmessagecapture',
+	'on:messageerror',
+	'onmessageerror',
+	'onmessageerrorcapture',
+
+	// Document Events
+	'on:visibilitychange',
+	'onvisibilitychange',
+	'onvisibilitychangecapture',
+
+	// Global Events
+	'on:beforematch',
+	'onbeforematch',
+	'onbeforematchcapture',
+	'on:cancel',
+	'oncancel',
+	'oncancelcapture',
+	'on:close',
+	'onclose',
+	'onclosecapture',
+	'on:fullscreenchange',
+	'onfullscreenchange',
+	'onfullscreenchangecapture',
+	'on:fullscreenerror',
+	'onfullscreenerror',
+	'onfullscreenerrorcapture'
+] as const;


Test patch:
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/array01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/array01-errors.yaml
new file mode 100644
index 0000000..4b8f175
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/array01-errors.yaml
@@ -0,0 +1,4 @@
+- message: Unexpected array in event handler.
+  line: 5
+  column: 18
+  suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/array01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/array01-input.svelte
new file mode 100644
index 0000000..215e452
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/array01-input.svelte
@@ -0,0 +1,5 @@
+<script>
+	const a = 'hello!';
+</script>
+
+<button onclick={[a]} />
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/class01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/class01-errors.yaml
new file mode 100644
index 0000000..46687e7
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/class01-errors.yaml
@@ -0,0 +1,4 @@
+- message: Unexpected class in event handler.
+  line: 4
+  column: 18
+  suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/class01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/class01-input.svelte
new file mode 100644
index 0000000..c62acc7
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/class01-input.svelte
@@ -0,0 +1,4 @@
+<script>
+</script>
+
+<button onclick={class B {}} />
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/object01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/object01-errors.yaml
new file mode 100644
index 0000000..b67b8ca
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/object01-errors.yaml
@@ -0,0 +1,4 @@
+- message: Unexpected object in event handler.
+  line: 5
+  column: 18
+  suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/object01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/object01-input.svelte
new file mode 100644
index 0000000..6bab426
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/object01-input.svelte
@@ -0,0 +1,5 @@
+<script>
+	function fn() {}
+</script>
+
+<button onclick={{ fn }} />
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/requirements.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/requirements.json
new file mode 100644
index 0000000..1a22bef
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/requirements.json
@@ -0,0 +1,3 @@
+{
+	"svelte": "^5.0.0"
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/string01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/string01-errors.yaml
new file mode 100644
index 0000000..81b1219
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/string01-errors.yaml
@@ -0,0 +1,8 @@
+- message: Unexpected string value in event handler.
+  line: 6
+  column: 18
+  suggestions: null
+- message: Unexpected string value in event handler.
+  line: 7
+  column: 18
+  suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/string01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/string01-input.svelte
new file mode 100644
index 0000000..01a8dfb
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/string01-input.svelte
@@ -0,0 +1,7 @@
+<script>
+	const a = 'hello!';
+	const b = `${a} world`;
+</script>
+
+<button onclick={a} />
+<button onclick={b} />
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/value01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/value01-errors.yaml
new file mode 100644
index 0000000..f6f646a
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/value01-errors.yaml
@@ -0,0 +1,12 @@
+- message: Unexpected number value in event handler.
+  line: 7
+  column: 18
+  suggestions: null
+- message: Unexpected bigint value in event handler.
+  line: 8
+  column: 18
+  suggestions: null
+- message: Unexpected regex value in event handler.
+  line: 9
+  column: 18
+  suggestions: null
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/value01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/value01-input.svelte
new file mode 100644
index 0000000..56a57dc
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/invalid/svelte5/value01-input.svelte
@@ -0,0 +1,9 @@
+<script>
+	const a = 42;
+	const b = 42n;
+	const c = /reg/;
+</script>
+
+<button onclick={a} />
+<button onclick={b} />
+<button onclick={c} />
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/valid/svelte5/function01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/valid/svelte5/function01-input.svelte
new file mode 100644
index 0000000..090905b
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/valid/svelte5/function01-input.svelte
@@ -0,0 +1,7 @@
+<script>
+	let a = 'hello!';
+	function fn() {}
+</script>
+
+<button onclick={() => a} />
+<button onclick={fn} />
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/valid/svelte5/null01-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/valid/svelte5/null01-input.svelte
new file mode 100644
index 0000000..e68461e
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/valid/svelte5/null01-input.svelte
@@ -0,0 +1,6 @@
+<script>
+	let a = null;
+</script>
+
+<button onclick={null} />
+<button onclick={a} />
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/valid/svelte5/requirements.json b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/valid/svelte5/requirements.json
new file mode 100644
index 0000000..1a22bef
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-not-function-handler/valid/svelte5/requirements.json
@@ -0,0 +1,3 @@
+{
+	"svelte": "^5.0.0"
+}
diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/dyamic-slot01-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/dyamic-slot01-errors.yaml
new file mode 100644
index 0000000..58aef47
--- /dev/null
+++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/valid-compile/invalid/dyamic-slot01-errors.yaml
@@ -0,0 +1,4 @@
+- message: <slot> name cannot be dynamic(dynamic-slot-name)
+  line: 5
+  column: 7
+  suggestions: null