@usedocent/mascot 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +178 -0
- package/dist/index.d.cts +69 -0
- package/dist/index.d.ts +69 -0
- package/dist/index.js +178 -0
- package/dist/library/axolotl-greeter.cjs +103 -0
- package/dist/library/axolotl-greeter.d.cts +8 -0
- package/dist/library/axolotl-greeter.d.ts +8 -0
- package/dist/library/axolotl-greeter.js +103 -0
- package/dist/library/bear-librarian.cjs +103 -0
- package/dist/library/bear-librarian.d.cts +8 -0
- package/dist/library/bear-librarian.d.ts +8 -0
- package/dist/library/bear-librarian.js +103 -0
- package/dist/library/cat-curator.cjs +103 -0
- package/dist/library/cat-curator.d.cts +8 -0
- package/dist/library/cat-curator.d.ts +8 -0
- package/dist/library/cat-curator.js +103 -0
- package/dist/library/corgi-usher.cjs +103 -0
- package/dist/library/corgi-usher.d.cts +8 -0
- package/dist/library/corgi-usher.d.ts +8 -0
- package/dist/library/corgi-usher.js +103 -0
- package/dist/library/docent-guide.cjs +103 -0
- package/dist/library/docent-guide.d.cts +8 -0
- package/dist/library/docent-guide.d.ts +8 -0
- package/dist/library/docent-guide.js +103 -0
- package/dist/library/dot-rendered.cjs +103 -0
- package/dist/library/dot-rendered.d.cts +8 -0
- package/dist/library/dot-rendered.d.ts +8 -0
- package/dist/library/dot-rendered.js +103 -0
- package/dist/library/fox-scout.cjs +103 -0
- package/dist/library/fox-scout.d.cts +8 -0
- package/dist/library/fox-scout.d.ts +8 -0
- package/dist/library/fox-scout.js +103 -0
- package/dist/library/index.cjs +2 -0
- package/dist/library/index.d.cts +11 -0
- package/dist/library/index.d.ts +11 -0
- package/dist/library/index.js +2 -0
- package/dist/library/loaders.cjs +103 -0
- package/dist/library/loaders.d.cts +8 -0
- package/dist/library/loaders.d.ts +8 -0
- package/dist/library/loaders.js +103 -0
- package/dist/library/lunamoth-guide.cjs +103 -0
- package/dist/library/lunamoth-guide.d.cts +8 -0
- package/dist/library/lunamoth-guide.d.ts +8 -0
- package/dist/library/lunamoth-guide.js +103 -0
- package/dist/library/mole-tunneller.cjs +103 -0
- package/dist/library/mole-tunneller.d.cts +8 -0
- package/dist/library/mole-tunneller.d.ts +8 -0
- package/dist/library/mole-tunneller.js +103 -0
- package/dist/library/otter-host.cjs +103 -0
- package/dist/library/otter-host.d.cts +8 -0
- package/dist/library/otter-host.d.ts +8 -0
- package/dist/library/otter-host.js +103 -0
- package/dist/library/owl-docent.cjs +103 -0
- package/dist/library/owl-docent.d.cts +8 -0
- package/dist/library/owl-docent.d.ts +8 -0
- package/dist/library/owl-docent.js +103 -0
- package/dist/library/penguin-concierge.cjs +103 -0
- package/dist/library/penguin-concierge.d.cts +8 -0
- package/dist/library/penguin-concierge.d.ts +8 -0
- package/dist/library/penguin-concierge.js +103 -0
- package/dist/library/raccoon-archivist.cjs +103 -0
- package/dist/library/raccoon-archivist.d.cts +8 -0
- package/dist/library/raccoon-archivist.d.ts +8 -0
- package/dist/library/raccoon-archivist.js +103 -0
- package/dist/library/snail-lamplighter.cjs +103 -0
- package/dist/library/snail-lamplighter.d.cts +8 -0
- package/dist/library/snail-lamplighter.d.ts +8 -0
- package/dist/library/snail-lamplighter.js +103 -0
- package/dist/lumen-index.cjs +103 -0
- package/dist/lumen-index.d.cts +23 -0
- package/dist/lumen-index.d.ts +23 -0
- package/dist/lumen-index.js +103 -0
- package/dist/presets-CAad3bCd.d.cts +12 -0
- package/dist/presets-CAad3bCd.d.ts +12 -0
- package/dist/rendered-CP0Y1GOF.d.ts +71 -0
- package/dist/rendered-Cr8oak0y.d.cts +71 -0
- package/package.json +71 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
var A={dormant:"data:image/webp;base64,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",listening:"data:image/webp;base64,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",thinking:"data:image/webp;base64,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",speaking:"data:image/webp;base64,UklGRnANAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSNkEAAAB8Mbatmlr27aNubazT9u2bdu2bdu2bdu+bNu2jQMrIz09PS3twuQYff6PiAkIeY7c99RY6PPiOfKdos9O53DI83tsSUYgcu3eGnwPCpjOmOyr4ygAoHypp+ajoDRy+14qPgktM5U5+2hHRlQqX++h0b+qVUG4ef+cQ0FN0xmTfTM/BbWFj/XNR6j1ELlhv2xGQUPTv431ycgfzZpAeHefnERBc+FK/TEPFC2a/XLQG6+zFQjP6IvVqGhXuEQ/FN9EW2rfLnphKwrajjywDwa/NWvNRObqgSMoaF/4pn9T0awDRG7t3uUUdGn6r3Hn5jRFt8Ibnbub0hGEy7i2MAVdq32z8OxFdAfhQY4tQUH3pjqnX68hBQifcWspCpIUru7V60jE7GcDn5agoDbL24DwQJ+eb8DqNqAy7dFCVNRl3TaEj3j0IKUO67cA4XL+zEdFa2QztW8X7txCqcPmjSA8yJu5oEjKVKeduY7SDRtB+IAv02ZIDMpFXDmbsSu28bwnYzNgnbERlAs7sh0j0hNc48gH1HpsuZHxtwM3pgwNk/nbiBvLQZJgE8GHgptLsQnaYj0bclk/Bn9US06F+wRHN+YsS4I1IrlDcPVUqqakwh8tFpzdlRRNgCWRPH80uLvAS6SKlaEb4xeWCi6v9BLJaJ0ZeHARvF7kukh2A5jNmi94PrHTB7AOAMBkDddC2IDSEYx7uTZ/NOsKkes5Vnydis5M/zXu106M6A7CC9wqfgRLASbjXi1Dxf+z9YrIrb06HzEN5StOFT+ipQHYpE8LUPH/7LBCuIlPOzGmonzcp0coJegOGI57NPovWGesiFzPoxUoSEZ4t0enMpax0zLjP0Yc+hI1HQhX9mcuGpK63J+tGVMy/nrgziOUlKBczJvRf8CSijjemxUoSMr4ncKZUxjTgnJBX4pv0xKLOMiXeamomYby477sxpgawGlXnqEkF7mtJ2OzYMkJX/RkVUbUTgOQSUfOziJyfUe+Qs1AeL0fc9HQMA3jnwdu7MiYA4TLuPEcNYvIM70YH6JxIsYfFU6sxtgIraGhcmEnLqY0QxoRh/pQfI+WifLTPsxDQ5vtoLFxThd2YmwFSUTu6sIzlHbQAporX/dgbAatJaA7QCYdWIGC9hugzchNHDiDsQMAVWhXeK8DX6F207Fhxlh2c9OQc+Tq2W3PmJXw8uyeoWRl/ONIZmOzYFlBuExmqzAiM5yR2ZnZGb9X5PU5amYwLpDVNA25Cw7JaivG7JSfzeo5SnYwzp3R6CxYfpF7ZLQUBfkrn8tocx06YPzXaD6LUcSyg3CufMLhJEUtJ5MhfzvIKCx43QySFqOoWWKmEqOR/Mp8Ie/xDW76JUuhEmMU7chUJcYoYOm3L12uCPkP5lpt36vf/AlYXktjlFpmYPUfv/DAIatMF8HRYmLeZTY7+PSr3oPVIMlaJP/69ddvOmW39RafGgS356NUKK/ffLczaRXCo6anRoL/2zBWRK4ewgiqI9cOfTj6c1iNTUKYEFrV5r1wMQVVtk4Ik0Rl5KZ9MGGGcpNZXDyEVShVWKcPFuFQJMYoRvLxEMIpjBVDrtQHI59k5c/v3awIIVxqQzMzFSEn+yAUC6yy2fabr7bodBFKV2f1V1YM/bz2HZ/+0c++89rZqxUhYwBWUDggcAgAAHAnAJ0BKoAAgAA+PRyLRCIhoRNJPaQgA8SxgGr5EG+fFTNDxQ+yoTvC3lwc687fxYumb5n/OZ9M/oAftV1tXoV+XP7Ln7gekBd+X4bwr8l/xuUhcf/JPxj+t4ndsfgqYh9tbydNAD+Yf3D1Xf7z9mfRn9K+wL+r//K7G37Y+zIZY9SGC2qfGGIyGxRvYEEDnPbyRXqv/R/TwdplwR2WJ5cuB7BS/9T3iPMcGP9kP0QUAF7fKzsKJ/36EGZWs54+R3VJOYvnE91p/yQfCm0TVYyEZQPdZsGfrqMf3A76ilvq8dCZs8nuqbHWEBiIfSnzPNc75hSdrPHB1RZijcdxVKfVfqCSZYdq7O5NnzlInJ0Rytt2rOsO1EXsvS6521pAdegclxkUvxlMjWqUzDZnrsnj2t4eGn945OsyXdZa4aVf+RP+wAD+/qU2u8/vTm8Ja8M4itTvME2BNovztpSMzyanov3fnwNlj97E/t6D2rlrlA8s3v1o1W9NGcA63j5EeUBthB96NZ8Awb8Kvdac0WdOkLSd0ldlc85YnwM1Rh8358Wv81Dg5AhAWQyuth7VK3eWuwsMrZpL5xu2ROuEkUwlML3ciwFyTwNffMHXi9c/kOEZOZtjZJJ6hsCSC8f8lkgovJ9C75PgJldqdQcDAPhR8NZBOdmDr1/V5DBTy6TupRdIr4kJ/tj92H1ul1vr70JGKVM0SkmcjcNXMpe3PuWNWR+LQ03pnXyE9BtCwiVVXd9Xc2TQf69p715Niec2PgVI/dWrOqrpZ4rSEU9TRbqSc7cuBbuEq5V/GorzcFdfdF3jPl4TQPz2x3pxmi7fylQzXGjYIqo0DexdCu8PbxHUkI8b5K0Vsqd4zIj14ShEIear8DrZ85zpKjbA3rqRahSvIkn0SfyHjXXpTmWatl/4siY8CLlnbSAOR/+VAaITE+Av6cT/D5jy+hJO3/kP7YismKVEOU+2J7SQ7qU2vZwVo6aq94VYjcHGgsHEtrPpZK99eugwzYAQGeKSh7XU10744INbqXnJZ4m763RPlS03Uz42kOmk5Aw3vYi2mn3LA/n/zPyyUET5pC6uYB6SiX8rkB2IdEGStXs7eKiKejmO95yrx1j0N8dp05l7GAUnXE45LohGnI05AYjlvgkSkZ2q3SAxDcq9I6nzH6lQ9j8Nx9TxLnHu79aGnTz677nrLv+wCOsZTmrppBodo/zphlh4+cH/6hKYBTI2qvevfp2cTfestyrOo6qIO5/7F3n2oeV53af2IdyXKVkdyAC4tA7NH7xU9OPovroKKbXEBxxA+ONM4UPVtDQbTri0jUqM73O9ni7+qZ6xbNYciywPp0GPHgkw/A1QxoxmOKsHYY8ElVEfm1L0wtE5ELx33l/5eFf7Prh/QO8KWBmGGJFWgRRokzUubs6IJME1hadG0Xj44RT6UpfKkeJAmAqasRvss0ZhEiDH/B0z3orAvmxp5VFXNyZRK5v9mgIXycxz5c7EUnvveCGRoMYazWEMWWbw/2jjIH7UpwnVX0x7ZJc5czqgML/hznT1j2Yq/RSikNOeV774bDdvOjHko3zBomU14B5ECrrnp+9fxSr+WjCMc2PW2exF48lK35Zsevy2vvRbRhEsp+FbIdyhcJMODi+m7gk6h8PbSkgZ6eiXO3Z0awNP7z+/xvnKzRzfzPilvJBrTnfLqyy17cYW7zsIR7zO9O4kNeJQUxMpaLr0s1L3wl7G9n1kVHJSyU1EjtnOqLQ6u72KcitmfvUtW3Lb0QE6yVGO0NNXTYZioap8GfD2IgqcuRoHU37PWF7Gw3LvqEqe6aJ+AXcKVV02seqXIq6eZd6+A/bgLn9U9VZUoT0Jf6JxPTL7uYi9t6EUsNteuDNGlbGW1fjfg3UZazEu9miKWXj9i36CT2CDkCB2qiOFfSD63OyEPqggzynibVIHPDv+POBqYNaNao5g36ioAV26RZVjiI+/IaiaEqpcTLqLzPbvuxQoY+lpHsvqUjQOboLV5sEkQKQXQFRFzJ9s5RyUFj9+oFiJDKUyp/2//wC6+nEDaptvhwPVfyWOdpzWVvjMy/UKeQ6UGGG0noTfD/UKzrPOBPjz30tp5lSQUO6xefz97icPF8noZn3/k3L7GtuD3wXR1z7YD2trtvZ07ISCNYZvru6BUdnnB/wbELJD5pgvxuwZGJWRxfnj/3jSi/GlqaH3XV+B5ajBsWYQrJjGgFslTmSYL+G4rDoa7t7K/FgVfMVdGVg/hv9RCeKRYqlWHLSDFhzA76yt4M40YE6e5m0j0PgLcnUCXnoQKQ6G9qDCxYR3Oszkp4SgW/SKlzao82fSt53TjrlPJZO7dIlJHpNGG+uPCsse0etsO42/SIabq7s+hcfVQKm0uClPni6q2eNjHKMKAnZkHC3+YM8T2A/+bMRjJ5xpG3sGs1OwGsndOWNZ7k3/YBmvRIo2hbv4UsthX7avQnp0SzOkc8jx6Gat1FWiexEyU+geAOLkftuhQSgvbhAhULCTvvJxBba+FyQ+rT748FwGlMZeKZ1RS+wKH5LzcmhropEiDloAPo/D8LriRm6zkmR48gd3aUN/K9U0m2SgCd3bx91HaxxSvb+BOvRgKhBI7l2rxvzu5RI49YSe7tF0RB12L7WFT2F8uHCdksl3i/zQhi3jN3UyLP7Ytnmjhs6WpnEhE1Xb5xN7xZIwBNEwvo8KmNjgnBewtSVCyFMUOob3N+SU0mtWAnnsrnc+gzwmPUIsr3J+InNRrwVfK8hhS9CTZYVpcUh33ET53llTyhZW+VRfMHcZIaU2yTkg+kO/I/LNi5b6JtCN5HFvGaugjv/eke7oDaxFZvOI44YjvtVLaggHhiCKVn2WKbjtUXE6ZxIG8AAAAA==",pointing:"data:image/webp;base64,UklGRiwNAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSCEFAAAB8Abb2iFp27btmV3V1cZpdJy2bVy2bdu2bdu2bds2O077PCv22GKLLVasH12Zuee+b/k/IiYglDl6w/vGYcirz5JfrobsyZxGPmnA9mMEhMcPVv17U8D08slQPYoCAMoPDNTuVMyMPH+Qqu+hwTQuD9GNKWhUfmyAxpeYNUF4zvA8kYKWpldPhmZXKlorXz80n+sC4fHDcioFHc0uGg3J3P/MukD5siF5KAXdlQcMx4opEpr9sR6MNzAJhPcfiv2oSCvcYxiqHyKV4qfVIFyPgtTCWw3B3LZZMtPp0gDcnYL0yvf4N5ma9QDhie49jYI+zbZHzq1D0a/w8c69idIThHu5ticVfSt+XHn2YUhvEN7OsQMp6N80Lvv1ZWgGEL7VrYMpyFJ4qFefg+ah+GPl0xYFmQrv4NOHkY1pXPRoHyqyFb7ZozdR0jAJhAf7swZDZzaC3cx+X7vzHMZ0JDtBeB9vVlTRmb1AbdmZZzLmxtf7sihmndgTlHu6cm9GZIePeDJ3ASw7CPd15AxG9MQkeLEj74EUYPxX5cb4WlgRF9Ru7EdBb0wg+HRwc+806Msi9/OjvsA0OxPePjh6PKfWGzsIeZPg6l2o0g09qPI/+wVnzydFsxHymePg7vrbSBVrh1TGn+4fXD7oAyRF+zO7RRW83ut515IUbUIiPLZ2K4TJWR8myX5g/NKcXyGE+TNfv92EVmxC5Afd2Xrsq555iz0W5kfjyWQ82XwitR9E3saX6omciXjl1WIkieZUEFty5QWMIhIV3AlTa4FkfKEnB3GKmTYTHVuxDZSbjnwCNitxurf5sU5DAVDu6cYZlH6QDB9z48aFQHiYF3di7AmpFN/34valQHicE2dkxA6K31Y+7ELtC6kgvL4PB9JKMbtg5MDcPQ0tzUwlxpgLhA8r7zb/IppF2dwFyaC2WtwtGK2JnG7//pMvfuid7no1cxG+obj6EjYo77k5rquw84fUDkgG4VZp40tnEcrl0PytfBTfrwobXdRA5WaLr3dDMghv6ARoXG/xpYzMrhx79LEE2IGkwseWNb60zVqLt1LygWKtrMvTvDhFj8IPFDXfarXF87KC8siSxpemeW5eZn+tC5pvII1rLZ6WF4T3Kmh8LdQAwBSLLR7FmBU0LpZzW5I0M5B8Uov75yZ8TTlv+v2fL1KSjBf89UtV051yg3LfYkJV1fPLKyuL47oKLW+ZH75fTuIbZgflDX05Kz/T6cSV4/OD8rWuHFYAhAd7sh8lP7XfV47sWQKE93JkN2oBUF3xY6MQftCPZVoJUB7vxgJRpNkFIy8mgJUA4SO9mI8sA4p1J0aXF8NPOFH/rxQoD/Oh+nM5+H7lw6+ohUB5vAvhpwXhHT58vxzD1334TjnC+/rwpWIU22MfPliKKg8OPr6ZUkQkjwpOPrcIVf5sj+DlwxmzUyHvUwc375adKvmRPYOjN0JeYuT7Dg+uHs6sSL5nn+Ds6ErTfGx6t7Xg7/G0aLloXAgeny6kRLUUZioxwpoiH+9SWHnO/0iylUqMUYyNTcYLapdCmNu69wf+2oqz5aLvv/kuRy2cQZ0F4T5O7Tye2mD48tMfefszDl6br8PMz1EbcKBfWxeoNQj3CR0fyTjLbOLWqtLQhK0uD2wQviy4/URMYWamGqNwtcvrKTtUr17w65Ns/arQ9bNQABp5WPD7wO9sCyAX/PQDjzpjM3R+OUVFyOsH1+vxZDKuQ9o9/mEkv7MVhnu0ccg5x9QhWwBWUDgg5AcAAPAkAJ0BKoAAgAA+PRyLRCIhoRLJdfQgA8SygGr40K7PVbODyOOYPj+Yud1tpvMB51H4zayl6AH7Adb3kMm5LKX769tOU9Eg7J4PZpSAP6yf8H8seaXTQ6AH5y9CTQw9Lf+X3Cv1i/4/YY9Gk1WffImgflBw23EjBbcJXP3VZH80+E+wqJsWtlMoO/vtR9R0bMWt2H6jARXzNqwR9gnXTbJZ7THZ5cF5flZ1FuBvpcKObDjO1IN0HjSn0QvIQExg5U0+ZwBj34u1gWpebs0Blqbx9dmmpxCUYRNr5iz+mAO8aMS8dg86sImeYwSVvMzfY+F1L/7+4915hC1yR08tRj6h+l5ZUcf54sJhwb0zehuK3bxSznIYI0s2lKaPVAlnUHS/v/nYryjcS7Q6zNI/OAAA/v6lOXuhZ1PTxtdhMk9aaauPO1ZWqDi9dFlquikT2LYlJG61ptDH/GLPDWMmnI+aVK/iWtgiHmUGcS374vz2GD7K1remJY3Vb2csB28xYWOHdjfx+Htb6Wi9TcWSWXeBtgpfnfpsk9hNmGvOevUA4GrgKIP3NYjGIAeytgY7y+TNHVGWZ/JqqQOKfUJBCjvYmZbaJ2BNX2ec5NhBRcAb7iPHO5pDDgzm6dTgkDZo40rHsvDINullnp+ep4+A74FC2pWlZ4VYAsq+7zgEvqEnP2fuGwQDl6SzRKavRXR0+HB9TAWGx3X/+dA/0FrL3z2Xbsw3m6j6TQPAAbfFMMu1mbfkBnLZpl1rzhHfJeKNroAkVzsVkjVWIS3NtCsvNsfhk0fJRu+GZwxzQmzSBcesj/V2RyumPoc/lJOwYPq4RlX8iYORLrX5apfQKjhxHsZJSxOIwbKKwW8uC/BxbugAD8SE1yOxLRE9lVUyRn+PK4ai/Q53WTbFnK2cHx0NrsPIxBM80byuljoRQ2NgYaxtJIB1zE+lBGUp3u4fuju9J9Enbt8tJC9M4H8XqfnZkmDUcbPU9dUEFHFPF8DCr3+tnPqC2yirSucnSG1nIrq1AVeM45P/9gGY05TxU+JH/j3uCptjG3tj+wr/7RpVryJ6Np5RPoevAvIxOClVJucwj8GIu51b+S9/HddbCFHtPgxOzzBtlzf2gjo8X7+4Eavjrn/2Bz8CBCPQnCUPkfY9090+DQX7idg6Lut7f9kFuHDh5S0cn2TEetsVHAN6C8CErtPtLqoBxfC79H6XjYmQ+UnMtToo2sV6hTgvqzWtp2/xFWOGv26DIZyfVi7WHo6IyODeo+HPJzzCABN0blMf/CRaCL5Iv/6O/ERHefJd/q/zdQD9oL4PWPGqNdK9KgWo8SIJxy41wPL1LDTNQXzyjM6c2jQferQ/eQbOV+ozEcTLwTPvjOj/lnCZtUG6DOA1nMc/u9+SkxqmCqGJbhXO5P59t9pYzJJS+epOmsUslwPi6umUDR0FQ4/gcF7Na6IH2JAlCNJITtySgYB1ezw1Js0uZgtG+d/BanUGPZ/lzc1YqH7hQZkKpk8rYgbYAIx5TDcJiDChZ88kcyVfhC7WwKxoM7GF0afgVt45XJBpJvREOsz1u/WZ9lXihnilN7qyHlfITRi9nSV7P+8n9NdNrDI0GRt0LCXSmwix+P25+aU3euzxkgQozp8VnSJlz66pvM8a9k3U66WtkeIL/sx+bNDqOAl1RupVa5Pr//ykC3I6Ot/xL0h+iq9a8EP4mfB81+G3yCdm2Jb5ODtpsu1/qHaNEz2jOkNhEkZ46RCfHEu8YtHsvyK94EagyD8lYj58fRaebCgHnaKz88b/Ki3iFTVVxyKUD1f+9W6/oqai2/p7tS6HooJAIwwG3Petbir15rhv884uje+cL3a5zIlYvlCfbkJEmgd6d5Uy8etJ7ebsLzAxxEP8K74qJc3k/ta32Ox1vb+ipvhQc/vF2t3XoTcjPctpH+ynnWSCRlMhuwdvWN034PkecUlZbOM3DvP8XAD/GeJNY7VhRY7rwoZMyx5AFalIDuHsiLBSdHd+Ig/paTpf1rMQG9XD9jdHRZckof4Ek2IGX7asdDeeH8q4e1xH/z0oLFgu2pyVxMNIMQjtpjHIS7zj8+OFI/28ZFYfR1JqOXt3fmVa2atr2/FznVEV1NEdtfs+dgv1MHk44xas8s75ujZ0orTfqSGy2/PC/tHSSRLc2h4z8Rdtwldrgod0Kt/yuqpkomUlmm33gcRP8xlLyfDr+MxmQcJ9MQi1hTK18424z5JRIbpl1viPg30p/HxyhdsE4VHMUaq3HEBewH325lls/Xck6flJ4fEWRy1QvtpHwO7u7H3HTBazIwG8BcSsbtU3A3JApoh0rYhNmLJIvDS0LnmYe+AoWWfhoCffet0V7BgCh0C6P0DjlRTEYs1O4yvO3K8d0xLyN8NzxzGPUzItTh8tUBolKIEO3lpmpkm1z+GU09h1uFpM62ddIMXS74yx/TY9RTopJsRbf/sty0dXBmiM2wqUM2Ff3QLYtfQPufjMUHBFKFEMDkmVCWFu5ots1vWQESuKViUFO+T1l5+P7WBdZ/m28Hp1quj/fss3SrtcpY61zYtNjmV3Ohm/D2wWpOpA/K37JIacJuHSB8ostSHBOPJFs4HtnGqMPlQrnXpd8McLLqAGhVoyW02KCucyX/x3EtC4DKHzmQss5WHmZ3tIj7Of4nZ+G0+LORiMudopggFrIMIp6sLwAAA=",celebrating:"data:image/webp;base64,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",muted:"data:image/webp;base64,UklGRnQJAABXRUJQVlA4WAoAAAAQAAAAfwAAfwAAQUxQSMYEAAAB8Abbtmnbtra1MeacY829bG7btm3btm3btm3btnVsGzNGtKhRo0aJcjB7H723Vvv/iJiAkGfn4ecHQ5O3niXfbDfZMYzCCxtsLgogXL2x2j8yA6DdkU11MAX/x6caahIVwwo3b6ZXiyA2vonWp6BQ+UIDdf5mVgThhs1zFgVlVcY0zUwqyvGphml9CSsH4ZrNshYFverQYJP0/d6sN97WJIdR0LtwseYYC0WFZr/ua4w7WQmUxzTFfFRUq5y9Id6DVWT4stUIq1FRtXDnJuj7vVllUBvbADtTUQOf9m9E11CncB33TqLUYjrUcW6sGepVnufc5ZSaoJzTtclU1G34qu3ZvZTaINzDsVkUJKg62q9HkQbvdmt2CpIULuXVY0jE7Odtn2anIFHh7j49gJ5IshqojvJoOhU9cvhKhLd6dBOlBxZXAeHC/oyjojzLVmH2o7Y7F1CqYwUQ7u7NGChqYAWmOsqZsyk9sNfeoLzWl1FmSAzKma4czZgenvZk4F+wmlgBlHM6sjYj0hNc7siz1NpYgfEvfW6MRIUVsIrugBvzI+ag9nZwcy5KCuypy0X96B9SS86EewZH1+dQCiwl5JbB1eMp2gMqYZEJfz5fcHZ3MmoyQp43ENyd/SVSJA3jN/MHj1tLv0Qian3G/fuC1/NeS7IO/L9hVvB81EZ3WnUYVrG2ayEsA60Jyl1cm0m1uhC5umPtn1BRGQtM4qBfmzOiPgjPcqv9c1gKgA16tQgFSQg38eoCJKJ81qnWz2lpABjl0xQqEhGu69OmjKkoH/bpAWo9LAHICI86EZaMcGWPFmVEMeu72aPTKekA3QF/2r+kJSRcyp9pVNTFchf7sy1jSuBf+tx5jJqUcm5vRghKJyA8xpvFGRNgGeNPW86cQkkLyum+tH5KSyxiH1+mUJGY8SNftmEshwRgHO/Kw9TkIrfwpBPRawrK5z1ZgrEXJADYSEeOySJyVUc+pWYgvMqPcTRkYPxHvxubMuYA4fxuPEzNIvIELwYF1htSMP6k5cRSjMgCwtmdOJNSBVKI2M+H1k9olaAC9Kz8yIcpVFRcH4zjXdiSsSrUF7mNCw9SK0MPqFD5igedLqw6oAyqtVEOLExBvQWoNnJ1B05irKle4U35tb6iZgR0O9lNoCHnyKWz24QxK+GF2T1Mzcr4j/7MOhGWFYSLZLYIBbmdmdkJ2Rl/2c6q9RUtMyhnZjWehtwF+2W1GWN2ys+zepSaHZSTMhqIsPwid8hobgryVz6W0XoaHTB0O/nMzaj5QTgln3A4CVHLyaTLf/VnFGa/XElqjKKWmpnGqCR/PnvIe3ClS/7CYU1ijCJak5mKxBiNw/78gkX7Qv79U1bc7/q3/8zCUhqjlDI1Fg9999gRy01sB0f7Rk1fbIO9Tr7ydVgJkixFsvvz9+44Ycc15h870Apez6QUKC9Za9vTYAXCw8eNGWgH97dkLIhcKoQOiyJXDk3Y+aNZidVDGEmU2KARzqWgyJYNYRStxEZNMBsMw5rJvzhnCMsyllitCeZgVyRGUZC8uxXCMRQON4QlmqD/AxZ+fvFa7RDCWdaFmakIOVsThPa0BZZabom5pwy2wrDLs/iDBUMzL3XhS59+9fG9hy/aChkDVlA4IIgEAABwGwCdASqAAIAAPj0ci0OiIaEVysz4IAPEs4CDAP0A01zuLcgCHS/0PsrC+PDv6LWj36qLrOEX33DEaWbEx4tCSYTiFrg/zD7ifuOnDwI0ESi7QvpYzxcWmHk9qxumnXcVYapSHipZ+hpEwyup4yGshsizqPLmAtC9h+zcuK0i5OykInJ9YL/wznkc4szE6+05/U6d5QQ3NaDDCs5o8UTjpPGuSaa6poJV14XQObR2TkzDh5lg60Al0tkkiAETuuMxrvCzSUlcJeyoBRO+OfBNTKKH7+hMm6lm6juSqbeakj5LoNAA/v6lNnWL1ye20SwaTO6vGVZ638LR2t//7FIYyrQ+NrTgfgm43zuen31Hzc6Kw/ftm9SPL99dhYOXtT4ZLMNP0Oe7ectQKNZ4OfsGLO9kztUGzZxQOV12O0O36y0dxTqr8NhRj/v18232BYopJIrNEJASz714nuChpTVQVsRSJXcZvWmbXWVQ5+sGw231RfoIzqfMK+3H+kcC/yRKZOYBps+uJJV2MRUbGA0QIIfu3gVhXtlo+6sHf0TPv/097eziXmsA8QTXe0idjdHjgnk47B5wp1GIlTAZ3zy2daU8LPhdJzGz0+9bOrgeRpgG9y1XIP5br9ChmZpmJDfrc7eXWJywWH9Vfdc9DBhOs03qFj6NpQuYfiN+CxEQmihSWNH9v0S76uGZnohxiIChAF7HtPugXRLY4Qfi8e7nm6O+kErXYQUBNxqRRqIpzH/CK3NaywVlXEJLtqN8IrcbDfccCK/8xG8raKsUjYyBy9y0lqLvZTheAgzjo5NLxcFq1M4A7VwmXpagCODHctVsJc+q4F7thOis/kzudoOQhIOEVMA4utvclba4OMvEvaGGSV+WKZIQvTiQ1ZCxpOm4uEPE7kbMEf2hevxt5sOXqYrWNU0c+sdQc7g45M9S/1BdRITh6gS3VZHTNKUqX4TCl18i9z3Jszuk7P6SGnovtEVKpn3oFlUMKLsKHkf70pfF2jg1c6i/ubLSL4orILO0MawcLDoYzSwr5lZAY3pChpaM0pm9Hr7tloJNQDea3csQ7EzRGGjs3xEtmdvcUoEra6JVuXK3MaduzcIik80xnvwiksCNLGl7DJcLDKeR4TJ29+9Gz05Jb243UUpTTxmIk2bhX79ZcY+zNrKx4iV1Va7bEO0bt0ex1Zx2zQj7gom8blzSsZOpPKqrVmQS8sD5Kk0TCC+64U1bcJzKoakBtMj06sCk9n4jB5BSilFBcD26RaZQXVkYQR2AMptpCu4vJLKG8oLU3ZLkag9UkF7Ap/HbQ08azyxxc0MmAElyTVZtOtHGX78ts4csPO818t1I0DupGs4JNu7IKTsQls+ptDNOvn3dUkAfJrKmy1GVUGLPOLxG6IEQbul1Z6xFHBhheGnpX8/2BnPmMOWcnjaYu63jP4jXE+N2laKfDM4pqmg2eJzmQp7mKmV+0tADW7Kglh8srDCBT8Sil89i4iCrrR5/FzGb85+P20S3Ga588f3EUV7q8LZ0fymG19eupJhL2B1CqAAAAA=="};var h="http://www.w3.org/2000/svg",m=(t,a)=>{let o=Object.keys(t).filter(i=>i!=="blink"&&i!=="animated");t.blink&&o.push("blink");let s=o.map(i=>` <image class="${a}__frame" data-frame="${i}" x="0" y="0" width="96" height="96" preserveAspectRatio="xMidYMid meet" href="${t[i]??""}"/>`).join(`
|
|
2
|
+
`);return`
|
|
3
|
+
<svg class="${a}" xmlns="${h}" viewBox="0 0 96 96" width="64" height="64"
|
|
4
|
+
data-state="dormant" role="img" aria-label="Docent" overflow="visible">
|
|
5
|
+
<g class="${a}__facing">
|
|
6
|
+
<g class="${a}__pose">
|
|
7
|
+
${s}
|
|
8
|
+
</g>
|
|
9
|
+
</g>
|
|
10
|
+
</svg>`},l=t=>`
|
|
11
|
+
.${t} {
|
|
12
|
+
--rm-amplitude: 0;
|
|
13
|
+
--rm-ease: cubic-bezier(0.2, 0, 0, 1);
|
|
14
|
+
--rm-dur: 400ms;
|
|
15
|
+
display: block;
|
|
16
|
+
overflow: visible;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* All frames stack; the active one fades in. Cross-fade rather than a swap, so a state change
|
|
20
|
+
reads as the character changing rather than as the character being replaced. */
|
|
21
|
+
.${t}__frame {
|
|
22
|
+
opacity: 0;
|
|
23
|
+
transition-property: opacity;
|
|
24
|
+
transition-duration: var(--rm-dur);
|
|
25
|
+
transition-timing-function: var(--rm-ease);
|
|
26
|
+
}
|
|
27
|
+
.${t}[data-state='dormant'] .${t}__frame[data-frame='dormant'],
|
|
28
|
+
.${t}[data-state='listening'] .${t}__frame[data-frame='listening'],
|
|
29
|
+
.${t}[data-state='thinking'] .${t}__frame[data-frame='thinking'],
|
|
30
|
+
.${t}[data-state='speaking'] .${t}__frame[data-frame='listening'],
|
|
31
|
+
.${t}[data-state='pointing'] .${t}__frame[data-frame='pointing'],
|
|
32
|
+
.${t}[data-state='celebrating'] .${t}__frame[data-frame='celebrating'],
|
|
33
|
+
.${t}[data-state='muted'] .${t}__frame[data-frame='muted'] { opacity: 1; }
|
|
34
|
+
|
|
35
|
+
/* Speaking is the one state built from two frames: the speaking frame is laid over the listening
|
|
36
|
+
one at the voice's own amplitude, so the character animates with the speech instead of
|
|
37
|
+
stepping between two fixed pictures. Floored so a quiet passage still reads as speaking. */
|
|
38
|
+
.${t}[data-state='speaking'] .${t}__frame[data-frame='speaking'] {
|
|
39
|
+
opacity: calc(0.15 + 0.85 * var(--rm-amplitude));
|
|
40
|
+
transition-duration: 80ms;
|
|
41
|
+
}
|
|
42
|
+
/* Fallback loop when nothing is driving amplitude (--rm-amplitude stays 0). */
|
|
43
|
+
.${t}[data-state='speaking'][data-amplitude='loop'] .${t}__frame[data-frame='speaking'] {
|
|
44
|
+
animation: ${t}-speak 0.6s ease-in-out infinite alternate;
|
|
45
|
+
}
|
|
46
|
+
/* Barge-in: speaking collapses to listening within 100ms (PRD 13.6). */
|
|
47
|
+
.${t}[data-state='listening'] .${t}__frame[data-frame='speaking'] { transition-duration: 100ms; }
|
|
48
|
+
|
|
49
|
+
/* Blink: a 130ms frame swap every 4.5s, matching Dot's cadence (PRD 13). Without it a rendered
|
|
50
|
+
presence is a still photograph, which is the single biggest reason it reads as dead.
|
|
51
|
+
|
|
52
|
+
Only on listening and speaking, and that limit is structural rather than taste. The blink
|
|
53
|
+
frame is the listening pose with the eyes closed, so swapping it over thinking or pointing
|
|
54
|
+
would jump the whole body to a different pose for those 130ms. Speaking is safe because it
|
|
55
|
+
already composites over the listening frame. Dot has no such limit: its blink is a scaleY on
|
|
56
|
+
the eyes and so is pose-independent. */
|
|
57
|
+
.${t}__frame[data-frame='blink'] { opacity: 0; }
|
|
58
|
+
.${t}:not([data-loop='true'])[data-state='listening'] .${t}__frame[data-frame='blink'],
|
|
59
|
+
.${t}:not([data-loop='true'])[data-state='speaking'] .${t}__frame[data-frame='blink'] {
|
|
60
|
+
animation: ${t}-blink 4.5s step-end infinite;
|
|
61
|
+
}
|
|
62
|
+
/* The mic indicator is the listening frame, so a quiet arrival must not blink either. */
|
|
63
|
+
.${t}[data-quiet='true'] .${t}__frame[data-frame='blink'] { animation: none; }
|
|
64
|
+
|
|
65
|
+
/* Aim is a side, not a bearing, so data-facing mirrors the whole character.
|
|
66
|
+
|
|
67
|
+
Mirroring is instant and is deliberately its own element. Interpolating scaleX from 1 to -1
|
|
68
|
+
passes through zero, so an eased flip squashes the character flat and pops it out reversed,
|
|
69
|
+
which reads as a smear rather than as a turn. Posing keeps the easing; mirroring does not. */
|
|
70
|
+
.${t}__facing {
|
|
71
|
+
transform-box: view-box;
|
|
72
|
+
transform-origin: 48px 48px;
|
|
73
|
+
}
|
|
74
|
+
.${t}[data-facing='right'] .${t}__facing { transform: scaleX(-1); }
|
|
75
|
+
|
|
76
|
+
.${t}__pose {
|
|
77
|
+
transform-box: view-box;
|
|
78
|
+
transform-origin: 48px 48px;
|
|
79
|
+
transition-property: transform;
|
|
80
|
+
transition-duration: var(--rm-dur);
|
|
81
|
+
transition-timing-function: var(--rm-ease);
|
|
82
|
+
}
|
|
83
|
+
/* The CSS bob is for presences whose frames are stills. A presence with an animated listening
|
|
84
|
+
loop breathes for real, and running both gives a seasick double motion. */
|
|
85
|
+
.${t}:not([data-loop='true'])[data-state]:not([data-state='dormant']) .${t}__pose {
|
|
86
|
+
animation: ${t}-breathe 3s ease-in-out infinite;
|
|
87
|
+
}
|
|
88
|
+
.${t}[data-dragging='true'] .${t}__pose { transform: rotate(6deg); }
|
|
89
|
+
|
|
90
|
+
/* Arrival beat: no mic indicator, so quiet holds the dormant frame (PRD 13.3). */
|
|
91
|
+
.${t}[data-quiet='true'][data-state='listening'] .${t}__frame[data-frame='listening'] { opacity: 0; }
|
|
92
|
+
.${t}[data-quiet='true'][data-state='listening'] .${t}__frame[data-frame='dormant'] { opacity: 1; }
|
|
93
|
+
|
|
94
|
+
@keyframes ${t}-breathe { 0%, 100% { translate: 0 0; } 50% { translate: 0 -2px; } }
|
|
95
|
+
@keyframes ${t}-speak { from { opacity: 0.15; } to { opacity: 1; } }
|
|
96
|
+
@keyframes ${t}-blink { 0%, 97.1% { opacity: 0; } 97.2%, 99.9% { opacity: 1; } 100% { opacity: 0; } }
|
|
97
|
+
|
|
98
|
+
/* PRD rule 6 / 13.8: reduced motion => instant swaps, no loops. */
|
|
99
|
+
@media (prefers-reduced-motion: reduce) {
|
|
100
|
+
.${t} *, .${t} { animation: none !important; transition-duration: 0ms !important; }
|
|
101
|
+
}
|
|
102
|
+
`,y=t=>Math.min(1,Math.max(0,Number.isFinite(t)?t:0)),f=t=>{if(!Number.isFinite(t))return"left";let a=(t%360+360)%360;return a>90&&a<270?"left":"right"},b=(t,a)=>{let r=`data-docent-${a}`,o=t instanceof Document?t.head:t;if(o.querySelector(`style[${r}]`))return;let s=(t instanceof Document?t:t.ownerDocument).createElement("style");s.setAttribute(r,""),s.textContent=l(a),o.appendChild(s)},p=(t,a,r,o={})=>{let s=t.getRootNode();b(s,r);let i=(s instanceof Document?s:s.ownerDocument).createElement("template");i.innerHTML=m(a,r).trim();let e=i.content.firstElementChild;t.appendChild(e);let c=o.state??"dormant";e.dataset.state=c,e.dataset.facing="left",a.animated&&(e.dataset.loop="true"),e.setAttribute("aria-label",o.label??"Docent");let u=n=>{e.setAttribute("width",String(n)),e.setAttribute("height",String(n))};return u(o.size??64),{el:e,get state(){return c},setState(n){c=n,e.dataset.state=n,n==="speaking"?e.dataset.amplitude="loop":delete e.dataset.amplitude},setPalette(){},setAmplitude(n){let g=y(n);e.style.setProperty("--rm-amplitude",g.toFixed(3)),g>0&&delete e.dataset.amplitude},setAim(n){e.dataset.facing=f(n)},setAttention(){},setSize:u,setQuiet(n){n?e.dataset.quiet="true":delete e.dataset.quiet},setDragging(n){n?e.dataset.dragging="true":delete e.dataset.dragging},destroy(){e.remove()}}};var d="lumen",U=()=>m(A,d),v=l(d),I=(t,a={})=>p(t,A,d,a);export{d as LUMEN_PREFIX,A as LUMEN_SPRITES,I as createLumen,p as createRenderedMascot,f as facingFor,U as lumenMarkup,v as lumenStyles,m as renderedMarkup,l as renderedStyles};
|
|
103
|
+
//# sourceMappingURL=lumen-index.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { MascotPalette, MascotPaletteInput } from '@usedocent/shared';
|
|
2
|
+
|
|
3
|
+
type PresetName = 'purple' | 'teal' | 'coral' | 'blue' | 'pink' | 'slate';
|
|
4
|
+
/** Body color mixed 50% toward white. Fallback when a custom palette omits dormantColor. */
|
|
5
|
+
declare const deriveDormant: (hex: string) => string;
|
|
6
|
+
type ResolvedPalette = {
|
|
7
|
+
[K in keyof MascotPalette]-?: string;
|
|
8
|
+
};
|
|
9
|
+
declare const PRESETS: Record<PresetName, ResolvedPalette>;
|
|
10
|
+
declare const resolvePalette: (input: PresetName | MascotPaletteInput) => ResolvedPalette;
|
|
11
|
+
|
|
12
|
+
export { type PresetName as P, type ResolvedPalette as R, PRESETS as a, deriveDormant as d, resolvePalette as r };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { MascotPalette, MascotPaletteInput } from '@usedocent/shared';
|
|
2
|
+
|
|
3
|
+
type PresetName = 'purple' | 'teal' | 'coral' | 'blue' | 'pink' | 'slate';
|
|
4
|
+
/** Body color mixed 50% toward white. Fallback when a custom palette omits dormantColor. */
|
|
5
|
+
declare const deriveDormant: (hex: string) => string;
|
|
6
|
+
type ResolvedPalette = {
|
|
7
|
+
[K in keyof MascotPalette]-?: string;
|
|
8
|
+
};
|
|
9
|
+
declare const PRESETS: Record<PresetName, ResolvedPalette>;
|
|
10
|
+
declare const resolvePalette: (input: PresetName | MascotPaletteInput) => ResolvedPalette;
|
|
11
|
+
|
|
12
|
+
export { type PresetName as P, type ResolvedPalette as R, PRESETS as a, deriveDormant as d, resolvePalette as r };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { MascotState, MascotPaletteInput } from '@usedocent/shared';
|
|
2
|
+
import { P as PresetName } from './presets-CAad3bCd.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The shared implementation behind every *rendered* presence: Lumen and each entry in the
|
|
6
|
+
* library. A rendered presence is a set of pre-rendered frames rather than drawn shapes, which
|
|
7
|
+
* is what keeps its material and its light, and it is why the three no-ops below exist.
|
|
8
|
+
*
|
|
9
|
+
* Dot is the drawn presence and is not built on this.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* One frame per state, plus `blink`: the closed-eye half of a two-frame blink. Blink is not a
|
|
13
|
+
* state, it is swapped over the current frame for a moment on a timer, which is what stops an
|
|
14
|
+
* awake character reading as a still photograph. Dot gets the same effect from a CSS scaleY.
|
|
15
|
+
*
|
|
16
|
+
* Data URIs, inlined by the generator so a host needs no asset pipeline.
|
|
17
|
+
*/
|
|
18
|
+
type SpriteSet = Record<MascotState, string> & {
|
|
19
|
+
/** Optional: a presence without one simply does not blink. Lumen currently has none. */
|
|
20
|
+
blink?: string;
|
|
21
|
+
/**
|
|
22
|
+
* True when `listening` is an animated WebP loop rather than a still. Such a presence breathes
|
|
23
|
+
* and blinks inside the image itself, so the CSS bob and the two-frame blink stand down.
|
|
24
|
+
*/
|
|
25
|
+
animated?: boolean;
|
|
26
|
+
};
|
|
27
|
+
interface RenderedOptions {
|
|
28
|
+
size?: 40 | 56 | 64;
|
|
29
|
+
state?: MascotState;
|
|
30
|
+
label?: string;
|
|
31
|
+
/** Accepted so a rendered presence satisfies the shared mascot options, and ignored. */
|
|
32
|
+
palette?: PresetName | MascotPaletteInput;
|
|
33
|
+
}
|
|
34
|
+
/** Identical surface to DotHandle, so a host can swap presences without touching call sites. */
|
|
35
|
+
interface RenderedHandle {
|
|
36
|
+
readonly el: SVGSVGElement;
|
|
37
|
+
readonly state: MascotState;
|
|
38
|
+
setState(next: MascotState): void;
|
|
39
|
+
/**
|
|
40
|
+
* No-op, deliberately. Rendered frames have no fill to re-colour, so this presence keeps its
|
|
41
|
+
* own identity in every app. Dot is the tintable one. The method stays because the shared
|
|
42
|
+
* handle requires it, and a silent partial re-colour would be worse than none.
|
|
43
|
+
*/
|
|
44
|
+
setPalette(p: PresetName | MascotPaletteInput): void;
|
|
45
|
+
setAmplitude(v: number): void;
|
|
46
|
+
/**
|
|
47
|
+
* Reduced to which side the character faces, not a free angle: the pointing frame is art, and
|
|
48
|
+
* art cannot rotate to an arbitrary bearing the way Dot's drawn arm can.
|
|
49
|
+
*/
|
|
50
|
+
setAim(deg: number): void;
|
|
51
|
+
/** No-op. The eyes are baked into each frame and cannot track a target. */
|
|
52
|
+
setAttention(dx: number, dy: number): void;
|
|
53
|
+
setSize(px: 40 | 56 | 64): void;
|
|
54
|
+
setQuiet(on: boolean): void;
|
|
55
|
+
setDragging(on: boolean): void;
|
|
56
|
+
destroy(): void;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Markup for a rendered presence. The root stays an `<svg>` even though the frames are raster:
|
|
60
|
+
* it keeps `el` an `SVGSVGElement`, so this satisfies the same handle as Dot. Every frame is
|
|
61
|
+
* present at mount and CSS cross-fades between them; the frames share one bounding box, so a
|
|
62
|
+
* state change never shifts the character.
|
|
63
|
+
*/
|
|
64
|
+
declare const renderedMarkup: (sprites: SpriteSet, prefix: string) => string;
|
|
65
|
+
/** State machine for a rendered presence, scoped to `prefix` so two can coexist. */
|
|
66
|
+
declare const renderedStyles: (prefix: string) => string;
|
|
67
|
+
/** 0deg points right, matching Dot's arm convention; the left half of the circle faces left. */
|
|
68
|
+
declare const facingFor: (deg: number) => "left" | "right";
|
|
69
|
+
declare const createRenderedMascot: (host: HTMLElement | ShadowRoot, sprites: SpriteSet, prefix: string, options?: RenderedOptions) => RenderedHandle;
|
|
70
|
+
|
|
71
|
+
export { type RenderedOptions as R, type SpriteSet as S, type RenderedHandle as a, renderedStyles as b, createRenderedMascot as c, facingFor as f, renderedMarkup as r };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { MascotState, MascotPaletteInput } from '@usedocent/shared';
|
|
2
|
+
import { P as PresetName } from './presets-CAad3bCd.cjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The shared implementation behind every *rendered* presence: Lumen and each entry in the
|
|
6
|
+
* library. A rendered presence is a set of pre-rendered frames rather than drawn shapes, which
|
|
7
|
+
* is what keeps its material and its light, and it is why the three no-ops below exist.
|
|
8
|
+
*
|
|
9
|
+
* Dot is the drawn presence and is not built on this.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* One frame per state, plus `blink`: the closed-eye half of a two-frame blink. Blink is not a
|
|
13
|
+
* state, it is swapped over the current frame for a moment on a timer, which is what stops an
|
|
14
|
+
* awake character reading as a still photograph. Dot gets the same effect from a CSS scaleY.
|
|
15
|
+
*
|
|
16
|
+
* Data URIs, inlined by the generator so a host needs no asset pipeline.
|
|
17
|
+
*/
|
|
18
|
+
type SpriteSet = Record<MascotState, string> & {
|
|
19
|
+
/** Optional: a presence without one simply does not blink. Lumen currently has none. */
|
|
20
|
+
blink?: string;
|
|
21
|
+
/**
|
|
22
|
+
* True when `listening` is an animated WebP loop rather than a still. Such a presence breathes
|
|
23
|
+
* and blinks inside the image itself, so the CSS bob and the two-frame blink stand down.
|
|
24
|
+
*/
|
|
25
|
+
animated?: boolean;
|
|
26
|
+
};
|
|
27
|
+
interface RenderedOptions {
|
|
28
|
+
size?: 40 | 56 | 64;
|
|
29
|
+
state?: MascotState;
|
|
30
|
+
label?: string;
|
|
31
|
+
/** Accepted so a rendered presence satisfies the shared mascot options, and ignored. */
|
|
32
|
+
palette?: PresetName | MascotPaletteInput;
|
|
33
|
+
}
|
|
34
|
+
/** Identical surface to DotHandle, so a host can swap presences without touching call sites. */
|
|
35
|
+
interface RenderedHandle {
|
|
36
|
+
readonly el: SVGSVGElement;
|
|
37
|
+
readonly state: MascotState;
|
|
38
|
+
setState(next: MascotState): void;
|
|
39
|
+
/**
|
|
40
|
+
* No-op, deliberately. Rendered frames have no fill to re-colour, so this presence keeps its
|
|
41
|
+
* own identity in every app. Dot is the tintable one. The method stays because the shared
|
|
42
|
+
* handle requires it, and a silent partial re-colour would be worse than none.
|
|
43
|
+
*/
|
|
44
|
+
setPalette(p: PresetName | MascotPaletteInput): void;
|
|
45
|
+
setAmplitude(v: number): void;
|
|
46
|
+
/**
|
|
47
|
+
* Reduced to which side the character faces, not a free angle: the pointing frame is art, and
|
|
48
|
+
* art cannot rotate to an arbitrary bearing the way Dot's drawn arm can.
|
|
49
|
+
*/
|
|
50
|
+
setAim(deg: number): void;
|
|
51
|
+
/** No-op. The eyes are baked into each frame and cannot track a target. */
|
|
52
|
+
setAttention(dx: number, dy: number): void;
|
|
53
|
+
setSize(px: 40 | 56 | 64): void;
|
|
54
|
+
setQuiet(on: boolean): void;
|
|
55
|
+
setDragging(on: boolean): void;
|
|
56
|
+
destroy(): void;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Markup for a rendered presence. The root stays an `<svg>` even though the frames are raster:
|
|
60
|
+
* it keeps `el` an `SVGSVGElement`, so this satisfies the same handle as Dot. Every frame is
|
|
61
|
+
* present at mount and CSS cross-fades between them; the frames share one bounding box, so a
|
|
62
|
+
* state change never shifts the character.
|
|
63
|
+
*/
|
|
64
|
+
declare const renderedMarkup: (sprites: SpriteSet, prefix: string) => string;
|
|
65
|
+
/** State machine for a rendered presence, scoped to `prefix` so two can coexist. */
|
|
66
|
+
declare const renderedStyles: (prefix: string) => string;
|
|
67
|
+
/** 0deg points right, matching Dot's arm convention; the left half of the circle faces left. */
|
|
68
|
+
declare const facingFor: (deg: number) => "left" | "right";
|
|
69
|
+
declare const createRenderedMascot: (host: HTMLElement | ShadowRoot, sprites: SpriteSet, prefix: string, options?: RenderedOptions) => RenderedHandle;
|
|
70
|
+
|
|
71
|
+
export { type RenderedOptions as R, type SpriteSet as S, type RenderedHandle as a, renderedStyles as b, createRenderedMascot as c, facingFor as f, renderedMarkup as r };
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@usedocent/mascot",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.cjs",
|
|
6
|
+
"module": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"require": "./dist/index.cjs"
|
|
13
|
+
},
|
|
14
|
+
"./lumen": {
|
|
15
|
+
"types": "./dist/lumen-index.d.ts",
|
|
16
|
+
"import": "./dist/lumen-index.js",
|
|
17
|
+
"require": "./dist/lumen-index.cjs"
|
|
18
|
+
},
|
|
19
|
+
"./library": {
|
|
20
|
+
"types": "./dist/library/index.d.ts",
|
|
21
|
+
"import": "./dist/library/index.js",
|
|
22
|
+
"require": "./dist/library/index.cjs"
|
|
23
|
+
},
|
|
24
|
+
"./library/loaders": {
|
|
25
|
+
"types": "./dist/library/loaders.d.ts",
|
|
26
|
+
"import": "./dist/library/loaders.js",
|
|
27
|
+
"require": "./dist/library/loaders.cjs"
|
|
28
|
+
},
|
|
29
|
+
"./library/*": {
|
|
30
|
+
"types": "./dist/library/*.d.ts",
|
|
31
|
+
"import": "./dist/library/*.js",
|
|
32
|
+
"require": "./dist/library/*.cjs"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist",
|
|
37
|
+
"!dist/**/*.map"
|
|
38
|
+
],
|
|
39
|
+
"sideEffects": false,
|
|
40
|
+
"scripts": {
|
|
41
|
+
"build": "tsup",
|
|
42
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
43
|
+
"test": "vitest run",
|
|
44
|
+
"lint": "eslint src",
|
|
45
|
+
"storybook": "storybook dev -p 6006",
|
|
46
|
+
"build-storybook": "storybook build",
|
|
47
|
+
"gen:library": "node scripts/gen-library.mjs"
|
|
48
|
+
},
|
|
49
|
+
"dependencies": {},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@usedocent/shared": "workspace:*",
|
|
52
|
+
"@storybook/html-vite": "^9.0.0",
|
|
53
|
+
"jsdom": "^26.0.0",
|
|
54
|
+
"storybook": "^9.0.0",
|
|
55
|
+
"tsup": "^8.3.5",
|
|
56
|
+
"typescript": "^5.7.3",
|
|
57
|
+
"vite": "^6.0.11",
|
|
58
|
+
"vitest": "^3.0.4"
|
|
59
|
+
},
|
|
60
|
+
"description": "Dot and the Docent presence library: SVG and CSS mascots with one shared state machine.",
|
|
61
|
+
"license": "UNLICENSED",
|
|
62
|
+
"publishConfig": {
|
|
63
|
+
"access": "public"
|
|
64
|
+
},
|
|
65
|
+
"repository": {
|
|
66
|
+
"type": "git",
|
|
67
|
+
"url": "git+https://github.com/usedocent/docent.git",
|
|
68
|
+
"directory": "packages/mascot"
|
|
69
|
+
},
|
|
70
|
+
"homepage": "https://usedocent.com"
|
|
71
|
+
}
|