{"_id":"@aphrody/eslint-plugin-m3","_rev":"4-6f1a642b086870f85d78b4fffbeb73bb","name":"@aphrody/eslint-plugin-m3","dist-tags":{"latest":"3.2.5"},"versions":{"3.2.1":{"name":"@aphrody/eslint-plugin-m3","version":"3.2.1","keywords":["eslint","eslintplugin","lint","m3","material-design","material-web","oxlint"],"author":"aphrody-code","license":"Apache-2.0","_id":"@aphrody/eslint-plugin-m3@3.2.1","maintainers":[{"name":"yohan971","email":"yohanpierre@live.fr"}],"homepage":"https://github.com/aphrody-code/material-web/tree/main/packages/eslint-plugin-m3#readme","bugs":{"url":"https://github.com/aphrody-code/material-web/issues"},"dist":{"shasum":"5b3826e149a2207043218a32567f7d3504e78507","tarball":"https://registry.npmjs.org/@aphrody/eslint-plugin-m3/-/eslint-plugin-m3-3.2.1.tgz","fileCount":13,"integrity":"sha512-Ggui8hAgRYj0K+fFa6eli7bP3l1lmp/jv9gOEAbgSIdJHLfTfv6SFt6X93TSPbmZhKKGsz3qPcKPWsL+CSNX5Q==","signatures":[{"sig":"MEYCIQCrPOEVQ5myBSyT7g2KqjFfGKStSZSPmg6j6hsh8U/kOwIhAKMb0lHKIQx3/X/8p3vJrAz2LMqGJOKJgeqJe11TA3fG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107376},"main":"./index.js","type":"module","shasum":"5b3826e149a2207043218a32567f7d3504e78507","exports":{".":"./index.js","./package.json":"./package.json"},"scripts":{"test":"bun test/run.ts","sync-symbols":"bun scripts/sync-symbol-names.ts"},"_npmUser":{"name":"yohan971","email":"yohanpierre@live.fr"},"_integrity":"sha512-Ggui8hAgRYj0K+fFa6eli7bP3l1lmp/jv9gOEAbgSIdJHLfTfv6SFt6X93TSPbmZhKKGsz3qPcKPWsL+CSNX5Q==","repository":{"url":"git+https://github.com/aphrody-code/material-web.git","type":"git","directory":"packages/eslint-plugin-m3"},"_npmVersion":"10.8.3","description":"Lint rules for sites consuming material-web (@aphrody/m3-react + Material Symbols) — runs under oxlint (jsPlugins) and ESLint.","directories":{},"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"oxlint":">=1.0.0"},"peerDependenciesMeta":{"oxlint":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-m3_3.2.1_1780527349935_0.5145234702730903","host":"s3://npm-registry-packages-npm-production"}},"3.2.2":{"name":"@aphrody/eslint-plugin-m3","version":"3.2.2","keywords":["eslint","eslintplugin","lint","m3","material-design","material-web","oxlint"],"author":"aphrody-code","license":"Apache-2.0","_id":"@aphrody/eslint-plugin-m3@3.2.2","maintainers":[{"name":"yohan971","email":"yohanpierre@live.fr"}],"homepage":"https://github.com/aphrody-code/material-web/tree/main/packages/eslint-plugin-m3#readme","bugs":{"url":"https://github.com/aphrody-code/material-web/issues"},"dist":{"shasum":"0b938eb3b75af12f016f75358085f0b8d940b101","tarball":"https://registry.npmjs.org/@aphrody/eslint-plugin-m3/-/eslint-plugin-m3-3.2.2.tgz","fileCount":13,"integrity":"sha512-LzikvFklMkI/+470H3GDN/yrnubv9F2AKMYcZRjXAaBjw5pjy67N+2PA3Ef7+0Y5nArB2mOQ6DwRgn/IATvh4g==","signatures":[{"sig":"MEQCIHGDmzVFEGC/uoOiG7RAgK4IAPHFbsbiSvFFhniOBvByAiBSugCiZ0NRxOOWlFqq+DZ5AEi+PHIBTqigi0Lo6XxUiw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107376},"main":"./index.js","type":"module","shasum":"0b938eb3b75af12f016f75358085f0b8d940b101","exports":{".":"./index.js","./package.json":"./package.json"},"scripts":{"test":"bun test/run.ts","sync-symbols":"bun scripts/sync-symbol-names.ts"},"_npmUser":{"name":"yohan971","email":"yohanpierre@live.fr"},"_integrity":"sha512-LzikvFklMkI/+470H3GDN/yrnubv9F2AKMYcZRjXAaBjw5pjy67N+2PA3Ef7+0Y5nArB2mOQ6DwRgn/IATvh4g==","repository":{"url":"git+https://github.com/aphrody-code/material-web.git","type":"git","directory":"packages/eslint-plugin-m3"},"_npmVersion":"10.8.3","description":"Lint rules for sites consuming material-web (@aphrody/m3-react + Material Symbols) — runs under oxlint (jsPlugins) and ESLint.","directories":{},"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"oxlint":">=1.0.0"},"peerDependenciesMeta":{"oxlint":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-m3_3.2.2_1780528055955_0.0022416889968841502","host":"s3://npm-registry-packages-npm-production"}},"3.2.4":{"name":"@aphrody/eslint-plugin-m3","version":"3.2.4","keywords":["eslint","eslintplugin","lint","m3","material-design","material-web","oxlint"],"author":"aphrody-code","license":"Apache-2.0","_id":"@aphrody/eslint-plugin-m3@3.2.4","maintainers":[{"name":"yohan971","email":"yohanpierre@live.fr"}],"homepage":"https://github.com/aphrody-code/material-web/tree/main/packages/eslint-plugin-m3#readme","bugs":{"url":"https://github.com/aphrody-code/material-web/issues"},"dist":{"shasum":"adb663c8e5ae5c49fc9bb70dbca77404958c7fd6","tarball":"https://registry.npmjs.org/@aphrody/eslint-plugin-m3/-/eslint-plugin-m3-3.2.4.tgz","fileCount":13,"integrity":"sha512-sH7c90mQpk4rKT9MXhTf+iojHsBb29euRcUvyNSRZnb3yyoRhWqc0IseH6z47oMl40kL3UVRsYav2hyzmiodGw==","signatures":[{"sig":"MEYCIQCD70WtDt/jF+f62a+nkVeBzTUxj2s+rlTLKKgFFpe58gIhAJZ4sGtImVnL2WSzQeNt/BCu4kb+ZCh9zr9ZbLR+csmI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107376},"main":"./index.js","type":"module","shasum":"adb663c8e5ae5c49fc9bb70dbca77404958c7fd6","exports":{".":"./index.js","./package.json":"./package.json"},"scripts":{"test":"bun test/run.ts","sync-symbols":"bun scripts/sync-symbol-names.ts"},"_npmUser":{"name":"yohan971","email":"yohanpierre@live.fr"},"_integrity":"sha512-sH7c90mQpk4rKT9MXhTf+iojHsBb29euRcUvyNSRZnb3yyoRhWqc0IseH6z47oMl40kL3UVRsYav2hyzmiodGw==","repository":{"url":"git+https://github.com/aphrody-code/material-web.git","type":"git","directory":"packages/eslint-plugin-m3"},"_npmVersion":"10.8.3","description":"Lint rules for sites consuming material-web (@aphrody/m3-react + Material Symbols) — runs under oxlint (jsPlugins) and ESLint.","directories":{},"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"oxlint":">=1.0.0"},"peerDependenciesMeta":{"oxlint":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-m3_3.2.4_1786525662968_0.49653926885048216","host":"s3://npm-registry-packages-npm-production"}},"3.2.5":{"_id":"@aphrody/eslint-plugin-m3@3.2.5","bugs":{"url":"https://github.com/aphrody-code/material-web/issues"},"dist":{"shasum":"56737caf17703493533601c14fbd1ebf471628d7","tarball":"https://registry.npmjs.org/@aphrody/eslint-plugin-m3/-/eslint-plugin-m3-3.2.5.tgz","fileCount":13,"integrity":"sha512-yfIUw3l1FZF9oC5AD0FA1oHMU4UVfAg/uRwiTq69OOGmkAIc7JDjUPHzAzEOgNDKwIRmZDGo6IuwawsV2QUKqA==","signatures":[{"sig":"MEUCIQCAfERzD/fy0rpFIlbHtYuT6Pr2hJluxP1KJ0viqd+v8AIgUU9gyBzOTpM4G8DQwj4gnHVwyvfQ2/gYXmBpu2lQfPo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDZbYAFhVarKPyjoNvzWQoM4bY1xnj+aP6oXpyvqDPpgAiBZLBK3s6vSSyaJ0ObYL+u0+iAoci31JLsXxcZH1kv4hQ=="}],"unpackedSize":107379},"main":"./index.js","name":"@aphrody/eslint-plugin-m3","type":"module","author":{"name":"aphrody-code"},"exports":{".":"./index.js","./package.json":"./package.json"},"gitHead":"6981e124848acb9ce5364d87af955fd5fe992e23","license":"Apache-2.0","scripts":{"test":"bun test/run.ts","sync-symbols":"bun scripts/sync-symbol-names.ts"},"version":"3.2.5","_npmUser":{"name":"yohan971","email":"yohanpierre@live.fr"},"homepage":"https://github.com/aphrody-code/material-web/tree/main/packages/eslint-plugin-m3#readme","keywords":["eslint","eslintplugin","lint","m3","material-design","material-web","oxlint"],"repository":{"url":"git+https://github.com/aphrody-code/material-web.git","type":"git","directory":"packages/eslint-plugin-m3"},"_npmVersion":"9.2.0","description":"Lint rules for sites consuming material-web (@aphrody/m3-react + Material Symbols) — runs under oxlint (jsPlugins) and ESLint.","directories":{},"maintainers":[{"name":"yohan971","email":"yohanpierre@live.fr"}],"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"oxlint":">=1.0.0"},"peerDependenciesMeta":{"oxlint":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/eslint-plugin-m3_3.2.5_1789022250691_0.08201491791696625"}}},"time":{"created":"2026-06-03T22:55:49.694Z","modified":"2026-09-10T06:37:30.984Z","3.2.1":"2026-06-03T22:55:50.076Z","3.2.2":"2026-06-03T23:07:36.103Z","3.2.4":"2026-08-12T09:07:43.130Z","3.2.5":"2026-09-10T06:37:30.781Z"},"bugs":{"url":"https://github.com/aphrody-code/material-web/issues"},"author":{"name":"aphrody-code"},"license":"Apache-2.0","homepage":"https://github.com/aphrody-code/material-web/tree/main/packages/eslint-plugin-m3#readme","keywords":["eslint","eslintplugin","lint","m3","material-design","material-web","oxlint"],"repository":{"url":"git+https://github.com/aphrody-code/material-web.git","type":"git","directory":"packages/eslint-plugin-m3"},"description":"Lint rules for sites consuming material-web (@aphrody/m3-react + Material Symbols) — runs under oxlint (jsPlugins) and ESLint.","maintainers":[{"name":"yohan971","email":"yohanpierre@live.fr"}],"readme":"<!-- SPDX-License-Identifier: Apache-2.0 -->\n\n# @aphrody/eslint-plugin-m3\n\nRègles de lint pour les sites qui **consomment** material-web\n(`@aphrody/m3-react` + Material Symbols). Écrit avec l'API ESLint-compatible :\ntourne **sous oxlint** (champ `jsPlugins`) **et sous ESLint** (champ `plugins`),\nsans transpilation (ESM pur).\n\nCible les composants `Md*` (wrappers React) et `md-*` (custom elements). Pensé en\nbinôme avec le kit de migration MUI→M3 (`migration/`) : ce que les codemods\nlaissent en `MIGRATION-TODO`, ce plugin l'attrape ensuite en continu.\n\n## Règles (8)\n\n| Règle                          | Type  | Fix  | Attrape                                                                                                                                                                                                                                                                          |\n| ------------------------------ | ----- | :--: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `m3/valid-icon-name`           | error | auto | Le texte d'un `<md-icon>`/`<MdIcon>` doit être un glyphe Material Symbols valide (snake_case). Détecte les restes PascalCase MUI (`Delete` → `delete`) et les noms introuvables — validé contre les **4253** glyphes officiels. Autofix quand le snake_case est un glyphe connu. |\n| `m3/valid-color-role`          | error |  —   | Un `var(--md-sys-color-<rôle>)` doit référencer un des **~49 rôles** réellement émis par material-web. Attrape les typos (`primry` → suggère `primary`), rôles MUI/Tailwind, casse — sinon la couleur résout en `unset` silencieux.                                              |\n| `m3/no-sx-prop`                | error |  —   | Le prop `sx` (MUI/Emotion) n'a **aucun effet** sur un `md-*` → `className`/Tailwind + tokens `--md-sys-*`.                                                                                                                                                                       |\n| `m3/no-mui-prop-on-md`         | error | auto | Noms de props MUI laissés sur un wrapper (`checked`→`selected`, `title`→`text`, `open`→`opened`, `value`→`activeTabIndex`). Autofix : renomme l'attribut.                                                                                                                        |\n| `m3/no-mui-import`             | warn  |  —   | Imports `@mui/material` / `@mui/icons-material` / `@mui/x-*` résiduels (mélange de systèmes, double bundle).                                                                                                                                                                     |\n| `m3/prefer-icon-token`         | warn  |  —   | `fontVariationSettings` inline sur une icône → tokens `--md-icon-fill/wght/grad/opsz` (héritables, animables).                                                                                                                                                                   |\n| `m3/require-icon-button-label` | warn  |  —   | Un bouton-icône (`md-*-icon-button`/`MdIconButton`) sans nom accessible (`aria-label`/`aria-labelledby`/`title`) — a11y, WCAG 4.1.2.                                                                                                                                             |\n| `m3/no-hardcoded-color`        | warn  |  —   | Couleur en dur (`#hex`/`rgb()`) dans `style`/`sx` d'un `md-*` → rôle `var(--md-sys-color-*)` (suit le thème + dark + dynamic-color).                                                                                                                                             |\n\nDeux règles sont **auto-corrigeables** (`oxlint --fix` ou `eslint --fix`) : `valid-icon-name` et `no-mui-prop-on-md` — idéal pour finir un port MUI→M3 en un passage.\n\n## Installation\n\n```bash\nbun add -D @aphrody/eslint-plugin-m3\n```\n\n## Usage — oxlint (recommandé, Rust, rapide)\n\n`.oxlintrc.json` :\n\n```json\n{\n  \"jsPlugins\": [\"./node_modules/@aphrody/eslint-plugin-m3/index.js\"],\n  \"rules\": {\n    \"m3/valid-icon-name\": \"error\",\n    \"m3/no-sx-prop\": \"error\",\n    \"m3/no-mui-prop-on-md\": \"error\",\n    \"m3/no-mui-import\": \"warn\",\n    \"m3/prefer-icon-token\": \"warn\",\n    \"m3/no-hardcoded-color\": \"warn\"\n  }\n}\n```\n\n> Le chemin de `jsPlugins` est résolu **relativement au fichier `.oxlintrc.json`**.\n> Les JS plugins oxlint sont en alpha (oxlint ≥ 1.x) — vérifié sur **oxlint 1.67**.\n\n## Usage — ESLint (flat config)\n\n```js\n// eslint.config.js\nimport m3 from \"@aphrody/eslint-plugin-m3\";\n\nexport default [\n  m3.configs.recommended, // ou m3.configs.strict (tout en error)\n];\n```\n\nOu à la carte :\n\n```js\nimport m3 from \"@aphrody/eslint-plugin-m3\";\nexport default [\n  { plugins: { m3 }, rules: { \"m3/no-sx-prop\": \"error\", \"m3/valid-icon-name\": \"error\" } },\n];\n```\n\n## Presets\n\n- `m3.configs.recommended` — règles structurelles en `error`, suggestions en `warn`.\n- `m3.configs.strict` — **tout** en `error` (utile pour clôturer un port MUI→M3).\n\n## Développement\n\n```bash\nbun test/run.ts          # lance oxlint réel sur les fixtures (6/6 sur bad, 0 sur good)\nbun scripts/sync-symbol-names.ts   # régénère data/material-symbols-names.js\n```\n\nLa liste des glyphes (`data/material-symbols-names.js`) est synchronisée depuis\n`migration/codemods/data/material-symbols-names.json` (source : codepoints\nofficiels Google `google/material-design-icons`, Apache-2.0).\n","readmeFilename":"README.md"}