{"_id":"@axiome-apps/atelier-content","_rev":"5-c4a777e762e8dbbbde81074ae09dadec","name":"@axiome-apps/atelier-content","dist-tags":{"latest":"0.6.2"},"versions":{"0.3.0":{"name":"@axiome-apps/atelier-content","version":"0.3.0","keywords":["content","cms","headless","page-builder","config-as-code","echoppe","prisme"],"author":{"name":"MrCasquette"},"license":"CECILL-2.1","_id":"@axiome-apps/atelier-content@0.3.0","maintainers":[{"name":"mrcasquette","email":"contact@vincent-cottalorda.fr"}],"dist":{"shasum":"3c0b082e4c230beab51d0ff84cdc38b118b6a5f7","tarball":"https://registry.npmjs.org/@axiome-apps/atelier-content/-/atelier-content-0.3.0.tgz","fileCount":47,"integrity":"sha512-550k3gAhrSKN9kJrRA/ayW1KWbfsLqLxXCppgVJf6DAV3+dQOtizqVLJGNePV/joMsTY9eyNNA8LDhWf38oswQ==","signatures":[{"sig":"MEYCIQDZoqqzqWsYUcgOPxI1X0LmN+YXX/NZm8nPm1jsg3aoYgIhAK8dCjMrTHQXGcCecLaf3xTeXu1CIZoy0dn+pP2ZJavz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95033},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"dc7f91f8f07c77acd89a2d6b88fec94c3739ff94","scripts":{"test":"bun test src","build":"tsc -p tsconfig.build.json","type-check":"tsc --noEmit"},"_npmUser":{"name":"mrcasquette","email":"contact@vincent-cottalorda.fr"},"_npmVersion":"11.16.0","description":"Déclaration de contenu config-as-code — sections, composants, entités et champs typés, synchronisés vers l'API. Partagé par Échoppe et Prisme.","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"^1.3.14","typescript":"6.0.3","@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/atelier-content_0.3.0_1787565049773_0.14190953870538636","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@axiome-apps/atelier-content","version":"0.4.0","keywords":["content","cms","headless","page-builder","config-as-code","echoppe","prisme"],"author":{"name":"MrCasquette"},"license":"CECILL-2.1","_id":"@axiome-apps/atelier-content@0.4.0","maintainers":[{"name":"mrcasquette","email":"contact@vincent-cottalorda.fr"}],"dist":{"shasum":"44ad96645d1a8a269c0bece2b9408e438bc77e94","tarball":"https://registry.npmjs.org/@axiome-apps/atelier-content/-/atelier-content-0.4.0.tgz","fileCount":47,"integrity":"sha512-34f0CG5zBO9pXSRdTD68zk12P63kuJYmRJCCFPVVO04NJ6V+/Z9I1vPdOtmiP0Sjm7/65VFwu6BP24xu1Ip7WQ==","signatures":[{"sig":"MEUCIQC++V16/ZTpe3ccHZ28g1h7PzzEqHH60D4XaQYFtbC7sQIgdz9SFvkDXSCXY8scMvisw1WN43BGP7HqRQNICNFfGMk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95033},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"28127e0075632496b944ee713ab639a331489615","scripts":{"test":"bun test src","build":"tsc -p tsconfig.build.json","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47497a86-c4d6-4a2b-8835-b0013dcf41fa"}},"_npmVersion":"11.19.0","description":"Déclaration de contenu config-as-code — sections, composants, entités et champs typés, synchronisés vers l'API. Partagé par Échoppe et Prisme.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"^1.3.14","typescript":"6.0.3","@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/atelier-content_0.4.0_1787565542851_0.8649702944889974","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@axiome-apps/atelier-content","version":"0.5.0","keywords":["content","cms","headless","page-builder","config-as-code","echoppe","prisme"],"author":{"name":"MrCasquette"},"license":"CECILL-2.1","_id":"@axiome-apps/atelier-content@0.5.0","maintainers":[{"name":"mrcasquette","email":"contact@vincent-cottalorda.fr"}],"dist":{"shasum":"53e62be68bbe8430710de67399ccd429b96579e0","tarball":"https://registry.npmjs.org/@axiome-apps/atelier-content/-/atelier-content-0.5.0.tgz","fileCount":47,"integrity":"sha512-adbvNgZvJuXOEg2tkLS0GZdcRrczjMcOZJcB/xaPgWLoQM7jZDW6W9QsdFtOsTXmDrGD6cgme/rXDEBnk5sq4g==","signatures":[{"sig":"MEUCIQC9dhRkQkRT/FsNNvgfD0XXnbJA4+5NSacRPwDJRF0JugIgF4J2bbxjlqgDYo05rPQ0i3+l0Uhs7UqosXQi5ONbffI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105529},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"aeec0855e46dc4e6a3012cc03b9c7089094a250e","scripts":{"test":"bun test src","build":"tsc -p tsconfig.build.json","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47497a86-c4d6-4a2b-8835-b0013dcf41fa"}},"_npmVersion":"11.19.0","description":"Déclaration de contenu config-as-code — sections, composants, entités et champs typés, synchronisés vers l'API. Partagé par Échoppe et Prisme.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@axiome-apps/atelier-prose":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"^1.3.14","typescript":"6.0.3","@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/atelier-content_0.5.0_1787576270033_0.4491683924413976","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@axiome-apps/atelier-content","version":"0.6.1","keywords":["content","cms","headless","page-builder","config-as-code","echoppe","prisme"],"author":{"name":"MrCasquette"},"license":"CECILL-2.1","_id":"@axiome-apps/atelier-content@0.6.1","maintainers":[{"name":"mrcasquette","email":"contact@vincent-cottalorda.fr"}],"homepage":"https://github.com/MrCasquette/atelier#readme","bugs":{"url":"https://github.com/MrCasquette/atelier/issues"},"dist":{"shasum":"a937df9baaa3084980713aee3849d0080b0ff516","tarball":"https://registry.npmjs.org/@axiome-apps/atelier-content/-/atelier-content-0.6.1.tgz","fileCount":47,"integrity":"sha512-1Hi9ievQQPZNJ/vfoCFMtaxTSc6jXrFKEZFXuYthtGvUDwHjZPdGQInEtukpbcw620MEp9XEApo++mlTtiRl2w==","signatures":[{"sig":"MEYCIQDCWjr0CjydHxUH4RqaB6Awb85+6h5m0gzK1nl+FgQ8fwIhAOLpqiIbT85fmyIR69tDbKBsR1GUuEH3YuXbjWSCtfsg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@axiome-apps%2fatelier-content@0.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":108388},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"4cb8ce3ffacf0612e1d15e447dd65451bafdfebd","scripts":{"test":"bun test src","build":"tsc -p tsconfig.build.json","type-check":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47497a86-c4d6-4a2b-8835-b0013dcf41fa"}},"repository":{"url":"git+https://github.com/MrCasquette/atelier.git","type":"git","directory":"packages/content"},"_npmVersion":"11.19.1","description":"Déclaration de contenu config-as-code — sections, composants, entités et champs typés, synchronisés vers l'API. Partagé par Échoppe et Prisme.","directories":{},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"@axiome-apps/atelier-prose":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"^1.3.14","typescript":"6.0.3","@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/atelier-content_0.6.1_1789056486663_0.796678617930574","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"@axiome-apps/atelier-content","version":"0.6.2","description":"Déclaration de contenu config-as-code — sections, composants, entités et champs typés, synchronisés vers l'API. Partagé par Échoppe et Prisme.","repository":{"type":"git","url":"git+https://github.com/MrCasquette/atelier.git","directory":"packages/content"},"type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"sideEffects":false,"publishConfig":{"access":"public"},"scripts":{"build":"tsc -p tsconfig.build.json","test":"bun test src","type-check":"tsc --noEmit"},"keywords":["content","cms","headless","page-builder","config-as-code","echoppe","prisme"],"author":{"name":"MrCasquette"},"license":"CECILL-2.1","dependencies":{"@axiome-apps/atelier-prose":"^0.1.1"},"devDependencies":{"@types/node":"^22.10.2","bun-types":"^1.3.14","typescript":"6.0.3"},"gitHead":"7108b9177ef300dc0ad13a5312071e12475f314e","_id":"@axiome-apps/atelier-content@0.6.2","bugs":{"url":"https://github.com/MrCasquette/atelier/issues"},"homepage":"https://github.com/MrCasquette/atelier#readme","_nodeVersion":"24.20.0","_npmVersion":"11.19.1","dist":{"integrity":"sha512-2CAgrU3ntg9LxmaLlKT03WM5n1itZU5cbrwLcDLZf+rTIfPRWfzzQt4qlbo1BJF7SUGUVBbWcvt2cs6I3MLWoA==","shasum":"d2019a0095f7265d421e08c59a2fb613f4244f7e","tarball":"https://registry.npmjs.org/@axiome-apps/atelier-content/-/atelier-content-0.6.2.tgz","fileCount":47,"unpackedSize":110130,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@axiome-apps%2fatelier-content@0.6.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIETR1A9lqmmwR1dtfF29EpW3gQjU6Mnqwg7b63Q3NWC+AiEA6IsBeCE1LlTPeETVSx8HXksKRDo0UuC1xxg3DbblpMg="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47497a86-c4d6-4a2b-8835-b0013dcf41fa"}},"directories":{},"maintainers":[{"name":"mrcasquette","email":"contact@vincent-cottalorda.fr"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/atelier-content_0.6.2_1789061087756_0.724004289834018"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-24T09:50:49.462Z","modified":"2026-09-10T17:24:48.183Z","0.3.0":"2026-08-24T09:50:49.918Z","0.4.0":"2026-08-24T09:59:03.003Z","0.5.0":"2026-08-24T12:57:50.157Z","0.6.1":"2026-09-10T16:08:06.805Z","0.6.2":"2026-09-10T17:24:47.882Z"},"bugs":{"url":"https://github.com/MrCasquette/atelier/issues"},"author":{"name":"MrCasquette"},"license":"CECILL-2.1","homepage":"https://github.com/MrCasquette/atelier#readme","keywords":["content","cms","headless","page-builder","config-as-code","echoppe","prisme"],"repository":{"type":"git","url":"git+https://github.com/MrCasquette/atelier.git","directory":"packages/content"},"description":"Déclaration de contenu config-as-code — sections, composants, entités et champs typés, synchronisés vers l'API. Partagé par Échoppe et Prisme.","maintainers":[{"name":"mrcasquette","email":"contact@vincent-cottalorda.fr"}],"readme":"# @axiome-apps/atelier-content\n\nDéclaration de contenu **config-as-code** pour Échoppe.\nLe développeur décrit ses **sections** de page et ses **components** réutilisables en TypeScript ;\nla CLI sérialise ces définitions vers l'API (registre) et génère les types du front.\n\nC'est un outil **build/dev-time** : il s'installe en `devDependency` et ne fait aucun appel runtime.\n\n## Installation\n\n```bash\npnpm add -D @axiome-apps/atelier-content\n```\n\n## Concepts\n\nTrois verbes, trois niveaux :\n\n- **`defineComponent`** — un atom/molecule : un groupe de champs nommé et **réutilisable**\n  (`button`, `card`…). Non insérable seul dans une page ; s'imbrique dans d'autres définitions.\n- **`defineSection`** — un **bloc de page** : ce que l'éditeur ajoute dans une page et que le\n  front fetch puis boucle (`hero`, `cardGroup`…).\n- **`defineContent`** — la racine, le **seul** point que lit la CLI. On y liste les sections ;\n  les components sont **collectés automatiquement** en suivant les références.\n\n## Les directives d'une prose\n\nUne section est un bloc de la page ; une **directive** est une inflexion du fil, à l'intérieur d'un\ntexte riche. Découper un article en douze sections pour y loger trois encadrés n'a pas d'échelle.\n\n```ts\nimport { defineDirective, directiveRegistry } from '@axiome-apps/atelier-content';\nimport { parseProse, proseIssues } from '@axiome-apps/atelier-prose';\n\nconst content = defineContent({\n  sections: [article],\n  directives: [defineDirective('video', { shape: 'leaf', attributes: { id: { required: true } } })],\n});\n\n// Le noyau + vos directives, pour valider et rendre.\nconst registry = directiveRegistry(content);\nproseIssues(parseProse(texte), registry);\n```\n\nTrois choses valent d'être sues :\n\n- **rien n'en va en base.** Une directive ne crée pas de table, ne se pousse pas, n'a pas de cache.\n  Elle sert à qui rend, et à lui seul — l'administration affichera donc une directive à vous en\n  brut ;\n- **déclarer ajoute des garanties, ça n'ouvre rien.** Une directive non déclarée traverse déjà,\n  structurée (`{ name, attributes, children }`) et sans garantie de style. La déclarer la fait\n  valider ;\n- **le noyau est fermé** — `warning`, `note`, `tip`, `figure`, `quote`, `cta`, `highlight`.\n  `defineDirective` refuse de redéfinir l'un d'eux.\n\n## Exemple\n\n```ts\nimport { defineComponent, defineSection, defineContent, field as f, link } from '@axiome-apps/atelier-content';\n\nconst card = defineComponent('card', {\n  label: 'Carte',\n  fields: {\n    title: f.text({ required: true, maxLength: 80 }),\n    body: f.richText(), // Markdown\n    image: f.image(),\n    cta: link, // component livré : { label, href, newTab }\n  },\n});\n\nconst hero = defineSection('hero', {\n  label: 'Héros',\n  fields: {\n    title: f.text({ required: true }),\n    variant: f.enum({ options: ['clair', 'sombre'] }),\n    cta: link,\n  },\n});\n\nconst cardGroup = defineSection('cardGroup', {\n  label: 'Groupe de cartes',\n  fields: {\n    heading: f.text(),\n    cards: f.list(card), // répète un component nommé\n  },\n});\n\nexport default defineContent({ sections: [hero, cardGroup] });\n```\n\n## Champs (`field`, alias `f`)\n\n**Primitifs** — `text`, `richText` (stocké en Markdown), `number` (`{ integer }`),\n`boolean`, `date` (stocké en ISO 8601, `{ time }`), `enum` (`{ options, multiple }`).\n\n**Fonctionnels** :\n\n- `image()` — un média (UUID), résolu au read.\n- `ref({ to })` — une référence catalogue (`product` | `collection` | `category`),\n  résolue au read en projection d'entité.\n- `component(definition)` — imbrique un **component nommé** à un seul exemplaire (by-reference).\n  Écrire la définition nue (`cta: link`) fait la même chose, sans pouvoir porter de méta : un\n  component imbriqué n'est obligatoire que déclaré par ce builder.\n- `list(component)` — répète un **component nommé** (by-reference).\n- `repeater({ fields })` — répète un **groupe inline anonyme**, imbricable à la main\n  (`repeater` dans `repeater` = menus à sous-niveaux).\n\nOptions communes : `label`, `hint`, `required`, `default`, plus des contraintes par type\n(`minLength`/`maxLength`, `min`/`max`, `placeholder`, `format`).\n\n## Licence\n\nCeCILL-2.1\n","readmeFilename":"README.md"}