{"_id":"@01normandie/launcher","_rev":"10-573b24b3dd2f0bd073f257e21bee6f89","name":"@01normandie/launcher","dist-tags":{"latest":"2.0.0"},"versions":{"1.0.0":{"name":"@01normandie/launcher","version":"1.0.0","author":{"name":"Zone01 Normandie"},"license":"MIT","_id":"@01normandie/launcher@1.0.0","maintainers":[{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"}],"dist":{"shasum":"1cfc204b1e5502d83d049a2d197890732887d4f6","tarball":"https://registry.npmjs.org/@01normandie/launcher/-/launcher-1.0.0.tgz","fileCount":15,"integrity":"sha512-GNjerDw8X2tT8xxghACC1sYNCO0WHzu6hp7vx9pyUB60KijwfPbSgrkSSS1OsauMuOhUthf+2MMwXyo7W9Rvbw==","signatures":[{"sig":"MEUCIQDdBKnYhtKHEiRIFQHAJFoDJDDhjj6yZsEOPH7/+X1QHgIgGUzXYiVFKW2VmY/MKzqB6HwqlqDTNSiinbKoipY9nAk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104335},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.mjs","require":"./dist/icons/index.js"}},"scripts":{"dev":"tsup --watch","build":"tsup","prepublishOnly":"npm run build"},"_npmUser":{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"},"_npmVersion":"11.6.2","description":"Zone01 Normandie — composants UI partagés","directories":{},"_nodeVersion":"24.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","react":"^18.0.0","react-dom":"^18.0.0","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0"},"peerDependencies":{"react":">=17.0.0","react-dom":">=17.0.0"},"_npmOperationalInternal":{"tmp":"tmp/launcher_1.0.0_1777555353788_0.8232258637470014","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@01normandie/launcher","version":"1.0.1","author":{"name":"Zone01 Normandie"},"license":"MIT","_id":"@01normandie/launcher@1.0.1","maintainers":[{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"}],"dist":{"shasum":"ff21233f43d00f465c849193b9a8d89e066c5f1f","tarball":"https://registry.npmjs.org/@01normandie/launcher/-/launcher-1.0.1.tgz","fileCount":16,"integrity":"sha512-Cnj/r6GZuU6XxGEWLs/y3y+kejhK7gqkBw5eIH2t+JQm+4Dx6Le/zFzyLZVz23yUCfZFdxmTRfGjsH/sRUsWkQ==","signatures":[{"sig":"MEUCIQDt08SzBX7gO+3S+Pf/N3BVLNghwmKXdsGH16pWCZIlwAIgN4U9gojd6hup+VAHdOeSyVqClD27FJX7iCBw0G7sZmI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107540},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.mjs","require":"./dist/icons/index.js"}},"scripts":{"dev":"tsup --watch","build":"tsup","prepublishOnly":"npm run build"},"_npmUser":{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"},"_npmVersion":"11.6.2","description":"Zone01 Normandie — composants UI partagés","directories":{},"_nodeVersion":"24.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","react":"^18.0.0","react-dom":"^18.0.0","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0"},"peerDependencies":{"react":">=17.0.0","react-dom":">=17.0.0"},"_npmOperationalInternal":{"tmp":"tmp/launcher_1.0.1_1777555532520_0.7595568406483102","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@01normandie/launcher","version":"1.0.2","author":{"name":"Zone01 Normandie"},"license":"MIT","_id":"@01normandie/launcher@1.0.2","maintainers":[{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"}],"dist":{"shasum":"4e0bdde2c9ed4a2f9642e4b789ffec8070351294","tarball":"https://registry.npmjs.org/@01normandie/launcher/-/launcher-1.0.2.tgz","fileCount":16,"integrity":"sha512-k/FXk3Jxm5Cs8YxOlV3zy7xO6G2ixmN47e+QYA0UCFfP6h7zSgRuMavJ6Xc5XpTxk/ezi095Cj9H9i4leWts9A==","signatures":[{"sig":"MEUCIQD9P1TQRYWmCWjL1cvDrMNnZkrjswz/2H8UIkylvB6L8QIgJduNuYFDyjx2/98a9CqrUmwOJIsHGWZu+FdARYTxSUw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107667},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.mjs","require":"./dist/icons/index.js"}},"scripts":{"dev":"tsup --watch","build":"tsup","prepublishOnly":"npm run build"},"_npmUser":{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"},"_npmVersion":"11.6.2","description":"Zone01 Normandie — composants UI partagés","directories":{},"_nodeVersion":"24.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","react":"^18.0.0","react-dom":"^18.0.0","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0"},"peerDependencies":{"react":">=17.0.0","react-dom":">=17.0.0"},"_npmOperationalInternal":{"tmp":"tmp/launcher_1.0.2_1777555949537_0.8404674418461111","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@01normandie/launcher","version":"1.0.3","author":{"name":"Zone01 Normandie"},"license":"MIT","_id":"@01normandie/launcher@1.0.3","maintainers":[{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"}],"dist":{"shasum":"b901dac5f4b40bf88dee612c2d9c322036adbe9a","tarball":"https://registry.npmjs.org/@01normandie/launcher/-/launcher-1.0.3.tgz","fileCount":16,"integrity":"sha512-+jz1vngLjXkhtzzZUIWTOAdfrH1oeaDbRFWmndtGqFk8wJR7cLfm55wJWeLbVEGOrMCigVkAp65SRMY8Fw1ywg==","signatures":[{"sig":"MEUCIQC55rd4Vm9Rlb06bsPkV5aVKP1rL28m5yJxHHteXmrX/QIgbkbFQx2KMByjAZdDPC4CLvcK0jj9JVgbrWJY6+IMAqo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107701},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.mjs","require":"./dist/icons/index.js"}},"scripts":{"dev":"tsup --watch","build":"tsup","prepublishOnly":"npm run build"},"_npmUser":{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"},"_npmVersion":"11.6.2","description":"Zone01 Normandie — composants UI partagés","directories":{},"_nodeVersion":"24.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","react":"^18.0.0","react-dom":"^18.0.0","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0"},"peerDependencies":{"react":">=17.0.0","react-dom":">=17.0.0"},"_npmOperationalInternal":{"tmp":"tmp/launcher_1.0.3_1777556849175_0.12448745999731159","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@01normandie/launcher","version":"1.0.4","author":{"name":"Zone01 Normandie"},"license":"MIT","_id":"@01normandie/launcher@1.0.4","maintainers":[{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"}],"dist":{"shasum":"36bdb8ee880757757edf342dc7a37a244a377bb2","tarball":"https://registry.npmjs.org/@01normandie/launcher/-/launcher-1.0.4.tgz","fileCount":16,"integrity":"sha512-pCdb3P7LFOUeZt3YJvpXimbOrCS+ozpwv79DiEDygRFOWUzGAC/xaNZaSo33hONbWn2+6DGlyKA0YTKYT2F4tQ==","signatures":[{"sig":"MEQCIDYm+BmlOfKIJI/O9AWT5Hs/t0g2LAQ2BuK2uKWi6SxfAiAnRzcc+viFYWMkkQE0AsiIa185wu5opjCPcNe1I1dQUA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107701},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.mjs","require":"./dist/icons/index.js"}},"scripts":{"dev":"tsup --watch","build":"tsup","prepublishOnly":"npm run build"},"_npmUser":{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"},"_npmVersion":"11.6.2","description":"Zone01 Normandie — composants UI partagés","directories":{},"_nodeVersion":"24.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","react":"^18.0.0","react-dom":"^18.0.0","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0"},"peerDependencies":{"react":">=17.0.0","react-dom":">=17.0.0"},"_npmOperationalInternal":{"tmp":"tmp/launcher_1.0.4_1777557387527_0.6036046651146503","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@01normandie/launcher","version":"1.0.5","author":{"name":"Zone01 Normandie"},"license":"MIT","_id":"@01normandie/launcher@1.0.5","maintainers":[{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"}],"dist":{"shasum":"175d2fe86289f86362985fa5948476b66a097075","tarball":"https://registry.npmjs.org/@01normandie/launcher/-/launcher-1.0.5.tgz","fileCount":16,"integrity":"sha512-HxcKM/rdok9v6s5xBJ2BZOQUaqN8M1j7CA1gcLBml/ltUUI36TjkQDirpUNydafhb9C4QBBi2KSYXjmP6FpLEQ==","signatures":[{"sig":"MEUCIQDbus6LycvXkCjvAEUegpIOIO5Xj829BhJLFoX3qMm9IgIgU6r0eQnSST8kX8cjQe8leLMQMAoebKqH0oyR+MgOt1E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108647},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.mjs","require":"./dist/icons/index.js"}},"scripts":{"dev":"tsup --watch","build":"tsup","prepublishOnly":"npm run build"},"_npmUser":{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"},"_npmVersion":"11.6.2","description":"Zone01 Normandie — composants UI partagés","directories":{},"_nodeVersion":"24.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","react":"^18.0.0","react-dom":"^18.0.0","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0"},"peerDependencies":{"react":">=17.0.0","react-dom":">=17.0.0"},"_npmOperationalInternal":{"tmp":"tmp/launcher_1.0.5_1777559028962_0.23258002197849836","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@01normandie/launcher","version":"1.0.6","author":{"name":"Zone01 Normandie"},"license":"MIT","_id":"@01normandie/launcher@1.0.6","maintainers":[{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"}],"dist":{"shasum":"f69f6679fe56fa3ba6d2dcb93bb2c7443e71c600","tarball":"https://registry.npmjs.org/@01normandie/launcher/-/launcher-1.0.6.tgz","fileCount":16,"integrity":"sha512-Q3RKNn2BgWTH0XkWJVsGBy+X4vPWo/6m5xXSebvuVadwNyWe3sZMN1z3v4P6zxsZo71JPdBtBIBo5NRvw3dtOw==","signatures":[{"sig":"MEQCIF50KPPAeY/sXTvy61rXE6qw3rrbMx+3rU6Y6UXhUpVKAiBn3BE++0O95rKLDPRLV3IA1klB3FY8BHDIxhWwIxWBdA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108647},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.mjs","require":"./dist/icons/index.js"}},"scripts":{"dev":"tsup --watch","build":"tsup","prepublishOnly":"npm run build"},"_npmUser":{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"},"_npmVersion":"11.6.2","description":"Zone01 Normandie — composants UI partagés","directories":{},"_nodeVersion":"24.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","react":"^18.0.0","react-dom":"^18.0.0","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0"},"peerDependencies":{"react":">=17.0.0","react-dom":">=17.0.0"},"_npmOperationalInternal":{"tmp":"tmp/launcher_1.0.6_1777559214671_0.29879970654008536","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@01normandie/launcher","version":"1.0.7","author":{"name":"Zone01 Normandie"},"license":"MIT","_id":"@01normandie/launcher@1.0.7","maintainers":[{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"}],"dist":{"shasum":"798f75741d62571ae0186236d87387e80bf213dc","tarball":"https://registry.npmjs.org/@01normandie/launcher/-/launcher-1.0.7.tgz","fileCount":16,"integrity":"sha512-prlJbxQCLaNNdNOUeMOQg415YF5cCfRWEbtM3Fj51YRLbWPUR9dppE93ryvzUd54pb5N24DHx4crX7jSnvfyhA==","signatures":[{"sig":"MEYCIQDr6UcggnmlK2k/w03AZ+jCHI9bhHbmfp9fx5LRKW6hMwIhAI0MjNUKNY98DKOA7xY11a9yAEY+fMNnaLjJOM/iOlL0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109351},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.mjs","require":"./dist/icons/index.js"}},"scripts":{"dev":"tsup --watch","build":"tsup","prepublishOnly":"npm run build"},"_npmUser":{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"},"_npmVersion":"11.6.2","description":"Zone01 Normandie — composants UI partagés","directories":{},"_nodeVersion":"24.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","react":"^18.0.0","react-dom":"^18.0.0","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0"},"peerDependencies":{"react":">=17.0.0","react-dom":">=17.0.0"},"_npmOperationalInternal":{"tmp":"tmp/launcher_1.0.7_1777560400521_0.5613847235478597","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@01normandie/launcher","version":"1.0.8","author":{"name":"Zone01 Normandie"},"license":"MIT","_id":"@01normandie/launcher@1.0.8","maintainers":[{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"}],"dist":{"shasum":"4243ed46cd1f67b6642f5356cbef5c10b960d226","tarball":"https://registry.npmjs.org/@01normandie/launcher/-/launcher-1.0.8.tgz","fileCount":16,"integrity":"sha512-XNQBVT8DgEyn3U1Bqf7Rd3O1g9tnLkHh1cNW5ZWXS0QYhHtCgzeg9rONIb6+o6jQX7HUhGmjd+Rb3wIt4PTVDQ==","signatures":[{"sig":"MEQCIFVLI46a53ve1z888qBYz9FR3ZPouQr7w/NtgS3s3SBuAiB1TrtNaBszkBrBW8C0z5imZQ7gR8YpJ1hcaz+1muoTcA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108918},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.mjs","require":"./dist/icons/index.js"}},"scripts":{"dev":"tsup --watch","build":"tsup","prepublishOnly":"npm run build"},"_npmUser":{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"},"_npmVersion":"11.6.2","description":"Zone01 Normandie — composants UI partagés","directories":{},"_nodeVersion":"24.0.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","react":"^18.0.0","react-dom":"^18.0.0","typescript":"^5.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0"},"peerDependencies":{"react":">=17.0.0","react-dom":">=17.0.0"},"_npmOperationalInternal":{"tmp":"tmp/launcher_1.0.8_1777984087318_0.5006479254359413","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@01normandie/launcher","version":"2.0.0","description":"Zone01 Normandie — composants UI partagés","author":{"name":"Zone01 Normandie"},"license":"MIT","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./icons":{"types":"./dist/icons/index.d.ts","import":"./dist/icons/index.mjs","require":"./dist/icons/index.js"}},"scripts":{"build":"tsup","dev":"tsup --watch","prepublishOnly":"npm run build"},"peerDependencies":{"react":">=17.0.0","react-dom":">=17.0.0"},"devDependencies":{"@types/react":"^18.0.0","@types/react-dom":"^18.0.0","react":"^18.0.0","react-dom":"^18.0.0","tsup":"^8.0.0","typescript":"^5.0.0"},"publishConfig":{"access":"public"},"_id":"@01normandie/launcher@2.0.0","_nodeVersion":"24.0.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-iHQgjY6nmWM2M7h7K3yxprl29Kqg7+S3jxpMzlE4+Baik/0/bmgZcf6ffwTyJ+nDb1AznRGLg1PXP6j5DekDiA==","shasum":"7f6600689765b1d166c0787a07721a1f5b660084","tarball":"https://registry.npmjs.org/@01normandie/launcher/-/launcher-2.0.0.tgz","fileCount":16,"unpackedSize":110823,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDmCGWzfd6u7N2MtHff5keKcWcyKvVd4N3jFzHOuVsRwAIgUNdQ/YDEo32flNaQhH1SkBR2etG+n8pIPli6ToaClnk="}]},"_npmUser":{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"},"directories":{},"maintainers":[{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/launcher_2.0.0_1778060246951_0.8804138741196235"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-30T13:22:33.726Z","modified":"2026-05-06T09:37:27.252Z","1.0.0":"2026-04-30T13:22:33.931Z","1.0.1":"2026-04-30T13:25:32.657Z","1.0.2":"2026-04-30T13:32:29.683Z","1.0.3":"2026-04-30T13:47:29.339Z","1.0.4":"2026-04-30T13:56:27.657Z","1.0.5":"2026-04-30T14:23:49.124Z","1.0.6":"2026-04-30T14:26:54.825Z","1.0.7":"2026-04-30T14:46:40.713Z","1.0.8":"2026-05-05T12:28:07.480Z","2.0.0":"2026-05-06T09:37:27.128Z"},"author":{"name":"Zone01 Normandie"},"license":"MIT","description":"Zone01 Normandie — composants UI partagés","maintainers":[{"name":"bissha01","email":"vivien.frebourg@zone01normandie.org"}],"readme":"# @01normandie/launcher\n\nBarre de navigation latérale partagée entre toutes les applications Zone01 Normandie.\n\nLe package embarque les icônes, labels et URLs de chaque outil — l'application consommatrice n'a qu'à préciser quelle app est active et passer les infos de l'utilisateur connecté.\n\n---\n\n## Installation\n\n```bash\nnpm install @01normandie/launcher\n```\n\nReact 17+ doit être présent dans l'application (peer dependency).\n\n---\n\n## Utilisation\n\n### Next.js App Router (`app/layout.tsx`)\n\n> **Attention — piège fréquent** : `LauncherSidebar` utilise des hooks React (`useState`, `useEffect`) et des APIs navigateur (`localStorage`), mais ne déclare pas lui-même `'use client'`. Dans Next.js App Router, les layouts sont des Server Components par défaut — importer `LauncherSidebar` directement dans `layout.tsx` sans `'use client'` causera une erreur au runtime.\n>\n> La bonne pratique est de créer un wrapper client fin, et de garder le layout en Server Component pour pouvoir y appeler `getServerSession`.\n\n#### Étape 1 — Créer un wrapper client\n\nCrée `components/AppSidebar.tsx` :\n\n```tsx\n'use client';\n\nimport { LauncherSidebar } from '@01normandie/launcher';\nimport { signOut } from 'next-auth/react';\nimport type { ReactNode } from 'react';\n\ninterface AppSidebarProps {\n  user?: { name: string; initials: string } | null;\n  children: ReactNode;\n}\n\nexport default function AppSidebar({ user, children }: AppSidebarProps) {\n  return (\n    <LauncherSidebar\n      activeAppId=\"01deck\"\n      user={user}\n      onLogout={() => signOut({ callbackUrl: '/' })}\n    >\n      {children}\n    </LauncherSidebar>\n  );\n}\n```\n\nCe composant est le seul à porter `'use client'`. Il reçoit `user` comme prop sérialisable depuis le serveur.\n\n#### Étape 2 — Utiliser `getServerSession` dans le layout\n\nDans `app/layout.tsx` (Server Component, pas de `'use client'`) :\n\n```tsx\nimport { getServerSession } from 'next-auth';\nimport { authOptions } from '@/auth';\nimport AppSidebar from '@/components/AppSidebar';\n\nfunction computeInitials(name: string): string {\n  return name\n    .split(' ')\n    .map((part) => part[0])\n    .filter(Boolean)\n    .slice(0, 2)\n    .join('')\n    .toUpperCase();\n}\n\nexport default async function RootLayout({ children }) {\n  const session = await getServerSession(authOptions);\n\n  const user = session?.user?.name\n    ? { name: session.user.name, initials: computeInitials(session.user.name) }\n    : null;\n\n  return (\n    <html lang=\"fr\">\n      <body>\n        <AppSidebar user={user}>\n          {children}\n        </AppSidebar>\n      </body>\n    </html>\n  );\n}\n```\n\n- Si l'utilisateur n'est pas connecté, `user` vaut `null` → la sidebar affiche le bouton \"Se connecter\".\n- Si connecté, `user.name` vient de `session.user.name` (fourni par NextAuth/Authentik), et les initiales sont calculées automatiquement (`\"Alice Leroi\"` → `\"AL\"`).\n- Comme le layout est un Server Component, la session est récupérée côté serveur — aucun flash client, aucune requête supplémentaire.\n\nLes balises `<html>` et `<body>` restent dans le layout — c'est requis par Next.js.\n\n### React (Vite / CRA)\n\n```tsx\nimport { LauncherSidebar } from '@01normandie/launcher';\n\nexport default function App() {\n  const user = { name: 'Alice L.', initials: 'AL' };\n\n  return (\n    <LauncherSidebar\n      activeAppId=\"01deck\"\n      user={user}\n      loginHref=\"/login\"\n      onLogout={() => { /* ta logique : signOut(), router.push('/login'), etc. */ }}\n    >\n      {/* contenu de l'app */}\n    </LauncherSidebar>\n  );\n}\n```\n\nAucun import CSS nécessaire — les styles sont injectés automatiquement.\n\n---\n\n## Props\n\n| Prop | Type | Requis | Description |\n|---|---|---|---|\n| `activeAppId` | `AppId` | ✅ | ID de l'application courante (met en surbrillance l'entrée correspondante dans la nav) |\n| `user` | `{ name: string; initials: string } \\| null` | — | Utilisateur connecté. `null` affiche un bouton \"Se connecter\" à la place |\n| `loginHref` | `string` | — | URL vers laquelle redirige le bouton \"Se connecter\" |\n| `onLogout` | `() => void` | — | Fonction appelée au clic sur le bouton de déconnexion — gère ta propre logique (vider le token, rediriger, etc.) |\n| `children` | `ReactNode` | — | Contenu principal de l'application (affiché à droite de la nav) |\n\n### Type `AppId`\n\n```ts\ntype AppId = '01deck' | 'emargement' | 'apprentissage';\n```\n\n---\n\n## Applications incluses\n\nLa liste des applications est gérée centralement dans le package. Mettre à jour le package suffit pour que toutes les apps voient apparaître un nouvel outil.\n\n| ID | Label | URL |\n|---|---|---|\n| `01deck` | 01deck | https://deck.zone01normandie.org |\n| `emargement` | Émargement | https://emargement.zone01normandie.org |\n| `apprentissage` | Intra | http://zone01normandie.org |\n\n---\n\n## Comportement\n\n- **Mode compact** (par défaut) : seules les icônes sont affichées. Cliquer sur le logo Zone01 déploie la barre.\n- **Mode étendu** : icônes + labels + nom de l'utilisateur + bouton de déconnexion.\n- L'état expanded/collapsed est persisté dans le `localStorage` de l'utilisateur.\n- La touche `Échap` referme la barre si elle est ouverte.\n\n---\n\n## Mise à jour du package\n\n### 1. Modifier les sources\n\nLes applications et leurs métadonnées (icône, label, URL, badge) sont dans :\n\n```\nsrc/LauncherSidebar.tsx  →  const APPS\nsrc/icons/index.tsx      →  icônes SVG\nsrc/style.css            →  styles\n```\n\n### 2. Bumper la version\n\n```bash\ncd 01launcher\n\nnpm version patch   # correctif mineur      1.0.0 → 1.0.1\nnpm version minor   # nouvelle fonctionnalité  1.0.0 → 1.1.0\nnpm version major   # changement breaking   1.0.0 → 2.0.0\n```\n\n### 3. Publier\n\n```bash\nnpm publish\n```\n\nLe build se lance automatiquement avant l'upload (`prepublishOnly`). Avoir l'application 2FA sous la main pour le code OTP.\n\n### 4. Mettre à jour dans les apps consommatrices\n\n```bash\nnpm update @01normandie/launcher\n```\n","readmeFilename":"README.md"}