JSX Unterminated Error Fix
2025-06-012 turns8,762 charsgpt-4-1-mini
Summary
User encountered an unterminated JSX contents error in a React component while using Vite and needed help fixing the syntax issue.
Messages
[plugin:vite:react-babel] /Users/danielkliewer/obj01/frontend/src/components/SummaryCard.tsx: Unterminated JSX contents. (140:14)
143 | };
/Users/danielkliewer/obj01/frontend/src/components/SummaryCard.tsx:140:14
138| opacity-0 group-hover:opacity-100
139| transition-opacity duration-500 blur-sm -z-10" />
140| </article>
| ^
141|
142| );
at constructor (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:363:19)
at TypeScriptParserMixin.raise (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:6609:19)
at TypeScriptParserMixin.jsxReadToken (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:4460:20)
at TypeScriptParserMixin.getTokenFromCode (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:4786:12)
at TypeScriptParserMixin.getTokenFromCode (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:9930:11)
at TypeScriptParserMixin.nextToken (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:5792:10)
at TypeScriptParserMixin.next (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:5702:10)
at TypeScriptParserMixin.eat (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:5706:12)
at TypeScriptParserMixin.expect (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:6909:15)
at TypeScriptParserMixin.jsxParseClosingElementAt (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:4692:10)
at TypeScriptParserMixin.jsxParseElementAt (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:4707:37)
at TypeScriptParserMixin.jsxParseElementAt (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:4710:32)
at TypeScriptParserMixin.jsxParseElement (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:4761:17)
at TypeScriptParserMixin.parseExprAtom (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:4771:19)
at TypeScriptParserMixin.parseExprSubscripts (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10996:23)
at TypeScriptParserMixin.parseUpdate (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10981:21)
at TypeScriptParserMixin.parseMaybeUnary (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10961:23)
at TypeScriptParserMixin.parseMaybeUnary (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:9778:18)
at TypeScriptParserMixin.parseMaybeUnaryOrPrivate (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10814:61)
at TypeScriptParserMixin.parseExprOps (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10819:23)
at TypeScriptParserMixin.parseMaybeConditional (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10796:23)
at TypeScriptParserMixin.parseMaybeAssign (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10749:21)
at /Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:9716:39
at TypeScriptParserMixin.tryParse (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:6918:20)
at TypeScriptParserMixin.parseMaybeAssign (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:9716:18)
at /Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10718:39
at TypeScriptParserMixin.allowInAnd (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:12345:12)
at TypeScriptParserMixin.parseMaybeAssignAllowIn (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10718:17)
at TypeScriptParserMixin.parseParenAndDistinguishExpression (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:11592:28)
at TypeScriptParserMixin.parseExprAtom (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:11246:23)
at TypeScriptParserMixin.parseExprAtom (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:4776:20)
at TypeScriptParserMixin.parseExprSubscripts (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10996:23)
at TypeScriptParserMixin.parseUpdate (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10981:21)
at TypeScriptParserMixin.parseMaybeUnary (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10961:23)
at TypeScriptParserMixin.parseMaybeUnary (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:9778:18)
at TypeScriptParserMixin.parseMaybeUnaryOrPrivate (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10814:61)
at TypeScriptParserMixin.parseExprOps (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10819:23)
at TypeScriptParserMixin.parseMaybeConditional (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10796:23)
at TypeScriptParserMixin.parseMaybeAssign (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10749:21)
at TypeScriptParserMixin.parseMaybeAssign (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:9727:20)
at TypeScriptParserMixin.parseExpressionBase (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10702:23)
at /Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10698:39
at TypeScriptParserMixin.allowInAnd (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:12340:16)
at TypeScriptParserMixin.parseExpression (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:10698:17)
at TypeScriptParserMixin.parseReturnStatement (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:13034:28)
at TypeScriptParserMixin.parseStatementContent (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:12689:21)
at TypeScriptParserMixin.parseStatementContent (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:9453:18)
at TypeScriptParserMixin.parseStatementLike (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:12658:17)
at TypeScriptParserMixin.parseStatementListItem (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:12638:17)
at TypeScriptParserMixin.parseBlockOrModuleBlockBody (/Users/danielkliewer/obj01/frontend/node_modules/@babel/parser/lib/index.js:13208:61
Click outside, press Esc key, or fix the code to dismiss.
You can also disable this overlay by setting server.hmr.overlay to false in vite.config.ts.
The error `Unterminated JSX contents` typically means that somewhere in your JSX code you have a tag or content that is not properly closed or there's a syntax issue inside the JSX block.
The error points to line 140, column 14 in `SummaryCard.tsx` at the closing `</article>` tag, suggesting something inside the `<article>` JSX element was not properly closed or structured.
### What to do
1. **Check JSX elements inside the `<article>` block.**
Make sure every opening tag has a matching closing tag or is self-closing (`<img />`, `<input />`, etc.).
2. **Look for dangling braces or strings.**
For example, unclosed `{` or missing `}` in expressions like `{ someVariable }` or JSX props.
3. **Check multiline JSX comments**
Comments inside JSX must use `{/* comment */}` syntax, not `//` or `/* */` directly.
---
### Example of common JSX mistakes causing this:
```tsx
return (
<article className="something">
<div>Some content
<img src="..." /> // This is fine because it's self-closed
</article> // But the div is not closed here => error
);
```
Should be:
```tsx
return (
<article className="something">
<div>Some content</div>
<img src="..." />
</article>
);
```
---
### Could you share the relevant snippet around lines 130-145 in `SummaryCard.tsx`?
If you want, you can paste that here and I can help spot the missing closing tag or syntax error directly.
---
### Meanwhile, some quick steps:
- Make sure all tags inside `<article>` are closed.
- Make sure your JSX expressions have matching braces.
- Check for stray characters or incomplete tags.
---
If you want, I can help you write a quick check script or format the JSX for you if you share the snippet!
gpt-4-1-mini