# Règles Cursor pour Tailwind CSS et shadcn/ui

> Règles Cursor qui imposent les conventions Tailwind v4 et les modèles de composants shadcn/ui, empêchant les agents de réinventer des primitives déjà existantes.

**Type:** Rule  
**Tools:** Cursor  
**Stack:** Next.js, TypeScript, Tailwind  
**Updated:** 2026-06-08

---

Collez ceci dans `.cursor/rules/tailwind-shadcn.mdc` (ou dans votre fichier de règles Cursor au niveau du projet). Cursor charge automatiquement tous les fichiers `.mdc` dans `.cursor/rules/` à l'ouverture du projet.

## Fichier de règles Cursor

```txt title="Cursor Rules"
# Tailwind CSS + shadcn/ui Rules

## Tailwind conventions
- Use Tailwind CSS v4. Class names follow the v4 API — do NOT use deprecated v3
  class names (e.g. use `shadow-sm` not `drop-shadow-sm` for box shadows on elements).
- All utility classes must be static strings so Tailwind's content scanner can detect
  them. Never build class names with string concatenation or template literals unless
  the full class name is in the source (e.g. `bg-${color}` is forbidden; use a lookup
  object instead).
- Class order: layout → box model → typography → visual (bg, border, shadow) →
  interactive (hover, focus) → responsive breakpoints. Use `prettier-plugin-tailwindcss`
  to enforce this automatically — do not manually reorder.
- Never write custom CSS for spacing, color, or typography that can be expressed with a
  Tailwind utility. Custom CSS lives in `src/styles/` and must be justified by a comment.
- Use `cn()` from `@/lib/utils` to merge conditional classes. Never use `clsx` or
  `classnames` directly elsewhere — they are already re-exported from `cn()`.

## shadcn/ui conventions
- Before creating a new UI component, check `src/components/ui/` for an existing
  shadcn/ui primitive. Use it. Do not re-implement Button, Dialog, Input, Select,
  Tooltip, or any other component that shadcn already provides.
- Add new shadcn components with `npx shadcn@latest add <component>` — never copy-paste
  component source manually from the docs.
- Extend shadcn components by wrapping them, not by editing the file in
  `src/components/ui/` directly. Edits there are overwritten by future `shadcn add` runs.
- Use shadcn's `variant` and `size` props before adding className overrides. If a new
  variant is needed, add it to the component's `cva()` definition in `src/components/ui/`.
- Dark mode is handled by the `dark` class on `<html>`. Never use `prefers-color-scheme`
  media queries alongside shadcn — they conflict with the class strategy.
- Do not install `@radix-ui/*` packages directly. They are transitive dependencies of
  shadcn components; adding them directly risks version mismatches.

## Accessibility
- Every interactive shadcn component must have an accessible label. Use `aria-label`,
  `aria-labelledby`, or a visually-hidden `<span>` — never omit it.
- Icon-only buttons must include `<span className="sr-only">Description</span>`.

## Definition of done
- `bun run build` completes without Tailwind class warnings.
- No `className` strings contain dynamic concatenation (`bg-` + variable).
- No new Radix packages in `package.json` that aren't installed via `shadcn add`.
- Storybook (if present) renders the new/modified component without console errors.
```

## Pourquoi ces règles

- **"Vérifiez `src/components/ui/` avant de créer quoi que ce soit"** est la règle la plus précieuse pour les projets shadcn. Les agents ont tendance à écrire des composants personnalisés — un `<Button>` sur mesure, un `<Select>` fait main — qui dupliquent les primitives shadcn déjà présentes dans le dépôt. Cela gaspille des tokens, crée des incohérences et contourne le travail d'accessibilité que shadcn fournit gratuitement.
- **Les chaînes de noms de classe statiques** est une contrainte stricte du scanner de Tailwind. Les agents produisent régulièrement des interpolations de style `bg-${color}-500` qui compilent mais ne génèrent aucun CSS à l'exécution, provoquant des bugs de style invisibles qui n'apparaissent que dans les builds de production.

## Bonne adéquation

- Projets Next.js ou Astro utilisant déjà shadcn/ui avec Tailwind v4, où le risque principal est que les agents dupliquent des primitives existantes ou luttent contre le système de design.

## Pas adapté

- Projets utilisant CSS Modules, Emotion, ou Styled Components — les règles d'ordre des classes Tailwind sont hors de propos et `cn()` n'existe pas.