diff --git a/.changeset/public-spiders-glow.md b/.changeset/public-spiders-glow.md
new file mode 100644
index 000000000000..55ba3c0dd425
--- /dev/null
+++ b/.changeset/public-spiders-glow.md
@@ -0,0 +1,5 @@
+---
+"@biomejs/biome": patch
+---
+
+Fixed [#7981](https://github.com/biomejs/biome/issues/7981). Now Biome correctly detects and parses `lang='tsx'` and `lang='jsx'` languages when used inside in `.vue` files, when `.experimentalFullSupportEnabled` is enabled.
diff --git a/crates/biome_cli/tests/cases/handle_vue_files.rs b/crates/biome_cli/tests/cases/handle_vue_files.rs
index 1c98fb509f9a..aa7c97bb38b6 100644
--- a/crates/biome_cli/tests/cases/handle_vue_files.rs
+++ b/crates/biome_cli/tests/cases/handle_vue_files.rs
@@ -568,6 +568,121 @@ const props: Props = { title: "Hello" };
));
}
+#[test]
+fn full_support_tsx() {
+ let fs = MemoryFileSystem::default();
+ let mut console = BufferConsole::default();
+
+ fs.insert(
+ "biome.json".into(),
+ r#"{ "html": { "formatter": {"enabled": true}, "linter": {"enabled": true}, "experimentalFullSupportEnabled": true } }"#.as_bytes(),
+ );
+
+ let vue_file_path = Utf8Path::new("file.vue");
+ fs.insert(
+ vue_file_path.into(),
+ r#"
+
+
+
+
+
+
+"#
+ .as_bytes(),
+ );
+
+ let (fs, result) = run_cli(
+ fs,
+ &mut console,
+ Args::from(["check", "--write", "--unsafe", vue_file_path.as_str()].as_slice()),
+ );
+
+ assert!(result.is_ok(), "run_cli returned {result:?}");
+
+ assert_cli_snapshot(SnapshotPayload::new(
+ module_path!(),
+ "full_support_tsx",
+ fs,
+ console,
+ result,
+ ));
+}
+
+#[test]
+fn full_support_jsx() {
+ let fs = MemoryFileSystem::default();
+ let mut console = BufferConsole::default();
+
+ fs.insert(
+ "biome.json".into(),
+ r#"{ "html": { "formatter": {"enabled": true}, "linter": {"enabled": true}, "experimentalFullSupportEnabled": true } }"#.as_bytes(),
+ );
+
+ let vue_file_path = Utf8Path::new("file.vue");
+ fs.insert(
+ vue_file_path.into(),
+ r#"
+
+
+
+
+
+
+"#
+ .as_bytes(),
+ );
+
+ let (fs, result) = run_cli(
+ fs,
+ &mut console,
+ Args::from(["check", "--write", "--unsafe", vue_file_path.as_str()].as_slice()),
+ );
+
+ assert!(result.is_ok(), "run_cli returned {result:?}");
+
+ assert_cli_snapshot(SnapshotPayload::new(
+ module_path!(),
+ "full_support_jsx",
+ fs,
+ console,
+ result,
+ ));
+}
+
#[test]
fn format_stdin_successfully() {
let fs = MemoryFileSystem::default();
diff --git a/crates/biome_cli/tests/snapshots/main_cases_handle_vue_files/full_support_jsx.snap b/crates/biome_cli/tests/snapshots/main_cases_handle_vue_files/full_support_jsx.snap
new file mode 100644
index 000000000000..72a47fbde2c9
--- /dev/null
+++ b/crates/biome_cli/tests/snapshots/main_cases_handle_vue_files/full_support_jsx.snap
@@ -0,0 +1,48 @@
+---
+source: crates/biome_cli/tests/snap_test.rs
+expression: redactor(content)
+---
+## `biome.json`
+
+```json
+{
+ "html": {
+ "formatter": { "enabled": true },
+ "linter": { "enabled": true },
+ "experimentalFullSupportEnabled": true
+ }
+}
+```
+
+## `file.vue`
+
+```vue
+
+
+
+
+
+
+
+
+```
+
+# Emitted Messages
+
+```block
+Checked 1 file in