{"_id":"@driftime/sanity-plugin-handbook","_rev":"8-08ba1e0b16b08764a83fb3e489d6ab17","name":"@driftime/sanity-plugin-handbook","dist-tags":{"latest":"0.4.1"},"versions":{"0.1.0":{"name":"@driftime/sanity-plugin-handbook","version":"0.1.0","keywords":["sanity","sanity-plugin"],"author":{"url":"https://driftime.com","name":"Kenny Heard","email":"kenny@driftime.com"},"license":"MIT","_id":"@driftime/sanity-plugin-handbook@0.1.0","maintainers":[{"name":"kennyheard","email":"work@kennyheard.dev"}],"homepage":"https://github.com/driftime/sanity-plugin-handbook","bugs":{"url":"https://github.com/driftime/sanity-plugin-handbook/issues"},"dist":{"shasum":"e15da5f8186b55fa2a18433ab3d98c091e8977d7","tarball":"https://registry.npmjs.org/@driftime/sanity-plugin-handbook/-/sanity-plugin-handbook-0.1.0.tgz","fileCount":57,"integrity":"sha512-0SN1FrRB5lq19nnBNrtXwJ5rl7GXyhoakL0fVqtP/YFKz+3UHXyRnXa9PhUY4iv6pLVpxb5fOWtaqECRkGHZ7A==","signatures":[{"sig":"MEUCIFz3I4pmjX6/tzRfUyLAEJgOAdUyEojjhR8bd0RN1HlOAiEA4BaRO9xuDZCBCcFry7y+Pe2IOslT/3Pc3uDQIzuY38c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1052359},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","source":"./src/index.ts","default":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"6c0fbbba0d219a074e2625dd1da41863a49c6ab1","scripts":{"dev":"plugin-kit link-watch","fix":"oxfmt && oxlint --fix","build":"plugin-kit verify-package --silent && pkg-utils build --strict --clean --check","check":"oxfmt --check && oxlint","watch":"pkg-utils watch --strict"},"_npmUser":{"name":"kennyheard","email":"work@kennyheard.dev"},"repository":{"url":"git+ssh://git@github.com/driftime/sanity-plugin-handbook.git","type":"git"},"_npmVersion":"11.11.0","description":"Schema-driven documentation and editorial guides, built right into Sanity Studio.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","browserslist":"extends @sanity/browserslist-config","dependencies":{"lucide-react":"1.7.0"},"sanityPlugin":{"verifyPackage":{"scripts":false,"sanityV2Json":false,"eslintImports":false}},"publishConfig":{"access":"public","exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"}},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"0.44.0","react":"19.2.4","oxlint":"1.59.0","sanity":"5.20.0","react-dom":"19.2.4","@sanity/ui":"3.1.14","typescript":"6.0.2","@types/node":"25.5.2","@types/react":"19.2.14","oxlint-tsgolint":"0.20.0","@sanity/pkg-utils":"10.4.13","@sanity/plugin-kit":"4.0.20","@sanity/browserslist-config":"1.0.5"},"peerDependencies":{"react":"18 || 19","sanity":"3 || 4 || 5","@sanity/ui":"2 || 3"},"_npmOperationalInternal":{"tmp":"tmp/sanity-plugin-handbook_0.1.0_1775681340354_0.544423076308564","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@driftime/sanity-plugin-handbook","version":"0.2.0","keywords":["sanity","sanity-plugin"],"author":{"url":"https://driftime.com","name":"Kenny Heard","email":"kenny@driftime.com"},"license":"MIT","_id":"@driftime/sanity-plugin-handbook@0.2.0","maintainers":[{"name":"kennyheard","email":"work@kennyheard.dev"}],"homepage":"https://github.com/driftime/sanity-plugin-handbook","bugs":{"url":"https://github.com/driftime/sanity-plugin-handbook/issues"},"dist":{"shasum":"d0cbe5ed8dda0a68b319de7792bf565f7943da60","tarball":"https://registry.npmjs.org/@driftime/sanity-plugin-handbook/-/sanity-plugin-handbook-0.2.0.tgz","fileCount":69,"integrity":"sha512-eU4UCK0/FQ3FP6yopdj1FVpQbC34p64XDO2YL7guQh7rMgyoq5fJA3/Fssx7DQpdocX1qNUSOrhdm2TgpLH0Fg==","signatures":[{"sig":"MEYCIQCcymCaWKU/G/EAEzHFwBMnbUkUATdIqh0O9fnBE7slXgIhAJoUhO7plmDWYK7dfBYiUA5esE2skwr0vwa8fM6Duw5O","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1095782},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","source":"./src/index.ts","default":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"8399dacb5c56d836c873fdbf4d307d2c58a54e2d","scripts":{"dev":"plugin-kit link-watch","fix":"oxfmt && oxlint --fix","build":"plugin-kit verify-package --silent && pkg-utils build --strict --clean --check","check":"oxfmt --check && oxlint","watch":"pkg-utils watch --strict"},"_npmUser":{"name":"kennyheard","email":"work@kennyheard.dev"},"repository":{"url":"git+ssh://git@github.com/driftime/sanity-plugin-handbook.git","type":"git"},"_npmVersion":"11.11.0","description":"Schema-driven documentation and editorial guides, built right into Sanity Studio.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","browserslist":"extends @sanity/browserslist-config","dependencies":{"@driftime/sanity-plugin-handbook":"file:.yalc/@driftime/sanity-plugin-handbook"},"sanityPlugin":{"verifyPackage":{"scripts":false,"sanityV2Json":false,"eslintImports":false}},"publishConfig":{"access":"public","exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"}},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"0.44.0","react":"19.2.4","oxlint":"1.59.0","sanity":"5.20.0","react-dom":"19.2.4","@sanity/ui":"3.1.14","typescript":"6.0.2","@types/node":"25.5.2","@types/react":"19.2.14","oxlint-tsgolint":"0.20.0","@sanity/pkg-utils":"10.4.13","@sanity/plugin-kit":"4.0.20","@sanity/browserslist-config":"1.0.5"},"peerDependencies":{"react":"18 || 19","sanity":"3 || 4 || 5","@sanity/ui":"2 || 3"},"_npmOperationalInternal":{"tmp":"tmp/sanity-plugin-handbook_0.2.0_1775682445640_0.12912929404686002","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@driftime/sanity-plugin-handbook","version":"0.2.1","keywords":["sanity","sanity-plugin"],"author":{"url":"https://driftime.com","name":"Kenny Heard","email":"kenny@driftime.com"},"license":"MIT","_id":"@driftime/sanity-plugin-handbook@0.2.1","maintainers":[{"name":"kennyheard","email":"work@kennyheard.dev"}],"homepage":"https://github.com/driftime/sanity-plugin-handbook","bugs":{"url":"https://github.com/driftime/sanity-plugin-handbook/issues"},"dist":{"shasum":"129f87aa0939601ccde0b5ff6a92a9ba02101f69","tarball":"https://registry.npmjs.org/@driftime/sanity-plugin-handbook/-/sanity-plugin-handbook-0.2.1.tgz","fileCount":69,"integrity":"sha512-w1yX00Xf7/G5tu7tfomOvI5WnJjpL9hyCOORfyPAZopkI7QrKszogk/4R+E2Fc/wuVVvfTFIY9v1f2Dj5jplKA==","signatures":[{"sig":"MEUCIHG+wIG+EDAcqrr+oJOjLpfUNdOh9b8dWRP7CFXk/iiaAiEA4FaxdC4OHjFe9P32u25QIFC3/4k96yRglj1NX051qug=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1096931},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"import":"./dist/index.js","source":"./src/index.ts","default":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"0a3cd6106c89f9a75fb79e3837c6cc6b56a44d61","scripts":{"dev":"plugin-kit link-watch","fix":"oxfmt && oxlint --fix","build":"plugin-kit verify-package --silent && pkg-utils build --strict --clean --check","check":"oxfmt --check && oxlint","watch":"pkg-utils watch --strict"},"_npmUser":{"name":"kennyheard","email":"work@kennyheard.dev"},"repository":{"url":"git+ssh://git@github.com/driftime/sanity-plugin-handbook.git","type":"git"},"_npmVersion":"11.11.0","description":"Schema-driven documentation and editorial guides, built right into Sanity Studio.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","browserslist":"extends @sanity/browserslist-config","sanityPlugin":{"verifyPackage":{"scripts":false,"sanityV2Json":false,"eslintImports":false}},"publishConfig":{"access":"public","exports":{".":{"import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"}},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"0.44.0","react":"19.2.4","oxlint":"1.59.0","sanity":"5.20.0","react-dom":"19.2.4","@sanity/ui":"3.1.14","typescript":"6.0.2","@types/node":"25.5.2","@types/react":"19.2.14","oxlint-tsgolint":"0.20.0","@sanity/pkg-utils":"10.4.13","@sanity/plugin-kit":"4.0.20","@sanity/browserslist-config":"1.0.5"},"peerDependencies":{"react":"18 || 19","sanity":"3 || 4 || 5","@sanity/ui":"2 || 3"},"_npmOperationalInternal":{"tmp":"tmp/sanity-plugin-handbook_0.2.1_1775683108142_0.1980469040156807","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@driftime/sanity-plugin-handbook","version":"0.3.0","keywords":["sanity","sanity-plugin"],"author":{"url":"https://driftime.com","name":"Kenny Heard","email":"kenny@driftime.com"},"license":"MIT","_id":"@driftime/sanity-plugin-handbook@0.3.0","maintainers":[{"name":"kennyheard","email":"work@kennyheard.dev"}],"homepage":"https://github.com/driftime/sanity-plugin-handbook","bugs":{"url":"https://github.com/driftime/sanity-plugin-handbook/issues","email":"kenny@driftime.com"},"dist":{"shasum":"35a8b34ca52af6c49604f958953459145e9a0de2","tarball":"https://registry.npmjs.org/@driftime/sanity-plugin-handbook/-/sanity-plugin-handbook-0.3.0.tgz","fileCount":7,"integrity":"sha512-3RsZLPa/QcsO2qr3gT65T9hbxFFGY7Ay6cNEhZUOovnyYfuPlV6mgep+WrR96Jv41uKkf1XNqdlM15c9M49rcA==","signatures":[{"sig":"MEUCIQCAfrbbqK/b5NsxQPRrf93hBUc0cL5eTNEicLttT5TC+AIgNowu+efRYipk9NaPFDKOgPK7/2KE1MRrx1G+FeTeFks=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":344478},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.19 <22 || >=22.12"},"exports":{".":{"source":"./src/index.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"f62b58449c6f9ba16c5b1f036a5b9a0349afa467","scripts":{"dev":"plugin-kit link-watch","fix":"oxfmt && oxlint --fix","build":"bun run check && bun run typecheck && plugin-kit verify-package --silent && pkg-utils build --strict --check --clean && node --check dist/index.js","check":"oxfmt --check && oxlint","watch":"pkg-utils watch --strict","typecheck":"tsc","prepublishOnly":"bun run build"},"_npmUser":{"name":"kennyheard","email":"work@kennyheard.dev"},"repository":{"url":"git+ssh://git@github.com/driftime/sanity-plugin-handbook.git","type":"git"},"_npmVersion":"11.17.0","description":"Schema-driven documentation and editorial guides, built right into Sanity Studio.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","browserslist":"extends @sanity/browserslist-config","dependencies":{"@sanity/ui":"^4.0.3","@sanity/icons":"^5.2.1","@portabletext/react":"^8.0.0"},"sanityPlugin":{"verifyPackage":{"oxfmt":false,"oxlint":false,"scripts":false,"tsconfig":false}},"publishConfig":{"access":"public","exports":{".":"./dist/index.js","./package.json":"./package.json"}},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"0.63.0","react":"19.2.8","oxlint":"1.78.0","sanity":"6.9.2","react-dom":"19.2.8","typescript":"7.0.2","@types/node":"26.2.0","@types/react":"19.2.18","oxlint-tsgolint":"7.0.2001","@sanity/tsconfig":"2.2.1","@types/react-dom":"19.2.4","@sanity/pkg-utils":"12.1.2","@sanity/plugin-kit":"10.0.5","@sanity/browserslist-config":"1.0.5","babel-plugin-react-compiler":"1.0.0"},"peerDependencies":{"react":"19","sanity":"6"},"_npmOperationalInternal":{"tmp":"tmp/sanity-plugin-handbook_0.3.0_1788860526274_0.15769652740929985","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@driftime/sanity-plugin-handbook","version":"0.3.1","keywords":["sanity","sanity-plugin"],"author":{"url":"https://driftime.com","name":"Kenny Heard","email":"kenny@driftime.com"},"license":"MIT","_id":"@driftime/sanity-plugin-handbook@0.3.1","maintainers":[{"name":"kennyheard","email":"work@kennyheard.dev"}],"homepage":"https://github.com/driftime/sanity-plugin-handbook","bugs":{"url":"https://github.com/driftime/sanity-plugin-handbook/issues","email":"kenny@driftime.com"},"dist":{"shasum":"c61ac9b956a12d1ac49495f4fdd3605b6506a781","tarball":"https://registry.npmjs.org/@driftime/sanity-plugin-handbook/-/sanity-plugin-handbook-0.3.1.tgz","fileCount":7,"integrity":"sha512-RpbVetIB62uXfU2IOYT9egOtdypB5zywYDEBetfI7RlTo81hpShPZm+wHaWLOFOpEdDPV/mUY0rvomMOO21E0w==","signatures":[{"sig":"MEQCIEkWHAaU7A8ICAexhrv015FP4QKv9Ozwaoa3R1Yuk9V5AiB5glt5FHNXVqQyZ9kavSVlWfQYtCUcblMzdszRN6ukwA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":344470},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.19 <22 || >=22.12"},"exports":{".":{"source":"./src/index.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"56b8c5201c5b66a00c9931a0e0fabc23ecacaef0","scripts":{"dev":"plugin-kit link-watch","fix":"oxfmt && oxlint --fix","build":"bun run check && bun run typecheck && plugin-kit verify-package --silent && pkg-utils build --strict --check --clean && node --check dist/index.js","check":"oxfmt --check && oxlint","watch":"pkg-utils watch --strict","typecheck":"tsc","prepublishOnly":"bun run build"},"_npmUser":{"name":"kennyheard","email":"work@kennyheard.dev"},"repository":{"url":"git+ssh://git@github.com/driftime/sanity-plugin-handbook.git","type":"git"},"_npmVersion":"11.17.0","description":"Schema-driven documentation and editorial guides, built right into Sanity Studio.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","browserslist":"extends @sanity/browserslist-config","dependencies":{"@sanity/ui":"^4.2.0","@sanity/icons":"^5.2.1","@portabletext/react":"^7.0.1 || ^8.0.0"},"sanityPlugin":{"verifyPackage":{"oxfmt":false,"oxlint":false,"scripts":false,"tsconfig":false}},"publishConfig":{"access":"public","exports":{".":"./dist/index.js","./package.json":"./package.json"}},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"0.67.0","react":"19.2.8","oxlint":"1.82.0","sanity":"6.13.0","react-dom":"19.2.8","typescript":"7.0.2","@types/node":"26.5.0","@types/react":"19.2.18","oxlint-tsgolint":"7.0.2001","@sanity/tsconfig":"2.2.1","@types/react-dom":"19.2.7","@sanity/pkg-utils":"13.0.0","@sanity/plugin-kit":"10.0.9","@sanity/browserslist-config":"1.0.5","babel-plugin-react-compiler":"1.0.0"},"peerDependencies":{"react":"19","sanity":"6"},"_npmOperationalInternal":{"tmp":"tmp/sanity-plugin-handbook_0.3.1_1788887824868_0.041330680940225184","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@driftime/sanity-plugin-handbook","version":"0.3.2","keywords":["sanity","sanity-plugin"],"author":{"url":"https://driftime.com","name":"Kenny Heard","email":"kenny@driftime.com"},"license":"MIT","_id":"@driftime/sanity-plugin-handbook@0.3.2","maintainers":[{"name":"kennyheard","email":"work@kennyheard.dev"}],"homepage":"https://github.com/driftime/sanity-plugin-handbook","bugs":{"url":"https://github.com/driftime/sanity-plugin-handbook/issues","email":"kenny@driftime.com"},"dist":{"shasum":"4dce96ed548c147a7d1496aa3b803b2b530f07a9","tarball":"https://registry.npmjs.org/@driftime/sanity-plugin-handbook/-/sanity-plugin-handbook-0.3.2.tgz","fileCount":7,"integrity":"sha512-lY1LtUq/AQIlBrUx/kbjoyVyOKjXJIJ//owVDxL+zTDd31g9ieuM+hAIkGdvkwRLaX274kCJueusrSvnpwVpIA==","signatures":[{"sig":"MEUCIALRUsdVEHgk667KH4Yvx+DVoBWHBVvJDQ3MfdXh/bO8AiEAxpProGmynOAwCE45S+Rp88X/iAazXLZ/TdDYKNGk450=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":344945},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.19 <22 || >=22.12"},"exports":{".":{"source":"./src/index.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"2f8f9e2ee12019fd60620768d9b20e3be5821575","scripts":{"dev":"plugin-kit link-watch","fix":"oxfmt && oxlint --fix","build":"bun run check && bun run typecheck && plugin-kit verify-package --silent && pkg-utils build --strict --check --clean && node --check dist/index.js","check":"oxfmt --check && oxlint","watch":"pkg-utils watch --strict","typecheck":"tsc","prepublishOnly":"bun run build"},"_npmUser":{"name":"kennyheard","email":"work@kennyheard.dev"},"repository":{"url":"git+ssh://git@github.com/driftime/sanity-plugin-handbook.git","type":"git"},"_npmVersion":"11.17.0","description":"Schema-driven documentation and editorial guides, built right into Sanity Studio.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","browserslist":"extends @sanity/browserslist-config","dependencies":{"@sanity/ui":"^4.2.0","@sanity/icons":"^5.2.1","@portabletext/react":"^7.0.1 || ^8.0.0"},"sanityPlugin":{"verifyPackage":{"oxfmt":false,"oxlint":false,"scripts":false,"tsconfig":false}},"publishConfig":{"access":"public","exports":{".":"./dist/index.js","./package.json":"./package.json"}},"_hasShrinkwrap":false,"devDependencies":{"oxfmt":"0.67.0","react":"19.2.8","oxlint":"1.82.0","sanity":"6.13.0","react-dom":"19.2.8","typescript":"7.0.2","@types/node":"26.5.0","@types/react":"19.2.18","oxlint-tsgolint":"7.0.2001","@sanity/tsconfig":"2.2.1","@types/react-dom":"19.2.7","@sanity/pkg-utils":"13.0.0","@sanity/plugin-kit":"10.0.9","@sanity/browserslist-config":"1.0.5","babel-plugin-react-compiler":"1.0.0"},"peerDependencies":{"react":"19","sanity":"6"},"_npmOperationalInternal":{"tmp":"tmp/sanity-plugin-handbook_0.3.2_1788905439652_0.36730897097041093","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@driftime/sanity-plugin-handbook","version":"0.4.0","keywords":["documentation","guides","handbook","portable-text","sanity","sanity-plugin"],"author":{"url":"https://driftime.com","name":"Kenny Heard","email":"kenny@driftime.com"},"license":"MIT","_id":"@driftime/sanity-plugin-handbook@0.4.0","maintainers":[{"name":"kennyheard","email":"work@kennyheard.dev"}],"homepage":"https://github.com/driftime/sanity-plugins/tree/main/packages/handbook#readme","bugs":{"url":"https://github.com/driftime/sanity-plugins/issues"},"dist":{"shasum":"9002ce9307174ad26cfac0b521c8e5b118d6db50","tarball":"https://registry.npmjs.org/@driftime/sanity-plugin-handbook/-/sanity-plugin-handbook-0.4.0.tgz","fileCount":6,"integrity":"sha512-+26ATvykLDEAXyTM5kWdFDaZBkXFnRR1hDFb6fd0hiXa3JhzzuWsXpYHFLPbkM9sK9jAeIhIlNEvFROnTm07wg==","signatures":[{"sig":"MEQCIE/XcB+mEi+9WnxRamX6TUcCJhPxJw5yFwG4j17qn1XDAiAfGH3VTz0w2KXDDLaRrTNVyjnmHnXdqe/XBj+qYUOrng==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":357575},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20.19 <22 || >=22.12"},"exports":{".":{"source":"./src/index.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"9131c3ceeeff12314a18b655d728bd6d9b5ee3c8","scripts":{"dev":"plugin-kit link-watch","push":"yalc push","build":"bun run typecheck && plugin-kit verify-package --silent && pkg-utils build --strict --check --clean && node --check dist/index.js","typecheck":"tsc","prepublishOnly":"bun run build"},"_npmUser":{"name":"kennyheard","email":"work@kennyheard.dev"},"repository":{"url":"git+https://github.com/driftime/sanity-plugins.git","type":"git","directory":"packages/handbook"},"_npmVersion":"11.17.0","description":"Schema-driven documentation and editorial guides, built right into Sanity Studio.","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","browserslist":"extends @sanity/browserslist-config","dependencies":{"@sanity/ui":"^4.0.3","@sanity/icons":"^5.2.1","@portabletext/react":"^8.0.0"},"sanityPlugin":{"verifyPackage":{"oxfmt":false,"oxlint":false,"scripts":false,"tsconfig":false}},"publishConfig":{"access":"public","exports":{".":"./dist/index.js","./package.json":"./package.json"}},"_hasShrinkwrap":false,"devDependencies":{"@repo/lib":"workspace:*","@sanity/pkg-utils":"catalog:"},"peerDependencies":{"react":"19","sanity":"^6.10.0"},"_npmOperationalInternal":{"tmp":"tmp/sanity-plugin-handbook_0.4.0_1789310043696_0.47818064620588707","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"_id":"@driftime/sanity-plugin-handbook@0.4.1","bugs":{"url":"https://github.com/driftime/sanity-plugins/issues"},"dist":{"shasum":"52a20289e850748a1e3dd6e1f11e769f0b8b1d8e","tarball":"https://registry.npmjs.org/@driftime/sanity-plugin-handbook/-/sanity-plugin-handbook-0.4.1.tgz","fileCount":6,"integrity":"sha512-EZsfIpuv9i4ae8ky/C2HrSMGnXqB2ldLYB+WkS80zW3DBJDLBs/y5APH2qWxiZy3ZUIQkXVGE+1oikLAn/k6gg==","signatures":[{"sig":"MEQCIG9fNo0FXXc1VY3tWVriHWLArooc4L7VH1HJUPPJPRU0AiBOlsozzG1AQzgztLlvbnz8DmtPFmARfmOa0eo5x7DN0w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEzMiJ9GeKYFmkeutreBKBBObXA4cX/ou1ydUlJb/OkOAiEAxKRtIZyApMz3bOICdj8CvsZgYudvxkXLygdpuRW+wXU="}],"unpackedSize":350961},"name":"@driftime/sanity-plugin-handbook","type":"module","types":"./dist/index.d.ts","author":{"url":"https://driftime.com","name":"Kenny Heard","email":"kenny@driftime.com"},"engines":{"node":">=20.19 <22 || >=22.12"},"exports":{".":{"source":"./src/index.ts","default":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"0d34727bdd5642064068fa900df0a8e2c9736b00","license":"MIT","scripts":{"dev":"plugin-kit link-watch","push":"yalc push","build":"bun run typecheck && plugin-kit verify-package --silent && pkg-utils build --strict --check --clean && node --check dist/index.js","typecheck":"tsc","prepublishOnly":"bun run build"},"version":"0.4.1","_npmUser":{"name":"kennyheard","email":"work@kennyheard.dev"},"homepage":"https://github.com/driftime/sanity-plugins/tree/main/packages/handbook#readme","keywords":["documentation","guides","handbook","portable-text","sanity","sanity-plugin"],"repository":{"url":"git+https://github.com/driftime/sanity-plugins.git","type":"git","directory":"packages/handbook"},"_npmVersion":"11.19.0","description":"Schema-driven documentation and editorial guides, built right into Sanity Studio.","directories":{},"maintainers":[{"name":"kennyheard","email":"work@kennyheard.dev"}],"sideEffects":false,"_nodeVersion":"24.21.0","browserslist":"extends @sanity/browserslist-config","dependencies":{"@sanity/ui":"^4.0.3","@sanity/icons":"^5.2.1","@portabletext/react":"^8.0.0"},"sanityPlugin":{"verifyPackage":{"oxfmt":false,"oxlint":false,"scripts":false,"tsconfig":false}},"publishConfig":{"access":"public","exports":{".":"./dist/index.js","./package.json":"./package.json"}},"_hasShrinkwrap":false,"devDependencies":{"@repo/lib":"workspace:*","@sanity/pkg-utils":"catalog:"},"peerDependencies":{"react":"19","sanity":"^6.10.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sanity-plugin-handbook_0.4.1_1790463506535_0.8929885067733789"}}},"time":{"created":"2026-04-08T20:49:00.258Z","modified":"2026-09-26T22:58:26.808Z","0.1.0":"2026-04-08T20:49:00.566Z","0.2.0":"2026-04-08T21:07:25.905Z","0.2.1":"2026-04-08T21:18:28.322Z","0.3.0":"2026-09-08T09:42:06.418Z","0.3.1":"2026-09-08T17:17:05.069Z","0.3.2":"2026-09-08T22:10:39.819Z","0.4.0":"2026-09-13T14:34:03.828Z","0.4.1":"2026-09-26T22:58:26.631Z"},"bugs":{"url":"https://github.com/driftime/sanity-plugins/issues"},"author":{"url":"https://driftime.com","name":"Kenny Heard","email":"kenny@driftime.com"},"license":"MIT","homepage":"https://github.com/driftime/sanity-plugins/tree/main/packages/handbook#readme","keywords":["documentation","guides","handbook","portable-text","sanity","sanity-plugin"],"repository":{"url":"git+https://github.com/driftime/sanity-plugins.git","type":"git","directory":"packages/handbook"},"description":"Schema-driven documentation and editorial guides, built right into Sanity Studio.","maintainers":[{"name":"kennyheard","email":"work@kennyheard.dev"}],"readme":"<div align=\"center\">\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/icon-dark.svg\" />\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/icon-light.svg\" />\n    <img src=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/icon-light.svg\" alt=\"Handbook plugin logo\" width=\"48\" />\n  </picture>\n  <h1>Handbook</h1>\n  <p><strong>A Sanity Studio plugin by Driftime®</strong></p>\n  <p>Schema-driven documentation and editorial guides, built right into Sanity Studio.</p>\n  <p>\n    <a href=\"https://www.npmjs.com/package/@driftime/sanity-plugin-handbook\"><img src=\"https://img.shields.io/npm/v/@driftime/sanity-plugin-handbook?style=flat-square&labelColor=1a1a1a&color=666666\" alt=\"npm version\" /></a>\n    <a href=\"https://github.com/driftime/sanity-plugins/blob/main/LICENSE\"><img src=\"https://img.shields.io/npm/l/@driftime/sanity-plugin-handbook?style=flat-square&labelColor=1a1a1a&color=666666\" alt=\"License: MIT\" /></a>\n  </p>\n</div>\n\n<br />\n\n## Overview\n\nEvery content model comes with knowledge the schema alone can't hold: what a field is for, which values work best, and how the site's content should be written. Handbook gives that knowledge a place in the Studio, so authors find the guidance right beside the content it describes.\n\nMost of it needs no writing at all. Handbook reads the documentation straight from the schema, listing every document type and every field with its description, an example value, and any tips or cautions defined alongside it. When the schema changes, the Handbook changes with it.\n\nThe rest is written by the site's editors. Guides cover house style, editorial process, and anything too long for a field description, arranged into groups in the same sidebar.\n\n<br />\n\n<figure>\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-how-to-use-dark.png\" />\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-how-to-use-light.png\" />\n    <img src=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-how-to-use-light.png\" alt=\"The Handbook tool in Sanity Studio: a sidebar listing introductory pages, document types grouped by role, and the team's own guides, with the How to use the Handbook page open\" />\n  </picture>\n  <p align=\"center\"><sub><em>The Handbook tool, with introductory pages, document types by role, and the team's guides in one sidebar.</em></sub></p>\n</figure>\n\n<br />\n\n## Installation\n\nHandbook is built for Sanity Studio 6.10 and React 19 and declares both as peer dependencies, so the Studio needs to be on those versions already. Node 20.19 or later is required, or 22.12 or later on Node 22.\n\n```bash\nbun add -E @driftime/sanity-plugin-handbook\n```\n\n<br />\n\n## Documentation\n\nIn the Studio, the plugin registers a Handbook tool, takes the document types it documents grouped by the role each plays in the content model, and reads a `handbook` property it adds to field and document definitions.\n\n<br />\n\n### Registering the Plugin\n\nThe plugin needs to know which document types to document and how to group them. Register it with a list of roles, each holding the document definitions that play that part in the content model, and each role becomes a section of the sidebar in the order listed.\n\n```typescript\nimport { defineConfig } from \"sanity\";\nimport { handbookPlugin } from \"@driftime/sanity-plugin-handbook\";\n\nimport { home, navigation, page, settings, templates } from \"@/schemas\";\n\nexport default defineConfig({\n  // ...\n  plugins: [\n    // ...\n    handbookPlugin({\n      roles: [\n        {\n          title: \"Singletons\",\n          description: \"Document types that exist as a single instance.\",\n          documents: [home],\n        },\n        {\n          title: \"Collections\",\n          description: \"Document types with multiple entries.\",\n          documents: [page],\n        },\n        {\n          title: \"Globals\",\n          description: \"Document types shared across the site.\",\n          documents: [navigation, templates, settings],\n        },\n      ],\n    }),\n  ],\n});\n```\n\n| Option                     | Type                              | Default                  | Purpose                                                                                            |\n| -------------------------- | --------------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------- |\n| `title`                    | `string`                          | `\"Handbook\"`             | The tool's name in the Studio navigation. See [Naming the Tool](#naming-the-tool).                 |\n| `sidebarTitle`             | `string`                          | `\"Handbook\"`             | The heading at the top of the sidebar. See [Naming the Tool](#naming-the-tool).                    |\n| `roles`                    | `SanityHandbookDocumentRole[]`    | required                 | The document types to document, grouped by role, in the order listed.                              |\n| `blocks`                   | `SanityHandbookBlockDefinition[]` | none                     | Blocks added to guide bodies. See [Adding Custom Blocks](#adding-custom-blocks).                   |\n| `editors`                  | `string[]`                        | everyone                 | Email addresses of the people who write guides. See [Choosing the Editors](#choosing-the-editors). |\n| `undocumentedFieldMessage` | `string`                          | a prompt to ask the team | Shown for a field with no description. See [Documenting Fields](#documenting-fields).              |\n\nA role takes a `title`, an optional `description` shown on the Document Types overview, and the `documents` that fill it, passed as definitions rather than names. The sidebar opens with a Getting Started section, holding a page on how to use the Handbook and the Document Types overview, followed by a section for each role and then the guides.\n\nThe plugin also registers two document types of its own for the guides, `handbook.handbook` and `handbook.guide`, along with an object type for each block a guide can hold, all under the `handbook.` prefix, and the tool itself is named `handbook`. A structure or a query that lists every registered type sees those types too, and a Studio that already has a tool or a type by one of these names needs to rename it before installing.\n\n<br />\n\n<figure>\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-document-types-dark.png\" />\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-document-types-light.png\" />\n    <img src=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-document-types-light.png\" alt=\"The Document Types overview in the Handbook tool, listing each role with its description and the document types it contains\" />\n  </picture>\n  <p align=\"center\"><sub><em>The Document Types overview, listing each role with its description and the types it holds.</em></sub></p>\n</figure>\n\n<br />\n\n### Documenting Fields\n\nEvery field is documented from what the schema already says. Its title comes from `title`, or from its name in Title Case, and its description from `description`, so an existing schema is a usable handbook from the start. The `handbook` property carries the documentation the editor has no room for. The plugin declares it on Sanity's own field and document definitions, so it is typed and completes like any other property.\n\n```typescript\nimport { defineField, defineType } from \"sanity\";\n\nexport const page = defineType({\n  name: \"page\",\n  type: \"document\",\n  title: \"Pages\",\n  description: \"General-purpose pages.\",\n  handbook: {\n    description:\n      \"Standalone pages for any content that doesn't need a document type of its own. Each page has its own address and is built from blocks rather than following a fixed layout.\",\n  },\n  fields: [\n    defineField({\n      name: \"title\",\n      type: \"string\",\n      description: \"Appears in navigation, browser tabs, and search results.\",\n      handbook: {\n        description:\n          \"What the document is called wherever it's listed: navigation menus, browser tabs, search results, and the Studio's own lists. Every document needs one, and it's also used to generate the slug and as the SEO title when those fields are left empty.\",\n        example: \"About Acme Inc.\",\n        tip: \"Keep it short enough to fit in a navigation menu without wrapping.\",\n      },\n    }),\n    defineField({\n      name: \"slug\",\n      type: \"slug\",\n      description: \"Last part of the page's web address.\",\n      options: { source: \"title\" },\n      handbook: {\n        description:\n          \"The last part of the page's web address. Generate it from the title, then edit it if the result is long or unclear. Shorter slugs are usually better.\",\n        example: \"about-acme-inc\",\n        caution: \"Changing the slug of a published page breaks every link that already points at it.\",\n      },\n    }),\n  ],\n});\n```\n\n| Key           | Type     | Purpose                                                                     |\n| ------------- | -------- | --------------------------------------------------------------------------- |\n| `title`       | `string` | Replaces the field or document title in the Handbook.                       |\n| `description` | `string` | Replaces the description, shown under the heading.                          |\n| `example`     | `string` | An example value, shown in italics below the description.                   |\n| `tip`         | `string` | Guidance for the author, shown as a hint icon that opens on hover or click. |\n| `info`        | `string` | Extra context about how the field is used, shown the same way.              |\n| `caution`     | `string` | A warning about constraints or pitfalls, shown the same way.                |\n\nEvery key is optional, and so is `handbook` itself. On a document, only `title` and `description` are read. Hints appear beside the field name in the order tip, info, caution, and each popover is labeled with its kind.\n\nA field with neither a `description` nor a `handbook.description` shows a message saying it has not been documented yet. Pass `undocumentedFieldMessage` to the plugin to replace that message for every field.\n\n```typescript\nhandbookPlugin({\n  // ...\n  undocumentedFieldMessage: \"Not documented yet. Ask in the content channel.\",\n});\n```\n\n<br />\n\n<figure>\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-fields-dark.png\" />\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-fields-light.png\" />\n    <img src=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-fields-light.png\" alt=\"A document type's fields in the Handbook tool, each with its type, description, an example value in italics, and hint icons\" />\n  </picture>\n  <p align=\"center\"><sub><em>A document type's fields, each with its type, description, example, and hints.</em></sub></p>\n</figure>\n\n<br />\n\n### Nested Fields\n\nAn object or array field has a control below its description that counts its subfields and expands to list them, each documented the way a top-level field is. An array with one member type lists that type's fields, and an array with several lists the members themselves. Sanity's own types, such as `image`, `file`, and `slug`, are not expanded, so a custom type built on one of them shows only the fields added to it. A type that contains itself is listed once, with a note referring back to the first occurrence in place of a second expansion.\n\n<br />\n\n### Naming the Tool\n\nThe tool is called Handbook in the Studio navigation and at the top of its sidebar. The two names are set separately, so a Studio can rename the tool without changing the sidebar heading, or give each its own wording.\n\n```typescript\nhandbookPlugin({\n  // ...\n  title: \"Guide\",\n  sidebarTitle: \"Acme Inc. Guide\",\n});\n```\n\n<br />\n\n## Guides\n\nGuides are documents in the dataset, and the plugin registers everything they need, so no schema setup is involved. A `handbook.guide` document holds one guide, and a `handbook.handbook` singleton arranges the guides into groups and sets their order in the sidebar. The tool fetches both and fetches them again whenever either changes, so a published edit appears without a reload. Because there is only ever one singleton, it is never offered in the create menu and cannot be deleted, duplicated, or unpublished.\n\nA guide has a title, an optional description, and a Portable Text body offering:\n\n- Paragraphs, headings, and blockquotes\n- Bullet and numbered lists\n- Bold, italic, strikethrough, and inline code\n- Links, to `http`, `https`, `mailto`, and `tel` addresses\n- Images with a caption and alternative text\n- Videos with a caption\n- Code blocks with syntax highlighting for CSS, GROQ, HTML, JavaScript, JSON, React, Shell, TypeScript, and plain text\n- Callouts in tip, information, and warning styles\n- Horizontal rules\n\n<br />\n\n<figure>\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-guide-dark.png\" />\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-guide-light.png\" />\n    <img src=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-guide-light.png\" alt=\"A guide open in the Handbook tool, showing a heading, paragraphs, a blockquote, a list, a callout, and an image with a caption\" />\n  </picture>\n  <p align=\"center\"><sub><em>A guide in the tool, with a heading, a blockquote, a list, a callout, and a captioned image.</em></sub></p>\n</figure>\n\n<br />\n\n### Adding Guides to the Structure\n\nGuides are read in the Handbook tool and written in the Structure tool, and they appear in the Structure tool only once its resolver adds them. `handbookStructure` returns the two list items for that, an editor for the singleton and a list of the guides in the order they were created. It reads the current user from the Structure context, and returns an empty array for anyone who is not an editor, so the resolver needs both of its arguments.\n\n```typescript\nimport { handbookStructure } from \"@driftime/sanity-plugin-handbook\";\nimport type { StructureResolver } from \"sanity/structure\";\n\nexport const structure: StructureResolver = (structureBuilder, context) => {\n  const { list, documentTypeListItems, divider } = structureBuilder;\n\n  const handbookItems = handbookStructure(structureBuilder, context);\n\n  return list()\n    .title(\"Content\")\n    .items([\n      ...documentTypeListItems().filter(\n        (item) => ![\"handbook.handbook\", \"handbook.guide\"].includes(item.getId() ?? \"\"),\n      ),\n      ...(handbookItems.length > 0 ? [divider(), ...handbookItems] : []),\n    ]);\n};\n```\n\nThe filter keeps the two Handbook document types out of a list built from every registered type, and the divider is added only when there is something to show below it. A Studio running several workspaces with different editors passes the workspace's own list as a third argument, since the plugin otherwise reads the list from whichever workspace was configured last.\n\n<br />\n\n<figure>\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-groups-dark.png\" />\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-groups-light.png\" />\n    <img src=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-groups-light.png\" alt=\"The Handbook singleton open in the Structure tool, showing three guide groups with reorder handles and the guides referenced in each\" />\n  </picture>\n  <p align=\"center\"><sub><em>The Handbook singleton in the Structure tool, where groups and their order are arranged.</em></sub></p>\n</figure>\n\n<br />\n\n<figure>\n  <picture>\n    <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-editor-dark.png\" />\n    <source media=\"(prefers-color-scheme: light)\" srcset=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-editor-light.png\" />\n    <img src=\"https://raw.githubusercontent.com/driftime/sanity-plugins/HEAD/packages/handbook/assets/handbook-editor-light.png\" alt=\"The Handbook Guides list in the Structure tool beside an open guide, showing its rich text editor and toolbar\" />\n  </picture>\n  <p align=\"center\"><sub><em>The guides list in the Structure tool beside an open guide.</em></sub></p>\n</figure>\n\n<br />\n\n### Choosing the Editors\n\nEveryone in the Studio can read the Handbook, and a smaller group usually writes it. The editors are the people who create guides and arrange them into groups on the singleton, and the plugin takes their email addresses.\n\n```typescript\nhandbookPlugin({\n  // ...\n  editors: [\"editor@acme.com\", \"lead@acme.com\"],\n});\n```\n\nFor an editor, `handbookStructure` returns its items and the create menu offers a new guide. For everyone else, the structure items are empty and both Handbook document types are left out of the create menu. When no list is given, everyone is an editor. The list decides what the Studio shows rather than what the dataset allows, so a project's own roles remain the place where write access is granted or withheld.\n\nThe same answer is available to a Studio's own components through `useIsHandbookEditor`, which checks the current user against the plugin's list, or against a list passed to it for a Studio running several workspaces.\n\n```typescript\nimport { useIsHandbookEditor } from \"@driftime/sanity-plugin-handbook\";\n\nconst isEditor = useIsHandbookEditor();\nconst isAcmeEditor = useIsHandbookEditor([\"editor@acme.com\", \"lead@acme.com\"]);\n```\n\n<br />\n\n### Adding Custom Blocks\n\nA guide body can hold custom blocks alongside the built-in ones. Each needs a schema definition for the editor and a component for the tool to render it with, and the component receives the stored block as `value`.\n\n```tsx\nimport { defineConfig, defineField, defineType } from \"sanity\";\nimport type { PortableTextObject } from \"sanity\";\nimport { handbookPlugin } from \"@driftime/sanity-plugin-handbook\";\n\nconst shortcutType = defineType({\n  name: \"handbook.shortcut\",\n  type: \"object\",\n  title: \"Keyboard Shortcut\",\n  description: \"Key combination shown as it appears on the keyboard.\",\n  fields: [\n    defineField({\n      name: \"keys\",\n      type: \"string\",\n      description: \"Keys to press, separated by plus signs.\",\n    }),\n  ],\n  preview: {\n    select: { title: \"keys\" },\n  },\n});\n\nfunction ShortcutBlock({ value }: { value: PortableTextObject }) {\n  const { keys } = value;\n\n  return <kbd>{typeof keys === \"string\" && keys}</kbd>;\n}\n\nexport default defineConfig({\n  // ...\n  plugins: [\n    // ...\n    handbookPlugin({\n      // ...\n      blocks: [{ schema: shortcutType, component: ShortcutBlock }],\n    }),\n  ],\n});\n```\n\nThe plugin registers the block's schema type itself, so it is not added to the Studio's own `schema.types` as well.\n\n<br />\n\n### Querying\n\nGuides are written and read inside the Studio, and the tool fetches everything it shows, so a site needs no query for the Handbook at all. A site that does want to publish the guides queries the singleton, follows its references, and resolves each image and video block's asset to a URL, which is the shape the exported types describe.\n\n```groq\n*[_type == \"handbook.handbook\"][0] {\n  ...,\n  groups[] {\n    ...,\n    guides[] {\n      ...,\n      ...@-> {\n        ...,\n        content[] {\n          ...,\n          _type == \"handbook.image\" => { ..., \"asset\": { \"url\": asset.asset->url } },\n          _type == \"handbook.video\" => { ..., \"asset\": { \"url\": asset.asset->url } }\n        }\n      }\n    }\n  }\n}\n```\n\n<br />\n\n## Reference\n\nThe rest of this document covers the shape of the stored guides and everything the package exports. Everything is imported from `@driftime/sanity-plugin-handbook`.\n\n<br />\n\n### Stored Guides\n\n`SanityHandbook` is the type of the singleton, and `SanityHandbookGuide` the type of a guide once its reference has been followed.\n\n```typescript\nimport type { SanityHandbookGuide } from \"@driftime/sanity-plugin-handbook\";\n\ninterface GuidePageProps {\n  guide: SanityHandbookGuide;\n}\n```\n\n```json\n{\n  \"_type\": \"handbook.handbook\",\n  \"groups\": [\n    {\n      \"_key\": \"a1b2\",\n      \"title\": \"Content Guidelines\",\n      \"guides\": [{ \"_key\": \"c3d4\", \"_type\": \"handbook.guide\", \"title\": \"Writing for the Web\", \"content\": [] }]\n    }\n  ]\n}\n```\n\n| Field         | Type                         | Document            | Purpose                                                              |\n| ------------- | ---------------------------- | ------------------- | -------------------------------------------------------------------- |\n| `_type`       | `string`                     | both                | `handbook.handbook` for the singleton, `handbook.guide` for a guide. |\n| `groups`      | `SanityHandbookGuideGroup[]` | `handbook.handbook` | The groups in sidebar order, each with a `title` and its `guides`.   |\n| `title`       | `string`                     | `handbook.guide`    | The guide's title, shown in the sidebar and as its heading.          |\n| `description` | `string`                     | `handbook.guide`    | An optional introduction shown below the heading.                    |\n| `content`     | `PortableTextBlock[]`        | `handbook.guide`    | The body, holding text blocks and the blocks below.                  |\n\nThe blocks a body can hold each have a type of their own, and the link annotation is stored in a text block's `markDefs`. A horizontal rule, `handbook.horizontalRule`, carries no fields.\n\n| Field      | Type                           | Block              | Purpose                                                                      |\n| ---------- | ------------------------------ | ------------------ | ---------------------------------------------------------------------------- |\n| `asset`    | `{ url?: string }`             | `handbook.image`   | The image, once the query resolves its reference to a URL.                   |\n| `caption`  | `string`                       | `handbook.image`   | An optional caption shown below the image.                                   |\n| `alt`      | `string`                       | `handbook.image`   | Optional alternative text for the image.                                     |\n| `asset`    | `{ url?: string }`             | `handbook.video`   | The video, once the query resolves its reference to a URL.                   |\n| `caption`  | `string`                       | `handbook.video`   | An optional caption shown below the video.                                   |\n| `code`     | `string`                       | `handbook.code`    | The source code.                                                             |\n| `language` | `string`                       | `handbook.code`    | The language it is highlighted as.                                           |\n| `variant`  | `SanityHandbookCalloutVariant` | `handbook.callout` | `tip`, `info`, or `warning`.                                                 |\n| `body`     | `PortableTextBlock[]`          | `handbook.callout` | The callout's text, with inline formatting and links but no lists or blocks. |\n| `href`     | `string`                       | `link`             | The address a run of text links to.                                          |\n\n<br />\n\n### API\n\n| Export                                                   | Purpose                                                        |\n| -------------------------------------------------------- | -------------------------------------------------------------- |\n| `handbookPlugin(config)`                                 | Registers the tool, its document types, and its blocks.        |\n| `handbookStructure(structureBuilder, context, editors?)` | Returns Structure items for the singleton and the guides list. |\n| `useIsHandbookEditor(editors?)`                          | Whether the current user can edit guides.                      |\n\n<br />\n\n### Types\n\n| Type                            | Purpose                                                         |\n| ------------------------------- | --------------------------------------------------------------- |\n| `SanityHandbookConfig`          | Everything `handbookPlugin` accepts.                            |\n| `SanityHandbookMetadata`        | The `handbook` property on field and document definitions.      |\n| `SanityHandbookDocumentRole`    | A role, with its title, description, and document definitions.  |\n| `SanityHandbookBlockDefinition` | A custom block, as a schema definition paired with a component. |\n| `SanityHandbook`                | The singleton document.                                         |\n| `SanityHandbookGuideGroup`      | A group in the singleton, with its ordered guides.              |\n| `SanityHandbookGuide`           | A guide document, with its title, description, and body.        |\n| `SanityHandbookImage`           | An image block.                                                 |\n| `SanityHandbookVideo`           | A video block.                                                  |\n| `SanityHandbookCode`            | A code block.                                                   |\n| `SanityHandbookCallout`         | A callout block.                                                |\n| `SanityHandbookCalloutVariant`  | `\"tip\"`, `\"info\"`, or `\"warning\"`.                              |\n| `SanityHandbookHorizontalRule`  | A horizontal rule block.                                        |\n| `SanityHandbookLink`            | The link annotation.                                            |\n\n<br />\n\n## License\n\nMIT © [Driftime®](https://driftime.com). See [LICENSE](https://github.com/driftime/sanity-plugins/blob/main/LICENSE).\n\n<br />\n\n## Acknowledgements\n\nIcons for the Studio's own controls come from `@sanity/icons`, so they match the rest of the Studio. The plugin's own icons are based on [Lucide](https://lucide.dev), distributed under the [ISC License](https://github.com/lucide-icons/lucide/blob/main/LICENSE).\n\n<br />\n<br />\n\n<div align=\"center\">\n  <p><strong>Built alongside <a href=\"https://cairn.driftime.com\">Cairn</a>, a starting point for responsible web experiences.</strong></p>\n  <p>Part of a suite of Sanity Studio plugins by Driftime®</p>\n  <p><a href=\"https://github.com/driftime/sanity-plugins#readme\">Sanity Plugins</a> · <a href=\"https://github.com/driftime/sanity-plugins/tree/main/packages/handbook#readme\">Handbook</a> · <a href=\"https://github.com/driftime/sanity-plugins/tree/main/packages/icon#readme\">Icon</a> · <a href=\"https://github.com/driftime/sanity-plugins/tree/main/packages/color#readme\">Color</a> · <a href=\"https://github.com/driftime/sanity-plugins/tree/main/packages/link#readme\">Link</a></p>\n</div>\n\n<br />\n\n<div align=\"center\">\n  <a href=\"https://driftime.com\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://driftime.com/driftime-github-logo-dark.svg\" />\n      <source media=\"(prefers-color-scheme: light)\" srcset=\"https://driftime.com/driftime-github-logo.svg\" />\n      <img src=\"https://driftime.com/driftime-github-logo.svg\" alt=\"Driftime® Logo\" width=\"100\" />\n    </picture>\n  </a>\n</div>\n","readmeFilename":"README.md"}