{"_id":"@0m0g1/griot","_rev":"20-24c62f740e321a4d757d605e51880892","name":"@0m0g1/griot","dist-tags":{"latest":"0.1.21"},"versions":{"0.1.0":{"name":"@0m0g1/griot","version":"0.1.0","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.0","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"9f99746fd67d5ac5e9fda6a709e877d9889d96dc","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.0.tgz","fileCount":13,"integrity":"sha512-puSSK6WWJVCEkHRqslFIKg/i9V8MlYlBwzaZ7YBk1CpWcSIsC7HjsRreFwJEMjuNR+00BWGCnapd/+KmrML6qg==","signatures":[{"sig":"MEYCIQChPaFv+oD4N/EsRfDfvxP7JPUjEHksP45nEq3GMH+inQIhAKvFJI3DDXlTqOsEyYa/6LkU1ule/AemBmITD/WAD46+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63196},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.8.0","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.0_1773199459572_0.3770957969697575","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@0m0g1/griot","version":"0.1.1","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.1","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"b6327f42a5fc418ec3b75ba5022d669b745bba8a","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.1.tgz","fileCount":13,"integrity":"sha512-OMa+zya9lG5bG/3JbDprC6kSSxlHPd5pte6KxcuKm0PQAr0y47o2LvIlQQnDjDqCLXwSV3WsQDL/ErLGrqCvGQ==","signatures":[{"sig":"MEUCIQClzVV9tlYAW/oN9shPQBcCc/YrVU5Bv8dM2Itj2D45HgIgfqZT6qpCQ6RCSwb8aSHrdXC+Y/XuhQvUoYM1Wjjwiw0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63242},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.8.0","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.1_1773200611923_0.49530095493853765","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@0m0g1/griot","version":"0.1.2","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.2","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"1d509eb1cbf01d65e631b0b921e228f0be525061","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.2.tgz","fileCount":14,"integrity":"sha512-yQ/rKLUuyASfUURT7Gvn7oY8mwW2SNvSzieE/EliG+tLqFpFeDMhF13L9cAq0wo/tlRMguCzo5nC9hqm5A7OFg==","signatures":[{"sig":"MEQCIB5FcCHcN/+4/IvIL8bgQdFYvC84IIBO0K5Uq/mrIC07AiA+RfZakP30EbrATYTxKrUguR4/rMwlckRL0b6fjLcZEA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":76133},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.8.0","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.2_1773200783369_0.15186162144503856","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@0m0g1/griot","version":"0.1.3","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.3","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"0c183487da3526dfdaa8c47f8e635f00765b0e8a","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.3.tgz","fileCount":15,"integrity":"sha512-+AZz4JsbGeVvftMiIjdyddanpthu/0YQWZmjUrYMsg2yBcLHEhklhXts/SWwkJrXkb4mhqS5l0+Zs/oQGADOQQ==","signatures":[{"sig":"MEUCIQCLUAVTIH4SRDRXxA5pO693P0aRVU8wSQi2Q7Po4FpllAIgDhrYS6HnPSK3ovtzMAs5R5a7K/IXBh1bSyGRjaQDA7E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94768},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"gitHead":"85a40daaa66cf27267cf21a706c51933544d6a77","_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.8.0","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.3_1773234223765_0.1898427696679399","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@0m0g1/griot","version":"0.1.4","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.4","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"66423d03d453cdf46f5a46474246f4d90fda269f","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.4.tgz","fileCount":16,"integrity":"sha512-tLnWPf+V22uGNU+WbRG/avvBx0qZ/7CyBTW2CKLU0+6jlmDnprbuT3SfBcxmrHladIbDDNDdeN62q5a3wTa8Xw==","signatures":[{"sig":"MEUCIH3Ut/5TGOZcMJr198mXrIxYXE3QAPX9z5N0VsWG+np5AiEA02lbPtnCWme/0IQoYwMPNfy6dEDyXnMHgYp98d8NDio=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118384},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"gitHead":"b0f77ff9a75589017500e8c4e761c34c859e1d7c","_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.8.0","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.4_1773415043595_0.43216435878442416","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@0m0g1/griot","version":"0.1.5","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.5","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"8fb77044b2b0a6e97243df4d83cef236dbe2a1b8","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.5.tgz","fileCount":18,"integrity":"sha512-4y8F1Z5lO1468vDsRTe0ze3zMWfiDNtRcX/fzAaQqNk7lFzbB8VLWHF0FhriGMZOtZQXY7Ou1u+MVK9r6yPcZA==","signatures":[{"sig":"MEUCIQDNQi9o++PJSZAzqxV/Hw2FcRHK8+TXDO4JWRoyNnO28AIgAgK/jGXlDHAWpcIpuCgLDagihoJTuhBhT3QHE7jQREU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150837},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"gitHead":"1392832595b67b912e4b517e48de41bfeaa972a8","_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.8.0","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.5_1773419503247_0.3617909720686667","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@0m0g1/griot","version":"0.1.6","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.6","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"b60167f30a1a1e0a0b4b17c76b532e6eaf067943","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.6.tgz","fileCount":18,"integrity":"sha512-DYWmGX1Me6elGQ89rhW6Gp3CNh4a1WEnUyH/SrFx6aw7x3bqg8Hg71jm6ZCZLvhwWpcgVtj4+7bMFK/6pfZ22A==","signatures":[{"sig":"MEQCIB44E6fzs8/dt0U1omf+6iWZ3zSw2sgVHLsMCVrSx96eAiAMb6/UDGcg0wd+Sr1nAym6ZEC8mqODzlSvMndO9dvpTQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150845},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"gitHead":"bfb78d5c3cc210f3e034ce6bb98f9304d4870c0c","_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.8.0","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.6_1773419609312_0.983815109647687","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@0m0g1/griot","version":"0.1.7","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.7","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"2c2574f51cd8b51e545475dae6cc14f7986f5fc3","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.7.tgz","fileCount":18,"integrity":"sha512-1huvTYNV4JFGOkPMdCPvWqBiwOffKCLMKDRa441HBK7ZeBBpe2YglYzZhSi1npH5Ko7T4boTqf0RdpY2UQQYrw==","signatures":[{"sig":"MEYCIQCISvqOLmzxRGBSBla/qbAcNsZ3pH6g5wAq8rP1pGQ9cwIhAOg/6hosH9qIoj4vW7kZQTYM3kmzbSWIsg1rzgK0GSaB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150837},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"gitHead":"690d6b1b2f9fad6af603e3381b64537e93905165","_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.8.0","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.7_1773419664098_0.5695140370951455","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@0m0g1/griot","version":"0.1.8","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.8","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"e39bdedd35c2b6bdb4213ae33773c507c5bf4713","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.8.tgz","fileCount":19,"integrity":"sha512-ahnpcC8kTihDqtrAus6+g+fIzsEh2lrqL/xxOKYWXosZx3SiHJHTS5Xe+47cpCsy+B5N1fTfe5FRm+AXqf8E1A==","signatures":[{"sig":"MEUCIQCBUUeMzDbz4erweCpUzYD7xW5wWNKgwiU9ojD1RtwQ3gIgAnj7zk2hnybGGtRT293CRiL8Vi5+2mjA2AxgrOub/dQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":166513},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"gitHead":"c2ae532a5749fd1130c0b5dca4895bfb75da632c","_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.8.0","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.8_1773420440091_0.921286633375413","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@0m0g1/griot","version":"0.1.9","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.9","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"d94a4a057f54a9be04b32ca3cb662bf65776f0de","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.9.tgz","fileCount":19,"integrity":"sha512-XPMhEKuqsJxaO3+chCq2373HYXry52AFG0lhcF462GtyaeEgoAqpIDed2mwPza7NS859A1CBHbf1gbxvvPX1mA==","signatures":[{"sig":"MEYCIQDkTFEdC8ey3Ktu3y8UgtJ8Dgtaqfa1AsTvVKt8tBOgQQIhALs0tlXr31Sku2yqiSkKHAgNh0Du5jVLlj8zBlfgQzMH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":166513},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"gitHead":"f3c5c17ea06f0993e1aedfe5f677d597f5ecb07e","_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.8.0","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.9_1773420566983_0.3175709876292614","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@0m0g1/griot","version":"0.1.10","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.10","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"549634c1a3980751b03ae51eb7ccdb6dbb528864","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.10.tgz","fileCount":19,"integrity":"sha512-xB8XJrDH4KPj9QRjUJSat1iHtMmBsELjWWTd9lHyoU/rnD0hBEZyNqSB80rTqicFJLIkx6xFI8hQpcR2o51H7A==","signatures":[{"sig":"MEUCIQDIT82jUSI51I0elIbzrD7AUb4ryUkngtDUKEFKCUXKUQIgC6GfWIG0bAsuRfCDbqNyOP6b8bNWfwZ+rBnJPM7lVLo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":196880},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"gitHead":"6df39567f7915835bc810c2dc6299d8ef38b5f25","_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.8.0","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.10_1773434655128_0.8046363769545137","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@0m0g1/griot","version":"0.1.11","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.11","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"d80458e67626b5b1b16b9c4c988d3f8392199d95","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.11.tgz","fileCount":19,"integrity":"sha512-y4FNGB5vY9eEygCNXRlT2CfmTsVw+vRQPgZfQazrR+/Il/hmS2P8QKx6D68l15WvzEdJP7d25X7m7YT9Hw6Hbw==","signatures":[{"sig":"MEUCIQCfp87MXU29WDZ2gFyDrYyZVkofl7rlLpnl334woukzOAIgZQXAfirJ3vc2OkXaG9BQIpKK8Uye0QfhJpaQOJYEMN0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":197159},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"gitHead":"3bcdf0565936d1f9b9a86d4573803bf4eca39409","_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.8.0","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.11_1773948283056_0.5162920441925687","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"@0m0g1/griot","version":"0.1.12","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.12","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"13883ec43c28e6ecc1feabff84325b48c2d8710d","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.12.tgz","fileCount":19,"integrity":"sha512-NgEaA6zzWU2nGQ90IagOpbCvgI50GPbFGFzhvNF5ZkmbwmJN/PKYDcQv58zcfFI4Gniy+puLuI5enkctYZV2pw==","signatures":[{"sig":"MEMCIHvjNQmRlo7KtUElSm0iGEevDHIGUUTUHssYNUyOkYlRAh9B7BBdVGycKpTEq6rgeTd/3v2TddPsc1cD7bY7ZKVK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":196880},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"gitHead":"2c48b51e08ca5c0e16ed935a4c6a82bbc5c5bd31","_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.8.0","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.12_1773948457143_0.5393077146587129","host":"s3://npm-registry-packages-npm-production"}},"0.1.13":{"name":"@0m0g1/griot","version":"0.1.13","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.13","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"21622ab1cbd795257fc5a7dd43980d6e1b8d600b","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.13.tgz","fileCount":19,"integrity":"sha512-i75SXn0L9mvaccWY+US8XXw6ZcuFUaETQYkYLmYrxgchyB20Il4qjHGCk76FG2sS0r39KxJAEFM0JmbFVFRwCg==","signatures":[{"sig":"MEUCIHNQUYvmwqXi3mwgFak5bvjlPuvJQU+VnPEzS0JzuJOCAiEAvAoI4njuesZtSSPFRd+hpXcsUo2zaA7mwk3jvX/8qVE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":197393},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"gitHead":"2af931ae084b691ca527b6e9b0a7003378b3450e","_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.8.0","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.13_1773949087932_0.4488159514292094","host":"s3://npm-registry-packages-npm-production"}},"0.1.14":{"name":"@0m0g1/griot","version":"0.1.14","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.14","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"0dda1d900bb878104ccb6ec6ab0fe822d252d5ce","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.14.tgz","fileCount":19,"integrity":"sha512-Ek7Yr44bliSgN3fu6W8hJ4pNz8rXI+hhqBdZaTpimqXbNITyFa6LKXt7x49h0ZnpxhVDQGjex+V4sO5h7uNNkg==","signatures":[{"sig":"MEQCID7YCXelC0vYk0qAt6zD2zXDpzedno4Qdkn+e5ivpLYxAiAEfJff+f8RXkfi1C4YCtg6pjNiJLRgu1nK2c2Y9rtIaw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":197841},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"gitHead":"e17ddc53f6c7508db6e189878bb63085eec78e39","_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.8.0","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.14_1773950014053_0.5016497127276593","host":"s3://npm-registry-packages-npm-production"}},"0.1.15":{"name":"@0m0g1/griot","version":"0.1.15","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.15","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"4fcf661851328411e5fff56a62e3d3aea7c9e6ae","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.15.tgz","fileCount":19,"integrity":"sha512-v0kZ6rl7Y+cYN0WoT/hPc51K3eX4DZn3N6BTaUIYdncdqoJM6G08e7+R0nWKVgxEbkZdiX9tp7oHohH/emQGrg==","signatures":[{"sig":"MEUCIQCYZeWRCdvJFAuJvIKSqkw0v1l9c6R6odLXEVQyaJXtwgIgBnkqdL0j9ZyFlTYwfaBWixM37CnPvehP+/xheTh6dOc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":198998},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"gitHead":"b70aaa31db9f33ec26760822aa891a83096abdd4","_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.12.1","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.15_1775316310322_0.2508158835648664","host":"s3://npm-registry-packages-npm-production"}},"0.1.16":{"name":"@0m0g1/griot","version":"0.1.16","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.16","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"290d4f21792780f801138b95eadc09f1245d93dd","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.16.tgz","fileCount":19,"integrity":"sha512-pSH4tsiNwZxSRZ9zCU2PfcYcWpmmY7x6w1ZvhNy23zoUknNcRv5pKJSMf6gcAoe1/WG+nyDDWP1EcKwFRG9/gA==","signatures":[{"sig":"MEUCIH47wjdfKouvom83bpOLkuon+Fmj43mMjFs8tlzjgFXdAiEA5DhE/H0U13HZijD7UesyCpEfHs3iKzr5NXunJ8bFvqI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":219244},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"gitHead":"d225b2e76320af2a8435f44af8c1014bd7d4a06b","_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.12.1","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.16_1778414151887_0.6344276221923761","host":"s3://npm-registry-packages-npm-production"}},"0.1.19":{"name":"@0m0g1/griot","version":"0.1.19","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.19","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"e0d7efca3c0a3e7ca09c18e8e85d02b56e42e81e","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.19.tgz","fileCount":19,"integrity":"sha512-hnZRGeiXg5F8S0gmKV5eTOJwnwgRTj1vQMXn9bQdkyFzs3gwSGRXrqcgvZvYfVb2hGG1LPdYcV/EikhnJ7tIkg==","signatures":[{"sig":"MEUCIQDpAXUkTDHrxxqWQbFKAUlcPCcxIlMIZQZYQIGpnZ3S5gIgNiUpB7pALJEvw12aGWOk6NN8O8CiQqfWvuzv6MOqFt8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":213838},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"gitHead":"100477e436878a28016cbc66caf0018d46075a91","_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.12.1","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.19_1778419240869_0.6346521368638436","host":"s3://npm-registry-packages-npm-production"}},"0.1.20":{"name":"@0m0g1/griot","version":"0.1.20","keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","_id":"@0m0g1/griot@0.1.20","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"dist":{"shasum":"d6109f6b28e44510257b64c46cc8fefd81ce673e","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.20.tgz","fileCount":19,"integrity":"sha512-WAOECq7xk4jlIUnqo0faCCzcS+5OS/BZMdJG/H2G6DFfXvJOgHOfdG7m4VzR7D04iA7JnZozMVpLndQUyR4fGQ==","signatures":[{"sig":"MEYCIQDJakwecN1qYqOYQiGmn/PQdvDrtivyzFX7nP7mOAajsgIhAOX/9+rsWxAydI2xKXZSsNnMIc4j9LiqawwsV60FcZLe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":214607},"main":"./src/Griot.js","type":"module","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"gitHead":"ed8d8b6e004f72dafbfc22563f3f266b86dcab5c","_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"_npmVersion":"11.12.1","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","directories":{},"_nodeVersion":"25.5.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/griot_0.1.20_1778520089770_0.6633814831306684","host":"s3://npm-registry-packages-npm-production"}},"0.1.21":{"name":"@0m0g1/griot","version":"0.1.21","description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","type":"module","main":"./src/Griot.js","module":"./src/Griot.js","exports":{".":"./src/Griot.js","./css":"./src/griot.css"},"keywords":["rich-text","editor","blocks","history","document"],"license":"MIT","gitHead":"96b424aac7bc4e27b171815b6b91492822938515","_id":"@0m0g1/griot@0.1.21","_nodeVersion":"25.5.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-fVmvMqIk5lERVemcKrfI3bdJtHOpmRM4+AAryIpNwddPiUcHsdpyoV98cOOSllOYlpwhdF02Rf9HScaOmpSkuw==","shasum":"a8c77c8d944e85bfa309fdbba0ad6dc13ccda9cd","tarball":"https://registry.npmjs.org/@0m0g1/griot/-/griot-0.1.21.tgz","fileCount":19,"unpackedSize":214746,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCo29xD+279x8jNM2OPMBtkS4TVRa8XOUAKb5jFVZFgAgIhAIriHq2TZXxc0ULvP7ldxnjgFQtDmCPOkfXyNtv68rRJ"}]},"_npmUser":{"name":"0m0g1","email":"omogidavis@gmail.com"},"directories":{},"maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/griot_0.1.21_1778531188342_0.34247861970740234"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-11T03:24:19.448Z","modified":"2026-05-11T20:26:28.616Z","0.1.0":"2026-03-11T03:24:19.708Z","0.1.1":"2026-03-11T03:43:32.069Z","0.1.2":"2026-03-11T03:46:23.529Z","0.1.3":"2026-03-11T13:03:43.912Z","0.1.4":"2026-03-13T15:17:23.820Z","0.1.5":"2026-03-13T16:31:43.390Z","0.1.6":"2026-03-13T16:33:29.454Z","0.1.7":"2026-03-13T16:34:24.305Z","0.1.8":"2026-03-13T16:47:20.277Z","0.1.9":"2026-03-13T16:49:27.147Z","0.1.10":"2026-03-13T20:44:15.277Z","0.1.11":"2026-03-19T19:24:43.195Z","0.1.12":"2026-03-19T19:27:37.297Z","0.1.13":"2026-03-19T19:38:08.102Z","0.1.14":"2026-03-19T19:53:34.203Z","0.1.15":"2026-04-04T15:25:10.481Z","0.1.16":"2026-05-10T11:55:52.058Z","0.1.19":"2026-05-10T13:20:41.042Z","0.1.20":"2026-05-11T17:21:29.926Z","0.1.21":"2026-05-11T20:26:28.486Z"},"license":"MIT","keywords":["rich-text","editor","blocks","history","document"],"description":"A self-contained block-based rich text editor and renderer built for historical document authoring.","maintainers":[{"name":"0m0g1","email":"omogidavis@gmail.com"}],"readme":"# Griot\n\nA lightweight, extensible block editor and viewer for the web. Inspired by Notion, built with plain JavaScript and zero dependencies. Griot ships a complete dark-themed CSS file, an immutable document model, and a fully keyboard-driven editing experience.\n\n---\n\n## Features\n\n- **19 block types** across four categories: text, media, embed, and structure\n- **Inline markup** — 12 token types parsed by a standalone lexer\n- **Markdown shortcuts** — type `# `, `> `, `- `, ` ``` ` etc. to convert a block on the fly\n- **Floating format toolbar** — appears on text selection; wraps with bold, italic, underline, strikethrough, inline code, highlight, link, or color\n- **Slash command palette** — type `/` in any empty block; searchable, keyboard-navigable, grouped by category\n- **Undo / redo** — linear history stack, up to 200 snapshots\n- **Live inline preview** — rendered below every text block that supports inline syntax\n- **Read-only viewer** — same document, no editing controls; supports highlight + scroll-to-block\n- **Immutable document operations** — every mutation returns a new document object\n- **Schema-driven** — all block types live in `BlockSchema.js`; easy to extend\n- **Default CSS** — ships with `griot.css`; dark theme with CSS variables scoped to `.griot-editor` / `.griot-viewer`\n- **Zero dependencies** — pure ES modules, no framework, no bundler required\n\n---\n\n## Installation\n\n```bash\nnpm install griot\n```\n\nOr via ES module directly:\n\n```html\n<script type=\"module\">\n  import { Editor, Viewer } from './path/to/griot.js';\n</script>\n```\n\n---\n\n## Styling\n\nGriot ships a complete default stylesheet (`griot.css`). Import it once:\n\n```html\n<link rel=\"stylesheet\" href=\"node_modules/griot/griot.css\">\n```\n\nAll styles are scoped to `.griot-editor` and `.griot-viewer`. Every value is a CSS variable — override any of them to theme Griot to your app:\n\n```css\n:root {\n  --griot-bg:            #060918;\n  --griot-surface:       rgba(255,255,255,0.03);\n  --griot-surface-hover: rgba(255,255,255,0.055);\n  --griot-border:        rgba(255,255,255,0.07);\n  --griot-border-focus:  rgba(99,102,241,0.5);\n  --griot-accent:        #6366f1;\n  --griot-accent-soft:   rgba(99,102,241,0.12);\n  --griot-accent-text:   #a5b4fc;\n  --griot-text:          #e2e8f0;\n  --griot-text-muted:    #64748b;\n  --griot-text-faint:    #334155;\n  --griot-code-bg:       rgba(0,0,0,0.45);\n  --griot-code-color:    #a5f3fc;\n  --griot-font-body:     system-ui, -apple-system, sans-serif;\n  --griot-font-mono:     'Fira Code', 'Cascadia Code', monospace;\n  --griot-font-serif:    'Georgia', 'Times New Roman', serif;\n  --griot-radius:        8px;\n}\n```\n\n---\n\n## Quick Start\n\n### Editor\n\n```html\n<link rel=\"stylesheet\" href=\"griot.css\">\n<div id=\"editor\"></div>\n\n<script type=\"module\">\n  import { Editor, createDocument } from 'griot';\n\n  const editor = new Editor(document.getElementById('editor'), {\n    doc: createDocument([\n      { id: 'b1', type: 'heading', text: 'Hello World', meta: { level: 1 } },\n      { id: 'b2', type: 'paragraph', text: 'Start writing…' },\n    ]),\n    books: [],\n    onChange:             (doc)         => console.log('changed', doc),\n    onEventClick:         (eventId)     => console.log('event', eventId),\n    onCiteClick:          (blockId)     => console.log('cite', blockId),\n    onRequestBookPicker:  (blockId, cb) => cb({ bookId: 'b1', unitId: 'u1', quote: '', note: '' }),\n  });\n</script>\n```\n\n### Viewer\n\n```html\n<div id=\"viewer\"></div>\n\n<script type=\"module\">\n  import { Viewer } from 'griot';\n\n  const viewer = new Viewer(document.getElementById('viewer'), {\n    doc:              myDocument,\n    books:            myBooks,\n    onEventClick:     (eventId) => { /* … */ },\n    onCiteClick:      (blockId) => { /* … */ },\n    highlightBlockId: 'b2',\n  });\n\n  viewer.setHighlight('b1');   // scroll to + 2.2s pulse-highlight\n</script>\n```\n\n---\n\n## Block Types\n\nAll 19 block types are defined in `BlockSchema.js`.\n\n### Text (10 types)\n\n| Type | Slash label | Notes |\n|---|---|---|\n| `paragraph` | Text | Supports full inline markup; live preview strip below input |\n| `heading` | Heading | Levels 1–6; level picker in editor toolbar |\n| `blockquote` | Quote | Supports inline markup |\n| `callout` | Callout | 💡 Customisable icon |\n| `callout_warning` | Warning | ⚠️ |\n| `callout_tip` | Tip | ✅ |\n| `callout_danger` | Danger | 🚨 |\n| `code` | Code block | Language input in toolbar; `pre` white-space; monospace |\n| `list_ul` | Bullet list | One item per line; Enter inserts newline |\n| `list_ol` | Numbered list | One item per line; Enter inserts newline |\n\n### Media (4 types)\n\n| Type | Slash label | Notes |\n|---|---|---|\n| `image` | Image | `src`, `alt`, `caption`, `width` (`full` etc.) |\n| `video` | Video | Auto-embeds YouTube (incl. Shorts) and Vimeo; falls back to native `<video>` |\n| `audio` | Audio | Auto-embeds Spotify (track/album/playlist/episode) and SoundCloud; falls back to native `<audio>` |\n| `gallery` | Gallery | Multiple items; layout: `grid`, `masonry`, `carousel`, or `strip` |\n\n### Embed (1 type)\n\n| Type | Slash label | Notes |\n|---|---|---|\n| `embed` | Embed / iframe | Generic `<iframe>` with configurable `height` and optional `caption` |\n\n### Structure (4 types)\n\n| Type | Slash label | Notes |\n|---|---|---|\n| `table` | Table | Full WYSIWYG editor with add/remove rows and columns; inline markup in cells |\n| `divider` | Divider | `<hr>` |\n| `timeline_ref` | Timeline event | `eventId`, `eventTitle`, `note`; clickable in viewer → `onEventClick` |\n| `book_citation` | Book citation | `bookId`, `unitId`, `quote`, `note`; triggers `onRequestBookPicker` |\n\n---\n\n## Inline Markup\n\nThe inline parser (`InlineLexer.js`) is fully independent and can be used standalone. Twelve token types are supported, evaluated in priority order:\n\n| Syntax | Token | Renders as |\n|---|---|---|\n| `**bold**` | `BOLD` | `<strong>` |\n| `*italic*` | `ITALIC` | `<em>` |\n| `__underline__` | `UNDERLINE` | `<u>` |\n| `~~strikethrough~~` | `STRIKE` | `<s>` |\n| `` `code` `` | `CODE` | `<code class=\"griot-inline-code\">` |\n| `==highlight==` | `HIGHLIGHT` | `<mark class=\"griot-highlight\">` |\n| `{#f00:red}` or `{tomato:text}` | `COLOR_MARK` | `<span style=\"color:…\">` |\n| `[label](url)` | `LINK` | `<a class=\"griot-link\" target=\"_blank\">` |\n| `![alt](url)` | `IMAGE` | `<img class=\"griot-inline-img\">` |\n| `[[event:id\\|label]]` | `EVENT_REF` | Clickable chip → `onEventClick` |\n| `[[cite:id\\|label]]` | `CITE_REF` | Clickable chip → `onCiteClick` |\n\n---\n\n## Markdown Block Shortcuts\n\nTyping these at the **start** of a block converts it instantly:\n\n| Pattern | Converts to |\n|---|---|\n| `# ` | Heading H1 |\n| `## ` through `###### ` | Heading H2–H6 |\n| `> ` | Blockquote |\n| `- ` or `* ` | Bullet list |\n| `1. ` | Numbered list |\n| `--- ` | Divider (text cleared) |\n| ` ``` ` or ` ``` ` + space | Code block |\n\n---\n\n## Editor Keyboard Shortcuts\n\n| Key | Action |\n|---|---|\n| `Enter` | Split block at cursor (newline in list blocks) |\n| `Backspace` at offset 0 | Merge block with previous; cursor placed at merge point |\n| `Delete` at end | Merge next block into current |\n| `↑` on first visual line | Move focus to previous block |\n| `↓` on last visual line | Move focus to next block |\n| `Ctrl/Cmd+Z` | Undo |\n| `Ctrl/Cmd+Y` or `Ctrl/Cmd+Shift+Z` | Redo |\n| `Ctrl/Cmd+B` | Wrap selection in `**…**` |\n| `Ctrl/Cmd+I` | Wrap selection in `*…*` |\n| `Ctrl/Cmd+U` | Wrap selection in `__…__` |\n\n---\n\n## Concepts\n\n### Document\n\n```typescript\ninterface Document {\n  id: string;\n  blocks: Block[];\n}\n```\n\n### Block\n\n```typescript\ninterface Block {\n  id: string;\n  type: string;\n  text: string | null;   // only present when hasText: true in schema\n  meta: Record<string, any>;\n}\n```\n\n---\n\n## API Reference\n\n### Core\n\n| Export | Description |\n|---|---|\n| `createBlock(type, overrides?)` | New block with unique id |\n| `cloneBlock(block, newId?)` | Deep clone; `newId` defaults to `true` |\n| `isTextBlock(block)` | `true` if block has a text field |\n| `isValidBlock(block)` | Minimal structural check |\n| `anchorId(blockId)` | DOM `id` string for a block element |\n| `scrollToBlock(blockId, behavior?)` | `scrollIntoView` wrapper |\n| `TEXT_TYPES` | `Set<string>` of types that carry a text field |\n| `ALL_TYPES` | `string[]` of all known types |\n\n### Document Operations\n\nAll functions are immutable — they return a new document object.\n\n| Export | Description |\n|---|---|\n| `createDocument(blocks?)` | New document; falls back to a single empty paragraph |\n| `toJSON(doc)` / `fromJSON(json)` | Serialize / deserialize |\n| `getBlock(doc, id)` | Find a block by id |\n| `getBlockIndex(doc, id)` | Index of a block |\n| `getBlockBefore(doc, id)` / `getBlockAfter(doc, id)` | Adjacent blocks |\n| `updateBlock(doc, id, patch)` | Patch `text`, `type`, and/or `meta` (meta is shallow-merged) |\n| `insertBlockAfter(doc, afterId, block)` | Insert a block |\n| `insertBlockBefore(doc, beforeId, block)` | Insert a block |\n| `removeBlock(doc, id)` | Delete a block |\n| `moveBlock(doc, fromIdx, toIdx)` | Reorder blocks |\n| `splitBlock(doc, blockId, offset)` | Split at cursor offset; headings become paragraphs. Returns `[newDoc, newBlockId]` |\n| `mergeBlockWithPrev(doc, blockId)` | Concatenate text with previous block. Returns `[newDoc, prevId, mergeOffset]` |\n\n### Inline Parsing & Rendering\n\n| Export | Description |\n|---|---|\n| `tokenizeInline(text)` | Returns `Token[]` |\n| `renderInlineToDOM(text, callbacks?)` | Returns a `DocumentFragment` |\n| `renderInlineToHTML(text)` | Returns an HTML string |\n| `escHtml(str)` / `escAttr(str)` | Escape helpers |\n| `TOKEN` | Frozen enum of all token type strings |\n\n### Block Rendering\n\n| Export | Description |\n|---|---|\n| `renderBlock(block, options)` | Renders a single block to a DOM element |\n| `getBlockDef(type)` | Schema definition for a type |\n| `getAllTypes()` | All registered type names |\n| `getTypesByCategory(category)` | Types filtered by `'text'`, `'media'`, `'embed'`, or `'structure'` |\n| `defaultMeta(type)` | Default meta object for a type |\n| `resolveYouTube(src)` | Extracts YouTube embed URL |\n| `resolveVimeo(src)` | Extracts Vimeo embed URL |\n| `resolveSpotify(src)` | Extracts Spotify embed URL |\n| `resolveSoundCloud(src)` | Builds SoundCloud player URL |\n\n### Editor\n\n```typescript\nnew Editor(container: HTMLElement, options: {\n  doc: Document;\n  books?: Book[];\n  onChange?: (doc: Document) => void;       // debounced 400 ms while typing\n  onEventClick?: (eventId: string) => void;\n  onCiteClick?: (blockId: string) => void;\n  onRequestBookPicker?: (\n    blockId: string,\n    callback: (selection: { bookId: string; unitId: string; quote: string; note: string }) => void\n  ) => void;\n})\n```\n\n**Methods:** `setDoc(doc)`, `setBooks(books)`, `focus(blockId)`, `destroy()`\n\n**Per-block toolbar:** type switcher (all 19 types), heading level selector (H1–H6), code language input, move up/down, add below, delete.\n\n**`onChange` debouncing:** while the user types, intermediate state is captured via `history.replace()`. A new undo point is committed 400 ms after the last keystroke.\n\n### Viewer\n\n```typescript\nnew Viewer(container: HTMLElement, options: {\n  doc?: Document;\n  books?: Book[];\n  onEventClick?: (eventId: string) => void;\n  onCiteClick?: (blockId: string) => void;\n  highlightBlockId?: string;\n})\n```\n\n**Methods:** `setDoc(doc)`, `setBooks(books)`, `setHighlight(blockId, options?)`, `destroy()`\n\n`setHighlight` scrolls to the block and applies a 2.2-second CSS pulse animation, then removes the highlight class automatically.\n\n### History\n\n```javascript\nimport { History } from 'griot';\n\nconst history = new History(initialDoc);  // max 200 snapshots\nhistory.push(doc);      // new undo point (discards redo future)\nhistory.replace(doc);   // overwrite current snapshot without a new undo point\nhistory.undo();         // returns previous document\nhistory.redo();         // returns next document\nhistory.current;        // current document\nhistory.canUndo();      // boolean\nhistory.canRedo();      // boolean\n```\n\n### Keyboard Helpers\n\n| Export | Description |\n|---|---|\n| `attachKeyboardHandler(el, blockId, callbacks)` | Attach all editor key bindings to a `contenteditable` |\n| `getCursorOffset(el)` | Character offset of caret |\n| `setCursorOffset(el, offset)` | Move caret to character offset |\n| `getSelectionOffsets(el)` | `{ start, end }` of current selection |\n| `focusAtEnd(el)` / `focusAtStart(el)` | Move caret to end / start |\n\n---\n\n## Multimedia\n\n### Gallery layouts\n\n```javascript\n{ type: 'gallery', meta: { items: [{ src, alt, caption }, …], layout: 'grid' } }\n// layout: 'grid' | 'masonry' | 'carousel' | 'strip'\n```\n\n### Auto-embed detection\n\nSetting `meta.src` on a `video` or `audio` block automatically produces the right embed:\n\n| URL pattern | Result |\n|---|---|\n| `youtube.com/watch?v=…`, `youtu.be/…`, `/shorts/…` | YouTube iframe |\n| `vimeo.com/…` | Vimeo iframe |\n| `open.spotify.com/track/…` (album/playlist/episode too) | Spotify iframe |\n| `soundcloud.com/…` | SoundCloud widget |\n| Anything else | Native `<video>` / `<audio>` |\n\n---\n\n## Extending\n\n### Adding a Block Type\n\n1. Add an entry to `BlockSchema.js` (or patch the schema at runtime).\n2. Add a rendering case to `BlockRenderer.js`.\n3. If it needs an editor UI, add a case to `Editor._buildSpecialBlockUI()`.\n4. The slash menu reads from the schema — no changes needed there.\n\n### Custom Inline Syntax\n\nAdd a rule to `InlineLexer.js`, then handle the new token type in both `InlineRenderer._toNode()` (DOM) and `InlineRenderer._toHTML()` (HTML string).\n\n---\n\n## Project Structure\n\n```\nsrc/\n  core/\n    Block.js          — block primitives, TEXT_TYPES, uid, anchorId\n    Document.js       — immutable document operations\n    History.js        — undo/redo stack (max 200)\n  blocks/\n    BlockSchema.js    — single source of truth for all 19 block types\n    BlockRenderer.js  — block → DOM element (used by Viewer)\n  inline/\n    InlineLexer.js    — tokenizer (12 token types)\n    InlineRenderer.js — tokens → DOM fragment or HTML string\n  editor/\n    Editor.js         — full editing lifecycle\n    FormatToolbar.js  — floating selection toolbar\n    SlashMenu.js      — slash command palette\n    Keyboard.js       — key bindings and cursor helpers\n  viewer/\n    Viewer.js         — read-only renderer\n  griot.js            — public entry point\ngriot.css             — default dark theme (CSS variables)\n```\n\n---\n\n## Development\n\n```bash\ngit clone https://github.com/yourname/griot.git\ncd griot\nnpm install\nnpm run dev   # dev server at localhost:5000\n```\n\n---\n\n## License\n\nMIT","readmeFilename":"README.md"}