{"_id":"@3sln/dodo","_rev":"11-2848b1aeed00534641e2c6ab99980784","name":"@3sln/dodo","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"@3sln/dodo","version":"0.0.1","keywords":["vdom","virtual dom","ui","declarative"],"author":"Ray Stubbs","license":"MIT","_id":"@3sln/dodo@0.0.1","maintainers":[{"name":"ray.3sln","email":"contact+npm@3sln.com"}],"dist":{"shasum":"905d3b7c21ca2b9e8da66ef68552d2258e90b58b","tarball":"https://registry.npmjs.org/@3sln/dodo/-/dodo-0.0.1.tgz","fileCount":8,"integrity":"sha512-3L09AIC7lUIYVs0bX5zqpfIK9nurcNGCuC3pIwxWeiym/ehP1pw4kvpFSQkCh08/oiOZcEd048JaRXJutQ2vBQ==","signatures":[{"sig":"MEYCIQCcrIGLQe53PjHZKI/OQcqL/Fn2dMKUBWvR0tq2aqesGAIhAMMjzu1XOBw6rZSsGsa259+ZUiNIg3C2uLOImtKZynLz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56404},"main":"index.js","type":"module","shasum":"905d3b7c21ca2b9e8da66ef68552d2258e90b58b","_npmUser":{"name":"ray.3sln","email":"contact+npm@3sln.com"},"_integrity":"sha512-3L09AIC7lUIYVs0bX5zqpfIK9nurcNGCuC3pIwxWeiym/ehP1pw4kvpFSQkCh08/oiOZcEd048JaRXJutQ2vBQ==","repository":{"url":"https://github.com/3sln/dodo.git","type":"git"},"_npmVersion":"10.8.3","description":"A minimal, configurable virtual DOM library.","directories":{},"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"happy-dom":"^18.0.1","@types/bun":"latest"},"_npmOperationalInternal":{"tmp":"tmp/dodo_0.0.1_1759796595252_0.08730674300021879","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@3sln/dodo","version":"0.0.2","keywords":["vdom","virtual dom","ui","declarative"],"author":"Ray Stubbs","license":"MIT","_id":"@3sln/dodo@0.0.2","maintainers":[{"name":"ray.3sln","email":"contact+npm@3sln.com"}],"dist":{"shasum":"bc23d770b77d3f5886cda3981454f8f0b7aa7e42","tarball":"https://registry.npmjs.org/@3sln/dodo/-/dodo-0.0.2.tgz","fileCount":8,"integrity":"sha512-bjbV4f2gEGQ9ueadFH1V+sk2IVFvRkoByxR23/CV1PAlOujnRNDWRqQGv9wN3o0AP5OIhyFdQIkGqo/TYAKjhg==","signatures":[{"sig":"MEUCIDaIsk2YJNdx3Hnv1c3pcSQ0wfz4MYXDJdaCslrYnE+OAiEA7K3aUzaq3BX7uioHrNJAr768uepK1YKoJO47AQNU8ts=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56860},"main":"index.js","type":"module","shasum":"bc23d770b77d3f5886cda3981454f8f0b7aa7e42","_npmUser":{"name":"ray.3sln","email":"contact+npm@3sln.com"},"_integrity":"sha512-bjbV4f2gEGQ9ueadFH1V+sk2IVFvRkoByxR23/CV1PAlOujnRNDWRqQGv9wN3o0AP5OIhyFdQIkGqo/TYAKjhg==","repository":{"url":"https://github.com/3sln/dodo.git","type":"git"},"_npmVersion":"10.8.3","description":"A minimal, configurable virtual DOM library.","directories":{},"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"happy-dom":"^18.0.1","@types/bun":"latest"},"_npmOperationalInternal":{"tmp":"tmp/dodo_0.0.2_1759820915086_0.29939361772953443","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@3sln/dodo","version":"0.0.3","keywords":["vdom","virtual dom","ui","declarative"],"author":"Ray Stubbs","license":"MIT","_id":"@3sln/dodo@0.0.3","maintainers":[{"name":"ray.3sln","email":"contact+npm@3sln.com"}],"dist":{"shasum":"e5e3a25e8e4596e88e95df8fe802a1380d106752","tarball":"https://registry.npmjs.org/@3sln/dodo/-/dodo-0.0.3.tgz","fileCount":8,"integrity":"sha512-yxvKTGJpf7hPg3fN3R6QHaA2Ro1GINhnW087+fx3IJt2Iy9f9p807zcG1K3AyTuVw2eP/TZEa7SSD2aRl1tBaQ==","signatures":[{"sig":"MEQCID5IlIYb4Ni3QGgb1b+dy7N/1mZrXXdmtJa3ZllR+a19AiA/tDJLJds0Mzk5T2FVfiGEtMbqnK/85u6eQwcbPUqGZQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57742},"main":"index.js","type":"module","shasum":"e5e3a25e8e4596e88e95df8fe802a1380d106752","_npmUser":{"name":"ray.3sln","email":"contact+npm@3sln.com"},"_integrity":"sha512-yxvKTGJpf7hPg3fN3R6QHaA2Ro1GINhnW087+fx3IJt2Iy9f9p807zcG1K3AyTuVw2eP/TZEa7SSD2aRl1tBaQ==","repository":{"url":"https://github.com/3sln/dodo.git","type":"git"},"_npmVersion":"10.8.3","description":"A minimal, configurable virtual DOM library.","directories":{},"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"happy-dom":"^18.0.1","@types/bun":"latest"},"_npmOperationalInternal":{"tmp":"tmp/dodo_0.0.3_1759821943440_0.1890963633028564","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@3sln/dodo","version":"0.0.4","keywords":["vdom","virtual dom","ui","declarative"],"author":"Ray Stubbs","license":"MIT","_id":"@3sln/dodo@0.0.4","maintainers":[{"name":"ray.3sln","email":"contact+npm@3sln.com"}],"dist":{"shasum":"920a13d1923e58fa8bc99413d80640babe567fda","tarball":"https://registry.npmjs.org/@3sln/dodo/-/dodo-0.0.4.tgz","fileCount":8,"integrity":"sha512-5E2jnHnngrVXQ/nt+fG/13ZDTVdgEfymBNkDreKguWrR6oEaKnOdMvp+mMcBZKfGzShnZqrR4ljyuL1qSYsm0g==","signatures":[{"sig":"MEQCIAmIUP1/JKiRiLJWxggqK+7l46kxGcGhc0//KIUwofVDAiA0HkPwo/JEBxK8ObooblAGaeEdNCNH+BZCerIrjn1idg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57874},"main":"index.js","type":"module","shasum":"920a13d1923e58fa8bc99413d80640babe567fda","scripts":{"format":"prettier -w \"**/*.js\""},"_npmUser":{"name":"ray.3sln","email":"contact+npm@3sln.com"},"_integrity":"sha512-5E2jnHnngrVXQ/nt+fG/13ZDTVdgEfymBNkDreKguWrR6oEaKnOdMvp+mMcBZKfGzShnZqrR4ljyuL1qSYsm0g==","repository":{"url":"https://github.com/3sln/dodo.git","type":"git"},"_npmVersion":"10.8.3","description":"A minimal, configurable virtual DOM library.","directories":{},"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.6.2","happy-dom":"^18.0.1","@types/bun":"latest"},"_npmOperationalInternal":{"tmp":"tmp/dodo_0.0.4_1760069746641_0.5604395502926593","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@3sln/dodo","version":"0.0.5","keywords":["vdom","virtual dom","ui","declarative"],"author":"Ray Stubbs","license":"MIT","_id":"@3sln/dodo@0.0.5","maintainers":[{"name":"ray.3sln","email":"contact+npm@3sln.com"}],"dist":{"shasum":"4ed523e98399c2259e8a80e2402f0cf36c04ce18","tarball":"https://registry.npmjs.org/@3sln/dodo/-/dodo-0.0.5.tgz","fileCount":7,"integrity":"sha512-25u0zYWe0Cf9YPeJnUyKsnSY4HPJiQWHRz8TYBASmMuDdGCtLsDYDSbIsLHjIsnhBpq4ltG2tHxPQGYxG+02RQ==","signatures":[{"sig":"MEQCICcwPjuOK1FjJeCN5C9+n/pTJVbM0XjOpf70IIwQOC07AiADv4VoU1zkgFUA27wYLTlMKDrPCRYUbYTu30WkE4lSWQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40626},"main":"index.js","type":"module","shasum":"4ed523e98399c2259e8a80e2402f0cf36c04ce18","scripts":{"format":"prettier -w \"**/*.js\""},"_npmUser":{"name":"ray.3sln","email":"contact+npm@3sln.com"},"_integrity":"sha512-25u0zYWe0Cf9YPeJnUyKsnSY4HPJiQWHRz8TYBASmMuDdGCtLsDYDSbIsLHjIsnhBpq4ltG2tHxPQGYxG+02RQ==","repository":{"url":"https://github.com/3sln/dodo.git","type":"git"},"_npmVersion":"10.8.3","description":"A minimal, configurable virtual DOM library.","directories":{},"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.6.2","happy-dom":"^18.0.1","@types/bun":"latest"},"_npmOperationalInternal":{"tmp":"tmp/dodo_0.0.5_1760306996767_0.8525836201387844","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"@3sln/dodo","version":"0.0.6","keywords":["vdom","virtual dom","ui","declarative"],"author":"Ray Stubbs","license":"MIT","_id":"@3sln/dodo@0.0.6","maintainers":[{"name":"ray.3sln","email":"contact+npm@3sln.com"}],"dist":{"shasum":"de52f059048d5d870e2ec1be81f8c153abe802b8","tarball":"https://registry.npmjs.org/@3sln/dodo/-/dodo-0.0.6.tgz","fileCount":7,"integrity":"sha512-6qphW9upPZNJergygI5YYMCQKX3reT8Hnber/2eoSJgEBAEjO1NvGfIlX65zoBUPkS4jWChzS244VxSgUm+GfA==","signatures":[{"sig":"MEUCIQDiZn+953jO9heyRidkK6tbK0/pA0LiiLcTXHnzdKzxbgIgbW9enppLnSg0B09SXthsY/o/F7mFqJyzoX0RNOUVfTk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36233},"main":"index.js","type":"module","shasum":"de52f059048d5d870e2ec1be81f8c153abe802b8","scripts":{"format":"prettier -w \"**/*.js\""},"_npmUser":{"name":"ray.3sln","email":"contact+npm@3sln.com"},"_integrity":"sha512-6qphW9upPZNJergygI5YYMCQKX3reT8Hnber/2eoSJgEBAEjO1NvGfIlX65zoBUPkS4jWChzS244VxSgUm+GfA==","repository":{"url":"https://github.com/3sln/dodo.git","type":"git"},"_npmVersion":"10.8.3","description":"A minimal, configurable virtual DOM library.","directories":{},"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.6.2","happy-dom":"^18.0.1","@types/bun":"latest"},"_npmOperationalInternal":{"tmp":"tmp/dodo_0.0.6_1760309901493_0.9329992142810364","host":"s3://npm-registry-packages-npm-production"}},"0.0.7":{"name":"@3sln/dodo","version":"0.0.7","keywords":["vdom","virtual dom","ui","declarative"],"author":"Ray Stubbs","license":"MIT","_id":"@3sln/dodo@0.0.7","maintainers":[{"name":"ray.3sln","email":"contact+npm@3sln.com"}],"dist":{"shasum":"98fbbda9504237b7dab4ad6fcb5572ed495ca24a","tarball":"https://registry.npmjs.org/@3sln/dodo/-/dodo-0.0.7.tgz","fileCount":7,"integrity":"sha512-ya54d1yYve3kHd2OkElFxzdbIB/qNghjZH4e8Q+0Zdl7ZLHBZAVRKttgvOVu6XOzWwcsnJJiSYdBWsk+rqPnuA==","signatures":[{"sig":"MEYCIQC+HKQ3gMnAYM5lFpgPT+3RsE2eeDKMPHYSvfJZM4zfhgIhAO1CpOMEGIIeAa/lQ7aQJGLdFSQIa4XUnCEJRJznmGUO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36058},"main":"index.js","type":"module","shasum":"98fbbda9504237b7dab4ad6fcb5572ed495ca24a","scripts":{"format":"prettier -w \"**/*.js\""},"_npmUser":{"name":"ray.3sln","email":"contact+npm@3sln.com"},"_integrity":"sha512-ya54d1yYve3kHd2OkElFxzdbIB/qNghjZH4e8Q+0Zdl7ZLHBZAVRKttgvOVu6XOzWwcsnJJiSYdBWsk+rqPnuA==","repository":{"url":"https://github.com/3sln/dodo.git","type":"git"},"_npmVersion":"10.8.3","description":"A minimal, configurable virtual DOM library.","directories":{},"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.6.2","happy-dom":"^18.0.1","@types/bun":"latest"},"_npmOperationalInternal":{"tmp":"tmp/dodo_0.0.7_1760334833705_0.4921999388025151","host":"s3://npm-registry-packages-npm-production"}},"0.0.8":{"name":"@3sln/dodo","version":"0.0.8","keywords":["vdom","virtual dom","ui","declarative"],"author":"Ray Stubbs","license":"MIT","_id":"@3sln/dodo@0.0.8","maintainers":[{"name":"ray.3sln","email":"contact+npm@3sln.com"}],"dist":{"shasum":"540fe3a0e794719c7ff0bfb6561688a2db95f947","tarball":"https://registry.npmjs.org/@3sln/dodo/-/dodo-0.0.8.tgz","fileCount":7,"integrity":"sha512-P/AsLX0tWm129L9/ai+01TVuSFXkvyJVjVXENHiEyumRRbo415q8g84636cSslM8iDg/vmGXWIhCkxiOBsUP2A==","signatures":[{"sig":"MEQCIFPYAqTb8BN4AnjthNTgO39D3TMsjvMWbIq1bomYbI4NAiB6n6e29MffkAepG8CX2wYADnM7YEJ1PBA+c95K10Xpdg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36196},"main":"index.js","type":"module","shasum":"540fe3a0e794719c7ff0bfb6561688a2db95f947","scripts":{"format":"prettier -w \"**/*.js\""},"_npmUser":{"name":"ray.3sln","email":"contact+npm@3sln.com"},"_integrity":"sha512-P/AsLX0tWm129L9/ai+01TVuSFXkvyJVjVXENHiEyumRRbo415q8g84636cSslM8iDg/vmGXWIhCkxiOBsUP2A==","repository":{"url":"https://github.com/3sln/dodo.git","type":"git"},"_npmVersion":"10.8.3","description":"A minimal, configurable virtual DOM library.","directories":{},"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.6.2","happy-dom":"^18.0.1","@types/bun":"latest"},"_npmOperationalInternal":{"tmp":"tmp/dodo_0.0.8_1767307001416_0.4220683943021897","host":"s3://npm-registry-packages-npm-production"}},"0.0.9":{"name":"@3sln/dodo","version":"0.0.9","keywords":["vdom","virtual dom","ui","declarative"],"author":"Ray Stubbs","license":"MIT","_id":"@3sln/dodo@0.0.9","maintainers":[{"name":"ray.3sln","email":"contact+npm@3sln.com"}],"dist":{"shasum":"5fb616c37f8dbe9ed6717013d5d0e7b02835cdb9","tarball":"https://registry.npmjs.org/@3sln/dodo/-/dodo-0.0.9.tgz","fileCount":7,"integrity":"sha512-d0PVcdMTo6rL6+8lcdYGVKlO1LXWlfNe41RbCPP/UE4JYmzdqisp+sBecEYeSRxTLpu0olw7k+BiZ/cdihyKMw==","signatures":[{"sig":"MEYCIQC2hTm6Oyl1XAiNO5vbCfm9V8o6GUqLPEGmPOD5mtim3wIhAKGDAgmaAH3Fq8dch48s5XV2RGB0BpdwuyUEIF6IL83G","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36658},"main":"index.js","type":"module","shasum":"5fb616c37f8dbe9ed6717013d5d0e7b02835cdb9","scripts":{"format":"prettier -w \"**/*.js\""},"_npmUser":{"name":"ray.3sln","email":"contact+npm@3sln.com"},"_integrity":"sha512-d0PVcdMTo6rL6+8lcdYGVKlO1LXWlfNe41RbCPP/UE4JYmzdqisp+sBecEYeSRxTLpu0olw7k+BiZ/cdihyKMw==","repository":{"url":"https://github.com/3sln/dodo.git","type":"git"},"_npmVersion":"10.8.3","description":"A minimal, configurable virtual DOM library.","directories":{},"_nodeVersion":"24.3.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.6.2","happy-dom":"^18.0.1","@types/bun":"latest"},"_npmOperationalInternal":{"tmp":"tmp/dodo_0.0.9_1767590701489_0.583686458530273","host":"s3://npm-registry-packages-npm-production"}},"0.0.10":{"name":"@3sln/dodo","version":"0.0.10","keywords":["vdom","virtual dom","ui","declarative","reactive","context"],"author":{"name":"Ray Stubbs"},"license":"MIT","_id":"@3sln/dodo@0.0.10","maintainers":[{"name":"ray.3sln","email":"contact+npm@3sln.com"}],"homepage":"https://github.com/3sln/dodo#readme","bugs":{"url":"https://github.com/3sln/dodo/issues"},"dist":{"shasum":"c8372c35716130586b0efda5a8ee6999209f39ae","tarball":"https://registry.npmjs.org/@3sln/dodo/-/dodo-0.0.10.tgz","fileCount":19,"integrity":"sha512-bkZPspzCby0Q1PoRtXAoNcqQFTK0tNEddLxpGC1FaKXXfffUwJfkw1bXxWUxPQEtddlgW7r16c/myhcXnPHURg==","signatures":[{"sig":"MEUCIQDzEfQElSvGHykp8nTfvdwUAv4hO5jhbzsX+TyypziGKAIgN6VPqCZLc+4A34SJySavbJBg7Tj5HJldrI+3bUsFX7s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@3sln%2fdodo@0.0.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":111246},"main":"index.js","type":"module","exports":{".":"./index.js","./src/*":"./src/*","./style":"./style.js","./animate":"./animate.js","./context":"./context.js","./observe":"./observe.js","./reactive":"./reactive.js","./package.json":"./package.json"},"gitHead":"aac96f12fa8edda5a9ff244c8ebe0bc9df574ad8","scripts":{"test":"bun test","format":"prettier -w \"**/*.js\""},"_npmUser":{"name":"ray.3sln","email":"contact+npm@3sln.com"},"repository":{"url":"git+https://github.com/3sln/dodo.git","type":"git"},"_npmVersion":"10.9.8","description":"A minimal, configurable virtual DOM library.","directories":{},"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"prettier":"^3.6.2","happy-dom":"^18.0.1","@types/bun":"latest"},"_npmOperationalInternal":{"tmp":"tmp/dodo_0.0.10_1785172332881_0.32608789734599775","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@3sln/dodo","version":"0.1.0","description":"A minimal, configurable virtual DOM library.","main":"index.js","type":"module","author":{"name":"Ray Stubbs"},"repository":{"type":"git","url":"git+https://github.com/3sln/dodo.git"},"license":"MIT","keywords":["vdom","virtual dom","ui","declarative","reactive","context"],"exports":{".":"./index.js","./reactive":"./reactive.js","./context":"./context.js","./observe":"./observe.js","./animate":"./animate.js","./style":"./style.js","./src/*":"./src/*","./package.json":"./package.json"},"devDependencies":{"@types/bun":"latest","@web/test-runner":"^1.0.0","@web/test-runner-playwright":"^1.0.0","chai":"^6.2.2","playwright":"^1.62.1","prettier":"^3.6.2"},"publishConfig":{"access":"public"},"scripts":{"test":"web-test-runner","format":"prettier -w \"**/*.js\"","test:watch":"web-test-runner --watch","test:coverage":"web-test-runner --coverage"},"_id":"@3sln/dodo@0.1.0","gitHead":"6e6fb16361c32eb4c1b5ef9c6d8f0f092d8e7bd6","bugs":{"url":"https://github.com/3sln/dodo/issues"},"homepage":"https://github.com/3sln/dodo#readme","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-e+kuIitDQfRU8qOE1OMEdrUMYWv2g3X43/KEQ6EvPuRNOpIdVTISjAO8ewMVqplV16x2vggo2SozfoSeRqutmw==","shasum":"e927fe20dd60b33ddae4bd76b70a0a5dade7460e","tarball":"https://registry.npmjs.org/@3sln/dodo/-/dodo-0.1.0.tgz","fileCount":19,"unpackedSize":121816,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@3sln%2fdodo@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCZwgJA5mkoOcjzWeavENiYeDYuGWrPff0arlxCBgcFxwIhALWxTQZeyBdVlKKwKLbORCZwAH61FxMWXRWdoB7HPp1/"}]},"_npmUser":{"name":"ray.3sln","email":"contact+npm@3sln.com"},"directories":{},"maintainers":[{"name":"ray.3sln","email":"contact+npm@3sln.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dodo_0.1.0_1785725522151_0.14024901383949273"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-07T00:23:15.163Z","modified":"2026-08-03T02:52:02.638Z","0.0.1":"2025-10-07T00:23:15.453Z","0.0.2":"2025-10-07T07:08:35.273Z","0.0.3":"2025-10-07T07:25:43.671Z","0.0.4":"2025-10-10T04:15:46.840Z","0.0.5":"2025-10-12T22:09:56.968Z","0.0.6":"2025-10-12T22:58:21.696Z","0.0.7":"2025-10-13T05:53:53.927Z","0.0.8":"2026-01-01T22:36:41.572Z","0.0.9":"2026-01-05T05:25:01.637Z","0.0.10":"2026-07-27T17:12:13.035Z","0.1.0":"2026-08-03T02:52:02.290Z"},"bugs":{"url":"https://github.com/3sln/dodo/issues"},"author":{"name":"Ray Stubbs"},"license":"MIT","homepage":"https://github.com/3sln/dodo#readme","keywords":["vdom","virtual dom","ui","declarative","reactive","context"],"repository":{"type":"git","url":"git+https://github.com/3sln/dodo.git"},"description":"A minimal, configurable virtual DOM library.","maintainers":[{"name":"ray.3sln","email":"contact+npm@3sln.com"}],"readme":"# Dodo\n\n> [!WARNING]\n> This is a work-in-progress project and is not yet ready for production use.\n\nA minimal, configurable virtual DOM library.\n\n## Documentation\n\nFor detailed documentation, live demos, and advanced usage examples, please check out the [Dodo Deck](https://dodo.3sln.com).\n\n## Quick Start\n\nInstallation:\n```shell\nnpm install @3sln/dodo\n# or\nbun add @3sln/dodo\n# or\nyarn add @3sln/dodo\n```\n\nBasic usage:\n```javascript\nimport { reconcile, h1, p, div } from '@3sln/dodo';\n\nconst container = document.getElementById('root');\n\n// Use helper functions like h1(), p(), etc. for standard elements.\n// A tag is followed by its children, and nothing else.\nconst myVdom = div(\n  h1('Hello, dodo!'),\n  p('This is a paragraph.').classes('lede')\n).props({ id: 'app' });\n\n// Reconcile the virtual DOM with the real DOM.\nreconcile(container, [myVdom]);\n```\n\nEverything about an element — its properties included — is chained onto the\nvnode, and every setter returns the vnode:\n\n```javascript\ndiv('content')\n  .props({ id: 'card' })\n  .style({ 'background-color': 'white', padding: '1em' })\n  .classes('card', isActive && 'active')\n  .attrs({ role: 'group' })\n  .data({ cardId: id })\n  .key(id)\n  .on({ click: onClick });\n```\n\nEach map is compared in its own right rather than by identity, so an object\nliteral rebuilt every render compares equal when its contents have not changed.\n\n## Optional modules\n\nFive modules ship alongside the core. Dodo's core does not import any of them,\nso they cost nothing if you do not use them.\n\n### Reactivity — `@3sln/dodo/reactive`\n\nReactive rendering built on a two method `Cell` protocol:\n\n```javascript\n{ onDirty(fn) -> unsubscribe, getValue() -> any }\n```\n\nDodo does not depend on the observable protocol, on signals, or on any other\nlibrary — it depends on this. Adapters bridge the rest (`fromObservable`,\n`fromSubscribe`, `fromSignal`), and `cell()` is there if you would rather not\nbring anything at all.\n\n```javascript\nimport {reconcile, p} from '@3sln/dodo';\nimport {cell, watch} from '@3sln/dodo/reactive';\n\nconst name = cell('world');\n\nreconcile(container, [watch(name, value => p(`hello ${value}`))]);\n\nname.setValue('dodo'); // re-renders on the next frame\n```\n\n### Context — `@3sln/dodo/context`\n\nDOM-scoped context, so data reaches a descendant without passing through every\ncomponent in between. Providers respect shadow DOM boundaries, and consumers\nname the keys they care about so unrelated changes do not re-render them.\n\n```javascript\nimport {withContext, useContext} from '@3sln/dodo/context';\n\nwithContext({theme: 'dark'},\n  someDeeplyNestedTree(\n    useContext(['theme'], ({theme}) => p(`theme is ${theme}`)),\n  ),\n)\n```\n\n### Observing elements — `@3sln/dodo/observe`\n\n`ResizeObserver` and `IntersectionObserver` as Cells, plus two components built\non them. Observers connect on the first listener and disconnect on the last, so\na detached `watch` takes its observer with it.\n\n```javascript\nimport {withElementSize, withVisibility} from '@3sln/dodo/observe';\n\nwithElementSize(size => canvas().props({width: size.width, height: size.height}))\n\nwithVisibility(visible => (visible ? chart() : skeleton()), {root: '.scroller'})\n```\n\nThe underlying `elementSize` / `elementVisibility` cells are plain functions of\nan element with no dependency on dodo, usable on their own.\n\n### Enter and exit animation — `@3sln/dodo/animate`\n\nHolds an element on screen long enough to animate out, reporting which phase of\nappearing or disappearing it is in. Reversing mid-animation aborts whatever was\nin flight, so a stale completion cannot land later and win.\n\n```javascript\nimport {withPresence} from '@3sln/dodo/animate';\n\nwithPresence(isOpen, phase => panel({phase}), {\n  spawn: {classes: ['fade-in']},\n  despawn: {classes: ['fade-out']},\n  mode: 'remove',\n})\n```\n\nDurations are read from computed style rather than waited on with\n`transitionend`, so a transition that never fires cannot leave a phase stuck.\n\n### Scoped styling — `@3sln/dodo/style`\n\nRenders a subtree into a shadow root with constructable stylesheets adopted, so\nits CSS genuinely cannot leak in either direction.\n\n```javascript\nimport {css, scoped} from '@3sln/dodo/style';\n\nconst styles = css`p { color: rebeccapurple; }`;\n\nscoped({styleSheets: [styles]}, p('scoped'))\n```\n\n`css` is memoised per call site, so writing it inline in a render function does\nnot rebuild the sheet every time.\n\n### Baking your own\n\nThe modules follow the same factory pattern as the rest of the project. If you\nuse a custom dodo instance, or want to replace the scheduler or the error view,\nbuild your own. Context renders through a `watch`, so it requires the reactive\nAPI to be injected — build it once and pass it in:\n\n```javascript\nimport reactive from '@3sln/dodo/src/reactive.js';\nimport context from '@3sln/dodo/src/context.js';\n\nconst userSettings = {dodo: myDodo, schedule: fn => fn()};\n\nconst {watch} = reactive(userSettings);\nconst {withContext, useContext} = context({...userSettings, reactive: {watch}});\n```","readmeFilename":"README.md"}