{"_id":"@cadriciel/core","_rev":"6-8303ac1414f4906ce1f634b7d09b88d2","name":"@cadriciel/core","dist-tags":{"latest":"0.2.0"},"versions":{"0.0.1":{"name":"@cadriciel/core","version":"0.0.1","_id":"@cadriciel/core@0.0.1","maintainers":[{"name":"stephane.zucatti","email":"stephane.zucatti@me.com"}],"dist":{"shasum":"912b6f6daf0eaa1088318c8abd917ea258fae767","tarball":"https://registry.npmjs.org/@cadriciel/core/-/core-0.0.1.tgz","fileCount":28,"integrity":"sha512-6C6v6hA3ERblKtfkChAb6/gLZXT5dmOW4jUNVob9vVdCVZlSIisg2AO16/OXKUJifj4r6pnC9Zhqol49lG/ltQ==","signatures":[{"sig":"MEUCIHjraM7v64DovhbDXE/zVsyaukT0WIx1P4p33uAblj7mAiEA8Acj24JOTr9nT+yRsS+yCkKzqp7taPAYC3URYspeLHk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":195951},"gitHead":"f5ed447c1f802fe4e483e237bf4110e2e116c249","private":false,"scripts":{"ng":"ng","test":"ng test","build":"ng-packagr -p ng-package.json","start":"ng serve","watch":"ng build --watch --configuration development"},"_npmUser":{"name":"stephane.zucatti","email":"stephane.zucatti@me.com"},"prettier":{"overrides":[{"files":"*.html","options":{"parser":"angular"}}],"printWidth":100,"singleQuote":true},"_npmVersion":"10.8.2","description":"This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 21.1.1.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.5","devDependencies":{"jsdom":"^27.1.0","vitest":"^4.0.8","ng-packagr":"^21.1.0","typescript":"~5.9.2","@angular/cli":"^21.1.1","@angular/build":"^21.1.1","angular-oauth2-oidc":"^20.0.2","@angular/compiler-cli":"^21.1.0"},"peerDependencies":{"rxjs":"^7.8.0","@angular/core":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0","@angular/common":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0","@angular/router":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.0.1_1769420744850_0.13028201286586505","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@cadriciel/core","version":"0.0.2","_id":"@cadriciel/core@0.0.2","maintainers":[{"name":"stephane.zucatti","email":"stephane.zucatti@me.com"}],"dist":{"shasum":"9da799deeffdf60201c876fc3d104ca772cf47ab","tarball":"https://registry.npmjs.org/@cadriciel/core/-/core-0.0.2.tgz","fileCount":30,"integrity":"sha512-k7r8O88FiD+AWjbY5YEF2g+9a/WfhBOYKzz+fux88bEnYpIb5saM9liDLNTm8pniWBNhC/HayaLvjZAiAIpzzw==","signatures":[{"sig":"MEQCIGakoCuip3vzCDyirugN2EgdqjQpNHHUGno+RM3o4lOwAiAW8iWRvG9qAuJo9/vK5p16tz2l+M+GSA9yn8geUr2DhA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":196955},"gitHead":"bb7ff55a5cbdb8f424f773cc99a12c933159fc2e","private":false,"scripts":{"ng":"ng","test":"ng test","build":"ng-packagr -p ng-package.json","start":"ng serve","watch":"ng build --watch --configuration development"},"_npmUser":{"name":"stephane.zucatti","email":"stephane.zucatti@me.com"},"prettier":{"overrides":[{"files":"*.html","options":{"parser":"angular"}}],"printWidth":100,"singleQuote":true},"_npmVersion":"10.8.2","description":"This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 21.1.1.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.5","devDependencies":{"jsdom":"^27.1.0","vitest":"^4.0.8","ng-packagr":"^21.1.0","typescript":"~5.9.2","@angular/cli":"^21.1.1","@angular/build":"^21.1.1","angular-oauth2-oidc":"^20.0.2","@angular/compiler-cli":"^21.1.0"},"peerDependencies":{"rxjs":"^7.8.0","@angular/core":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0","@angular/common":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0","@angular/router":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.0.2_1769436877938_0.38520698901348527","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@cadriciel/core","version":"0.0.3","_id":"@cadriciel/core@0.0.3","maintainers":[{"name":"stephane.zucatti","email":"stephane.zucatti@me.com"}],"dist":{"shasum":"c713e350c463f4087d2034353e9beed98048d845","tarball":"https://registry.npmjs.org/@cadriciel/core/-/core-0.0.3.tgz","fileCount":5,"integrity":"sha512-uNb6ENUgrH2Sixx3WWt/RBDD0KE56A++O7NbQpk7lB5s9FaonBxp4g+A14FJZ60vploPo2lOjO7s9/VugtagFw==","signatures":[{"sig":"MEYCIQCvEOvOTEU5T3l/9q4M5vmYMbjSiB/iTKIGin4hqLiO2gIhANiIxolSvZeHR8iIwn36AjUbOIGiytEdDmgFNgS0ED/6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":144789},"module":"fesm2022/cadriciel-core.mjs","exports":{".":{"types":"./types/cadriciel-core.d.ts","default":"./fesm2022/cadriciel-core.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"bbfea058eda43431ce0ae38cdf38adb67779bd1c","private":false,"typings":"types/cadriciel-core.d.ts","_npmUser":{"name":"stephane.zucatti","email":"stephane.zucatti@me.com"},"_npmVersion":"10.8.2","description":"This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 21.1.1.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.5","peerDependencies":{"rxjs":"^7.8.0","@angular/core":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0","@angular/common":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0","@angular/router":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.0.3_1769447128229_0.9627443067289954","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@cadriciel/core","version":"0.0.4","_id":"@cadriciel/core@0.0.4","maintainers":[{"name":"stephane.zucatti","email":"stephane.zucatti@me.com"}],"dist":{"shasum":"a642c4546ebc72e3609046c755df098214092dd8","tarball":"https://registry.npmjs.org/@cadriciel/core/-/core-0.0.4.tgz","fileCount":5,"integrity":"sha512-YoDOqVtDWQV9KEg3d6R/rUZ+v+ehRz12OlcrHDpDN9331WFeIeD0+as0o2vfjCJ2bRhCN8inYzc2sopbdAWYVQ==","signatures":[{"sig":"MEYCIQDCbqKppxhMcDvQIj/x4Uqeq3zMxtMLzjP+OQKenA0e7QIhAP3aHiKxjyVSprhCwwa3VgyfiChdDhN3mHMhA+XoQMP5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":145657},"main":"./dist/fesm2022/cadriciel-core.mjs","types":"./dist/types/cadriciel-core.d.ts","module":"fesm2022/cadriciel-core.mjs","exports":{".":{"types":"./types/cadriciel-core.d.ts","default":"./fesm2022/cadriciel-core.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"21cd6407190f259b5f5c68f90ac89f82268ee67c","private":false,"typings":"types/cadriciel-core.d.ts","_npmUser":{"name":"stephane.zucatti","email":"stephane.zucatti@me.com"},"_npmVersion":"10.8.2","description":"This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 21.1.1.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.5","peerDependencies":{"rxjs":"^7.8.0","@angular/core":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0","@angular/common":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0","@angular/router":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.0.4_1769451503788_0.009472014534842144","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@cadriciel/core","version":"0.0.5","_id":"@cadriciel/core@0.0.5","maintainers":[{"name":"stephane.zucatti","email":"stephane.zucatti@me.com"}],"dist":{"shasum":"abe13d1f9ed67da576beeaadac6d6dde5f9a919e","tarball":"https://registry.npmjs.org/@cadriciel/core/-/core-0.0.5.tgz","fileCount":5,"integrity":"sha512-hL3ER9iilKDNc9psz3FbxqD96QSrlNd2qG3tVtJuyD+XmxArURIP9DH6bEknhprscp3OOBld42wgjf2YsObcCA==","signatures":[{"sig":"MEQCIBQ7tY8W8BriC/vdHQdjTWqCqQlgTgKL/hSg+EMjkt8pAiAaYSj2fBpDysrCMk/nFLuYQmH9X5y78tJ8B7MYl4Gw2Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":145657},"main":"./dist/fesm2022/cadriciel-core.mjs","types":"./dist/types/cadriciel-core.d.ts","module":"fesm2022/cadriciel-core.mjs","exports":{".":{"types":"./types/cadriciel-core.d.ts","default":"./fesm2022/cadriciel-core.mjs"},"./package.json":{"default":"./package.json"}},"gitHead":"4618679ed360f05f609a5ed7a5bece04ae9df0d2","private":false,"typings":"types/cadriciel-core.d.ts","_npmUser":{"name":"stephane.zucatti","email":"stephane.zucatti@me.com"},"_npmVersion":"10.8.2","description":"This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 21.1.1.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.5","peerDependencies":{"rxjs":"^7.8.0","@angular/core":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0","@angular/common":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0","@angular/router":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0"},"_npmOperationalInternal":{"tmp":"tmp/core_0.0.5_1769452743242_0.8454659911911022","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@cadriciel/core","version":"0.2.0","main":"./dist/fesm2022/cadriciel-core.mjs","module":"fesm2022/cadriciel-core.mjs","types":"./dist/types/cadriciel-core.d.ts","exports":{"./package.json":{"default":"./package.json"},".":{"types":"./types/cadriciel-core.d.ts","default":"./fesm2022/cadriciel-core.mjs"}},"private":false,"packageManager":"bun@1.3.5","peerDependencies":{"@angular/common":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0","@angular/core":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0","@angular/router":"^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0","rxjs":"^7.8.0"},"dependencies":{"tslib":"^2.3.0"},"sideEffects":false,"typings":"types/cadriciel-core.d.ts","_id":"@cadriciel/core@0.2.0","gitHead":"c3c6e39df868f65d3482ee8fab74c72760317a94","description":"Briques transverses des applications Cadriciel (CEREMA) : accès aux données et aux API, identité, temps réel, fichiers, thème et contrat de layout.","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-DdD7cmABtQwJfqYYIR2A9XohbfIwaloJrbg1Da+gZiQuQnvMeO2ctFxH135r6GbJJqZQIXtGIkFfih4hkYKDig==","shasum":"54e5623b155ed5fa7f69288b940ea825a398391b","tarball":"https://registry.npmjs.org/@cadriciel/core/-/core-0.2.0.tgz","fileCount":5,"unpackedSize":155837,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIE2oDqSe1u64Ul+o83xBa131zWkqhlpxaehSuVNQrnbFAiAwamoqQlpWPkmtrP7BY2JXDxzj/aecwGAf01qChGsC5w=="}]},"_npmUser":{"name":"stephane.zucatti","email":"stephane.zucatti@me.com"},"directories":{},"maintainers":[{"name":"stephane.zucatti","email":"stephane.zucatti@me.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/core_0.2.0_1787039242527_0.657335289679225"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-26T09:45:44.761Z","modified":"2026-08-18T07:47:23.197Z","0.0.1":"2026-01-26T09:45:45.006Z","0.0.2":"2026-01-26T14:14:38.085Z","0.0.3":"2026-01-26T17:05:28.381Z","0.0.4":"2026-01-26T18:18:23.944Z","0.0.5":"2026-01-26T18:39:03.393Z","0.2.0":"2026-08-18T07:47:22.672Z"},"description":"Briques transverses des applications Cadriciel (CEREMA) : accès aux données et aux API, identité, temps réel, fichiers, thème et contrat de layout.","maintainers":[{"name":"stephane.zucatti","email":"stephane.zucatti@me.com"}],"readme":"# @cadriciel/core\n\nBriques transverses des applications Cadriciel (CEREMA) : accès aux données et aux API,\nidentité, temps réel, fichiers, thème et contrat de layout.\n\nPubliée sur npmjs sous `@cadriciel/core`. Consommée par le template `cadriciel-frontend`,\ndonc par tous les projets créés depuis le studio, et par le shell frontless.\n\n```bash\nnpm install @cadriciel/core\n```\n\n## Ce que le paquet fournit\n\n| Domaine | Symboles |\n|---|---|\n| Configuration | `ApplicationConfigService`, `CADRICIEL_CORE_CONFIG`, `CADRICIEL_AUTH_ENV`, `CadricielAuthEnvironment` |\n| Données | `QueryService`, `AggregateBuilder`, `CadricielService` |\n| Identité | `UserService`, `User`, `Claims`, `MyStorageService` |\n| Temps réel | `RealtimeService`, `ChannelController`, `WsService` |\n| Fichiers | `MyFilesService` |\n| Thème | `ThemeService`, `ThemeMode`, `THEME_DARK_CLASS` |\n| Layout (contrat) | `LayoutConfig`, `LayoutCapabilities`, `ToolbarConfig`, `ToolbarItem`, `MenuMode`, `AppMenuItem`, `MenuService` |\n\n## Thème clair / sombre\n\n`ThemeService` est la source de vérité du thème. Il est indépendant du layout : une\napplication sans layout peut l'utiliser, et changer de layout ne change rien au thème.\n\n```ts\nconst theme = inject(ThemeService);\n\ntheme.isDark();          // signal — thème effectivement appliqué\ntheme.mode();            // 'light' | 'dark' | 'system'\ntheme.toggle();          // bascule et persiste le choix\ntheme.set('dark');\ntheme.useSystem();       // repasse au suivi du système, oublie le choix\ntheme.initialize('dark') // défaut projet ; sans effet si l'utilisateur a déjà choisi\n```\n\nLe service pose la classe `theme-dark` sur `<html>` — la convention de\n[`@cadriciel/ui`](https://www.npmjs.com/package/@cadriciel/ui), dont les composants ne\nlisent que les tokens `--cad-*`. Sans choix persisté, la préférence système s'applique et\nreste suivie à chaud. La bascule emprunte l'API View Transitions quand elle est disponible,\nsauf si l'utilisateur a demandé moins d'animations.\n\n## Contrat de layout\n\n`LayoutConfig` décrit ce que l'application *demande* ; `LayoutCapabilities` ce qu'un layout\n*sait rendre*. Tous les champs de configuration sont optionnels et un layout peut n'en\nhonorer aucun — l'application interroge les capacités plutôt que de supposer.\n\nL'**état interne** d'un layout (menu replié, sous-menu ouvert, transition en cours) ne fait\npas partie du contrat : il appartient au layout qui l'implémente et disparaît avec lui.\nC'est ce qui permet d'en permuter un sans toucher au reste.\n\n`AppMenuItem` est aligné sur `CadMenuItem` de `@cadriciel/ui` : un menu se passe\ndirectement à `<cad-menu>` sans adaptation. `icon` est un **nom** d'icône (`user`,\n`settings`), jamais une classe CSS.\n\n## Développement\n\n```bash\nbun install\nbun run build     # ng-packagr → dist/\n```\n\nLa CI publie sur npmjs sur un tag `v*`, ou sur `main` quand `package.json` change.\n\n## Journal des versions\n\n### 0.2.0 — changements incompatibles\n\nVersion de la sortie de PrimeNG. Trois retraits, aucun consommateur connu n'était concerné.\n\n- **`LayoutService` retiré.** C'était la machine à états d'un layout précis\n  (`slim-plus`, `overlaySubmenuActive`, `showConfigSidebar()`), pas un service transverse.\n  La figer ici revenait à faire dicter par le core les rouages internes d'un layout, ce qui\n  interdit d'en permuter un. Cet état appartient désormais au layout qui l'implémente.\n  Le seul comportement réellement partagé qu'il portait — la bascule clair/sombre — est\n  repris par `ThemeService`, en mieux.\n- **`LayoutState` retiré**, pour la même raison.\n- **`LayoutConfig` nettoyé.** `preset`, `primary`, `surface` et `layoutTheme` étaient des\n  notions PrimeNG. Remplacés par `defaultTheme` et `accent`. Ajout des quatre drapeaux\n  `showBreadcrumb` / `showFooter` / `showSearch` / `showSettings` et de `toolbarConfig`,\n  qui existaient dans le template mais pas ici — le core était en retard sur son propre\n  contrat.\n- **`AppMenuItem` enrichi** : `command`, `disabled`, `visible`, `queryParams`, `id`,\n  `title`, `badge` numérique, `routerLink` accepte une chaîne. Aligné sur `CadMenuItem`.\n- **`MenuService.items`** expose le menu en signal. `getMenu()` reste disponible mais rend\n  un instantané : un layout qui l'appelait une fois à l'initialisation ne voyait jamais les\n  mises à jour.\n- Ajout de `LayoutCapabilities`, `EMPTY_LAYOUT_CAPABILITIES`, `ThemeService`, `ThemeMode`,\n  `THEME_DARK_CLASS`.\n","readmeFilename":"README.md"}