fix(css): repair Tailwind v4 color-mix parser crash on dev server

Tailwind v4's content scanner walks the entire project root by default
and emits a CSS rule for every class-shaped token it finds — including
literal class fragments quoted inside .planning report markdown and
docs/ design specs. The bracketed CSS-variable arbitrary-value form
combined with an opacity modifier (e.g. `bg-[var(--name)]/12`)
generates an escaped selector whose `\(...\)\/N` token sequence
crashes Turbopack's CSS parser with `Unexpected token Delim('.')`,
500-ing every page that imports globals.css.

The crash:
    ./src/app/globals.css:1853:27
    Parsing CSS source code failed
      1852 |   .bg-\[var\(...\)\]\/12 {
    > 1853 |     background-color: var(...);
           |                           ^

Three coordinated changes:
- Add `@source not "../../.planning"` and `@source not "../../docs"`
  to globals.css so the scanner skips planning + docs trees. Stops
  fixture-style class names in research/audit reports from poisoning
  the generated CSS.
- Migrate `bg-[var(--dracula-*)]/N` / `ring-[var(--dracula-*)]/N` in
  target-card.tsx to the Tailwind v4 parenthesised shorthand
  `bg-(--dracula-*)/N` / `ring-(--dracula-*)/N`. The shorthand emits
  a clean selector that LightningCSS parses cleanly. Per the Tailwind
  v4 upgrade guide, the bracketed form is deprecated for CSS
  variables.
- Replace `shadow-[0_0_0_1px_var(--dracula-green)]/20` in
  consistency-strip.tsx with `shadow-[0_0_0_1px_color-mix(in_oklab,var(--dracula-green)_20%,transparent)]`.
  The arbitrary shadow with opacity modifier hits the same parser
  issue; encoding the alpha directly in the value via color-mix
  removes the modifier and keeps the visual identical.

Verification: `pnpm dev --port 3030` then `curl -sI /auth/login` ->
HTTP/1.1 200 OK (was 500). Zero CSS parse errors in the dev server
log. Affected tests (targets + api-handler + api/version) still pass
(31/31).
This commit is contained in:
Marc-André Bombeck committed 2026-05-14 15:39:39 +02:00
1 parent 53278ccd87
commit 782731aeda
3 files changed
+38 -8

No files matched your search

+15
View File
@@ -2,6 +2,21 @@
@import "tw-animate-css";
@import "shadcn/tailwind.css";
/*
* Exclude planning + docs directories from Tailwind v4's content scan.
*
* v4's scanner walks the entire project root by default and picks any
* class-shaped token out of every text file. Planning reports and
* design docs often quote literal class-name fragments such as
* `bg-[var(...)]/12` as examples, and the bracketed-CSS-variable form
* combined with an opacity modifier generates an escaped selector that
* Turbopack's CSS parser rejects with `Unexpected token Delim('.')`,
* 500-ing every page. Constraining the scan to source code avoids
* fixture-style strings poisoning the generated CSS.
*/
@source not "../../.planning";
@source not "../../docs";
@custom-variant dark (&:is(.dark *));
@theme inline {