diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md new file mode 100644 index 0000000..2cc9191 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -0,0 +1,47 @@ +--- +name: 🐛 Bug +about: Signaler un bug du DSMMG +labels: bug +--- + +## RĂ©sumĂ© + + + +## Reproduction + +Un repro CodeSandbox ou StackBlitz est idĂ©al. Sinon, Ă©tapes : + +1. Aller sur 
 +2. Faire 
 +3. Observer 
 + +## Comportement attendu + + + +## Comportement observĂ© + + + +## Environnement + +- Version DSMMG : +- Browser + version : +- OS : +- Mode : light / dark / system +- Accent : synapse / blue / 
 / custom +- DensitĂ© : comfortable / cozy / compact +- Reduced motion activĂ© : oui / non + +## Composant(s) concernĂ©(s) + + + +## A11y + +- [ ] Reproductible au clavier ? +- [ ] Reproductible avec lecteur d'Ă©cran ? +- [ ] RĂ©gression de contraste ? + +## IdĂ©e de cause / fix (optionnel) diff --git a/.github/ISSUE_TEMPLATE/feature.md b/.github/ISSUE_TEMPLATE/feature.md new file mode 100644 index 0000000..f4d668a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.md @@ -0,0 +1,34 @@ +--- +name: ✹ Feature +about: Proposer une nouvelle fonctionnalitĂ© ou un nouveau composant +labels: feature +--- + +## ProblĂšme Ă  rĂ©soudre + + + +## Solution proposĂ©e + + + +## Composants existants couvrant partiellement + + + +## RĂ©fĂ©rences (autres DS) + + + +## AccessibilitĂ© + + + +## Alternatives Ă©cartĂ©es + +## Effort estimĂ© + +- [ ] S (≀ 1j) +- [ ] M (1 sem) +- [ ] L (2-3 sem — RFC requise) +- [ ] XL (1 mois+ — RFC + roadmap) diff --git a/.github/ISSUE_TEMPLATE/rfc.md b/.github/ISSUE_TEMPLATE/rfc.md new file mode 100644 index 0000000..5f42e3b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/rfc.md @@ -0,0 +1,69 @@ +--- +name: 📜 RFC +about: Proposition formelle pour un changement majeur +labels: rfc +--- + +> Une RFC est requise pour : nouveau composant non-trivial, +> breaking change sur l'API publique, refonte de tokens, nouvelle +> dĂ©pendance externe, changement architectural. + +## Titre + +RFC #XXXX — + +## Statut + +- [ ] Draft +- [ ] In review +- [ ] Accepted +- [ ] Rejected +- [ ] Superseded by #... + +## Auteur(s) + +@
 + +## Date + +YYYY-MM-DD + +## Contexte + + + +## Proposition + + + +## API publique (si applicable) + +```tsx +// avant + + +// aprĂšs + +``` + +## Alternatives Ă©cartĂ©es + + + +## CoĂ»t migration + +- Codemod possible : oui / non +- Effort consommateur estimĂ© : +- PĂ©riode de deprecation prĂ©vue : + +## Risques + +- A11y : +- Performance : +- DX : +- Lock-in / dĂ©pendances : + +## DĂ©cision + + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..efd8746 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,45 @@ +## RĂ©sumĂ© + + + +## Changements + +- [ ] Ajout — nouveau composant / token / variant +- [ ] Fix — bugfix +- [ ] Refacto — pas de surface publique modifiĂ©e +- [ ] Doc — uniquement docs / stories / commentaires +- [ ] Breaking — change l'API publique (prĂ©ciser ci-dessous) + +### DĂ©tail des breaking changes (si applicable) + + + +## Tests + +- [ ] Tests unitaires ajoutĂ©s / mis Ă  jour +- [ ] Stories Storybook ajoutĂ©es / mises Ă  jour +- [ ] Test axe-core (pas de violation a11y) +- [ ] Test clavier (Tab, Esc, flĂšches, Enter, Espace) +- [ ] TestĂ© en dark mode +- [ ] TestĂ© sur les 9 presets accent (au moins synapse + un autre) +- [ ] TestĂ© en zoom 200 % / reflow 320px +- [ ] TestĂ© avec `prefers-reduced-motion: reduce` +- [ ] Lint contraste WCAG passe (`pnpm lint:contrast`) + +## Documentation + +- [ ] Page MDX du composant dans `docs/` (anatomie, props, do/don't, a11y) +- [ ] Story Storybook avec autodocs +- [ ] CHANGELOG via Changesets (`pnpm changeset`) + +## Captures / preuves visuelles + + + +## Checklist finale + +- [ ] J'ai lu [CONTRIBUTING.md](../CONTRIBUTING.md) +- [ ] Mon code suit les conventions de naming (`mmg-*`, `--mmg-color-*`) +- [ ] Aucun hex en dur — uniquement des tokens +- [ ] Aucun `--mmg-color-synapse-*` direct dans un composant +- [ ] CI verte diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 66a461d..8fd1e02 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,6 +59,22 @@ jobs: - name: Build Storybook run: pnpm --filter storybook build + - name: Install Playwright Chromium + run: pnpm exec playwright install --with-deps chromium + + - name: Visual regression (Playwright) + run: pnpm test:visual + env: + CI: true + + - name: Upload Playwright report on failure + if: failure() + uses: actions/upload-artifact@v4 + with: + name: playwright-report + path: playwright-report + retention-days: 14 + - name: Bundle size budget run: pnpm size diff --git a/.gitignore b/.gitignore index e1f4d85..314e14f 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,11 @@ storybook-static # Test artifacts coverage .nyc_output +playwright-report +playwright/.cache +test-results +e2e/__screenshots__/*-actual.png +e2e/__screenshots__/*-diff.png # Demo specifics demo/_dev.log diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..14c8ba4 --- /dev/null +++ b/.npmrc @@ -0,0 +1,16 @@ +# DSMMG — npm/pnpm config workspace +# Usage privĂ© : tout @managemate va sur le Verdaccio local par dĂ©faut. +# En CI ou pour les contributeurs externes, override via env vars. + +# Registre par dĂ©faut pour le scope @managemate +@managemate:registry=https://npm.dinawo.fr/ + +# Reste sur npm public +registry=https://registry.npmjs.org/ + +# pnpm — Ă©viter les conflits de hoisting auto sur les peers Radix +strict-peer-dependencies=false +auto-install-peers=true + +# Lockfile cohĂ©rent pour CI +prefer-frozen-lockfile=true diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..1b9f01d --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,33 @@ +# DSMMG — CODEOWNERS +# RĂšgle : ces personnes/Ă©quipes sont automatiquement assignĂ©es en +# review sur les PRs touchant les fichiers concernĂ©s. +# Doc Gitea : https://docs.gitea.com/usage/code-owners + +# Mainteneurs principaux du DS — review obligatoire sur tout +* @lololefarmer + +# Tokens & couleurs — exige un designer dans la review +/packages/tokens/ @lololefarmer +/packages/css/src/tokens/ @lololefarmer +/packages/css/src/tokens.css @lololefarmer +/scripts/lint-contrast.mjs @lololefarmer +DESIGN.md @lololefarmer + +# CSS de composants — review front +/packages/css/src/components/ @lololefarmer + +# Composants React — review front senior +/packages/react/src/ @lololefarmer + +# Tests & Storybook +/storybook/ @lololefarmer +/packages/react/src/*.test.tsx @lololefarmer + +# CI & release +/.github/workflows/ @lololefarmer +/.changeset/ @lololefarmer + +# Documentation +/docs/ @lololefarmer +README.md @lololefarmer +CONTRIBUTING.md @lololefarmer diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..87f2fb8 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,72 @@ +# Code de conduite — DSMMG + +InspirĂ© du [Contributor Covenant 2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/) +et adaptĂ© au contexte ManageMate Group. + +## Notre engagement + +En tant que membres, contributeurs et mainteneurs du DSMMG, nous nous +engageons Ă  faire de la participation Ă  ce projet une expĂ©rience +exempte de harcĂšlement pour tout le monde, indĂ©pendamment de l'Ăąge, +de la corpulence, du handicap visible ou invisible, de l'origine +ethnique, des caractĂšres sexuels, de l'identitĂ© ou expression de genre, +du niveau d'expĂ©rience, de l'Ă©ducation, du statut socio-Ă©conomique, +de la nationalitĂ©, de l'apparence personnelle, de la religion ou de +l'orientation sexuelle. + +## Comportements attendus + +- Faire preuve d'**empathie** et de **bienveillance**. +- Respecter les opinions, points de vue et expĂ©riences diffĂ©rents. +- Donner et accepter avec grĂące les retours constructifs. +- Assumer la responsabilitĂ© de nos erreurs, prĂ©senter nos excuses aux + personnes affectĂ©es, et apprendre de nos erreurs. +- PrivilĂ©gier ce qui est le mieux pour la communautĂ©, pas seulement + pour nous individuellement. + +## Comportements inacceptables + +- Langage ou imagerie sexualisĂ©, attention ou avances sexuelles + importunes. +- Trolling, commentaires insultants ou dĂ©sobligeants, attaques + personnelles ou politiques. +- HarcĂšlement public ou privĂ©. +- Publication d'informations privĂ©es de tiers (adresse, e-mail, etc.) + sans permission explicite. +- Toute autre conduite raisonnablement considĂ©rĂ©e comme inappropriĂ©e + dans un cadre professionnel. + +## Application + +Les responsables du projet sont chargĂ©s de clarifier et faire +respecter nos standards de comportement. Ils prendront des mesures +correctives appropriĂ©es et Ă©quitables en rĂ©ponse Ă  tout comportement +qu'ils jugent inappropriĂ©. + +Les mainteneurs ont le droit et la responsabilitĂ© de supprimer, +modifier ou rejeter les commentaires, commits, code, modifications de +documentation et autres contributions qui ne sont pas alignĂ©s avec ce +code de conduite. + +## Application interne + +Les violations peuvent ĂȘtre signalĂ©es au mainteneur principal du +projet ou Ă  `conduct@managemate.fr`. Toutes les plaintes seront +examinĂ©es avec sĂ©rieux et donneront lieu Ă  une rĂ©ponse jugĂ©e +nĂ©cessaire et appropriĂ©e. ConfidentialitĂ© garantie. + +## Sanctions possibles + +1. **Correction** — avertissement privĂ©, explication Ă©crite de la + violation et de la conduite attendue. +2. **Avertissement** — avertissement officiel + interdiction + d'interaction avec la victime pendant une pĂ©riode dĂ©finie. +3. **Bannissement temporaire** — interdiction de toute interaction + avec le projet pendant une pĂ©riode donnĂ©e. +4. **Bannissement dĂ©finitif** — interdiction permanente de toute + interaction publique avec le projet. + +## Attribution + +AdaptĂ© du [Contributor Covenant version 2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/), +disponible sous Creative Commons Attribution 4.0. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..8c5611d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,129 @@ +# Contribuer au DSMMG + +Merci de prendre le temps de contribuer. Ce guide dĂ©crit le workflow +attendu pour ajouter / modifier un composant, fixer un bug, ou faire +Ă©voluer le design system. + +## Setup local + +```sh +git clone https://git.dinawo.fr/ManageMate-Group/DSMMG.git +cd DSMMG +pnpm install +pnpm build # build tous les packages dans le bon ordre +pnpm storybook # lance Storybook localement (port 6006) +pnpm demo # lance la demo Vite (port 5180) +pnpm --filter @managemate/react test:watch +``` + +PrĂ©-requis : Node ≄ 20, pnpm ≄ 9, Git. + +## Workflow d'une PR + +1. **CrĂ©er une branche** depuis `main` : + - `feat/` — nouvelle fonctionnalitĂ© + - `fix/` — correction de bug + - `chore/` — outillage, refacto sans surface publique + - `docs/` — documentation +2. **Coder + tests** : + - Tests unitaires (`*.test.tsx`) avec Vitest + axe-core + - Stories Storybook (`*.stories.tsx`) avec autodocs + - Doc MDX pour les composants publics +3. **Ajouter un changeset** : `pnpm changeset` (sĂ©lectionner les + packages impactĂ©s et le bump appropriĂ© — patch / minor / major). +4. **Push** + ouvrir la PR sur `main`. +5. **CI doit passer** : + - lint + typecheck + - tests Vitest + - axe-core (pas de violation a11y) + - lint contraste WCAG (`pnpm lint:contrast`) + - build Storybook + visual regression + - bundle size budget (`pnpm size`) +6. **1 review minimum** d'un CODEOWNER avant merge. + +## Conventions de code + +### Naming + +- **Tokens couleur** : `--mmg-color-*` (jamais `--mmg-color-synapse-*` + directement dans un composant — toujours `--mmg-color-accent-*`). +- **Classes CSS** : `mmg-` BEM-like (`mmg-btn`, `mmg-btn--primary`, + `mmg-btn__icon`). +- **Utilitaires CSS** : `mmg-u-*` (`mmg-u-stack`, `mmg-u-text-primary`). +- **Composants React** : PascalCase (`Button`, `ProfileHeader`, + `MetricCard`). **Un fichier par composant**, pas de monolithe. +- **Tests** : `.test.tsx`, **stories** : `.stories.tsx`. + +### SĂ©mantique + +- Choisir le tag HTML selon **la sĂ©mantique**, pas selon la taille + visuelle. Un titre de page reste `

` mĂȘme s'il est stylĂ© en + `display-xl`. +- PrĂ©fĂ©rer ` + + + } +> + + +``` + +## Sheet + +```tsx + +
...
+
+``` + +## ConfirmDialog (destructive) + +```tsx + api.delete(ids)} +/> +``` + +Focus initial sur **Annuler** (pas Confirm) pour Ă©viter les actions destructives accidentelles. + +## A11y + +- `role="dialog"` + `aria-modal="true"` natif. +- Title liĂ© via `aria-labelledby`, description via `aria-describedby`. +- Focus trap : Tab cycle uniquement dans le dialog. +- Restitution focus Ă  l'Ă©lĂ©ment d'origine Ă  la fermeture. +- Esc ferme. +- Click backdrop ferme (sauf si `modal={false}` posĂ©). + +## Do / Don't + +✅ **Do** +- Un titre explicite (RGAA 9.2 — relations). +- Description si l'action a des consĂ©quences (suppression, paiement). +- Bouton primary Ă  droite, ghost/cancel Ă  gauche. + +❌ **Don't** +- Ne pas empiler les Dialogs (UX cauchemardesque). Si vraiment besoin, utiliser un Sheet + Wizard pattern. +- Ne pas utiliser pour un message non-bloquant — prĂ©fĂ©rer Toast. +- Ne pas ouvrir automatiquement au load sans interaction utilisateur (RGAA 13.1 — pas d'apparition non sollicitĂ©e). diff --git a/docs/src/content/docs/components/input.md b/docs/src/content/docs/components/input.md new file mode 100644 index 0000000..edc6dfe --- /dev/null +++ b/docs/src/content/docs/components/input.md @@ -0,0 +1,80 @@ +--- +title: Input / Textarea / Select +description: Champs de formulaire DSMMG — Field-wrapped, accessibles, Ă©tats couverts. +--- + +## Anatomie + +``` +┌──────────────────────────────────────┐ +│ Label (semi) * │ ← --required +├─────────────────────────────────────── +│ [icon] Valeur saisie │ ← Input +├─────────────────────────────────────── +│ Hint │ ← --tertiary +│ Erreur │ ← --danger (si invalid) +└──────────────────────────────────────┘ +``` + +## API + +```tsx +import { Input, Textarea, Select } from "@managemate/react"; + +} + size="md" // sm | md | lg +/> + +