{"_id":"@abraca/junis","_rev":"20-ba9fe6f1585eea1e37bfebd34489c54e","name":"@abraca/junis","dist-tags":{"latest":"2.102.0"},"versions":{"2.80.0":{"name":"@abraca/junis","version":"2.80.0","license":"MIT","_id":"@abraca/junis@2.80.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"7d0b3c8968f65919f1c0219d689855dfd2517b2c","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.80.0.tgz","fileCount":383,"integrity":"sha512-WjEuAa+sH6N885kLUsYn92RncR/dNEZAl0CWBxzo02S/cBb0HJ2CmhAnOlk5iGdNysz9htF+iUUcnVQzrAJOEw==","signatures":[{"sig":"MEQCIAbDZ9VSePEjKm/pOccIc/+iYuNIN16oaC+U4f/FgO7OAiAMfPhS8g0Mgv/ONYjEVlbtPdYWW04HbABdOavjxMi0CQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1376152},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.80.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","parity:nav":"node scripts/parity-nav.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","docker:reset":"node scripts/docker-reset.mjs","janitor:watch":"node scripts/janitor-watch.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/3699bdbc3b0b7b9a6aa459fc433aba8b/abraca-junis-2.80.0.tgz","_integrity":"sha512-WjEuAa+sH6N885kLUsYn92RncR/dNEZAl0CWBxzo02S/cBb0HJ2CmhAnOlk5iGdNysz9htF+iUUcnVQzrAJOEw==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.79.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.79.0","@vueuse/motion":"^3.0.3","@abraca/convert":"^2.79.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.74.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.74.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.78.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.80.0_1786011391707_0.7683944491712518","host":"s3://npm-registry-packages-npm-production"}},"2.81.0":{"name":"@abraca/junis","version":"2.81.0","license":"MIT","_id":"@abraca/junis@2.81.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"7dae6329373faca95a7e6de5c98f3a9f94205142","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.81.0.tgz","fileCount":392,"integrity":"sha512-3lvhEBQUf23d1VXhKigjwys51jofm29iT1EpC9oPxhexsShwnwc83EqZLjuOK3QPI0EzqV51KGIw/y3sp1gFlw==","signatures":[{"sig":"MEYCIQCkwhKH5dnqw5uHPaIKRVeDE95yHyBMdoXO7/si/+cDUwIhAJnV6OQQS2PLewWStuYiriGwusO9Ou3/f+rOzQDcN09B","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1401129},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.81.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","parity:nav":"node scripts/parity-nav.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","docker:reset":"node scripts/docker-reset.mjs","janitor:watch":"node scripts/janitor-watch.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/2ada24bb68dd28e28ab339682b84d9bb/abraca-junis-2.81.0.tgz","_integrity":"sha512-3lvhEBQUf23d1VXhKigjwys51jofm29iT1EpC9oPxhexsShwnwc83EqZLjuOK3QPI0EzqV51KGIw/y3sp1gFlw==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.79.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.79.0","@vueuse/motion":"^3.0.3","@abraca/convert":"^2.79.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.74.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.74.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.78.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.81.0_1786025476419_0.15543288280805023","host":"s3://npm-registry-packages-npm-production"}},"2.82.0":{"name":"@abraca/junis","version":"2.82.0","license":"MIT","_id":"@abraca/junis@2.82.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"534f74620841ac8580e762d92c2d22ca5e2c49b6","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.82.0.tgz","fileCount":397,"integrity":"sha512-dij+6bnvspC097UaWo/GrUZmo3MrL7L0moVpjqu8DMSV3fTvYo6heJJ+pDR3eJHa6zsEwSoUuAnkJD6wq65U8Q==","signatures":[{"sig":"MEQCIE4m9LaAhyglD95DrecxSRQQlIR/fQ/1ExQkk/l5W1ILAiAzEwwtoGlWxUa+WlP5rvVMubwiqs4/m9SO1NrYk/HtDQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1408298},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.82.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","parity:nav":"node scripts/parity-nav.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","docker:reset":"node scripts/docker-reset.mjs","janitor:watch":"node scripts/janitor-watch.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/961b16db6c227771395885e95ebf38b3/abraca-junis-2.82.0.tgz","_integrity":"sha512-dij+6bnvspC097UaWo/GrUZmo3MrL7L0moVpjqu8DMSV3fTvYo6heJJ+pDR3eJHa6zsEwSoUuAnkJD6wq65U8Q==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.79.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.79.0","@vueuse/motion":"^3.0.3","puppeteer-core":"^25.5.0","@abraca/convert":"^2.79.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.74.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.74.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.78.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.82.0_1786034944608_0.759625540352248","host":"s3://npm-registry-packages-npm-production"}},"2.83.0":{"name":"@abraca/junis","version":"2.83.0","license":"MIT","_id":"@abraca/junis@2.83.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"036633307f7aba1d2be8880b757f9cc7c43422a1","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.83.0.tgz","fileCount":399,"integrity":"sha512-pUMsX7gKeeNAveCfVtp7KCsO4BSusVW3mFnmLcsbR+n/rir2DKXLXYL9BalS1xNLwTFr8eQpJTIuKUMD9LD8Nw==","signatures":[{"sig":"MEUCIEKo0dmOZz3TGyZBdnop/Iz/UDUOER1Mg3IrAlPUEA6oAiEAilzBPp1nEs/V2h77LDKBvwxj9COyG5dWSF9PRJ1CI+c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1443343},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.83.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","parity:nav":"node scripts/parity-nav.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","docker:reset":"node scripts/docker-reset.mjs","janitor:watch":"node scripts/janitor-watch.mjs","janitor:verify":"node scripts/janitor-verify.mjs","janitor:inspect":"node scripts/janitor-inspect.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/bd8dd2e40d57c4dc914bb7b751e1a53a/abraca-junis-2.83.0.tgz","_integrity":"sha512-pUMsX7gKeeNAveCfVtp7KCsO4BSusVW3mFnmLcsbR+n/rir2DKXLXYL9BalS1xNLwTFr8eQpJTIuKUMD9LD8Nw==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.79.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.79.0","@vueuse/motion":"^3.0.3","puppeteer-core":"^25.5.0","@abraca/convert":"^2.79.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.74.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.74.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.78.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.83.0_1786116420604_0.022355540418645292","host":"s3://npm-registry-packages-npm-production"}},"2.84.0":{"name":"@abraca/junis","version":"2.84.0","license":"MIT","_id":"@abraca/junis@2.84.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"c4b3af43161d9904d314434d762dd13b1afba70f","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.84.0.tgz","fileCount":405,"integrity":"sha512-FHehAQNNfqqLz4LfyaERG1zn3vJJzdobYem6ubv330fmQI+qd/RpLsouhuXW3mwnL21qprBzy8jQSS6Bfub3Dw==","signatures":[{"sig":"MEQCIEd21rjUZT/rGV1jVe1uaISN+D94DchKamMs4S2fwRcvAiB22/hqN3nZLCf45ev+DUyM0DNdwOr3LGSpaPFofcxZFg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1474266},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.84.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","parity:nav":"node scripts/parity-nav.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","docker:reset":"node scripts/docker-reset.mjs","janitor:watch":"node scripts/janitor-watch.mjs","janitor:verify":"node scripts/janitor-verify.mjs","janitor:inspect":"node scripts/janitor-inspect.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/59f27a11465a99a920158c5fdc0edee3/abraca-junis-2.84.0.tgz","_integrity":"sha512-FHehAQNNfqqLz4LfyaERG1zn3vJJzdobYem6ubv330fmQI+qd/RpLsouhuXW3mwnL21qprBzy8jQSS6Bfub3Dw==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.83.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.83.0","@vueuse/motion":"^3.0.3","puppeteer-core":"^25.5.0","@abraca/convert":"^2.83.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.83.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.83.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.83.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.84.0_1786123652833_0.22775985496289453","host":"s3://npm-registry-packages-npm-production"}},"2.85.0":{"name":"@abraca/junis","version":"2.85.0","license":"MIT","_id":"@abraca/junis@2.85.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"c5e107983c8513b59e4a31a28c959c15ef63f5a3","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.85.0.tgz","fileCount":425,"integrity":"sha512-KD6GwE1ODZ7lxaLVT8AFmOyQGS3FS8nNelA0VYoQvYquaXniMiaS8n4u/4v5el3aslURK+5gaIXxEpIixw5TAg==","signatures":[{"sig":"MEYCIQDvVUtAD0fNrzmTVvEceHCSjFNd+DUMF6Qh5FbTuVMFVAIhAPbBqJBfGoh6sm2zV+IlhZsw4Sb1yGLsMR0eW0Sl+MC2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1532933},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.85.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","parity:nav":"node scripts/parity-nav.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","docker:reset":"node scripts/docker-reset.mjs","janitor:watch":"node scripts/janitor-watch.mjs","janitor:verify":"node scripts/janitor-verify.mjs","janitor:inspect":"node scripts/janitor-inspect.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/eff6dfa79ed5173b1ef0f820052b75a3/abraca-junis-2.85.0.tgz","_integrity":"sha512-KD6GwE1ODZ7lxaLVT8AFmOyQGS3FS8nNelA0VYoQvYquaXniMiaS8n4u/4v5el3aslURK+5gaIXxEpIixw5TAg==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.83.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.83.0","@vueuse/motion":"^3.0.3","puppeteer-core":"^25.5.0","@abraca/convert":"^2.83.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.83.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.83.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.83.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.85.0_1786345151878_0.06711026819302712","host":"s3://npm-registry-packages-npm-production"}},"2.86.0":{"name":"@abraca/junis","version":"2.86.0","license":"MIT","_id":"@abraca/junis@2.86.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"4238a20f1808650fcf524670fe36cf2ea981a016","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.86.0.tgz","fileCount":507,"integrity":"sha512-xI1g8ByOvO81GLWP3Qe5Bmg1dMGtOf6BG/tOGxw7JWilKGcanMYBLEzM8UHuRU6IwR3+26mbdREGPsQ6yqIOfA==","signatures":[{"sig":"MEYCIQDZRRU3APGEjGVt8LmPkqdPrdyvmWjoFtBlk2K12qBdEgIhAJLnmxGyc1dIwLVOFRBaBdDAaddsdSyw+hyAAKCyfojE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1914187},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.86.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","parity:nav":"node scripts/parity-nav.mjs","pins:check":"node scripts/pins-check.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","deploy:check":"node scripts/deploy-check.mjs","docker:reset":"node scripts/docker-reset.mjs","janitor:watch":"node scripts/janitor-watch.mjs","parity:follow":"node scripts/parity-follow.mjs","parity:studio":"node scripts/parity-studio.mjs","janitor:verify":"node scripts/janitor-verify.mjs","janitor:inspect":"node scripts/janitor-inspect.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/58aa0a2b2856d333ef326b080fa2ce76/abraca-junis-2.86.0.tgz","_integrity":"sha512-xI1g8ByOvO81GLWP3Qe5Bmg1dMGtOf6BG/tOGxw7JWilKGcanMYBLEzM8UHuRU6IwR3+26mbdREGPsQ6yqIOfA==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.83.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.83.0","@vueuse/motion":"^3.0.3","puppeteer-core":"^25.5.0","@abraca/convert":"^2.83.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.83.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.83.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.83.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.86.0_1786624655844_0.8054179775507502","host":"s3://npm-registry-packages-npm-production"}},"2.87.0":{"name":"@abraca/junis","version":"2.87.0","license":"MIT","_id":"@abraca/junis@2.87.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"f55f2e3e02a056af0ae756f680556514b542f7e9","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.87.0.tgz","fileCount":511,"integrity":"sha512-ZWXeW3/ZoQSRl+23WZP1N1tY51s3DFmVAzaQ2C2Q8pjZr3M0qgVzy7Z2J4u9U3DQ/qHnI9yC0BUVVrG+WfiMiw==","signatures":[{"sig":"MEUCIH6pqS9jlKZGAYAy0MMGMnkLboIt7dycCc0Jad7MubbUAiEAyp1hWLRAAWl+GDzFGFFQlmzXHCDXlSKW+IZ+l13xjrE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1922277},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.87.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","parity:nav":"node scripts/parity-nav.mjs","pins:check":"node scripts/pins-check.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","deploy:check":"node scripts/deploy-check.mjs","docker:reset":"node scripts/docker-reset.mjs","janitor:watch":"node scripts/janitor-watch.mjs","parity:follow":"node scripts/parity-follow.mjs","parity:studio":"node scripts/parity-studio.mjs","janitor:verify":"node scripts/janitor-verify.mjs","janitor:inspect":"node scripts/janitor-inspect.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/5858a6d6f0053359465363a93bf1dbb7/abraca-junis-2.87.0.tgz","_integrity":"sha512-ZWXeW3/ZoQSRl+23WZP1N1tY51s3DFmVAzaQ2C2Q8pjZr3M0qgVzy7Z2J4u9U3DQ/qHnI9yC0BUVVrG+WfiMiw==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.83.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.83.0","@vueuse/motion":"^3.0.3","puppeteer-core":"^25.5.0","@abraca/convert":"^2.83.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.83.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.83.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.83.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.87.0_1786899929000_0.9528921215483512","host":"s3://npm-registry-packages-npm-production"}},"2.88.0":{"name":"@abraca/junis","version":"2.88.0","license":"MIT","_id":"@abraca/junis@2.88.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"85f25ad34c24ebffa129d384ec55a301c1f346bc","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.88.0.tgz","fileCount":549,"integrity":"sha512-ATkivZdOCTm6T14hWbazL5OvqdjcQDoe1lsz1hk7GY5IyNZih2x7CJK7kMjBlDobqMTtrjRb6MkCGNVOT0GGAg==","signatures":[{"sig":"MEUCIG3F27pyxm2K+a7n/BxG4Py0uZY80BfayW/y2ejF9XCLAiEAsVmPxBqgCEr3qZDDq1fuh1wttewJHkM5C1Gp3y49A3E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2133891},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.88.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","deps:check":"node scripts/deps-check.mjs","parity:nav":"node scripts/parity-nav.mjs","pins:check":"node scripts/pins-check.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","deploy:check":"node scripts/deploy-check.mjs","docker:reset":"node scripts/docker-reset.mjs","parity:touch":"node scripts/parity-touch.mjs","janitor:watch":"node scripts/janitor-watch.mjs","parity:follow":"node scripts/parity-follow.mjs","parity:studio":"node scripts/parity-studio.mjs","janitor:verify":"node scripts/janitor-verify.mjs","janitor:inspect":"node scripts/janitor-inspect.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/50ccfc2d7ed8498629d2089c261c3ef3/abraca-junis-2.88.0.tgz","_integrity":"sha512-ATkivZdOCTm6T14hWbazL5OvqdjcQDoe1lsz1hk7GY5IyNZih2x7CJK7kMjBlDobqMTtrjRb6MkCGNVOT0GGAg==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.87.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.87.0","@vueuse/motion":"^3.0.3","puppeteer-core":"^25.5.0","@abraca/convert":"^2.87.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.87.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.87.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.87.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.88.0_1787394859220_0.4305548111596009","host":"s3://npm-registry-packages-npm-production"}},"2.90.0":{"name":"@abraca/junis","version":"2.90.0","license":"MIT","_id":"@abraca/junis@2.90.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"c17ba7846ad5323e55575ea903ec070e4b330fce","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.90.0.tgz","fileCount":562,"integrity":"sha512-ey0eeoUS17LW4yH4F39zDHgmOofUZle7Xf2KTvcZg+pjCvjSJp6w4rCuxzcHfh2JsWlPllScLMtxT2N5sk/FIg==","signatures":[{"sig":"MEYCIQCwY1BXMkmBPOL+9Uv0F9+TzZQO/bQ4g2xI8o0mznZmXAIhAOO+GrNV+rNRkvbzv3nyTiELk2ZDteOWzK3CE3tWSwR6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2193487},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.90.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run deps:check && npm run pins:check && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","deps:check":"node scripts/deps-check.mjs","parity:nav":"node scripts/parity-nav.mjs","pins:check":"node scripts/pins-check.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","deploy:check":"node scripts/deploy-check.mjs","docker:reset":"node scripts/docker-reset.mjs","parity:touch":"node scripts/parity-touch.mjs","janitor:watch":"node scripts/janitor-watch.mjs","parity:follow":"node scripts/parity-follow.mjs","parity:studio":"node scripts/parity-studio.mjs","parity:weight":"node scripts/parity-weight.mjs","janitor:verify":"node scripts/janitor-verify.mjs","parity:offline":"node scripts/parity-offline.mjs","janitor:inspect":"node scripts/janitor-inspect.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/41f10d7a3440bc5788d4961365820061/abraca-junis-2.90.0.tgz","_integrity":"sha512-ey0eeoUS17LW4yH4F39zDHgmOofUZle7Xf2KTvcZg+pjCvjSJp6w4rCuxzcHfh2JsWlPllScLMtxT2N5sk/FIg==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.88.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.3","puppeteer-core":"^25.5.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.88.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.90.0_1787908029771_0.6290745502437514","host":"s3://npm-registry-packages-npm-production"}},"2.91.0":{"name":"@abraca/junis","version":"2.91.0","license":"MIT","_id":"@abraca/junis@2.91.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"9a50f80ba3d98b33edfbd6ddbcd35a5b43c88c18","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.91.0.tgz","fileCount":562,"integrity":"sha512-zi6Yt/e8JbJTEHrEeN1A4ZRV/CBBrEqQynLV6msndGPIuET+C1MDjegpnAr7JvZhOes/Hx5zpWGQ6Q/NI9AcQA==","signatures":[{"sig":"MEUCIQDx7GCCqKIGWcog8dFc5CMr9gE0aLitEh3cxkHkJDna0wIgLnd5aZO0lwOM63GgEvaotycGdiw3ZlkV6NRlMrsm/PM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2193487},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.91.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run deps:check && npm run pins:check && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","deps:check":"node scripts/deps-check.mjs","parity:nav":"node scripts/parity-nav.mjs","pins:check":"node scripts/pins-check.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","deploy:check":"node scripts/deploy-check.mjs","docker:reset":"node scripts/docker-reset.mjs","parity:touch":"node scripts/parity-touch.mjs","janitor:watch":"node scripts/janitor-watch.mjs","parity:follow":"node scripts/parity-follow.mjs","parity:studio":"node scripts/parity-studio.mjs","parity:weight":"node scripts/parity-weight.mjs","janitor:verify":"node scripts/janitor-verify.mjs","parity:offline":"node scripts/parity-offline.mjs","janitor:inspect":"node scripts/janitor-inspect.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/089d4b93c0839e4eff99e2e4b9d50e18/abraca-junis-2.91.0.tgz","_integrity":"sha512-zi6Yt/e8JbJTEHrEeN1A4ZRV/CBBrEqQynLV6msndGPIuET+C1MDjegpnAr7JvZhOes/Hx5zpWGQ6Q/NI9AcQA==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.88.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.3","puppeteer-core":"^25.5.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.88.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.91.0_1787909037472_0.2258382049830021","host":"s3://npm-registry-packages-npm-production"}},"2.92.0":{"name":"@abraca/junis","version":"2.92.0","license":"MIT","_id":"@abraca/junis@2.92.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"ee1a70b0ab1474de160030e35d6dedf5e3c9d922","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.92.0.tgz","fileCount":562,"integrity":"sha512-UJsnA9ZwxsGLGDb30z8z76Lk2JKWX2yJONe6uYhPISSIvKWwcS1zNhpkP8RFwkacK6WfOrIiN22u0wDtNXileQ==","signatures":[{"sig":"MEYCIQDuTvtUD+OAThNCnRCQoMhvT+bvBjTV2ogsGAGQgzEeUgIhAJap39gjTBOKnNcNbZcR2zxR7g6hDbtBZS+NGQLSjYt/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2193487},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.92.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run deps:check && npm run pins:check && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","deps:check":"node scripts/deps-check.mjs","parity:nav":"node scripts/parity-nav.mjs","pins:check":"node scripts/pins-check.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","deploy:check":"node scripts/deploy-check.mjs","docker:reset":"node scripts/docker-reset.mjs","parity:touch":"node scripts/parity-touch.mjs","janitor:watch":"node scripts/janitor-watch.mjs","parity:follow":"node scripts/parity-follow.mjs","parity:studio":"node scripts/parity-studio.mjs","parity:weight":"node scripts/parity-weight.mjs","janitor:verify":"node scripts/janitor-verify.mjs","parity:offline":"node scripts/parity-offline.mjs","janitor:inspect":"node scripts/janitor-inspect.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/f5373cbfbffbd9473befbe19676655d6/abraca-junis-2.92.0.tgz","_integrity":"sha512-UJsnA9ZwxsGLGDb30z8z76Lk2JKWX2yJONe6uYhPISSIvKWwcS1zNhpkP8RFwkacK6WfOrIiN22u0wDtNXileQ==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.88.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.3","puppeteer-core":"^25.5.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.88.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.92.0_1787918431809_0.8976405430707648","host":"s3://npm-registry-packages-npm-production"}},"2.93.0":{"name":"@abraca/junis","version":"2.93.0","license":"MIT","_id":"@abraca/junis@2.93.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"5aa01f9318f8c49a091fc866b706743b37d1def8","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.93.0.tgz","fileCount":564,"integrity":"sha512-Q7gfTo3CnB/5qAy+4qg8c0XCfxvNf5ezcQvh5R4ZHJ+Qs+eRQTOL7DtLJRHSqlh+F25nzL1o3Cnr6J3THWeHdw==","signatures":[{"sig":"MEYCIQCLuFc2gvDcIowXJHPstT8Y1NUwGmvtxz8xUQ6EQSEUtAIhAKnUnr+6QUGlY7Or58z/1XBS5zqjtnJLWRZhgsWJBaNU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2244311},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.93.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run deps:check && npm run pins:check && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","deps:check":"node scripts/deps-check.mjs","parity:nav":"node scripts/parity-nav.mjs","pins:check":"node scripts/pins-check.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","deploy:check":"node scripts/deploy-check.mjs","docker:reset":"node scripts/docker-reset.mjs","parity:touch":"node scripts/parity-touch.mjs","janitor:watch":"node scripts/janitor-watch.mjs","parity:follow":"node scripts/parity-follow.mjs","parity:mobile":"node scripts/parity-mobile.mjs","parity:studio":"node scripts/parity-studio.mjs","parity:weight":"node scripts/parity-weight.mjs","janitor:verify":"node scripts/janitor-verify.mjs","parity:offline":"node scripts/parity-offline.mjs","janitor:inspect":"node scripts/janitor-inspect.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/8888b5b45a94e1c04b91dd965aae20e9/abraca-junis-2.93.0.tgz","_integrity":"sha512-Q7gfTo3CnB/5qAy+4qg8c0XCfxvNf5ezcQvh5R4ZHJ+Qs+eRQTOL7DtLJRHSqlh+F25nzL1o3Cnr6J3THWeHdw==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.88.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.3","puppeteer-core":"^25.5.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.88.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.93.0_1787984737452_0.1301971442660652","host":"s3://npm-registry-packages-npm-production"}},"2.95.0":{"name":"@abraca/junis","version":"2.95.0","license":"MIT","_id":"@abraca/junis@2.95.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"d97cdc8a5a3e85206453361ca408771123690b8b","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.95.0.tgz","fileCount":564,"integrity":"sha512-o6Hr0j5OBI7r99pgztnPZN1mF/j7wEwtoF9//cjT9Wvkz8uFTgplnu3iXfNmToeMRdj/MkJbdp8Q8fUnqVQQjQ==","signatures":[{"sig":"MEUCIQDMxpm+7mVIqq1ooEccLaPM6siuXWQwuiGh1O6znKbLrQIgdBcePLRXzN6kNreCvtOXViGWMYxBzbcAytXQNQwrgBo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2254406},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.95.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run deps:check && npm run pins:check && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","deps:check":"node scripts/deps-check.mjs","parity:nav":"node scripts/parity-nav.mjs","pins:check":"node scripts/pins-check.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","deploy:check":"node scripts/deploy-check.mjs","docker:reset":"node scripts/docker-reset.mjs","parity:touch":"node scripts/parity-touch.mjs","janitor:watch":"node scripts/janitor-watch.mjs","parity:follow":"node scripts/parity-follow.mjs","parity:mobile":"node scripts/parity-mobile.mjs","parity:studio":"node scripts/parity-studio.mjs","parity:weight":"node scripts/parity-weight.mjs","janitor:verify":"node scripts/janitor-verify.mjs","parity:offline":"node scripts/parity-offline.mjs","janitor:inspect":"node scripts/janitor-inspect.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/ad59d865d7972e9a7c60e809c892dfdc/abraca-junis-2.95.0.tgz","_integrity":"sha512-o6Hr0j5OBI7r99pgztnPZN1mF/j7wEwtoF9//cjT9Wvkz8uFTgplnu3iXfNmToeMRdj/MkJbdp8Q8fUnqVQQjQ==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.88.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.3","puppeteer-core":"^25.5.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.88.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.95.0_1788357734040_0.9922943564450557","host":"s3://npm-registry-packages-npm-production"}},"2.96.0":{"name":"@abraca/junis","version":"2.96.0","license":"MIT","_id":"@abraca/junis@2.96.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"4b7feb60ee01e7b52fa05c96290746c4c87ea2c0","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.96.0.tgz","fileCount":564,"integrity":"sha512-k+grdH699QqDuOfZ3tzg3ro4KPr64danBiX84bghkWQQ/f1SsoknNfEEWUzWzUANpXekUjqDpv62ig+6E2HurA==","signatures":[{"sig":"MEUCIQDCqmuH2LxD2ERjECJU0+K5QzE9Zxef0bEjggIB6sAd8gIgG6pF+t+1M9mu6ZRARWawh8i8fQvwy1m1c3SmHNbR/Hg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2254406},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.96.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run deps:check && npm run pins:check && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","deps:check":"node scripts/deps-check.mjs","parity:nav":"node scripts/parity-nav.mjs","pins:check":"node scripts/pins-check.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","deploy:check":"node scripts/deploy-check.mjs","docker:reset":"node scripts/docker-reset.mjs","parity:touch":"node scripts/parity-touch.mjs","janitor:watch":"node scripts/janitor-watch.mjs","parity:follow":"node scripts/parity-follow.mjs","parity:mobile":"node scripts/parity-mobile.mjs","parity:studio":"node scripts/parity-studio.mjs","parity:weight":"node scripts/parity-weight.mjs","janitor:verify":"node scripts/janitor-verify.mjs","parity:offline":"node scripts/parity-offline.mjs","janitor:inspect":"node scripts/janitor-inspect.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/909bd2286ff32c8e8ba8eed4a8da4c5f/abraca-junis-2.96.0.tgz","_integrity":"sha512-k+grdH699QqDuOfZ3tzg3ro4KPr64danBiX84bghkWQQ/f1SsoknNfEEWUzWzUANpXekUjqDpv62ig+6E2HurA==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.88.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.3","puppeteer-core":"^25.5.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.88.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.96.0_1788448511303_0.8823808927394079","host":"s3://npm-registry-packages-npm-production"}},"2.97.0":{"name":"@abraca/junis","version":"2.97.0","license":"MIT","_id":"@abraca/junis@2.97.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"1a76e090bf29060023b28ce53726ca015c9387f4","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.97.0.tgz","fileCount":571,"integrity":"sha512-TWpHese1wvH8RLRNH1Y2ANB2wVPUWu6xSCBA+nCrBJAClDYqPCM9hoSYRYGXk28QPws49GjiIRbFZ0vSlF4vpw==","signatures":[{"sig":"MEQCIB7tVpCPVuVgN9yylsCm5KOMSCwZOz5MLjBARs4EpwY4AiBVRv5idm7lN0I3M3yR372W+tEDugruyw4we1K8GIYGyA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2280756},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.97.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run deps:check && npm run pins:check && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","deps:check":"node scripts/deps-check.mjs","parity:nav":"node scripts/parity-nav.mjs","pins:check":"node scripts/pins-check.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","deploy:check":"node scripts/deploy-check.mjs","docker:reset":"node scripts/docker-reset.mjs","parity:touch":"node scripts/parity-touch.mjs","janitor:watch":"node scripts/janitor-watch.mjs","parity:follow":"node scripts/parity-follow.mjs","parity:mobile":"node scripts/parity-mobile.mjs","parity:studio":"node scripts/parity-studio.mjs","parity:weight":"node scripts/parity-weight.mjs","janitor:verify":"node scripts/janitor-verify.mjs","parity:offline":"node scripts/parity-offline.mjs","janitor:inspect":"node scripts/janitor-inspect.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/d18ff6410ac7d1e818c56105fe770af6/abraca-junis-2.97.0.tgz","_integrity":"sha512-TWpHese1wvH8RLRNH1Y2ANB2wVPUWu6xSCBA+nCrBJAClDYqPCM9hoSYRYGXk28QPws49GjiIRbFZ0vSlF4vpw==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.88.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.3","puppeteer-core":"^25.5.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.88.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.97.0_1788454519014_0.7017370750920002","host":"s3://npm-registry-packages-npm-production"}},"2.99.0":{"name":"@abraca/junis","version":"2.99.0","license":"MIT","_id":"@abraca/junis@2.99.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"9347e8ef3683e968f3177860655a94548bd8d235","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.99.0.tgz","fileCount":573,"integrity":"sha512-zDVlEzkZooFIFs+gsfGzFue9Uz8h3kHjj2axBTdU0aEsbhPwMRNKPi7FaniIgZrpUe5oPys2QG+a+mCeneieZQ==","signatures":[{"sig":"MEUCIQCyAleplGK8iv55HPsXyh2PNKE2ldLVYsTkFxMY++3jQwIgSCEBjMMJppNRNXQ+ufoJnfTvS/Cs40BfqT0OV/V2AiU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2286219},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.99.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run deps:check && npm run pins:check && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","deps:check":"node scripts/deps-check.mjs","parity:nav":"node scripts/parity-nav.mjs","pins:check":"node scripts/pins-check.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","deploy:check":"node scripts/deploy-check.mjs","docker:reset":"node scripts/docker-reset.mjs","parity:touch":"node scripts/parity-touch.mjs","janitor:watch":"node scripts/janitor-watch.mjs","parity:follow":"node scripts/parity-follow.mjs","parity:mobile":"node scripts/parity-mobile.mjs","parity:studio":"node scripts/parity-studio.mjs","parity:weight":"node scripts/parity-weight.mjs","janitor:verify":"node scripts/janitor-verify.mjs","parity:offline":"node scripts/parity-offline.mjs","janitor:inspect":"node scripts/janitor-inspect.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/786d4e8567a73e0a630b90204a77d11a/abraca-junis-2.99.0.tgz","_integrity":"sha512-zDVlEzkZooFIFs+gsfGzFue9Uz8h3kHjj2axBTdU0aEsbhPwMRNKPi7FaniIgZrpUe5oPys2QG+a+mCeneieZQ==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.88.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.3","puppeteer-core":"^25.5.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.88.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.99.0_1788459035756_0.884009565247974","host":"s3://npm-registry-packages-npm-production"}},"2.100.0":{"name":"@abraca/junis","version":"2.100.0","license":"MIT","_id":"@abraca/junis@2.100.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"eda9d4ea2a8242c49a0a9f73e09527893df90250","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.100.0.tgz","fileCount":573,"integrity":"sha512-Xq99CQV92I6u7/wEE0GLhzEHNUWk6Aax1hMdBB7oUv2HSz+D4fXyi5jBnvWv0H8HbesrYO9P3MqAXaRoU5Kymw==","signatures":[{"sig":"MEUCIHp0RxOSQZhvm2K8vb2SyMKNLuadD6eTQV6EM71jQEEnAiEAytKAZms3teT2yasTxmaxrJZ9s3LK4dDcGo5Fz7tzcRM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2286221},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.100.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run deps:check && npm run pins:check && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit","deps:check":"node scripts/deps-check.mjs","parity:nav":"node scripts/parity-nav.mjs","pins:check":"node scripts/pins-check.mjs","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground","docker:down":"docker compose down","docker:logs":"docker compose logs -f","deploy:check":"node scripts/deploy-check.mjs","docker:reset":"node scripts/docker-reset.mjs","parity:touch":"node scripts/parity-touch.mjs","janitor:watch":"node scripts/janitor-watch.mjs","parity:follow":"node scripts/parity-follow.mjs","parity:mobile":"node scripts/parity-mobile.mjs","parity:studio":"node scripts/parity-studio.mjs","parity:weight":"node scripts/parity-weight.mjs","janitor:verify":"node scripts/janitor-verify.mjs","parity:offline":"node scripts/parity-offline.mjs","janitor:inspect":"node scripts/janitor-inspect.mjs"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/c3c1bbba653144b16e3730a04c58bf93/abraca-junis-2.100.0.tgz","_integrity":"sha512-Xq99CQV92I6u7/wEE0GLhzEHNUWk6Aax1hMdBB7oUv2HSz+D4fXyi5jBnvWv0H8HbesrYO9P3MqAXaRoU5Kymw==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.88.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.3","puppeteer-core":"^25.5.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.88.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.100.0_1788512915976_0.3602114329825086","host":"s3://npm-registry-packages-npm-production"}},"2.101.0":{"name":"@abraca/junis","version":"2.101.0","license":"MIT","_id":"@abraca/junis@2.101.0","maintainers":[{"name":"rgby","email":"me@janis.io"}],"homepage":"https://github.com/abracadabra/jun-is#readme","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"dist":{"shasum":"42957377d53bfb63f74d3af3c7c7737bcb431243","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.101.0.tgz","fileCount":592,"integrity":"sha512-8Rr74xtacsr5ZB5tGl5dhyHc0RXUGmwIUOjMDBuy6aqepQbDLhlnmTca2mzlX3eHWjzeCAa40HvC7VyABXOxXw==","signatures":[{"sig":"MEYCIQDadaZwv2T/7Uwo9tDz+40hoGfapBjQ5p5Qllsf1fvusQIhAPJnTjA5rHFAdBd2jpiPr0Q/GPhPLMJrxtfC0wjtIn2I","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2347089},"main":"./dist/module.mjs","type":"module","_from":"file:abraca-junis-2.101.0.tgz","//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","lint":"eslint .","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","release":"npm run lint && npm run deps:check && npm run pins:check && npm run prepack","dev:nuxt":"nuxt dev playground --port 3003","dev:build":"nuxt build playground","dev:clean":"node scripts/dev-clean.mjs","docker:up":"docker compose up -d --build","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit && cd ../examples/atelier && vue-tsc --noEmit && cd ../kammer && vue-tsc --noEmit","deps:check":"node scripts/deps-check.mjs","dev:kammer":"node scripts/dev.mjs kammer","parity:nav":"node scripts/parity-nav.mjs","pins:check":"node scripts/pins-check.mjs","dev:atelier":"node scripts/dev.mjs atelier","dev:backend":"node scripts/dev-backend.mjs","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground && nuxt prepare examples/atelier && nuxt prepare examples/kammer","docker:down":"docker compose down","docker:logs":"docker compose logs -f","deploy:check":"node scripts/deploy-check.mjs","docker:reset":"node scripts/docker-reset.mjs","parity:touch":"node scripts/parity-touch.mjs","janitor:watch":"node scripts/janitor-watch.mjs","parity:access":"node scripts/parity-access.mjs","parity:follow":"node scripts/parity-follow.mjs","parity:mobile":"node scripts/parity-mobile.mjs","parity:studio":"node scripts/parity-studio.mjs","parity:weight":"node scripts/parity-weight.mjs","janitor:verify":"node scripts/janitor-verify.mjs","parity:offline":"node scripts/parity-offline.mjs","dev:nuxt:kammer":"nuxt dev examples/kammer --port 3005","janitor:inspect":"node scripts/janitor-inspect.mjs","dev:nuxt:atelier":"nuxt dev examples/atelier --port 3004"},"_npmUser":{"name":"rgby","email":"me@janis.io"},"_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/344fe95b5ce01b1f496beec4f915297d/abraca-junis-2.101.0.tgz","_integrity":"sha512-8Rr74xtacsr5ZB5tGl5dhyHc0RXUGmwIUOjMDBuy6aqepQbDLhlnmTca2mzlX3eHWjzeCAa40HvC7VyABXOxXw==","repository":{"url":"git+https://github.com/abracadabra/jun-is.git","type":"git"},"_npmVersion":"10.9.2","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","directories":{},"_nodeVersion":"23.7.0","dependencies":{"defu":"^6.1.7","@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0"},"publishConfig":{"access":"public"},"typesVersions":{"*":{".":["./dist/types.d.mts"]}},"_hasShrinkwrap":false,"devDependencies":{"yjs":"^13.6.30","nuxt":"^4.4.6","eslint":"^10.4.0","vue-tsc":"^3.3.1","@nuxt/ui":"^4.7.1","mapbox-gl":"^3.24.0","@nuxt/icon":"^2.0.0","typescript":"^6.0.3","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@types/node":"latest","tailwindcss":"^4.3.0","@abraca/nuxt":"^2.88.0","@nuxt/schema":"^4.4.6","@tiptap/core":"^3.23.5","@vueuse/nuxt":"^14.3.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.3","puppeteer-core":"^25.5.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0","@nuxt/eslint-config":"^1.15.2","@iconify-json/lucide":"^1.2.108","@nuxt/module-builder":"^1.0.2","@iconify-json/simple-icons":"^1.2.83"},"peerDependencies":{"vue":"^3.5.0","yjs":"^13.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","@nuxt/ui":"^4.0.0","mapbox-gl":"^3.0.0","@nuxt/icon":"^2.0.0","@nuxt/fonts":"^0.14.0","@nuxt/image":"^2.0.0","@abraca/nuxt":"^2.88.0","@tiptap/core":"^3.0.0","@abraca/dabra":"^2.88.0","@vueuse/motion":"^3.0.0","@abraca/convert":"^2.88.0","@nuxtjs/color-mode":"^3.5.0"},"peerDependenciesMeta":{"shaders":{"optional":true},"mapbox-gl":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/junis_2.101.0_1788518865559_0.6753047947443782","host":"s3://npm-registry-packages-npm-production"}},"2.102.0":{"name":"@abraca/junis","version":"2.102.0","description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","repository":{"type":"git","url":"git+https://github.com/abracadabra/jun-is.git"},"license":"MIT","type":"module","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./css":"./dist/runtime/assets/css/jun.css"},"main":"./dist/module.mjs","typesVersions":{"*":{".":["./dist/types.d.mts"]}},"publishConfig":{"access":"public"},"dependencies":{"@nuxt/kit":"^4.4.6","@vueuse/core":"^14.3.0","defu":"^6.1.7"},"//deps":"SINGLETONS ARE PEERS, NEVER DEPENDENCIES. @abraca/convert was a dependency until 2.79.0 and had to move: it peers on yjs, and a nested second copy of it means a Y.XmlElement built by one yjs crossing into a fragment owned by another — 'Unexpected content type in insert operation', which no bundler config fixes. Same reason @tiptap/core, vue and yjs are peers. Anything holding global identity or editor/CRDT state belongs here so the app resolves exactly one copy; wand.toml [pins] + `wand doctor` enforce the versions.","peerDependencies":{"@abraca/convert":"^2.88.0","@abraca/dabra":"^2.88.0","@abraca/nuxt":"^2.88.0","@nuxt/fonts":"^0.14.0","@nuxt/icon":"^2.0.0","@nuxt/image":"^2.0.0","@nuxt/ui":"^4.0.0","@nuxtjs/color-mode":"^3.5.0","@tiptap/core":"^3.0.0","@vueuse/motion":"^3.0.0","mapbox-gl":"^3.0.0","nuxt":"^4.0.0","shaders":"^3.0.0","vue":"^3.5.0","yjs":"^13.0.0"},"peerDependenciesMeta":{"mapbox-gl":{"optional":true},"shaders":{"optional":true},"@nuxt/fonts":{"optional":true},"@nuxt/image":{"optional":true}},"devDependencies":{"@abraca/convert":"^2.88.0","@abraca/dabra":"^2.88.0","@abraca/nuxt":"^2.88.0","@iconify-json/lucide":"^1.2.108","@iconify-json/simple-icons":"^1.2.83","@nuxt/eslint-config":"^1.15.2","@nuxt/fonts":"^0.14.0","@nuxt/icon":"^2.0.0","@nuxt/image":"^2.0.0","@nuxt/module-builder":"^1.0.2","@nuxt/schema":"^4.4.6","@nuxt/ui":"^4.7.1","@nuxtjs/color-mode":"^3.5.0","@tiptap/core":"^3.23.5","@types/node":"latest","@vueuse/motion":"^3.0.3","@vueuse/nuxt":"^14.3.0","eslint":"^10.4.0","mapbox-gl":"^3.24.0","nuxt":"^4.4.6","puppeteer-core":"^25.5.0","tailwindcss":"^4.3.0","typescript":"^6.0.3","vue-tsc":"^3.3.1","yjs":"^13.6.30"},"scripts":{"dev":"npm run dev:prepare && node scripts/dev.mjs","dev:atelier":"node scripts/dev.mjs atelier","dev:kammer":"node scripts/dev.mjs kammer","dev:backend":"node scripts/dev-backend.mjs","dev:nuxt":"nuxt dev playground --port 3003","dev:nuxt:atelier":"nuxt dev examples/atelier --port 3004","dev:nuxt:kammer":"nuxt dev examples/kammer --port 3005","dev:build":"nuxt build playground","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxt prepare playground && nuxt prepare examples/atelier && nuxt prepare examples/kammer","dev:clean":"node scripts/dev-clean.mjs","lint":"eslint .","janitor:watch":"node scripts/janitor-watch.mjs","janitor:verify":"node scripts/janitor-verify.mjs","test":"node scripts/test.mjs","parity":"node scripts/parity-ssr.mjs","parity:nav":"node scripts/parity-nav.mjs","parity:follow":"node scripts/parity-follow.mjs","parity:studio":"node scripts/parity-studio.mjs","parity:touch":"node scripts/parity-touch.mjs","parity:mobile":"node scripts/parity-mobile.mjs","parity:offline":"node scripts/parity-offline.mjs","parity:weight":"node scripts/parity-weight.mjs","parity:access":"node scripts/parity-access.mjs","deploy:check":"node scripts/deploy-check.mjs","pins:check":"node scripts/pins-check.mjs","typecheck":"vue-tsc --noEmit && cd playground && vue-tsc --noEmit && cd ../examples/atelier && vue-tsc --noEmit && cd ../kammer && vue-tsc --noEmit","release":"npm run lint && npm run deps:check && npm run pins:check && npm run prepack","docker:up":"docker compose up -d --build","docker:down":"docker compose down","docker:logs":"docker compose logs -f","docker:reset":"node scripts/docker-reset.mjs","janitor:inspect":"node scripts/janitor-inspect.mjs","deps:check":"node scripts/deps-check.mjs"},"_id":"@abraca/junis@2.102.0","bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"homepage":"https://github.com/abracadabra/jun-is#readme","_integrity":"sha512-Qb2tFnuikbU007XpawhlKD1sna9lBEprcMohbMLEgMzai/0dv9ekC2yL9F39fisZCIo1lZLMKKlawQK1NioDzQ==","_resolved":"/private/var/folders/hr/md8t9py522nc49j31t495rv00000gn/T/5a4a5a4aa2c91f4b1810aff1cb512677/abraca-junis-2.102.0.tgz","_from":"file:abraca-junis-2.102.0.tgz","_nodeVersion":"23.7.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-Qb2tFnuikbU007XpawhlKD1sna9lBEprcMohbMLEgMzai/0dv9ekC2yL9F39fisZCIo1lZLMKKlawQK1NioDzQ==","shasum":"72b031aacba7edace119ab951f9479ceafcc8f3d","tarball":"https://registry.npmjs.org/@abraca/junis/-/junis-2.102.0.tgz","fileCount":592,"unpackedSize":2347089,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEMCH10bun7jZFpyCfJ2fM2KBLG23IT9/q6JefN0ChmeKDUCIFKiq/KYVWpg7UQg0vms85VwDR/8tg8Fd7WliFrOiVmc"}]},"_npmUser":{"name":"rgby","email":"me@janis.io"},"directories":{},"maintainers":[{"name":"rgby","email":"me@janis.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/junis_2.102.0_1789127369534_0.46237027883259674"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-06T10:16:31.455Z","modified":"2026-09-11T11:49:29.936Z","2.80.0":"2026-08-06T10:16:31.910Z","2.81.0":"2026-08-06T14:11:16.690Z","2.82.0":"2026-08-06T16:49:04.930Z","2.83.0":"2026-08-07T15:27:00.778Z","2.84.0":"2026-08-07T17:27:33.010Z","2.85.0":"2026-08-10T06:59:12.056Z","2.86.0":"2026-08-13T12:37:36.044Z","2.87.0":"2026-08-16T17:05:29.164Z","2.88.0":"2026-08-22T10:34:19.398Z","2.90.0":"2026-08-28T09:07:09.926Z","2.91.0":"2026-08-28T09:23:57.627Z","2.92.0":"2026-08-28T12:00:32.010Z","2.93.0":"2026-08-29T06:25:37.617Z","2.95.0":"2026-09-02T14:02:14.184Z","2.96.0":"2026-09-03T15:15:11.513Z","2.97.0":"2026-09-03T16:55:19.247Z","2.99.0":"2026-09-03T18:10:36.038Z","2.100.0":"2026-09-04T09:08:36.165Z","2.101.0":"2026-09-04T10:47:45.729Z","2.102.0":"2026-09-11T11:49:29.753Z"},"bugs":{"url":"https://github.com/abracadabra/jun-is/issues"},"license":"MIT","homepage":"https://github.com/abracadabra/jun-is#readme","repository":{"type":"git","url":"git+https://github.com/abracadabra/jun-is.git"},"description":"Website-builder Nuxt module for the Abracadabra CRDT platform — page-type renderers, presence chrome, studio editing and SSR, all driven by documents","maintainers":[{"name":"rgby","email":"me@janis.io"}],"readme":"# @abraca/junis\n\nA website builder for [Abracadabra](https://github.com/abracadabra). Point it at\na document tree and you get a website: typed page renderers, presence-aware\nchrome, an owner editing studio, server-side rendering, feeds, search, and\nvisitor interaction — all driven by documents rather than code.\n\n> **Status: pre-1.0, and honest about it.** All **23** page types render and are\n> exercised on every boot from an **empty database** — the playground ships no\n> database, deliberately, because one that ships a database never proves its\n> seeder works. A cold start seeds **98 documents**, **34 bodies** and two\n> generated photographs for the wall.\n>\n> Verified on every change, and these numbers are what the commands print:\n>\n> | | |\n> |---|---|\n> | `pnpm parity` | **619** SSR assertions across all 23 types |\n> | `pnpm parity:nav` | **56** assertions — the only check that catches broken client-side navigation |\n> | `pnpm test` | **150** assertions, no server needed |\n> | `pnpm lint` · `pnpm typecheck` | clean |\n>\n> The **globe** is on in the playground with a token and seeded waypoints, and\n> off by default in the module because enabling it pulls `mapbox-gl` into the\n> bundle graph.\n>\n> **The largest gap:** `parity` and `parity:nav` both walk the site as a\n> *visitor*. Nothing automated exercises the owner **studio**. Remaining gaps\n> are in `FOLLOW-UP.md`; `CLAUDE.md` is the working reference.\n\n```bash\npnpm add @abraca/junis @abraca/nuxt @abraca/dabra @abraca/convert\n```\n\n## Three shapes, and you have to pick one\n\n```ts\njun: { access: { mode: 'public' } }   // 'open' | 'public' | 'private'\n```\n\n| | Reads | Writes | Runnable example |\n|---|---|---|---|\n| `open` | everyone | **everyone** | `playground/` · [jun.is](https://jun.is) |\n| `public` *(default)* | everyone | the owner, plus guestbook/poll/thread over RPC | [`examples/atelier`](examples/atelier) |\n| `private` | **members only** | members, per their grant | [`examples/kammer`](examples/kammer) |\n\n`private` is not a login screen bolted on the front. Everything public about a\njun-is site is served from a doc cache that a **service-role** runner fills, so\nwithout a gate a \"private\" deployment refuses a stranger's CRDT socket and then\nhands them the whole tree over its own endpoints. `mode: 'private'` closes that:\n`/api/**` answers 401, a navigation renders a sign-in screen with **no document\npayload**, and the feeds, the sitemap and the link-preview cards are gone.\n\nEvery shape has a server half too — the backend is the authority, and nothing in\nthis module grants or withholds access on its own. **[`ACCESS.md`](ACCESS.md)**\nhas both halves for all three, plus the owner's new **Access** settings panel\n(⌘, → Access): who holds a grant here, who may join, and whether this page is\npublic.\n\nAll four ship from the same release train and carry the same version. The three\n`@abraca/*` siblings are **peers**, not dependencies, so your app resolves one\ncopy of each — a second copy of `@abraca/convert` means a second `yjs` identity,\nand Y content built against one cannot be inserted into a document owned by the\nother.\n\n```ts\n// nuxt.config.ts\nexport default defineNuxtConfig({\n  modules: ['@abraca/junis'],\n\n  jun: {\n    brand: { name: 'Acme', tagline: 'We make things' },\n  },\n\n  abracadabra: {\n    url: 'https://your-backend.example.com',\n    entryDocId: '…',\n  },\n})\n```\n\n```css\n/* app/assets/css/main.css */\n@import \"tailwindcss\";\n@import \"@nuxt/ui\";\n@import \"@abraca/junis/css\";\n```\n\nThat is a working website. The module installs what it builds on (`@abraca/nuxt`,\n`@nuxt/ui`, `@nuxt/fonts`, `@nuxt/image`, `@vueuse/motion`) unless you have\nlisted them yourself.\n\n---\n\n## ⚠️ Registration must stay open\n\nThe single most important thing about deploying anything built on this module.\n\nA visitor is **not** an anonymous session: the SDK mints a guest Ed25519 keypair\nin the browser and *registers* it. That soft identity is a real account, so the\nvisitor is `authenticated` and should land on `[access].authenticated` =\n**`viewer`** — read and awareness, no write.\n\n`Observer`, the only role an anonymous principal may hold, is excluded from the\nserver's `can_send_awareness()`. An anonymous visitor therefore **cannot carry\npresence**, which is the premise of the entire system. Closing registration\nsilently pushes every visitor onto that path, and nothing will look broken —\npresence simply stops.\n\nBecause visitors cannot write, everything they contribute (guestbook\nsignatures, reactions) goes through the RPC runner, whose handlers receive the\nserver-stamped caller id.\n\n---\n\n## Page types\n\nEach key registers a `jun-<key>` type and mounts its renderer. All are on by\ndefault except `globe`.\n\n| Type | What it is |\n|---|---|\n| `jun-journal` → `jun-entry` | A writing feed and its articles. Drafts, scheduled publishing, covers. |\n| `jun-live` → `jun-now` | A social timeline and its posts. The composer is a draft *document*. |\n| `jun-apps` → `jun-app` | A reorderable icon grid and its project pages. |\n| `jun-links` | A column of link rows. A row with no URL opens its own page. |\n| `jun-cv` | A career spine, newest first. |\n| `jun-uses` | A grouped list; the sections come from the page's own meta. |\n| `jun-library` | A reading list shelved by status, with ratings. |\n| `jun-wall` | A masonry photo wall. Photos are real documents with EXIF extracted. |\n| `jun-cinema` → `jun-movie` | A poster shelf and its theatre. Uploaded film (streamed) or a provider link (facade). |\n| `jun-festival` → `jun-track` | A music library shaped like a music app, with a player that survives navigation. |\n| `jun-services` | Live figures from keyless public APIs, fetched and cached server-side. |\n| `jun-mosaic` | A page composed of other pages — panes are documents, rendered by their own renderers. |\n| `jun-guestbook` | The one page visitors write to, over RPC. |\n| `jun-stats` | Live numbers over the document tree. |\n| `jun-redirect` | A document whose `meta.url` is a destination. Emits a real 301. |\n| `jun-home` | A composed front page — sections assembled from the tree. |\n| `jun-config` | The site's own settings. Owner-only, enforced. |\n| `jun-globe` | A map of a journey with a route editor. **Off by default** — see below. |\n\n```ts\njun: {\n  pageTypes: {\n    globe: true,                          // opt in\n    guestbook: false,                     // never registered\n    journal: { label: 'Notes', icon: 'i-lucide-notebook' },\n  },\n}\n```\n\n`false` means the renderer chunk is never referenced, so a disabled type's\ndependencies never enter your bundle graph. That is why this is a build-time\noption and not something the settings document carries.\n\n### The home page\n\n`/` renders the **space root document** through the ordinary pipeline, which is\nusually right. Setting that document's type to `jun-home` — from its own context\nmenu — opts into `JunHomeRenderer` instead: a front page assembled from sections\nthat resolve themselves out of the document tree.\n\n| | |\n|---|---|\n| Layouts | `stack` · `split` · `magazine` · `minimal` |\n| Sections | hero · latest writing · projects · now · links · pages · page content |\n\nBoth live in the document's meta (`homeLayout`, `homeSections`), edited from a\nbar on the page itself. Nothing in it knows a slug or a type id: a site that\nrenames its journal, remaps a type or turns projects off keeps a working home\npage, and the section that has nothing to show drops out heading and all.\n\n**Adopting an existing corpus?** `pageTypeAliases` maps a legacy type id onto a\ncanonical one, so documents keep rendering without a migration:\n\n```ts\njun: { pageTypeAliases: { 'janis-journal': 'jun-journal' } }\n```\n\nIt is also how you survive a type being **retired**. `jun-window` — a pretend\napplication that showed the whole presence vocabulary at once — was removed in\n2.82.0. A document still carrying that type does not break: an unrecognised type\nfalls through to FLOWING and renders in the editor, which is the same tolerance\nthat makes \"Page type ▸\" a safe menu item. To point those pages somewhere\ndeliberate instead:\n\n```ts\njun: { pageTypeAliases: { 'jun-window': 'jun-mosaic' } }\n```\n\n### The mosaic — an alternative to the home page\n\n`jun-home` composes a front page out of a fixed vocabulary of sections.\n`jun-mosaic` has no vocabulary: **its children are the panes**, and a pane\nrenders a *document* through `<ADocRenderer>` — the same call a whole page\nmakes. So a mosaic can hold a live journal feed beside a globe beside a kanban,\nand none of it is a special case.\n\n| | |\n|---|---|\n| Layouts | `bento` · `columns` · `masonry` · `feature` · `freeform` |\n| A pane | `meta.paneDoc` (render that document) · nothing (render itself) · `meta.paneWidget` (`clock`, `presence`, `brand`) |\n| Sizing | `meta.paneSpan` `{ c, r }` in grid units; `meta.paneRect` `{ x, y, w, h }` in freeform |\n\nDrag a tile to rearrange, drag its corner to resize, drag a page in from the\nnavigation to add it — every one of those is a CRDT write, so the layout changes\nlive for anyone else looking at it. Setting the ROOT document's type to\n`jun-mosaic` makes it the front page, the same opt-in `jun-home` uses.\n\nPanes are never editable and (by default) not interactive: a tile is a window\nonto a document, and clicking it opens that document. `meta.paneInteractive`\nopts a single pane back in. Live panes mount lazily and are capped\n(`jun.mosaic.maxPanes`, default 24); a pane past the cap, or one that would\nnest the page inside itself, renders as a card rather than disappearing.\n\n### Media: what leaves the browser, and when\n\n`jun-cinema` and `jun-festival` both take **uploads or links**, and the two\nbehave very differently on purpose.\n\n- **Uploads stream.** `JunMedia` mints a short-lived grant and hands the browser\n  a server URL, so a film seeks over HTTP Range instead of downloading whole.\n  Raise `[uploads] max_file_size` on your backend — the 10 MiB default rejects\n  a phone video.\n- **Links show a facade.** A YouTube or Vimeo URL renders a poster and a play\n  button; the third-party iframe is constructed only after a click, against\n  `youtube-nocookie.com`. Nothing is requested from a provider until a visitor\n  asks for it. `features.thirdPartyEmbeds: false` degrades every provider link\n  to a link card, and `jun.embeds.remoteThumbnails` (off) governs whether even\n  the poster may come from the provider.\n- **An unrecognised host never becomes an iframe.** It renders as a link.\n\n### Signals fetch from the server, never the browser\n\n`jun-services` cards are fetched by the module's own cached endpoint. Every\nadapter is keyless — `github-repo`, `github-user`, `npm`, `crates`, `rss`,\n`http`, `og` — and adding a card is pasting a URL, which is sniffed into a\nprovider and a reference.\n\nThree of them (`rss`, `http`, `og`) take a URL from a document, which makes the\nendpoint a request forwarder. It is guarded: http(s) only, DNS resolved and\nchecked against private/loopback/link-local ranges at every redirect hop, a\nfive-second timeout, a one-megabyte body cap, and nothing about the visitor\nforwarded. A site that wants no such surface drops those three:\n\n```ts\njun: { services: { adapters: ['github-repo', 'npm'] } }\n```\n\n`jun.githubToken` is optional and **server-only**; without it GitHub allows 60\nrequests an hour per server IP, which the cache normally absorbs.\n\n### The globe needs a Mapbox token\n\nIt is the module's only external-service dependency, and the only place a site\nmust configure something beyond its own content:\n\n```ts\njun: {\n  pageTypes: { globe: true },\n  mapboxToken: process.env.MAPBOX_TOKEN,\n}\n```\n\nIt falls back to whatever `@abraca/nuxt` is already configured with, so a site\nthat already shows maps needs nothing new.\n\n---\n\n## Options\n\n### `brand`\n\nSite identity. The only thing most sites set.\n\n| | |\n|---|---|\n| `name` | `<title>` suffix, JSON-LD, footer, studio bar |\n| `tagline` | Meta description default, hero subtitle fallback |\n| `seoDescription` | Overrides `tagline` for the meta description |\n| `avatar` | Author avatar on timeline posts. Falls back to an icon. |\n| `logoMark` | Which built-in mark `<JunLogo>` draws. Default `'sun'`. |\n| `logoVariant` | `'mark'` (default) \\| `'lockup'` \\| `'wordmark'` |\n| `themeColor` | PWA / browser theme colour |\n| `icons` | PWA manifest icons. No defaults — see *PWA* below. |\n| `schemaType` | `'Person'` \\| `'Organization'` \\| `false` |\n\n`name` defaults to **`Jun!s`**. The bang is part of the name rather than\npunctuation, and `<JunLogo>` gives it its own span so a lockup can weight it —\na name without one renders as plain text, so this costs nothing to override.\n\n`logoMark` and `logoVariant` choose between the marks `<JunLogo>` already\ndraws; they are not a way to supply a logo of your own. It ships four, each the\nbang in a different register — `sun` (the orb, and the one mark that carries a\ncolour; the default), `sprout` (a lowercase j that is also a tree, and upside\ndown the bang), `node` (the same silhouette as a graph: three points, two\nedges) and `page` (the document glyph with the bang set inside it) — plus three\nvariants (`mark`, `lockup`, `wordmark`), all pickable live from the settings\ndocument. To supply a logo of your OWN, declare your own `JunLogo.vue` in\n`app/components/`; Nuxt's name resolution prefers it everywhere the mark\nappears.\n\n**The sun takes the site's accent.** It is the one mark with chroma, and the\nchroma is `themeAccent`'s: the theme sheet emits `--jun-sun-from` / `-to` /\n`-core` / `-glow` per colour scheme, so the orb follows an accent change live\nand needs no colour-mode read of its own. Its core is picked by the body's\nBRIGHTNESS rather than by the scheme — white on a pale orb is a featureless\ndisc, and a pale accent has that problem in daylight. A monochrome site gets\nthe monochrome orb: near-black with a white core, inverted on dark.\n\nHover, press and the intro's draw are CSS, in `jun.css` rather than in the\ncomponent — they have to answer an ancestor's `:hover` (the navbar's home link,\nthe settings picker's button), which a scoped style cannot reach.\n\nWhatever you use must render identical markup in the navbar and the intro — the\nfirst-load sequence FLIP-morphs one onto the other, and the handoff is only\ninvisible if they match. That is why the mark is chosen inside the component\nrather than passed in per call site.\n\n### `features`\n\nEach flag gates **both halves** of its feature — the client mount and the server\nroutes or runners it needs — so switching one off genuinely removes it.\n\n| Flag | Default | |\n|---|---|---|\n| `intro` | `true` | First-load logo choreography |\n| `backdrop` | `'blobs'` | The ambient field — see *Backdrops* below |\n| `presence` | `true` | The base every other presence feature reads |\n| `awareBlobs` | `true` | Peers as soft tinted blobs |\n| `peerCursors` | `false` | Named site-wide cursors — reads as surveillance |\n| `travellersChip` | `false` | A \"who's online\" widget, which this is not |\n| `campfire` | `false` | The user center — see *Campfire* below |\n| `studio` | `true` | Owner edit mode |\n| `search` | `true` | ⌘K overlay + full-text endpoint |\n| `feeds` | `true` | `/feed.xml` + `/feed.json` |\n| `sitemap` | `true` | `/sitemap.xml` |\n| `rpc` | `true` | Visitor writes: guestbook, reactions, scheduled publishing |\n| `docCache` | `true` | The SSR runner. Without it pages render empty. |\n| `bootstrap` | `true` | Seed a starter tree into an empty backend |\n| `slideover` | `true` | The document peek panel — powers \"Open in slideover\" |\n| `contextMenu` | `true` | Document context menus. Off leaves the browser's own. |\n| `lightbox` · `announcement` · `footer` | `true` | |\n\n### `campfire`\n\nThe site's **user center**: a hearth in one corner that opens a small tabbed\npanel — who else is here, one shared fire to talk around, and each visitor's own\nhandle. `features.campfire` decides whether a fresh site boots with it lit;\nevery key below is also a Site Config key, so the owner changes any of them live\nfrom the settings page without a redeploy.\n\n| | Default | |\n|---|---|---|\n| `title` | `'Campfire'` | What the place is called — header, empty state, every aria label |\n| `icon` | `'i-lucide-flame'` | The mark on the hearth, its panel and its chat tab |\n| `chat` | `true` | The shared fire. See the note below — this one has a server half. |\n| `roster` | `true` | Who is here, and where |\n| `identity` | `true` | The visitor's own handle and mood |\n| `reactions` | `true` | Emoji embers, rising whether the panel is open or not |\n| `follow` | `true` | Tap a traveller to walk the site with them |\n| `showPages` | `true` | Show what each person is reading. Off is the private choice. |\n| `showBots` | `false` | Include runners and agents. Off by default — see below. |\n| `allowRename` | `true` | Let a visitor choose their own handle |\n| `reactionSet` | `['🔥','❤️','👋','☕']` | The palette, in order |\n| `historyLimit` | `60` | Messages kept on screen (5–300) |\n| `placement` | `'bottom-right'` | Any of the four corners. The top two clear the navbar. |\n| `size` | `'md'` | `sm` · `md` · `lg` |\n| `pillMode` | `'full'` | `full` · `compact` · `count` · `ember` — how loud the closed hearth is |\n| `rosterStyle` | `'list'` | `list` · `grid` · `facepile` · `dots` |\n| `openTab` | `'auto'` | Which panel a tap opens |\n| `blur` · `ember` | `true` | The frosted panel; the warm flame (off keeps it grey) |\n| `label` | `''` | Replaces \"N others warming here\". `{n}` is the count. |\n\n**`chat` has a server half, and it is the reason chat works at all.** Visitors\nare soft identities pinned to `viewer` and the server gates `messages:send` on\nwrite access to the CHANNEL document — so a campfire bound to the space root has\nevery visitor message silently rejected behind the client's own optimistic echo.\nThe `jun:campfire` runner (in `jun-rpc`) therefore opens exactly ONE document\nwith `public_access = \"editor\"`: a hidden `kind: \"channel\"` child of the space\nroot. Turning `chat` off clears that access again. This needs `features.rpc`;\nwithout the runner there is no channel, and the panel says so rather than\noffering a composer that loses what is typed into it.\n\n**`showBots` is off** because a site with a doc-cache runner would otherwise\ngreet its first human visitor with \"3 others warming here\", none of whom are\npeople. A session that never broadcasts a page is a process, not a reader; the\njanitor deliberately broadcasts one, so it counts as a person.\n\n**Renaming it renames the metaphor too.** \"Campfire\" is this module's word, not\nevery site's — a support desk, a common room, a lobby. Setting `title` to\nanything else also drops the two strings that only make sense around a fire: the\nchat tab becomes \"Chat\" rather than \"Fire\", and the no-channel state says \"no\nchannel yet\" rather than \"the fire is not lit yet\". Pick a `icon` to match; the\nsettings page offers the full Lucide set through the same picker the document\ntree uses, and an unrecognised value falls back rather than rendering an empty\nbox.\n\n**The owner can change a person's role from the roster.** In the `list` style,\neach row carries a menu for the site owner: Owner / Editor / Viewer / Observer,\n\"Remove access\", and the person's public key. It writes a permission row on the\nSPACE ROOT, so it cascades exactly as the campfire channel's own access does,\nand it reads the permissions back afterwards — the chip beside a name is what\nthe SERVER stores, never what was asked for. `admin` and `service` are not\noffered: the server refuses to grant an elevated role to anyone but a root\nadmin, so a button for it would be a button that fails.\n\nThe grant is keyed on the public key awareness carries, which is the DEVICE\nkey. For a soft identity — every ordinary visitor — that key IS the account. For\nsomeone who signed in with a password on a device with its own keypair the two\ndiffer, and no endpoint resolves one to the other from the browser; the read-back\nis what makes that visible rather than silent. The other three roster styles get\nno menu at all: they are ambient displays, and hanging a privilege change off a\n10px dot is how someone grants ownership by accident.\n\n### `contextMenu`\n\nEvery document surface — nav items, list rows, grid tiles, cards — carries the\nsame menu, built by `useJunDocMenu()`. **Visitors get the read-only half**\n(open, open in a new tab, open in the slideover, copy link, share, subscribe);\nthe owner vocabulary (rename, icon, page type, duplicate, pin, hide, move,\ntrash) is added while editing.\n\nEach item is individually switchable, because a menu is site voice rather than\nplumbing:\n\n| | Default | |\n|---|---|---|\n| `enabled` | `true` | Master switch. Off leaves the browser's menu everywhere. |\n| `visitor` | `true` | The read-only half. Off returns to owner-only. |\n| `open` · `newTab` · `slideover` · `copyLink` · `share` · `subscribe` | `true` | |\n| `copyMarkdown` · `copyTitle` · `copyId` | `false` | Opt-in — clutter on a small site |\n| `duplicate` · `changeType` · `setIcon` · `pin` · `hide` · `moveToTop` · `trash` | `true` | Owner items |\n| `suppressNative` | `false` | Suppress the browser menu on page body for visitors |\n\n`suppressNative` defaults to **off** on purpose. The reference site suppressed\nit unconditionally, which also took away \"Copy\" on every paragraph of prose.\n\nContribute your own items from a client plugin:\n\n```ts\nregisterJunMenuItems((ctx) => ctx.type === 'jun-app'\n  ? [[{ label: 'Open repository', icon: 'i-lucide-github', onSelect: () => …ically }]]\n  : null)\n```\n\n### `navigation`\n\nBuild-time defaults for the navbar. Every one is also a Site Config key, so\nthese are what a fresh site boots with rather than a lock.\n\n| | Default | |\n|---|---|---|\n| `placement` | `'top'` | `top` \\| `top-bar` \\| `bottom` \\| `rail-left` \\| `rail-right` |\n| `shape` | `'pill'` | `pill` \\| `rounded` \\| `square` \\| `ghost` |\n| `size` | `'md'` | `sm` \\| `md` \\| `lg` |\n| `itemMode` | `'text'` | `text` \\| `icon` \\| `icon-focus` \\| `icon-text` \\| `icon-stack` |\n| `activeStyle` | `'underline'` | `underline` \\| `pill` \\| `dot` \\| `bold` \\| `glow` \\| `box` \\| `bracket` |\n| `autoHide` · `blur` · `showLogo` · `centerActive` | `true` | |\n| `showIndices` · `keyboardNav` · `freshnessDots` | `true` | |\n| `homeItem` | `false` | An explicit Home item |\n| `travellers` | `false` | The fellow-travellers dot stack in the right cluster |\n| `travellersList` | `false` | Hovering that stack names each traveller and their page |\n\nEvery placement **floats over** the content rather than displacing it, which is\nwhat keeps it a presentation choice: no renderer knows which one is active and\nswitching one live never reflows a page. The rails fall back to `top` below\n`lg`, and a PANEL page type still docks the bar full-width regardless.\n\n**Both traveller switches are off, and they are two switches for a reason.** The\ndots say how MANY people are here; the roster says WHO they are and what each is\nreading. A site may reasonably want the first without the second, and off is the\nmore private default for both — in a navbar whose whole idea is slight ambient\npresence, a dot stack with a hover roster reads as a \"who's online\" widget, and\nthe campfire is where a real user center belongs. With `travellersList` off the\nchip renders as a plain readout with no popover at all, rather than a button\nthat opens nothing. `features.travellersChip` still decides whether the\ncomponent is in the build; these decide whether it is shown.\n\n### Surface — the performance lever\n\n`themeSurface` on the settings document: `glass` (default) · `soft` · `solid`.\n\n`backdrop-filter` is the most expensive property on the page, and this site has\none on the navbar, every card, the hearth, the lightbox, the timeline and\nseveral renderers. Each re-reads whatever is behind it, so a background image\nmultiplies the cost across all of them at once — which is exactly when a site\nstarts to feel sluggish.\n\n| | Frosted surfaces | |\n|---|---|---|\n| `glass` | 15 | The house look |\n| `soft` | 4 | Navbar and hearth only; content surfaces go flat |\n| `solid` | 0 | No blur anywhere, panels opaque |\n\n(Counts measured on the settings page — the heaviest one.)\n\nRemoval is universal (`backdrop-filter: none` on `*`), restoration is a short\nlist by name. That asymmetry is deliberate: setting a *value* on `*` would give\nevery element its own compositing layer, which would be far worse than the\nproblem it solves.\n\n### Backdrops\n\n`features.backdrop` picks the ambient field:\n\n`blobs` · `dots` · `grid` · `aurora` · `mesh` · `rings` · `waves` · `noise` ·\n`solid` · `shader` · `false`\n\nAll of them except `shader` are pure CSS — no canvas, no `filter: blur()`, no\nper-frame JavaScript beyond a pointer parallax that stops once it settles — so\nthe owner can switch between them **live** from the settings page. `shader`\npulls an optional WebGL peer and must be chosen at build time; when it is, the\nruntime picker is disabled and says why.\n\n`backdrops` narrows the set the settings page offers.\n\n**A background IMAGE composes with the backdrop rather than replacing it.** Drop\na photograph or a texture on the settings page and it becomes the page's base,\nwith the chosen field still drifting across it — `cover` / `contain` / `tile`, a\nstrength from 5% to 100%, and an optional softening. It is stored as an upload\nreference (`<docId>/<uploadId>`, attached to the space root) or as a literal\nURL, and served off the thumbnail ladder rather than as the original: a\nbackground sits behind content, usually below full strength, and the difference\nis a multi-megabyte decode against a hundred kilobytes.\n\n**Softening is a low-resolution source, never `filter: blur()`.** A blurred\nfull-viewport layer is a Gaussian the compositor re-reads for the layer and\nagain for every `backdrop-filter` surface above it — which on this site is the\nnavbar, every card and the hearth. A 64px copy scaled up to the viewport is the\nsame picture and costs nothing: upscaling *is* a blur. (It is disabled for\n`tile`, where the image's natural size is the repeat size.)\n\nThe image is painted INSIDE the backdrop component rather than on a layer\nbeneath it, and that is load-bearing: both backdrops own an opaque base colour\nbecause `mix-blend-mode` blends only within its own stacking context, and five\nof the nine kinds multiply or screen against it. A separate `-z-20` layer with a\ntransparent backdrop above it would have silently broken aurora, mesh, rings,\nwaves and noise. Here the pattern blends against the photograph, which is what\n\"they work together\" has to mean to be worth having.\n\n**Dark mode.** Every kind reads far more strongly on a dark scheme than a naive\nport of its light values would: a pattern screening onto a near-black base at\nthe alpha that reads as a quiet texture on white lands within a couple of RGB\nsteps of the background and is, in practice, invisible. The dark palettes are\nbrighter and the dark opacities higher — both halves were needed, and the blob\nfield takes its two inner alphas from CSS variables so the scheme can raise them\nwithout the gradient builder knowing which scheme it is in.\n\n### Everything else\n\n| Option | |\n|---|---|\n| `layout` | Which types are immersive / panel / feed / self-padded |\n| `nodePanel` | `'navigate'` (default) or `'slideover'` — what a plain click does |\n| `palettes` · `paletteMap` | Backdrop palettes, keyed by TYPE so a rename keeps them |\n| `seed` | The starter tree. `'default'` seeds one page per enabled type. |\n| `guestNames` | Vocabulary for warm anonymous handles |\n| `metaExcludeKeys` | Keys that must never auto-materialise as an editor chip |\n| `siteConfigDefaults` | Starting values for the settings document |\n| `imageDomains` | Remote hosts `<NuxtImg>` may optimise |\n| `apiBase` | Default `/api/_jun` |\n| `pages` · `layoutName` · `fonts` · `autoInstall` | Opt out of what the module registers |\n\n---\n\n## PWA\n\nA manifest is contributed **only if you have installed `@vite-pwa/nuxt`\nyourself**. A service worker has real consequences — stale assets, update\nprompts — and that is not a decision a content module should make for you.\n\nIt is built from `brand`, so your manifest and your site cannot drift apart. No\ndefault icons are supplied: pointing a manifest at files you do not have\nproduces a *broken* install prompt rather than none.\n\nNavigations stay network-first with no offline fallback. This is a realtime SSR\nsite and the CRDT layer owns offline data; a worker serving stale HTML would\nfight it.\n\n---\n\n## How it renders\n\nDocuments are **server-rendered from a Nitro doc cache**, then become realtime\non the client. Skeletons should rarely be seen.\n\nThe seeder writes real document bodies into a fresh backend and hands them\nstraight to that cache, so a cold deploy serves prose on its first request\nrather than empty pages for the first two minutes.\n\nPage-type renderers are client-only by design, which means for a crawler, a feed\nreader or a link preview **the SSR payload is the site**. `pnpm parity` asserts\nthat half: every sitemap URL returns 200 with its own title and description, a\ndocument with a body ships that body, no page paints a skeleton, JSON-LD appears\nwhere a type declares it, feeds carry real content, search reaches body text,\nand an unknown URL is a real 404.\n\n---\n\n## Commands\n\n```bash\npnpm dev            # backend + Nuxt\npnpm dev:clean      # reset the playground database and caches\npnpm parity         # SSR assertions against a running dev server\npnpm parity:nav     # clicks through the nav — catches broken client routing\npnpm lint\npnpm typecheck\n```\n\nRun **both** parity scripts. They are blind to different things: `parity`\nreloads for every check, so it cannot see a broken in-app navigation, and\n`parity:nav` never reloads, so it cannot see an SSR regression. A bug that\nsurvived twelve phases here was invisible to the first and obvious to the\nsecond.\n\n> `pnpm dev:clean` prints an IndexedDB incantation to run in any open tab.\n> That is not optional: a tab still open on the site will re-push its copy of\n> the old tree on reconnect, and you end up with two of every page. Repeat the\n> cycle and the tree multiplies. A deleted database is not a tombstone — it is a\n> peer that lost its memory, and the browser holds the newer state.\n\n## Requirements\n\nNode ≥ 22 · `@abraca/nuxt` ≥ 2.74.0 · Nuxt 4\n\n`yjs`, `y-protocols`, `@tiptap/*`, `prosemirror-*` and `vue` must each resolve\nto **one copy**. Two `yjs` copies break every `instanceof` check, which empties\nthe SSR cache silently. The module dedupes what it can; a workspace with linked\npackages may need `pnpm.overrides`.\n\n## Licence\n\nMIT\n","readmeFilename":"README.md"}