{"_id":"@sirpepe/ornament","_rev":"42-92bc76db944c2e89625401aa9cb35c45","name":"@sirpepe/ornament","dist-tags":{"latest":"3.1.1"},"versions":{"0.0.1":{"name":"@sirpepe/ornament","version":"0.0.1","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.1","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"dist":{"shasum":"957fa77039be4692e4b2d218faf09a8cdc059d44","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.1.tgz","fileCount":31,"integrity":"sha512-1EpcUt54lqi/OvPNMmtSfow1U6PRN/K6pN2a1iECHovPOOSmpHNiVMkSxmjCwfZlLsLRwwCKb4ggqLJUyVFwTQ==","signatures":[{"sig":"MEUCIGY16BORSh2Zn+KFKZvRRa3N1K7MfDCUPxlKNPeY1SJMAiEAhEcvh+ZLBOen9zPbLT46C650mPPLqKUXdMCDSZT8wuE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":213363},"main":"dist/esm/index.js","type":"module","types":"dist/types","browser":"dist/min/index.min.js","gitHead":"d0c3803b2e3698d59a04afa1c9465e9592ce2f6c","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"_npmVersion":"9.8.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"npm":"^9.7.1","zod":"^3.21.4","sinon":"^15.2.0","uhtml":"^3.2.1","eslint":"^8.41.0","rollup":"^3.25.1","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.17.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.5.2","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.1_1693427240460_0.5697902897850999","host":"s3://npm-registry-packages"}},"0.0.2":{"name":"@sirpepe/ornament","version":"0.0.2","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.2","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"dist":{"shasum":"61dbe51a245a2f784a316f7cd9fcaa23cc367c7b","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.2.tgz","fileCount":24,"integrity":"sha512-OiSRD9PFIJ67cyU3qLuOvEXB03nOBYhBkRJXAN1KrMHkuzdUhOTxLZ4vKFiqgV4pOO5Rt/w+wo4XfvQ5yG2VAw==","signatures":[{"sig":"MEUCIETOSBfBukqw7FAGUb260bMViCBHfxSfvytmZinR+nDrAiEApjJiceWsz1OzAu4zG6bROZEr+JioG4z4SYsrFquJJgw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":163445},"main":"./dist/esm/index.js","type":"module","types":"./dist/types","browser":"./dist/min/index.min.js","exports":{".":{"default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"1cf3170a5d9bcc60ea0e06d17d746c8ce0caf8a4","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"https://github.com//SirPepe/ornament.git","type":"git"},"_npmVersion":"9.8.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"npm":"^9.7.1","zod":"^3.21.4","sinon":"^15.2.0","uhtml":"^3.2.1","eslint":"^8.41.0","rollup":"^3.25.1","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.17.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.5.2","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.2_1693466515058_0.8479465143215796","host":"s3://npm-registry-packages"}},"0.0.3":{"name":"@sirpepe/ornament","version":"0.0.3","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.3","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"dist":{"shasum":"4e608477cc2973c2a788b84093ca1edc6229b8e6","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.3.tgz","fileCount":32,"integrity":"sha512-iXyNMr2wbZQOqLk/PEPOAkGXxqUeqpT/lOKwEqvr8lvysA6niF8dn56xYaAXxhQ801SWtKArhyuPCdcyRr0WjQ==","signatures":[{"sig":"MEUCIG+kD9qvLT6oUyjZc52j+23cvkOw18THz9f8SMev1BUzAiEA5QujRGEoiY4G/tMFss1alJziS0B4guppU2tnssWE4OE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":214823},"main":"dist/esm/index.js","type":"module","types":"dist/types","browser":"dist/min/index.min.js","exports":{".":{"default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"5895e0344bdcddc94fedbded5b1db7b81d3f4c38","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"https://github.com//SirPepe/ornament.git","type":"git"},"_npmVersion":"9.8.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"npm":"^9.7.1","zod":"^3.21.4","sinon":"^15.2.0","uhtml":"^3.2.1","eslint":"^8.41.0","rollup":"^3.25.1","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.17.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.5.2","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.3_1693466770426_0.6361720137798268","host":"s3://npm-registry-packages"}},"0.0.4":{"name":"@sirpepe/ornament","version":"0.0.4","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.4","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"dist":{"shasum":"620cc70f2c4999b3d6392c907d2cace0bb9ad752","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.4.tgz","fileCount":32,"integrity":"sha512-L5/1KR0CjKNNXGbRafCxpGONv7X3TKruTzc2ND5fjQY8jbeaWzJex1hi0iN/bSsdQN98GmEz+NeyHOtb9MT3QA==","signatures":[{"sig":"MEUCIAoRZoZKoE+V+rndvBxnwvXNfWihmAKpuohASiTJzx4EAiEAhhxsFefsqamLa4Sp3Iqj1Rrb+7FWZJyOslu1FBDuyUY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":216522},"main":"dist/esm/index.js","type":"module","types":"dist/types","browser":"dist/min/index.min.js","exports":{".":{"default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"606ff786d79d1c52e686b5182988e55107aea0f6","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"https://github.com//SirPepe/ornament.git","type":"git"},"_npmVersion":"9.8.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"npm":"^9.7.1","zod":"^3.21.4","sinon":"^15.2.0","uhtml":"^3.2.1","eslint":"^8.41.0","rollup":"^3.25.1","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.17.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.5.2","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.4_1693473020143_0.40303468572791656","host":"s3://npm-registry-packages"}},"0.0.5":{"name":"@sirpepe/ornament","version":"0.0.5","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.5","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"d2eff20658ab1c5fd17647cd9ab10da6c2fb7d91","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.5.tgz","fileCount":31,"integrity":"sha512-uzS/gm5yn+MNw9PNlJ4NcjYqPf1A4gjQseeAFHw2kq7XB/dNV7ezm4ayEPuJ5JIWtf0FENysIR7iOeFmA9+K/g==","signatures":[{"sig":"MEYCIQDsOdZCqtkqc4iiv6D5yWuAOR2mkIJz+lRHMbi7ZXyJQQIhAPKuLlT01Sp74iu5cF1Hzxu0JED2YmgiSn3LzSIeISc4","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":214082},"main":"dist/esm/index.js","type":"module","types":"dist/types","browser":"dist/min/index.min.js","exports":{".":{"default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"a97e0bc7f9cecfae5906d7ce753a124d947b7775","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"npm":"^9.7.1","zod":"^3.21.4","sinon":"^15.2.0","uhtml":"^3.2.1","eslint":"^8.41.0","rollup":"^3.25.1","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.17.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.5.2","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.5_1694172852330_0.30312200316258897","host":"s3://npm-registry-packages"}},"0.0.6":{"name":"@sirpepe/ornament","version":"0.0.6","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.6","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"dca5cdae8658f58c2123d5ce21ff3b598bf57da3","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.6.tgz","fileCount":31,"integrity":"sha512-x7lxSJv8eZn1zO+YFIB22FtRvhNWaPvcAbPlOMZaBFxSmSzL6mil6AjP74+wAEm0kK2ZX/hqPqXnpQWLSr+/ag==","signatures":[{"sig":"MEYCIQD2kNHgPQ1V57O+ofjjJ+mInrR5m9vIkeXKvvvY4pT/7gIhAIz4IL1JF1nzCWyIf2AU3BHGvvqWMZQi8PjqJFCOQJlU","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":214108},"main":"dist/esm/index.js","type":"module","types":"dist/types","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"46c119011e5411ed666fa48a781a0caac92a24e8","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.21.4","sinon":"^16.0.0","uhtml":"^3.2.1","eslint":"^8.41.0","rollup":"^3.25.1","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.17.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.5.2","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.6_1694778940199_0.7696074964111164","host":"s3://npm-registry-packages"}},"0.0.7":{"name":"@sirpepe/ornament","version":"0.0.7","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.7","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"5ff2640f2b88a7dee5e5653c74024117412be22d","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.7.tgz","fileCount":34,"integrity":"sha512-1KNWnEOkeCrQ3kT5gcl/cbcJV3gPjJOpLZa36BgAdAbFxEC+/ryq8il+Bm76RPZTKOFLsKA6hvhXukuHhHBxCw==","signatures":[{"sig":"MEQCIHKxrxP7uFvcLVuq16ZYH6xi5rPhY5HEz2wtvLT08UuyAiBnPdXAotGljGT8g9kyZbH7WLFcLJ0eSEEasWiZmncwrQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":228591},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"cd985a90366cbffcb93a325b339fe30cf600d3f3","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","dependencies":{"@web/test-runner-playwright":"^0.10.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.21.4","sinon":"^16.0.0","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^3.25.1","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.17.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.5.2","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.7_1695301421013_0.2860466785702136","host":"s3://npm-registry-packages"}},"0.0.8":{"name":"@sirpepe/ornament","version":"0.0.8","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.8","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"d33cd98d5a633badb85e35ccd6e6f85b3051eb56","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.8.tgz","fileCount":34,"integrity":"sha512-Sn0fTtIFzNkv80SEGFyUjp69kOIRZw6dxtwAqeWQJL1cWIuDKsoLSHNkmXynxzlJXaq3Zrdf8aKhTSzqgoZ8AA==","signatures":[{"sig":"MEUCIQDrGUMUQsBc/ufNRhVKf14ZYKrh74Tnh4wRRgzSK2xUSgIgVGLxJ/gU/QruAB8+IuNC3gVgj2IwtKyyUfHvmcQijQg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":245464},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"66a311d00c25f17403e75a4f7e8651b3d968ebb2","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.21.4","sinon":"^16.0.0","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^3.25.1","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.17.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.5.2","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.10.1","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.8_1695720594568_0.07610641112416694","host":"s3://npm-registry-packages"}},"0.0.9":{"name":"@sirpepe/ornament","version":"0.0.9","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.9","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"0ccdb82f23ffbd983617444a4f91a63e90c469bb","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.9.tgz","fileCount":37,"integrity":"sha512-Q1wbaLKZERbOzwZ0vteDhwjwEgWXM1oBlDqamyzRvrqx13E94il2RiguqnxkuWeJm43pwsdAmTc6bz/cQqwmCw==","signatures":[{"sig":"MEYCIQCAllEaKClbYpNeg0D7D4279CASsqNq9DxgwATTeyEYuQIhAITCRkKfEkhmIU8fW7qvwQTPTsj9bgAKJYPeA8OzHAMJ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":249323},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"e0b83ebcc7b445da90ca65eaed7c58ec0c3f9f18","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.21.4","sinon":"^16.0.0","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^3.25.1","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.17.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.5.2","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.10.1","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.9_1696167440207_0.7736973734651595","host":"s3://npm-registry-packages"}},"0.0.10":{"name":"@sirpepe/ornament","version":"0.0.10","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.10","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"a3e3ddbedaf80d5763f311da8ceaacd1c14112a4","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.10.tgz","fileCount":37,"integrity":"sha512-a7fAtoMjvcJYqw8eAGdGD2Gncof8arxRCkobTxZboxEUTd+YX21Kc7H8UvBpXQbeyBx+bHuVvZ4bvpItjBInjw==","signatures":[{"sig":"MEYCIQDzfIa6hshuLRHLGInQ6A5EoAo8xvHgBfWfc6QAe0qD+wIhAMsnfYmxpx89qBuOnsz/Y9AD5jWcq7kpvFJWKEdKZnfq","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":249348},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"4b4b8ce4669de3ca5c92b9d23f0191e49248c1f4","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.21.4","sinon":"^16.0.0","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^3.25.1","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.17.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.5.2","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.10.1","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.10_1697027363438_0.4176424604164297","host":"s3://npm-registry-packages"}},"0.0.11":{"name":"@sirpepe/ornament","version":"0.0.11","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.11","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"866752bf5a1dede2a142197da9940e5ae119fca0","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.11.tgz","fileCount":37,"integrity":"sha512-S4hMuvV6ZNEZbsn+oaOaUSPHskApI6XzWQHYZTdAXJYNwEau2ypa9R4To6r9ndosSiqs59pUlC7zRU/8oQlpkA==","signatures":[{"sig":"MEUCIQCACXuysX1eA1XZS2es07O8A9UbnMUkDbkv26a+HPrCnQIgSjoQfYibrWED0gOzMaZ2ndxRAGJRfZMMrIwsg61I0Xw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":249348},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"15c0f0068d8cb57ad982de4c2fee4cb21e4b9463","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.21.4","sinon":"^16.0.0","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^3.25.1","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.17.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.5.2","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.10.1","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.11_1697027834429_0.09713103884599117","host":"s3://npm-registry-packages"}},"0.0.12":{"name":"@sirpepe/ornament","version":"0.0.12","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.12","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"604fde6e192bc6c91b7c3cfd51a372036e9eee4d","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.12.tgz","fileCount":37,"integrity":"sha512-/A/zudVtVE4E6wV9jgu06JJMcQ7Qh0uTmJ3Jluw/kRUUfpA8lsr1l2dBRDUTKcQ0SDX8cYDpxgPNJwVA7OCu8g==","signatures":[{"sig":"MEYCIQCrbmlyl0K58TZR1hX9F5y7dMKpJSVEs4AMPSRiUV3YugIhAMVrZtOsV4S95iPVEXagWM3tfLmj9I6fxh26VcwrU8Pj","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":252793},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"cf047a7be0503aa78a7d492d7633925e7100fe8c","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.21.4","sinon":"^16.0.0","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^3.25.1","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.17.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.5.2","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.10.1","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.12_1697801332153_0.7839719099728957","host":"s3://npm-registry-packages"}},"0.0.13":{"name":"@sirpepe/ornament","version":"0.0.13","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.13","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"1efc9e8f0c558e66bd380bd4ba9597083c4de090","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.13.tgz","fileCount":37,"integrity":"sha512-UK7+FSWzh7bL8gr6sX1rhjjEd7XXPGffB4F12yboVpzm1BbYZUeyFQwfKk2zQw5vEW65GxhNGYCBPFku47xGMg==","signatures":[{"sig":"MEUCIQDv7VAXn4Py26a3t2lVYGy3A2PudkorQML8OqU40lP3pwIgS0WiFoq3U+DyI4WmMCuw4Fr02m1xR68kEyiKqa0JAgA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":255410},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"32e19d0b8f2792b19454f6766e25f99096d568bb","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.21.4","sinon":"^17.0.1","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^4.2.0","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.13_1698850497926_0.46470731667522536","host":"s3://npm-registry-packages"}},"0.0.14":{"name":"@sirpepe/ornament","version":"0.0.14","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.14","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"f20bd0fefa72ab50b8e4005f9026687bdf38e6e1","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.14.tgz","fileCount":39,"integrity":"sha512-VFHnVy8xpfeMyL4MM0Ea/APqDcMVOrvvOpiC8ViB1tWzTFfsb37MLcsORRiP3m/fFbXEW1307ZeEB3F/+YHEnA==","signatures":[{"sig":"MEYCIQDDOEyNTSn7oGFHJVX9N1oZVI3woJq9IRUaaV8+fcObigIhAM8/20Bhdg5czpFtNM7XeTew/GrY9CltyGt/xLP+Qp3e","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":257516},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"5334af74283e0889f8795c54bee8f04d3d39610a","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.21.4","sinon":"^17.0.1","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^4.2.0","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.14_1698953827784_0.5207325802776819","host":"s3://npm-registry-packages"}},"0.0.15":{"name":"@sirpepe/ornament","version":"0.0.15","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.15","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"41d26a9152a06607f47c0ebe7602957bf710ba1d","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.15.tgz","fileCount":39,"integrity":"sha512-dmURDF4SPZpL8id55pbpRSsRp+4E2owEJBzfvmZkd5Ypu+tP6Xaufq44LHoxlHWJMllibENnyAi5yX+yFvTpUg==","signatures":[{"sig":"MEUCID+JhS0yT5HS2qmkvYU2weSHsACjujRNvFWqZcjLldCDAiEAyloAW79kC4K84Z7E8WrUBHfMXs4vtI8x4y2CYqFL/CI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":259766},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"7ada480d0ef50c8d0c59bed123202243bd71839c","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.21.4","sinon":"^17.0.1","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^4.2.0","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.15_1698964403285_0.29572137279468524","host":"s3://npm-registry-packages"}},"0.0.16":{"name":"@sirpepe/ornament","version":"0.0.16","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.16","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"aba1bcb24f09e9fea8b536d32ad642d9d8bb3162","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.16.tgz","fileCount":39,"integrity":"sha512-8lQe+p+C+8mOfDYDFu/+MuqDzwHTA5B4YBpXo1QEgof7zz0CfGJVzwzw1Ka/MDJYwXDpuiCMJcbQ1Gy7KfSCfQ==","signatures":[{"sig":"MEYCIQCfubIc+B9i7Pcqu+hQJpgemirxdAOxjQW2zhHKw4FPfgIhAIu26F7RDKweqTCf9w7a39WKdD+hB04bfsTDcLAKRLWR","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":261101},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"0899d79dbc8468f2ee159e78cdd44b547dd94b88","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.21.4","sinon":"^17.0.1","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^4.2.0","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.16_1699011647455_0.28787578768011657","host":"s3://npm-registry-packages"}},"0.0.17":{"name":"@sirpepe/ornament","version":"0.0.17","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.17","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"b414cbc818f0de93ac87e42e2961c581c37329f1","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.17.tgz","fileCount":41,"integrity":"sha512-zu9DKAkVWmbu5+vKcc4SWXzN64JCjbirpEEdiAUUwE9POutFYs3Jr1LEYRxyK8SS8xRZ5geOLpk+HvepJ/l1qQ==","signatures":[{"sig":"MEUCIQCOSohTstVwfoYR/c4/5KYzzufMhym2bmIXhzlIBZ2T1wIgTG9Di4Zv9aWXydn+gss2nAeZTsT4E+7Tawceu91eHUQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":301734},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"0951bd1ad1cbb5b13cf6ba8d00cb2d4c999daea3","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.21.4","sinon":"^17.0.1","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^4.2.0","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.17_1699447390337_0.8905638419790998","host":"s3://npm-registry-packages"}},"0.0.18":{"name":"@sirpepe/ornament","version":"0.0.18","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.18","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"fb0e09e4529400cc99493ba0ff4eb2bf47a0102e","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.18.tgz","fileCount":41,"integrity":"sha512-52TwE4HbUYNVUyCy0IOA/Yxn+XVv6dYmDnlFBO046TwGOydoTGhNbnM76TYEIA0goDaS1/ElYhhsxSP8UftRLQ==","signatures":[{"sig":"MEUCIQDo3G8s3imJ92ulcAn59V7bgf0i/GqzBZ7Kd4a3f/2yZAIgfTPG8rfW7Ni4BJpmIi+CJAy6Doqa7QUAHu4PoAePLEY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":302107},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"59851ec4d90afcf125d747acd056723896226de2","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.21.4","sinon":"^17.0.1","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^4.2.0","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.18_1699456188770_0.21533715303960155","host":"s3://npm-registry-packages"}},"0.0.19":{"name":"@sirpepe/ornament","version":"0.0.19","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.19","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"0ef4ab455163fae3975024404138aea002ea597b","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.19.tgz","fileCount":41,"integrity":"sha512-hCG/Y5VPhqUEINWUkhDwbcXRJ2D+dCLzUpme5irQG2x1h/ApI4R7Ft6Bb1BplbdiAbdKi53C7GGAZR+TcNhvyg==","signatures":[{"sig":"MEMCHxBEok3KW/252MRQVIzqUXdJYDorvAfTpXCZ7DbaLoQCIDKRQnYvweDZ5IZF/p7Th8NMMCOjMoLFcOQITGH+tIhU","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":303283},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"a37d7e307bd50c737b1873c093bf61e3dfdfb56c","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.21.4","sinon":"^17.0.1","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^4.2.0","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^16.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^10.0.16","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.19_1699458310627_0.7729875673032915","host":"s3://npm-registry-packages"}},"0.0.20":{"name":"@sirpepe/ornament","version":"0.0.20","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.20","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"a42a5d80c170e51d9a59a1203b99c60258596b3e","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.20.tgz","fileCount":41,"integrity":"sha512-cj1/eZEZRtedysonXg42ndPOUWqQD2V8x8kLiJHkLu0PWSe1Mg5/5X1c/eGuLDb0SAjCyWdzYVzwGfz52wnTWA==","signatures":[{"sig":"MEUCIAt5FVj95q/z2dtoo1bfaueBdgHUKoTOU4JVR1RSAhbTAiEAiW4T3ye4SZccJBYcuEI5jXCWtIfGR1mlBK/akDy4naE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":309490},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"84a39546d0a42e549b8b9ef21b59720e36acf895","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^17.0.0","uhtml":"^4.0.0","eslint":"^8.41.0","rollup":"^4.2.0","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^17.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.20_1699955592910_0.6934160677300829","host":"s3://npm-registry-packages"}},"0.0.21":{"name":"@sirpepe/ornament","version":"0.0.21","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.21","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"4584e6b2d78cfa616b823a45bd37aeb993e67fd7","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.21.tgz","fileCount":42,"integrity":"sha512-8ShD8igt9pwTJwTP+1iCo8SPQj5w5tHmzfhEdP33tOsyeyC+8sLCwejVwpAuSiWVgmfDGPxxsZd7eaYoSy/iQA==","signatures":[{"sig":"MEYCIQC3iUhZqgZM0MnwjzF+rHa23Pezo+kttq0a/nZnWk4nNgIhAJnIi8+pAD0nCEQ5MRC4/HirYaMPtteAowfMpvIs/uHu","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":324415},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"11b3afa3ff590d19cf05f78236ef5c256ca9d6b5","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^17.0.0","uhtml":"^4.0.0","eslint":"^8.41.0","rollup":"^4.2.0","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^17.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.21_1700776381670_0.47182241739334896","host":"s3://npm-registry-packages"}},"0.0.22":{"name":"@sirpepe/ornament","version":"0.0.22","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.22","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"61a270c1cd0d12b04c493164361e8c200dad19ba","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.22.tgz","fileCount":42,"integrity":"sha512-8tTSY2zWtHW8AGgI495S9ZYTo/0bieFysAxKlQn9zXPrmNhHD527UL7No9krdM33P4h6Z8w5bpoMS6Eo/XNJXw==","signatures":[{"sig":"MEUCIB9CinRN7O5DJo/zkt4CykGkynaQLmXaZ+st27Oi4ScmAiEA9pnmFqF1VKIW1GiTbDwOdxuAcj4Vc/VqgxmDI4ofzJY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":331621},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"59fce2a92dcf18162ab6b4490042afebaf7c64ca","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^17.0.0","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^4.2.0","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^17.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.22_1701163190003_0.16827319797180862","host":"s3://npm-registry-packages"}},"0.0.23":{"name":"@sirpepe/ornament","version":"0.0.23","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.23","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"44cc76b50fc7a94c38277679f55e197432711952","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.23.tgz","fileCount":40,"integrity":"sha512-Y/42zYD92KCuI+XATOyadETxHwsoW95TqRMtqno04k8RZI7iLbdkCv+YuUGmLpDrGvxzc87lh933afY9dUeq4w==","signatures":[{"sig":"MEQCIFEpfECGPNdzVVPY7jaj/qWKW/kbQB2U7B/D9ejrRE0uAiAHYzhg0AmMd471KT1UtAMeEgjLsIBUn5qNq5FHVh4n2A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":331034},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"7954dc72a718cc43bd7e21692feb4a0876ab1e1b","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^17.0.0","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^4.2.0","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^17.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.23_1704898668198_0.5873757939916402","host":"s3://npm-registry-packages"}},"0.0.24":{"name":"@sirpepe/ornament","version":"0.0.24","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.24","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"a79d442e7d249c34b9150e1407054b5fa9979346","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.24.tgz","fileCount":40,"integrity":"sha512-WcVdFZWfVfoRacf5vnj40a6jPLvASwlsaKnomvy9zAPdwweJQhe0czK+WQ3IsivD1R0fsFdaM0LGETiixcVGpw==","signatures":[{"sig":"MEUCIQDaXbBIFR9kisLheoXERaIkwbJ4YYYRoJ2yv6ocnM+4LAIgRNvsfy3DsyzmYUUPdmU8FXUdfBwYGL44vYRsF0exih8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":331892},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"4a763a0d9247725c56729ce9b83195296c0f4d5d","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^17.0.0","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^4.2.0","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^17.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.24_1705671525417_0.658909313386107","host":"s3://npm-registry-packages"}},"0.0.25":{"name":"@sirpepe/ornament","version":"0.0.25","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.25","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"bafd19dc0f08d064567f4a85ce87f9d939081cbc","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.25.tgz","fileCount":40,"integrity":"sha512-8pKyRRtYwFafS+boAagn6iORhslwsH3JnXvHUOecKIrtVZwLsTsqsx29zyGu6sbKb/Wf34b+M76xTrNgsmGHVQ==","signatures":[{"sig":"MEUCIGKaWHu9JBONONDoon/9uQtM86S1XHD7+s/tHLeOQCcYAiEA42ptFN2tK8GaWIheiiXyP0aE+bK3FIA3JHosLIdSg5g=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":343621},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"47b56c839bfff0bf138a652be8a7a7995791e3a0","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^17.0.0","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^4.2.0","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^17.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.25_1706804497501_0.22370638185611558","host":"s3://npm-registry-packages"}},"0.0.26":{"name":"@sirpepe/ornament","version":"0.0.26","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.26","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"f260a9dc24ddaf989b617ea65a23d7a4070b2bcf","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.26.tgz","fileCount":40,"integrity":"sha512-JYzTz4e8gO/ERA2oVfux/rMzVQZkJDhHOjZEXVGAgtEr3Be8j7/wNbrBx632GbznPn32CPyjzEsfeZgP702D/w==","signatures":[{"sig":"MEYCIQCoVGt8uTPbhaobkNCCvc8xLoE4whse1vWy20ObGEp4HgIhAP/ZgTDRiVGdV5McrcM5NFu1W6VAMYUPonl6c9PRoTWU","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":345931},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","browser":"dist/min/index.min.js","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"143c7bde1adf757ebb8b0c2c13cf3ec365a85650","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"9.5.1","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"18.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^17.0.0","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^4.2.0","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^17.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.26_1706916706385_0.2731693305027558","host":"s3://npm-registry-packages"}},"0.0.27":{"name":"@sirpepe/ornament","version":"0.0.27","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.0.27","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"ec8a5ff61352583cc25b898e33ebeb6cc4d90591","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.0.27.tgz","fileCount":40,"integrity":"sha512-C0e0vCKXiPuc3vVhdCXb1sYWrwW7VgJSjHTfOEn7jpMNY1wO22YFqRVeiL2vpK3nDvgViJRhLdW2onVIxLkm7g==","signatures":[{"sig":"MEQCIGqdfsdtAOQUNkeYmQeyiIsFBTYd28Q3D2ihOMMARH9PAiAPzuKF9o01twyRyuqPjQH/YEM8P9/5TUBjcOZfC3GaRg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":347727},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"e9495b96c13b753c874529a4be9e0e2d4339e8a4","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"10.2.4","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"20.11.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^17.0.0","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^4.2.0","install":"^0.13.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^17.0.0","typescript":"^5.0.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^6.3.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^6.3.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.0.27_1709761644840_0.9425114734974191","host":"s3://npm-registry-packages"}},"0.1.0":{"name":"@sirpepe/ornament","version":"0.1.0","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.1.0","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"3f96b6d77a3716fd5ccc33c7b92c14ec4f186498","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.1.0.tgz","fileCount":41,"integrity":"sha512-QWfCtL488frNTBTtqnxlviDrOiCeFdIArv7OYjFijvpPzCD5Xqbi3xcajtjTfsjdVQ4DkebDyWtkOO4g0YqRNQ==","signatures":[{"sig":"MEUCIQCclV2FMOW/5GvJMwxNHTQPHeDYlJpaiQVTGnWAiyGZhQIgPYU/cHmcHhzq555SNsqE8VXpvB9t3nnQOvBE1y072n0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":350030},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"98f4d068b5722608cd1d653edfb66a506545744b","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"10.2.4","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"20.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^17.0.0","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^4.2.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^17.0.0","typescript":"5.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^7.1.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^7.1.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.1.0_1710504165746_0.7554813180319047","host":"s3://npm-registry-packages"}},"0.1.1":{"name":"@sirpepe/ornament","version":"0.1.1","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@0.1.1","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"e40f7a4a3b05ae0e8df2dad6077b4d5b07e184bc","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-0.1.1.tgz","fileCount":41,"integrity":"sha512-ZymdacD5fvAOfI9i7O8aQwkaCAVFtpffL2JnNgsbOSAGbftWlCikq5N/j1BH+XOyB9Y3j/9sBzUE17bEZJ5tYQ==","signatures":[{"sig":"MEUCIAtHIgBx/sm51SInu8gwtkrcl0ow4eRMHYn29rOB7WI1AiEAn+Pi50s2qR7PV2WJRv9fGjz7j8T8q5Y9NUWiXpg7srw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":353531},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"320b11d92fac32cb0c8ff6affe2478f51cbd51ec","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"10.2.4","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"20.11.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^17.0.0","uhtml":"^3.2.2","eslint":"^8.41.0","rollup":"^4.2.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^17.0.0","typescript":"5.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^7.1.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^7.1.0","@babel/plugin-proposal-decorators":"^7.22.3"},"_npmOperationalInternal":{"tmp":"tmp/ornament_0.1.1_1711365698159_0.5462111046483005","host":"s3://npm-registry-packages"}},"1.0.0":{"name":"@sirpepe/ornament","version":"1.0.0","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@1.0.0","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"6af584a013c96a2eb0a137ed10df45c30c875c4b","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-1.0.0.tgz","fileCount":44,"integrity":"sha512-2AjKUxn8cl5euADQyW06hsQR/+WTdnoaroj4hLxxTkS/6n7nrC/+zug+E9fFSYNqd/CyR//flwplGHi4Tfqy6Q==","signatures":[{"sig":"MEYCIQCGMzTH9IV0Z2ySRZ2JAFOLYRIUPY2szwr7NCNIc5rmcQIhAJorbIKxS5EuXGngs2bHmKTuAE1p/gOvkdG6Ji/3NqEK","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":370451},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"0a2be5a6800fe7ca55b389ed1cfb30b6d94b1210","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"10.2.4","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"20.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^17.0.0","uhtml":"^3.2.2","eslint":"^8.41.0","preact":"^10.20.1","rollup":"^4.2.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^17.0.0","typescript":"5.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^7.1.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^7.1.0","@babel/plugin-proposal-decorators":"^7.22.3","@babel/plugin-transform-react-jsx":"^7.23.4"},"_npmOperationalInternal":{"tmp":"tmp/ornament_1.0.0_1712328112802_0.13066468006448817","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"@sirpepe/ornament","version":"1.1.0","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@1.1.0","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"23a05801bf4f679ff7a91275b24fabb5b35eb132","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-1.1.0.tgz","fileCount":45,"integrity":"sha512-o9h4USYck2/o+tXHo71DHDqESjycuo3BmiQGJw0MjpRAA9VEVZ8QwAf3VBUXNTJztKCG+D8wpaTo8ibqPlxlsQ==","signatures":[{"sig":"MEQCIF4cvS3saCd7Jny6VzpdbqESqX3YNJVsmiMWJ2Yd4Mf1AiByLfVvyEJbL1L23hs80eSETcYWYwZdK5h7aFJJuPrxoA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":379374},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"751f9f4946796f5f48b5910ec587008def360417","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"10.2.4","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"20.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^18.0.0","uhtml":"^4.5.0","eslint":"^8.41.0","preact":"^10.20.1","rollup":"^4.2.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^17.0.0","typescript":"5.4","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^7.1.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^7.1.0","@babel/plugin-proposal-decorators":"^7.22.3","@babel/plugin-transform-react-jsx":"^7.23.4"},"_npmOperationalInternal":{"tmp":"tmp/ornament_1.1.0_1718360869669_0.21192360113281294","host":"s3://npm-registry-packages"}},"1.2.0":{"name":"@sirpepe/ornament","version":"1.2.0","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@1.2.0","homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"f451ac83dda502d89028006f5a47649ef8d6ebb4","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-1.2.0.tgz","fileCount":45,"integrity":"sha512-ATYvLx4woKM4El25azj51MTpdl2AU0Zc5s5L/Fb8xc4oCbVNiPogtL0cbtpThQW8adJ1XleQlFZKos8XlDbHRw==","signatures":[{"sig":"MEUCIQDjaBDUvATOdtwTGj/Eo2ZaI9B+oVtPlc1tiBu5t/oFlAIgUFsiC4+fnUXHLKfjHcEaOEJ4jrTrpfny5KG0WWzxYwM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":366181},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"3d3dae8e8e3a1845d5f7273f5a529409e3982bd1","scripts":{"lint":"eslint --ext .ts src","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"10.2.4","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"20.11.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^18.0.0","uhtml":"^4.5.0","eslint":"^8.41.0","preact":"^10.20.1","rollup":"^4.2.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","release-it":"^17.0.0","typescript":"5.5","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^7.1.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^7.1.0","@babel/plugin-proposal-decorators":"^7.22.3","@babel/plugin-transform-react-jsx":"^7.23.4"},"_npmOperationalInternal":{"tmp":"tmp/ornament_1.2.0_1719226496164_0.029398768665015007","host":"s3://npm-registry-packages"}},"1.3.0":{"name":"@sirpepe/ornament","version":"1.3.0","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@1.3.0","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"59fdbb5bf6c1a7f8f96fb5299511421299a9cf2b","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-1.3.0.tgz","fileCount":53,"integrity":"sha512-UUFZePwkl/9hUfcjF6D0vH4tX7vHcMMbvC+NJyaCY06OeDGgsYJrfbGTnBpfd0D5y4N7q6wR7Ik0P5zzyt9yhA==","signatures":[{"sig":"MEUCIEs3rj8RYxb9/Au8BnVOXP182tzye5Ict0ZtDW7QwxLYAiEA5MjyBe3avtSmeqkEz+wGuvs2q++0I9LwnwzMaUmgPyw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":378755},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"}},"gitHead":"f85690aa85f2d6d39fa608da64e068c5ef745978","scripts":{"lint":"npx prettier . --check && eslint","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"10.2.4","description":"Micro-library for building vanilla web components","directories":{"test":"test"},"_nodeVersion":"20.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^18.0.0","uhtml":"^4.5.0","eslint":"^8.41.0","preact":"^10.20.1","rollup":"^4.2.0","globals":"^15.8.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","@eslint/js":"^9.5.0","release-it":"^17.0.0","typescript":"5.5","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","typescript-eslint":"^7.14.1","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.1.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^7.6.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^7.6.0","@babel/plugin-proposal-decorators":"^7.22.3","@babel/plugin-transform-react-jsx":"^7.23.4"},"_npmOperationalInternal":{"tmp":"tmp/ornament_1.3.0_1720622021480_0.6989316648544088","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"@sirpepe/ornament","version":"2.0.0","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@2.0.0","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"8f697faf0314866bf31ae320b6c56cc6fdc2a827","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-2.0.0.tgz","fileCount":59,"integrity":"sha512-tQPNPsFBeujmeGyDhULDZ05eldibTFCMpB7fjyAtIVSJg/Wv9sUAPkkO4kwaMZ9dTFGhwx3IMPTM6rZegYGiTw==","signatures":[{"sig":"MEYCIQCMu1pGFOr+GLpAOBdlmp/Ahv98mqz7Ddz5Zc1DBJ9DPAIhAKiwsxrl/sCTCKwQ4cXakwr1kbOdxm63cfJbZbyBxFv3","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":563529},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"},"./readme":"./Readme.md"},"gitHead":"ba9597942b2fbf756ae64df8f397b85ec9a19b5b","scripts":{"lint":"npx prettier . --check && eslint","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve --playwright --browsers chromium firefox","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test web-test-runner test/**/*.test.ts --node-resolve","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"10.2.4","description":"Micro-library for building vanilla web component frameworks","directories":{"test":"test"},"_nodeVersion":"20.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^18.0.0","uhtml":"^4.5.0","eslint":"^8.41.0","preact":"^10.20.1","rollup":"^4.2.0","globals":"^15.8.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","@eslint/js":"^9.5.0","release-it":"^17.0.0","typescript":"5.5","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.18.0","@babel/preset-env":"^7.22.4","typescript-eslint":"^7.14.1","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.1.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^7.6.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^7.6.0","@babel/plugin-proposal-decorators":"^7.22.3","@babel/plugin-transform-react-jsx":"^7.23.4"},"_npmOperationalInternal":{"tmp":"tmp/ornament_2.0.0_1722598376431_0.2549218007004914","host":"s3://npm-registry-packages"}},"2.1.0":{"name":"@sirpepe/ornament","version":"2.1.0","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@2.1.0","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"1dd97e1af43415b0b788436bd2647a1d08467c1b","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-2.1.0.tgz","fileCount":62,"integrity":"sha512-lXt8qjQbN0yM4UO5XKItnqgVTdvVve2rHvX6IfhSUZDAT6sSebssldWgUr5vtDJ2agJYoyT0KDXjlpRIWXBRsA==","signatures":[{"sig":"MEUCIEOEnx2gZbqJ7ena/jla3bONjUoXSccOS1rSGhN1qa+UAiEA0eYnY9nAnhu20CLtM9R8RxQi1OpRePyPqH5NOxll+oI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":578260},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"},"./readme":"./Readme.md"},"gitHead":"1e8f8cad8bb6a62afce6745843b396139213aca1","scripts":{"lint":"npx prettier . --check && eslint","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test wtr test/**/*.test.ts --playwright --browsers firefox chromium webkit","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test wtr test/**/*.test.ts --playwright --browsers chromium","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"10.9.0","description":"Micro-library for building vanilla web component frameworks","directories":{"test":"test"},"_nodeVersion":"22.10.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^19.0.0","uhtml":"^4.5.0","eslint":"^8.41.0","preact":"^10.20.1","rollup":"^4.2.0","globals":"^15.8.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","@eslint/js":"^9.5.0","release-it":"^17.0.0","typescript":"^5.6.0","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.19.0","@babel/preset-env":"^7.25.3","typescript-eslint":"^8.1.0","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.1.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^8.1.0","@rollup/plugin-node-resolve":"^15.1.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^8.1.0","@babel/plugin-proposal-decorators":"^7.22.3","@babel/plugin-transform-react-jsx":"^7.23.4"},"_npmOperationalInternal":{"tmp":"tmp/ornament_2.1.0_1729781198264_0.9637180355681094","host":"s3://npm-registry-packages"}},"2.2.0":{"name":"@sirpepe/ornament","version":"2.2.0","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@2.2.0","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"10551a6caa611b5b1874cf1219f21d372ee79e10","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-2.2.0.tgz","fileCount":64,"integrity":"sha512-svdnQomn8YpIvZvSKsbTBhfLusCu3zmVXSKUY7jXdnVk+Nsuo/AygGdTHlQiT3fgCYsdiZiSEHp3ScV3D1Cw0g==","signatures":[{"sig":"MEUCIQCjs58AkUnvSLf082QnnU3htjjSgxILRiZJldj7rVYoFgIgFji3Hqlu6vi7NzGmT6+Dv5CMPAK8VwiUeo/jiY+pLtY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":595511},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"},"./readme":"./Readme.md","./changelog":"./changelog.md"},"gitHead":"6f983d9891ac163dc2fa6a923b1c087925f1154c","scripts":{"lint":"npx prettier . --check && eslint","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test wtr test/**/*.test.ts --playwright --browsers firefox chromium webkit","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test wtr test/**/*.test.ts --playwright --browsers chromium","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"10.9.2","description":"Micro-library for building vanilla web component frameworks","directories":{"test":"test"},"_nodeVersion":"22.13.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^19.0.0","uhtml":"^4.5.0","eslint":"^8.41.0","preact":"^10.20.1","rollup":"^4.2.0","globals":"^15.8.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","@eslint/js":"^9.5.0","release-it":"^18.0.0","typescript":"^5.6.0","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.19.0","@babel/preset-env":"^7.25.3","typescript-eslint":"^8.1.0","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^9.1.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^8.1.0","@rollup/plugin-node-resolve":"^16.0.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^8.1.0","@babel/plugin-proposal-decorators":"^7.22.3","@babel/plugin-transform-react-jsx":"^7.23.4"},"_npmOperationalInternal":{"tmp":"tmp/ornament_2.2.0_1736518357898_0.30603153191759525","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"@sirpepe/ornament","version":"2.2.1","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@2.2.1","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"0a629569dd70616d7231f1b019eb4097f5a96e28","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-2.2.1.tgz","fileCount":64,"integrity":"sha512-PG54iK0QU1LQda85xHzTvVTrwfwO/i4FBJaf9cmkbPwGeTQ+HIaALUQ0XhFbjXsV5HM/82XnSpuuFCpyFSFIrQ==","signatures":[{"sig":"MEUCIQCTlIbMg28YGaw6kWGn2eE3NEyJNzTgKY0p9NW1bq91HwIgNR2u71Yg9zpPlCIt8JGhZRjn/eigKoCzoX+HR2EMr7s=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":596725},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"},"./readme":"./Readme.md","./changelog":"./changelog.md"},"gitHead":"17b991b2d441f848d0a29354e84346fbcda42883","scripts":{"lint":"npx prettier . --check && eslint .","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test wtr test/**/*.test.ts --playwright --browsers firefox chromium webkit","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test wtr test/**/*.test.ts --playwright --browsers chromium","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"10.9.2","description":"Micro-library for building vanilla web component frameworks","directories":{"test":"test"},"_nodeVersion":"23.6.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^19.0.0","uhtml":"^4.5.0","eslint":"^9.0.0","preact":"^10.20.1","rollup":"^4.2.0","globals":"^15.8.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","@eslint/js":"^9.5.0","release-it":"^18.0.0","typescript":"^5.6.0","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.19.0","@babel/preset-env":"^7.25.3","typescript-eslint":"^8.1.0","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^10.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^8.1.0","@rollup/plugin-node-resolve":"^16.0.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^8.1.0","@babel/plugin-proposal-decorators":"^7.22.3","@babel/plugin-transform-react-jsx":"^7.23.4"},"_npmOperationalInternal":{"tmp":"tmp/ornament_2.2.1_1737385943994_0.02356142107150072","host":"s3://npm-registry-packages-npm-production"}},"2.2.2":{"name":"@sirpepe/ornament","version":"2.2.2","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@2.2.2","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"f4cf05946660bba233ef3c98c35a9ae7c816f3e8","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-2.2.2.tgz","fileCount":64,"integrity":"sha512-jyBToProOfOcUfMcH4a1YsFP9nGI3pfXLMzolOAfgf2lVagGYpSkRmWOazFLBjRAfM3c+mXh7w+Lg7x4USajcw==","signatures":[{"sig":"MEUCIBu+ms6ln4ds7a7IW4QYWsfE/4jx841bzsVYdOMUltplAiEA2UDKIbvjyNmWl6qNz4+ItpViIuLpqE6fkG91hmOyUrE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":600098},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"},"./readme":"./Readme.md","./changelog":"./changelog.md"},"gitHead":"64cca9b3fbe685c3219987f951712ca43c544b52","scripts":{"lint":"npx prettier . --check && eslint .","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test wtr test/**/*.test.ts --playwright --browsers firefox chromium webkit","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test wtr test/**/*.test.ts --playwright --browsers chromium","build-dev":"NODE_ENV=development rollup -c rollup.config.mjs","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"10.9.2","description":"Micro-library for building vanilla web component frameworks","directories":{"test":"test"},"_nodeVersion":"23.6.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^19.0.0","uhtml":"^4.5.0","eslint":"^9.0.0","preact":"^10.20.1","rollup":"^4.2.0","globals":"^15.8.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","@eslint/js":"^9.5.0","release-it":"^18.0.0","typescript":"^5.6.0","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.19.0","@babel/preset-env":"^7.25.3","typescript-eslint":"^8.1.0","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^10.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^8.1.0","@rollup/plugin-node-resolve":"^16.0.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^8.1.0","@babel/plugin-proposal-decorators":"^7.22.3","@babel/plugin-transform-react-jsx":"^7.23.4"},"_npmOperationalInternal":{"tmp":"tmp/ornament_2.2.2_1737445827169_0.8810040538826176","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@sirpepe/ornament","version":"3.0.0","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@3.0.0","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"3ea0d34adb5bbc1e26f847ab4157f48ca049387c","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-3.0.0.tgz","fileCount":64,"integrity":"sha512-mbRPehW9H34HDwwj/so+eFX/bKDBMaKlIpzjoVtnclIslhlcbjg1zIC5sUMrwmjIE3tmoPAHLG14gTWqKTnWnA==","signatures":[{"sig":"MEYCIQCVgmstO82lf2cLRAX9BUupptZGont1ErWn7HZCfg9QKwIhAPQFaAUrp7sLbKFzI8QY42FUA+qPOkszJo2Yk0jtnNZj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":607336},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","volta":{"node":"22.14.0"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"},"./readme":"./Readme.md","./changelog":"./changelog.md"},"gitHead":"c06d74cc38924d964f11483776354ccd47fbd040","scripts":{"lint":"npx prettier . --check && eslint .","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test wtr test/**/*.test.ts --playwright --browsers firefox chromium webkit","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test wtr test/**/*.test.ts --playwright --browsers chromium","build-dev":"NODE_ENV=development rollup -c rollup.config.mjs","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"10.9.2","description":"Micro-library for building vanilla web component frameworks","directories":{"test":"test"},"_nodeVersion":"22.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^20.0.0","uhtml":"^4.5.0","eslint":"^9.0.0","preact":"^10.20.1","rollup":"^4.2.0","globals":"^16.0.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","@eslint/js":"^9.5.0","release-it":"^18.0.0","typescript":"^5.6.0","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.20.0","@babel/preset-env":"^7.25.3","typescript-eslint":"^8.1.0","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^10.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^8.1.0","@rollup/plugin-node-resolve":"^16.0.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^8.1.0","@babel/plugin-proposal-decorators":"^7.22.3","@babel/plugin-transform-react-jsx":"^7.23.4"},"_npmOperationalInternal":{"tmp":"tmp/ornament_3.0.0_1743334719015_0.20770679181237117","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@sirpepe/ornament","version":"3.0.1","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@3.0.1","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"e868e8021d840d55254c29a24758dc60ffa28fd3","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-3.0.1.tgz","fileCount":64,"integrity":"sha512-qMSD5PS/UFzM6sSJrAinQezdTasxw15LMl/KOMTTEKUrQvA1xS25LJ/n7kQ5468LeszDS9BroFub5g70RThHLg==","signatures":[{"sig":"MEYCIQDwy+pEaA1nrvzE1ubXjNdkeJ9E71Q/3rrj/II3pS3lYwIhAMaSywyrRitlcxcyigHVqBPf+dw1qXf5eXfUBQoD9kkf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":612606},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","volta":{"node":"22.14.0"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"},"./readme":"./Readme.md","./changelog":"./changelog.md"},"gitHead":"0e866bb2253e8cc77f78afc74ba2ac9a4e2da739","scripts":{"lint":"npx prettier . --check && eslint .","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test wtr test/**/*.test.ts --playwright --browsers firefox chromium webkit","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test wtr test/**/*.test.ts --playwright --browsers chromium","build-dev":"NODE_ENV=development rollup -c rollup.config.mjs","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"10.9.2","description":"Micro-library for building vanilla web component frameworks","directories":{"test":"test"},"_nodeVersion":"22.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^20.0.0","uhtml":"^4.5.0","eslint":"^9.0.0","preact":"^10.20.1","rollup":"^4.2.0","globals":"^16.0.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","@eslint/js":"^9.5.0","release-it":"^18.0.0","typescript":"^5.6.0","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^17.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.20.0","@babel/preset-env":"^7.25.3","typescript-eslint":"^8.1.0","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^5.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^10.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^8.1.0","@rollup/plugin-node-resolve":"^16.0.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^8.1.0","@babel/plugin-proposal-decorators":"^7.22.3","@babel/plugin-transform-react-jsx":"^7.23.4"},"_npmOperationalInternal":{"tmp":"tmp/ornament_3.0.1_1744012301678_0.26813131406447455","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@sirpepe/ornament","version":"3.1.0","author":{"name":"peter@peterkroener.de"},"license":"MIT","_id":"@sirpepe/ornament@3.1.0","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"homepage":"https://github.com/SirPepe/ornament#readme","bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"dist":{"shasum":"a01781e55eff79f3091fb6a7069dc197c3eb2345","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-3.1.0.tgz","fileCount":58,"integrity":"sha512-Nj7evoiiFmL+Use/Xb02Hu+G+qvaN9WLxoqtE28L686ric7sd9GcwxTLRiMd0eo7IpBASbnLhcFYhPmV2XUT4g==","signatures":[{"sig":"MEQCIC2fLuAOGjT8PZ4rBI8tkw1F2gtpv+Yt+fKgtKEiIDDKAiA2okkGnKExyMro6WaHbkMx6Xy5Cbyk9rRiZTMfv8qFNA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":575237},"main":"dist/esm/index.js","type":"module","types":"dist/types/index.d.ts","volta":{"node":"22.14.0"},"exports":{".":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js","require":"./dist/min/index.min.js"},"./readme":"./Readme.md","./changelog":"./changelog.md"},"gitHead":"ab921f5e9103cac2b4f022f92f038f471c974881","scripts":{"lint":"npx prettier . --check && eslint .","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","test":"NODE_ENV=test wtr test/**/*.test.ts --playwright --browsers firefox chromium webkit","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","types":"rm -rf dist/types && tsc -p tsconfig.build.json","release":"npm run prepareRelease && release-it","test-dev":"NODE_ENV=test wtr test/**/*.test.ts --playwright --browsers chromium","build-dev":"NODE_ENV=development rollup -c rollup.config.mjs","build-examples":"cd examples && rollup -c rollup.config.mjs","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples"},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"repository":{"url":"git+https://github.com/SirPepe/ornament.git","type":"git"},"_npmVersion":"10.9.2","description":"Micro-library for building vanilla web component frameworks","directories":{"test":"test"},"_nodeVersion":"22.14.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"sinon":"^21.0.0","uhtml":"^4.5.0","eslint":"^9.0.0","preact":"^10.20.1","rollup":"^4.2.0","globals":"^16.0.0","prettier":"^3.0.0","@babel/cli":"^7.22.5","@eslint/js":"^9.5.0","release-it":"^19.0.0","typescript":"^5.6.0","@babel/core":"^7.22.1","@types/mocha":"^10.0.3","@types/sinon":"^21.0.0","@esm-bundle/chai":"^4.3.4-fix.0","@web/test-runner":"^0.20.0","@babel/preset-env":"^7.25.3","typescript-eslint":"^8.1.0","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-terser":"^0.4.3","@web/dev-server-rollup":"^0.6.0","eslint-config-prettier":"^10.0.0","@babel/preset-typescript":"^7.21.5","@typescript-eslint/parser":"^8.1.0","@rollup/plugin-node-resolve":"^16.0.0","@web/test-runner-playwright":"^0.11.0","@typescript-eslint/eslint-plugin":"^8.1.0","@babel/plugin-proposal-decorators":"^7.22.3","@babel/plugin-transform-react-jsx":"^7.23.4"},"_npmOperationalInternal":{"tmp":"tmp/ornament_3.1.0_1765799321606_0.23400891328182616","host":"s3://npm-registry-packages-npm-production"}},"3.1.1":{"name":"@sirpepe/ornament","version":"3.1.1","description":"Micro-library for building vanilla web component frameworks","type":"module","main":"dist/esm/index.js","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","require":"./dist/min/index.min.js","default":"./dist/esm/index.js"},"./readme":"./Readme.md","./changelog":"./changelog.md"},"scripts":{"lint":"npx prettier . --check && eslint .","test":"NODE_ENV=test wtr test/**/*.test.ts --playwright --browsers firefox chromium webkit","test-dev":"NODE_ENV=test wtr test/**/*.test.ts --playwright --browsers chromium","build":"npm run lint && rollup -c rollup.config.mjs && npm run size","build-dev":"NODE_ENV=development rollup -c rollup.config.mjs","build-examples":"cd examples && rollup -c rollup.config.mjs","types":"rm -rf dist/types && tsc -p tsconfig.build.json","prepareRelease":"rm -rf dist && npm run types && npm run lint && npm run test && npm run build && npm run build-examples","size":"gzip -c dist/min/index.min.js | wc -c | numfmt --to iec --format '%8.4f'","release":"npm run prepareRelease && release-it"},"directories":{"test":"test"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/SirPepe/ornament.git"},"bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"homepage":"https://github.com/SirPepe/ornament#readme","author":{"name":"peter@peterkroener.de"},"license":"MIT","devDependencies":{"@babel/cli":"^7.22.5","@babel/core":"^7.22.1","@babel/plugin-proposal-decorators":"^7.22.3","@babel/plugin-transform-react-jsx":"^7.23.4","@babel/preset-env":"^7.25.3","@babel/preset-typescript":"^7.21.5","@eslint/js":"^9.5.0","@esm-bundle/chai":"^4.3.4-fix.0","@preact/signals-core":"^1.4.0","@rollup/plugin-alias":"^6.0.0","@rollup/plugin-babel":"^6.0.3","@rollup/plugin-node-resolve":"^16.0.0","@rollup/plugin-terser":"^0.4.3","@types/mocha":"^10.0.3","@types/sinon":"^21.0.0","@typescript-eslint/eslint-plugin":"^8.1.0","@typescript-eslint/parser":"^8.1.0","@web/dev-server-rollup":"^0.6.0","@web/test-runner":"^0.20.0","@web/test-runner-playwright":"^0.11.0","eslint":"^9.0.0","eslint-config-prettier":"^10.0.0","globals":"^17.0.0","preact":"^10.20.1","prettier":"^3.0.0","release-it":"^19.0.0","rollup":"^4.2.0","sinon":"^21.0.0","typescript":"^5.6.0","typescript-eslint":"^8.1.0","uhtml":"^4.5.0"},"volta":{"node":"22.14.0"},"_id":"@sirpepe/ornament@3.1.1","gitHead":"08865d0f730cb94822c9436a10bc2d000cd4b378","_nodeVersion":"22.14.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-yux2PEGEIkYTCMr571g5atN3LozvGoF/+91woo/+nPesPLw9tZMKACJEw2Bvyyw7Tfbmizp1q1tSiEy3ySOdOw==","shasum":"78890caea7f8f370bab647ebe73e929b83320770","tarball":"https://registry.npmjs.org/@sirpepe/ornament/-/ornament-3.1.1.tgz","fileCount":58,"unpackedSize":581262,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHV4dYIsUtZJ1qh577A/2iIVqLU/D2fPk5iNeFgzP/QBAiAi1SwJf+v9AzK99mHlPIaQTygBuHzeDIxsIJXQSEZhdw=="}]},"_npmUser":{"name":"sirpepe","email":"peter@peterkroener.de"},"maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ornament_3.1.1_1769419733263_0.12244430751488378"},"_hasShrinkwrap":false}},"time":{"created":"2023-08-30T20:27:20.374Z","modified":"2026-01-26T09:28:53.545Z","0.0.1":"2023-08-30T20:27:20.658Z","0.0.2":"2023-08-31T07:21:55.216Z","0.0.3":"2023-08-31T07:26:10.602Z","0.0.4":"2023-08-31T09:10:20.439Z","0.0.5":"2023-09-08T11:34:12.555Z","0.0.6":"2023-09-15T11:55:40.371Z","0.0.7":"2023-09-21T13:03:41.267Z","0.0.8":"2023-09-26T09:29:54.781Z","0.0.9":"2023-10-01T13:37:20.450Z","0.0.10":"2023-10-11T12:29:23.625Z","0.0.11":"2023-10-11T12:37:14.668Z","0.0.12":"2023-10-20T11:28:52.454Z","0.0.13":"2023-11-01T14:54:58.110Z","0.0.14":"2023-11-02T19:37:07.993Z","0.0.15":"2023-11-02T22:33:23.548Z","0.0.16":"2023-11-03T11:40:47.641Z","0.0.17":"2023-11-08T12:43:10.624Z","0.0.18":"2023-11-08T15:09:48.963Z","0.0.19":"2023-11-08T15:45:10.812Z","0.0.20":"2023-11-14T09:53:13.108Z","0.0.21":"2023-11-23T21:53:01.911Z","0.0.22":"2023-11-28T09:19:50.162Z","0.0.23":"2024-01-10T14:57:48.375Z","0.0.24":"2024-01-19T13:38:45.592Z","0.0.25":"2024-02-01T16:21:37.647Z","0.0.26":"2024-02-02T23:31:46.671Z","0.0.27":"2024-03-06T21:47:25.140Z","0.1.0":"2024-03-15T12:02:46.146Z","0.1.1":"2024-03-25T11:21:38.336Z","1.0.0":"2024-04-05T14:41:52.979Z","1.1.0":"2024-06-14T10:27:49.805Z","1.2.0":"2024-06-24T10:54:56.361Z","1.3.0":"2024-07-10T14:33:41.618Z","2.0.0":"2024-08-02T11:32:56.607Z","2.1.0":"2024-10-24T14:46:38.591Z","2.2.0":"2025-01-10T14:12:38.217Z","2.2.1":"2025-01-20T15:12:24.312Z","2.2.2":"2025-01-21T07:50:27.382Z","3.0.0":"2025-03-30T11:38:39.217Z","3.0.1":"2025-04-07T07:51:41.915Z","3.1.0":"2025-12-15T11:48:41.735Z","3.1.1":"2026-01-26T09:28:53.418Z"},"bugs":{"url":"https://github.com/SirPepe/ornament/issues"},"author":{"name":"peter@peterkroener.de"},"license":"MIT","homepage":"https://github.com/SirPepe/ornament#readme","repository":{"type":"git","url":"git+https://github.com/SirPepe/ornament.git"},"description":"Micro-library for building vanilla web component frameworks","maintainers":[{"name":"sirpepe","email":"peter@peterkroener.de"}],"readme":"# [Ornament](https://sirpepe.github.io/use-ornament/) - Framework for web component frameworks\n\n📢 **What's new in 3.1.1?** [Check out the Changelog!](./changelog.md)\n\n**Build your own component framework** with Ornament, a stable, mid-level,\npareto-optimal, treeshakable, tiny and TypeScript-positive toolkit for web\ncomponent infrastructure! Escape from heavyweight frameworks, constant rewrites\nand the all-encompassing frontend FOMO with a declarative, simple, and type-safe\nAPI for almost-vanilla web components:\n\n```javascript\nimport {\n  define,\n  attr,\n  string,\n  number,\n  connected,\n  reactive,\n} from \"@sirpepe/ornament\";\n\n// Register the element with the specified tag name\n@define(\"my-greeter\")\nclass MyGreeter extends HTMLElement {\n  // No built-in rendering functionality. Shadow DOM or light DOM? Template\n  // strings, JSX, or something else entirely? You decide!\n  #shadow = this.attachShadow({ mode: \"open\" });\n\n  // Define content attributes alongside corresponding getter/setter pairs\n  // for a JS api and attribute change handling and type checking. If you use\n  // TypeScript, the type checks will work at compile time *and* at run time\n  @attr(string()) accessor name = \"Anonymous\";\n  @attr(number({ min: 0 })) accessor age = 0;\n\n  // Mark the method as reactive to have it run every time one of the attributes\n  // change, and also run it when the component first connects to the DOM.\n  @reactive()\n  @connected()\n  greet() {\n    this.#shadow.innerHTML = `Hello! My name is ${this.name}, my age is ${this.age}`;\n  }\n}\n```\n\nOrnament makes quasi-vanilla web components fun and easy when compared to the\nequivalent boilerplate monstrosity that one would have to write by hand\notherwise:\n\n<details>\n<summary>😱 Unveil the horror 😱</summary>\n\n```javascript\nclass MyGreeter extends HTMLElement {\n  #shadow = this.attachShadow({ mode: \"open\" });\n\n  // Internal \"name\" and \"age\" states, initialized from the element's content\n  // attributes, with default values in case the content attributes are not set.\n  // The value for \"age\" has to be figured out with some imperative code in the\n  // constructor to keep NaN off our backs.\n  #name = this.getAttribute(\"name\") || \"Anonymous\";\n  #age;\n\n  constructor() {\n    super(); // mandatory boilerplate\n    let age = Number(this.getAttribute(\"age\"));\n    if (Number.isNaN(age)) {\n      // Remember to keep NaN in check\n      age = 0;\n    }\n    this.#age = 0;\n  }\n\n  // Remember to run the reactive method when connecting to the DOM\n  connectedCallback() {\n    this.greet();\n  }\n\n  // Method to run each time `#name` or `#age` changes\n  greet() {\n    this.#shadow.innerHTML = `Hello! My name is ${this.#name}, my age is ${this.#age}`;\n  }\n\n  // DOM getter for the property, required to make JS operations like\n  // `console.log(el.name)` work\n  get name() {\n    return this.#name;\n  }\n\n  // DOM setter for the property with type checking and/or conversion *and*\n  // attribute updates, required to make JS operations like `el.name = \"Alice\"`\n  // work.\n  set name(value) {\n    value = String(value); // Remember to convert/check the type!\n    this.#name = value;\n    this.setAttribute(\"name\", value); // Remember to sync the content attribute!\n    this.greet(); // Remember to run the method!\n  }\n\n  // DOM getter for the property, required to make JS operations like\n  // `console.log(el.age)` work\n  get age() {\n    return this.#age;\n  }\n\n  // DOM setter for the property with type checking and/or conversion *and*\n  // attribute updates, required to make JS operations like `el.age = 42` work.\n  set age(value) {\n    value = Number(value); // Remember to convert/check the type!\n    if (Number.isNaN(value) || value < 0) {\n      // Remember to keep NaN in check\n      value = 0;\n    }\n    this.#age = value;\n    this.setAttribute(\"age\", value); // Remember to sync the content attribute!\n    this.greet(); // Remember to run the method!\n  }\n\n  // Attribute change handling, required to make JS operations like\n  // `el.setAttribute(\"name\", \"Bob\")` update the internal element state.\n  attributeChangedCallback(name, oldValue, newValue) {\n    // Because `#name` is a string, and attribute values are always strings as\n    // well we don't need to convert the types at this stage, but we still need\n    // to manually make sure that we fall back to \"Anonymous\" if the new value\n    // is null (if the attribute got removed) or if the value is (essentially)\n    // an empty string\n    if (name === \"name\") {\n      if (newValue === null || newValue.trim() === \"\") {\n        newValue = \"Anonymous\";\n      }\n      this.#name = newValue;\n      this.greet(); // Remember to run the method!\n    }\n    // But for \"#age\" we do again need to convert types, check for NaN, enforce\n    // the min value of 0...\n    if (name === \"age\") {\n      const value = Number(value); // Remember to convert/check the type!\n      if (Number.isNaN(value) || value < 0) {\n        // Remember to keep NaN in check\n        value = 0;\n      }\n      this.#age = value;\n      this.greet(); // Remember to run the method!\n    }\n  }\n\n  // Required for attribute change monitoring to work\n  static get observedAttributes() {\n    return [\"name\", \"age\"]; // remember to always keep this up to date\n  }\n}\n\n// Finally remember to register the element\nwindow.customElements.define(\"my-greeter\", MyGreeter);\n```\n\n</details>\n\nOrnament makes _only the most tedious bits_ of building vanilla web components\n(attribute handling and lifecycle reactions) easy by adding some primitives that\nreally should be part of the standard, but aren't. You yourself add everything\nelse. **Ornament is not a framework,** but something that you want to build your\nown framework on top of. Combine Ornament's baseline web component features with\nsomething like [uhtml](https://github.com/WebReflection/uhtml) or\n[Preact](https://preactjs.com/) for rending, add your favorite state management\nlibrary (or don't), write some glue code and enjoy your very own frontend web\nframework.\n\n## Guide\n\n### Installation\n\nInstall [@sirpepe/ornament](https://www.npmjs.com/package/@sirpepe/ornament)\nwith your favorite package manager. To get the decorator syntax working in early\n2026, you will probably need _some_ tooling support, such as:\n\n- [@babel/plugin-proposal-decorators](https://babeljs.io/docs/babel-plugin-proposal-decorators)\n  (with the option `version` set to `\"2023-11\"`)\n- [esbuild](https://esbuild.github.io) (with the option `target` set to `esnext`)\n- [TypeScript 5.0+](https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/#decorators)\n  (with the option `experimentalDecorators` turned _off_).\n\nApart from that, Ornament is just a bunch of functions. No further setup\nrequired.\n\n### General philosophy\n\nThe native APIs for web components are verbose and imperative, but lend\nthemselves to quite a bit of streamlining with\n[the ever-upcoming syntax for ECMAScript Decorators](https://2ality.com/2022/10/javascript-decorators.html).\nThe native APIs are also missing a few important primitives and conveniences.\nOrnament's goal is to provide the missing primitives and to streamline the\ndeveloper experience. Ornament is **not a framework** but instead aims to be:\n\n- **as stable as possible** by remaining dependency-free, keeping its own code to an absolute minimum, and relying on (or re-implementing) iron-clad web standards where possible\n- **fast and lean** by being nothing more than just a bag of relatively small and simple functions\n- supportive of **gradual** adoption and removal by being able to co-exist with vanilla web component code\n- **malleable** by being easy to extend, easy to customize, and easy to get rid of\n- **universal** by adhering to (the spirit of) web standards, thereby staying compatible with vanilla web component code as well as all sorts of web frameworks\n- equipped with **useful type definitions** (and work within the constraints of TypeScript)\n\nOrnament is _infrastructure for web components_ and not a framework itself. It\nmakes dealing with the native APIs bearable and leaves building something\nactually sophisticated up to you. Ornament does not come with _any_ of the\nfollowing:\n\n- **State management** (even though it is simple to connect components to signals or event targets)\n- **Rendering** (but it works well with [uhtml](https://github.com/WebReflection/uhtml), [Preact](https://preactjs.com/) and similar libraries)\n- Built-in solutions for **client-side routing**, **data fetching**, or really anything beyond the components themselves\n- Any preconceived notions about what should be going on **server-side**\n- **Specialized syntax or tooling** for every (or any specific) use case\n\nYou can (and probably have to) therefore pick or write your own solutions for\nthe above features. Check out the `examples` folder for inspiration! The\nexamples can be built using `npm run build-examples`.\n\n### Exit strategy\n\nEvery good library should come with an exit strategy as well as install\ninstructions. Here is how you can get rid of Ornament if you want to migrate\naway:\n\n- Components built with Ornament will generally turn out to be very close to\n  vanilla web components, so **they will most probably just keep working** when\n  used with other frameworks/libraries. You can theoretically just keep your\n  components and replace them only when the need for change arises.\n- If you want to replace Ornament with hand-written logic for web components,\n  you can **replace all attribute and update handling piecemeal.** Ornament's\n  decorators co-exist with native `attributeChangedCallback()` and friends just\n  fine. Ornament _extends_ what you can do with custom elements, it does not\n  require abstracting anything away.\n- Much of your migration will depend on **how you build on top of Ornament.**\n  You should keep reusable components and app-specific state containers\n  separate, just as you would do in e.g. React. This will make maintenance and\n  eventual migration much easier, but this is really outside of Ornament's area\n  of responsibility.\n\nIn general, migrating away should not be too problematic. The components that\nyou will build with Ornament will naturally tend to be self-contained and\nuniversal, and will therefore more or less always keep chugging along.\n\n## Decorators\n\n### API overview\n\n| Decorator             | Class element               | `static` | `#private` | Symbols | Summary                                                                                                                                                 |\n| --------------------- | --------------------------- | -------- | ---------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `@define()`           | Class                       | -        | -          | -       | Register a custom element class with a tag name and set it up for use with Ornament's other decorators                                                  |\n| `@enhance()`          | Class                       | -        | -          | -       | Set up a custom element class for use with Ornament's other decorators, but do _not_ register it with a tag name                                        |\n| `@prop()`             | Accessor                    | ✕        | ✓          | ✓       | Define an accessor to work as a property with a given data type                                                                                         |\n| `@attr()`             | Accessor                    | ✕        | ✓[^1]      | ✓[^1]   | Define an accessor to work as a content attribute and associated property with a given data type                                                        |\n| `@state()`            | Accessor                    | ✕        | ✓          | ✓[^2]   | Track the accessor's value in the element's [CustomStateSet](https://developer.mozilla.org/en-US/docs/Web/API/CustomStateSet)                           |\n| `@reactive()`         | Method, Field[^3]           | ✕        | ✓          | ✓       | Run a method or class field function when accessors decorated with `@prop()` or `@attr()` change value (with optional conditions)                       |\n| `@init()`             | Method, Field[^3]           | ✕        | ✓          | ✓       | Run a method or class field function after the class constructor finishes                                                                               |\n| `@connected()`        | Method, Field[^3]           | ✕        | ✓          | ✓       | Run a method or class field function when the element connects to the DOM                                                                               |\n| `@disconnected()`     | Method, Field[^3]           | ✕        | ✓          | ✓       | Run a method or class field function when the element disconnects from the DOM                                                                          |\n| `@connectedMove()`    | Method, Field[^3]           | ✕        | ✓          | ✓       | Run a method or class field function when the element is moved with [moveBefore()](https://developer.mozilla.org/en-US/docs/Web/API/Element/moveBefore) |\n| `@adopted()`          | Method, Field[^3]           | ✕        | ✓          | ✓       | Run a method or class field function when the element is adopted by a new document                                                                      |\n| `@formAssociated()`   | Method, Field[^3]           | ✕        | ✓          | ✓       | Run a method or class field function when the element is associated with a form element                                                                 |\n| `@formReset()`        | Method, Field[^3]           | ✕        | ✓          | ✓       | Run a method or class field function when the element's form owner resets                                                                               |\n| `@formDisabled()`     | Method, Field[^3]           | ✕        | ✓          | ✓       | Run a method or class field function when the element's ancestor fieldset is disabled                                                                   |\n| `@formStateRestore()` | Method, Field[^3]           | ✕        | ✓          | ✓       | Run a method or class field function when the element's `formStateRestoreCallback` fires                                                                |\n| `@subscribe()`        | Accessor, Method, Field[^3] | ✕        | ✓          | ✓       | Update a reactive accessor or run a method or class field function to react to changes to a signal or to events on an EventTarget                       |\n| `@observe()`          | Method, Field[^3]           | ✕        | ✓          | ✓       | Run a method or class field function as a callback for an IntersectionObserver, MutationObserver, or ResizeObserver                                     |\n| `@debounce()`         | Method, Field[^3]           | ✓        | ✓          | ✓       | Debounce a method or class field function, (including `static`)                                                                                         |\n\n[^1]:\n    Can be `#private` or a symbol _if_ a non-private non-symbol getter/setter\n    pair for the attribute name exists and a content attribute name has been\n    set using the `as` option.\n\n[^2]: Can be a symbol _if_ a string value has been provided for the state field\n\n[^3]: Class field values must be of type `function`\n\n### `@define(tagName: string, options: ElementDefinitionOptions = {}, registry: CustomElementRegistry = window.customElements)`\n\n**Class decorator** to register a class as a custom element, basically an\nalternative syntax for [`customElements.define()`](https://developer.mozilla.org/en-US/docs/Web/API/CustomElementRegistry/define);\n\n```javascript\nimport { define } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass MyTest extends HTMLElement {}\n\nconsole.log(document.createElement(\"my-test\")); // instance of MyTest\n```\n\n`@define()` also sets up attribute observation for use with the `@attr()`\ndecorator, prepares the hooks for lifecycle decorators like `@connected()` and\nensures that property upgrades for previously undefined elements happen in a\npredictable fashion. **Most of Ornament's features will only work if the component class is decorated with either `@define()` or `@enhance()`!**\n\n<details>\n<summary>What are safe upgrades?</summary>\n\nHTML tags can be used even if the browser does not (yet) know about them, and\nthis also works with web components - the browser can upgrade custom elements\nevent after the parser has processed them as unknown elements.\n[But this can lead to unexpected behavior](https://codepen.io/SirPepe/pen/poqLege?editors=0010)\nwhen properties are set on elements that have not yet been properly defined,\nshadowing relevant accessors on the prototype:\n\n```javascript\nconst x = document.createElement(\"hello-world\");\n// \"x\" = unknown element = object with \"HTMLElement.prototype\" as prototype\n\nx.data = 42;\n// \"x\" now has an _own_ property data=42\n\n// Implements an accessor for hello-world. The getters and\n// setters end up as properties on the prototype\nclass HelloWorld extends HTMLElement {\n  accessor data = 23;\n}\n\nwindow.customElements.define(\"hello-world\", HelloWorld);\n// It is now clear that \"x\" should have had \"HelloWorld.prototype\" as its\n// prototype all along\n\nwindow.customElements.upgrade(x);\n// \"x\" now gets \"HelloWorld.prototype\" as its prototype (with the accessor)\n\nconsole.log(x.data);\n// logs 42, bypassing the getter - \"x\" itself has an own property \"data\", the\n// accessor on the prototype is shadowed\n```\n\nOrnament ensures safe upgrades, always making sure that no prototype accessors\nfor attributes are ever shadowed by properties defined before an element was\nproperly upgraded.\n\n</details>\n\n<details>\n<summary>Notes for TypeScript</summary>\n\nYou should add your custom element's interface to `HTMLElementTagNameMap` to\nmake it work with native DOM APIs:\n\n```typescript\n@define(\"my-test\")\nexport class MyTest extends HTMLElement {\n  foo = 1;\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    \"my-test\": MyTest;\n  }\n}\n\nlet test = document.createElement(\"my-test\");\nconsole.log(test.foo); // only type checks with the above interface declaration\n```\n\n</details>\n\nIf you want to run your component code in a non-browser environment like JSDOM,\nyou can pass the JSDOM's CustomElementRegistry as the third argument to\n`@define()`.\n\n### `@enhance()`\n\n**Class decorator** to set up attribute observation and lifecycle hooks\n_without_ registering the class as a custom element.\n\n```javascript\nimport { enhance } from \"@sirpepe/ornament\";\n\n@enhance()\nclass MyTest extends HTMLElement {}\n\n// MyTest can only be instantiated when it has been registered as a custom\n// element. Because we use @enhance() instead of @define() in this example, we\n// have to take care of this manually.\nwindow.customElements.define(\"my-test\", MyTest);\n\nconsole.log(document.createElement(\"my-test\")); // instance of MyTest\n```\n\nThis decorator is only really useful if you need to handle element registration\nin some other way than what `@define()` provides. It is safe to apply\n`@enhance()` more than once on a class, or on both (or either) a base class and\nsubclass:\n\n```javascript\nimport { enhance } from \"@sirpepe/ornament\";\n\n// Not useful, but also not a problem\n@enhance()\n@enhance()\n@enhance()\nclass MyTest0 extends HTMLElement {}\n\n// Works\n@enhance()\nclass Base1 extends HTMLElement {}\nclass MyTest1 extends Base1 {}\n\n// Works\nclass Base2 extends HTMLElement {}\n@enhance()\nclass MyTest2 extends Base2 {}\n\n// Works\n@enhance()\nclass Base3 extends HTMLElement {}\n@enhance()\nclass MyTest3 extends Base3 {}\n```\n\nRemember that **most of Ornament's features will only work if the component class is decorated with either `@define()` or `@enhance()`.**\n\n### `@prop(transformer: Transformer<any, any>)`\n\n**Accessor decorator** to define a property on the custom element class\n_without_ an associated content attribute. Such a property is more or less a\nregular accessor with two additional features:\n\n- it uses **transformers** for type checking and validation\n- changes cause class members decorated with `@reactive()` to run\n\nExample:\n\n```javascript\nimport { define, prop, number } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  // Applies the number transformer to ensure that foo is always a number\n  @prop(number()) accessor foo = 23;\n\n  // Automatically runs when \"foo\" (or any accessor decorated with @prop() or\n  // @attr()) changes\n  @reactive()\n  log() {\n    console.log(`Foo changed to ${this.foo}`);\n  }\n}\n\nlet testEl = document.createElement(\"my-test\");\nconsole.log(testEl.foo); // logs 23\ntestEl.foo = 42; // logs \"Foo changed to 42\"\nconsole.log(testEl.foo); // logs 42\ntestEl.foo = \"asdf\"; // throw exception (thanks to the number transformer)\n```\n\nAccessors defined with `@prop()` work as a _JavaScript-only API_. Values can\nonly be accessed through the accessor's getter, invalid values are rejected by\nthe setter with exceptions. `@prop()` can be used on private accessors or\nsymbols without problem.\n\nNote that you can still define your own accessors, getters, setters etc. as you\nwould usually do. They will still work as expected, but they will not cause\n`@reactive()` methods to run.\n\n### `@attr(transformer: Transformer<any, any>, options: AttrOptions = {})`\n\n**Accessor decorator** to define a property with a matching content attribute on\nthe custom element class. This results in something very similar to\naccessors decorated with `@prop()`, but with the following additional features:\n\n- Its value can be initialized from a content attribute, if the attribute is present\n- Changes to the content attribute's value (eg. via `setAttribute()`) update the value of the property to match (depending on the options and the transformer)\n\n<details>\n<summary>What's the deal with content attributes?</summary>\n\nGetting attribute handling on Web Components right is _hard_, because many\ndifferent APIs and states need to interact in just the right way and the related\ncode tends to end up scattered across various class members. Attributes on HTML\nelements have two faces: the _content attribute_ and the _DOM property_.\nContent attributes are always strings and are defined either via HTML or via DOM\nmethods like `setAttribute()`. DOM properties can be accessed via object\nproperties such as `someElement.foo` and may be of any type. Both faces of\nattributes need to be implemented and properly synced up for an element to be\ntruly compatible with any software out there - a JS frontend framework may work\nprimarily with properties, while HTML authors or server-side rendering\nsoftware will work with content attributes.\n\nKeeping content and properties in sync can entail any or all of the following\ntasks:\n\n- Updating the content attribute when the property gets changed (eg. update the HTML attribute `id` when running `element.id = \"foo\"` in JS)\n- Updating the property when the content attribute gets changed (eg. `element.id` should return `\"bar\"` after `element.setAttribute(\"id\", \"bar\")`)\n- Converting types while updating content and/or properties (an attribute may be a `number` as a property, but content attributes are by definition always strings)\n- Rejecting invalid types on the property setter (as opposed to converting types from content to properties which, like all of HTML, never throws an error)\n- Connecting properties and content attributes with different names (like how the content attribute `class` maps to the property `className`)\n- Fine-tuning the synchronization behavior depending on circumstances (see the interaction between the `value` content and properties on `<input>`)\n- Remembering to execute side effects (like updating Shadow DOM) when any properties and/or content attribute changes\n\nThis is all _very_ annoying to write by hand, but because the above behavior is\nmore or less the same for all attributes, it is possible to to simplify the\nsyntax quite a bit:\n\n```javascript\nimport { attr, define number } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass MyTest extends HTMLElement {\n  @attr(number({ min: -100, max: 100 })) accessor value = 0;\n\n  @reactive()\n  log() {\n    console.log(this.value);\n  }\n}\n```\n\nThe line starting with with `@attr` gets you a content and a matching DOM\nproperty named `value`, which...\n\n- Always reflects a number between `-100` and `100`\n- Initializes from the content attribute and falls back to the initializer value `0` if the attribute is missing or can't be interpreted as a number\n- Automatically updates the content attribute with the stringified value of the property when the property is updated\n- Automatically updates the property when the content attribute is updated (it parses the attribute value into a number and clamps it to the specified range)\n- Implements getters and setters for the properties, with the getter always returning a number and the setter rejecting invalid values (non-numbers or numbers outside the specified range of `[-100, 100]`)\n- Causes the method marked `@reactive()` to run on update\n\nYou can use `@prop()` for standalone properties (that is, DOM properties\nwithout an associated content attributes), swap out the `number()` transformer\nfor something else, or combine any of the above with hand-written logic.\n\n</details>\n\n```javascript\nimport { define, attr, number } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  // Applies the number transformer to ensure that content attribute values get\n  // parsed into numbers and that new non-number values passed to the property\n  // setter get rejected\n  @attr(number()) accessor foo = 23; // 23 = fallback value\n\n  // Automatically runs when \"foo\", or any accessor decorated with @prop() or\n  // @attr(), changes (plus once on element initialization)\n  @reactive() log() {\n    console.log(`Foo changed to ${this.foo}`);\n  }\n}\n\ndocument.body.innerHTML = `<my-test foo=\"42\"></my-test>`;\nlet testEl = document.querySelector(\"my-test\");\nconsole.log(testEl.foo); // logs 42 (initialized from the attribute)\ntestEl.foo = 1337; // logs \"Foo changed to 1337\"\nconsole.log(testEl.foo); // logs 1337\nconsole.log(testEl.getAttribute(\"foo\")); // logs \"1337\"\ntestEl.foo = \"asdf\"; // throw exception (thanks to the number transformer)\ntestEl.setAttribute(\"foo\", \"asdf\"); // works, content attributes can be any string\nconsole.log(testEl.foo); // logs 23 (fallback value)\n```\n\nAccessors defined with `@attr()` work like all other supported attributes on\nbuilt-in elements. Content attribute values (which are always strings) get\nparsed by the transformer, which also deals with invalid values in a graceful\nway (i.e. without throwing exceptions). Values can also be accessed through the\nDOM property's accessor, where invalid values _are_ rejected with exceptions by\nthe setter.\n\n`@attr()` can only be used on private accessors or symbols only if the following\nholds true:\n\n1. The option `as` _must_ be set\n2. A non-private, non-symbol getter/setter pair for the attribute name defined in the option `as` _must_ exist on the custom element class\n\nContent attributes always have public DOM properties, and ornament enforces\nthis. A private/symbol attribute accessor with a manually-provided public facade\nmay be useful if you want to attach some additional logic to the public API\n(= hand-written getters and setters) while still having the convenience of of\nusing `@attr` on an `accessor`.\n\nNote that you can still define your own attribute handling with\n`attributeChangedCallback()` and `static get observedAttributes()` as you would\nusually do. This will keep working work as expected, but changes to such\nattributes will not cause `@reactive()` methods to run.\n\n#### Options for `@attr()`\n\n- **`as` (string, optional)**: Sets an attribute name different from the accessor's name, similar to how the `class` content attribute works for the `className` property on built-in elements. If `as` is not set, the content attribute's name will be equal to the accessor's name. `as` is required when the decorator is applied to a symbol or private property.\n- **`reflective` (boolean, optional)**: If `false`, prevents the content attribute from updating when the property is updated, similar to how `value` works on `input` elements. Defaults to true.\n\n### `@state(options: StateOptions = {})`\n\n**Accessor decorator** that tracks the accessor's value in the element's\n[CustomStateSet](https://developer.mozilla.org/en-US/docs/Web/API/CustomStateSet).\nBy default, the state's name is the decorated member's name and `Boolean` is\nused to decide whether a state should be added or removed from the set.\n\n```javascript\nimport { define, state } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  @state()\n  accessor foo = 0;\n  // Default: tracks the state \"foo\" by transforming the value with Boolean()\n\n  @state({ name: \"isOdd\", toBoolean: (value) => value % 2 !== 0 })\n  accessor bar = 0;\n  // Custom: tracks \"bar\" as \"isOff\" by transforming the value with toBoolean()\n}\n\nlet testEl = document.createElement(\"my-test\");\n\n// Custom state \"foo\" is not set, since Boolean(0) === false\nconsole.log(testEl.matches(\":state(foo)\")); // > false\n\n// Custom state \"isOdd\" is not set, since (value % 2 !== 0) === false\nconsole.log(testEl.matches(\":state(isOdd)\")); // > false\n\ntestEl.foo = 1;\ntestEl.bar = 1;\n\n// Custom state \"foo\" is set, since Boolean(1) === true\nconsole.log(testEl.matches(\":state(foo)\")); // > true\n\n// Custom state \"isOdd\" is set, since (value % 2 !== 0) === true\nconsole.log(testEl.matches(\":state(isOdd)\")); // > true\n```\n\nThe decorator works with private accessors. If no `name` option is provided, the\ncustom state name includes the `#` sign. Use on symbol accessors requires the\n`name` option.\n\nTo properly combine with `@prop()` and `@attr()`, `@state()` should be applied\nto the accessor last to benefit from the type checking and/or conversion\nprovided from the other decorators:\n\n```javascript\nimport { define, state, prop, number } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  @prop(number({ min: 0 })) // <- @prop() comes first\n  @state({ toBoolean: (x) => x % 2 === 0 }) // <- @state() comes last\n  accessor foo = 0;\n}\n\nconst testEl = new Test();\n// state \"foo\" is true\n\ntestEl.foo = 1;\n// state \"foo\" is false\n\ntry {\n  testEl.foo = -2; // <- this fails\n} catch {\n  // state \"foo\" on el still false; @prop intercepted the set operation\n}\n```\n\n#### Options for `@state()`\n\n- **`name` (string, optional)**: name of the state in the CustomStateSet. If `name` is not set, the state's name will be equal to the accessor's name. `name` is required when the decorator is applied to a symbol.\n- **`toBoolean` (((value, instance) => boolean), optional)**: Function to transform the accessor's value into a boolean, which in turn decides whether a state should be added or removed from the set. Defaults to the `Boolean` function. Called with `this` set to the component instance.\n\n### `@reactive(options: ReactiveOptions = {})`\n\n**Method and class field decorator** that runs class members when accessors\ndecorated with `@prop()` or `@attr()` change their values:\n\n```javascript\nimport { define, reactive, prop, number } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  @prop(number()) accessor foo = 0;\n  @prop(number()) accessor bar = 0;\n\n  @reactive()\n  log() {\n    console.log(`foo is now ${this.foo}, bar is now ${this.bar}`);\n  }\n}\n\nlet testEl = document.createElement(\"my-test\");\ntestEl.foo = 1;\ntestEl.bar = 2;\n\n// first logs \"foo is now 1, bar is now 0\"\n// then logs \"foo is now 1, bar is now 2\"\n```\n\nDecorated members are called with no arguments. They react to changes to the\ninstances' internal state and should therefore be able to access all relevant\ndata through `this`. In many cases you may want to apply `@reactive()` to\nmethods decorated with `@debounce()` to prevent excessive\ncalls.\n\nThe `predicate` and/or `keys` options can be used to control whether the\ndecorated method or function reacts to an update. For the decorated member to\nrun, the following needs to be true:\n\n1. `options.keys` must either have been omitted or must contain the property or\n   content attribute name that changed\n2. `options.excludeKeys` must either have been omitted or must not contain the\n   property or content attribute name that changed\n3. `options.predicate` must either have been omitted or must return true when\n   called immediately before the function is scheduled to run\n\n#### Options for `@reactive()`\n\n- **`keys` (Array\\<string | symbol\\>, optional)**: List of attributes (defined by `@prop()` or `@attr()`) to monitor. Can include private names and symbols. Defaults to monitoring all content attributes and properties defined by `@prop()` or `@attr()`.\n- **`excludeKeys` (Array\\<string | symbol\\>, optional)**: List of attributes and properties (defined by `@prop()` or `@attr()`) _not_ to monitor. Can include private names and symbols. Defaults to an empty array.\n- **`predicate` (Function `(this: T, prop: string | symbol, newValue: any, instance: T) => boolean`)**: If provided, controls whether or not the decorated method is called for a given change. Note that this function is not part of the class declaration itself and can therefore _not_ access private fields on `instance`, but the predicate function gets passed the affected property's name and new value.\n\n### `@init()`\n\n**Method and class field decorator** that runs class members when the class\nconstructor finishes. This has the same effect as adding method calls to the end\nof the constructor's body.\n\n```javascript\nimport { define, init } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  constructor() {\n    super();\n    console.log(23);\n  }\n\n  @init()\n  log() {\n    console.log(42);\n  }\n}\n\nlet testEl = document.createElement(\"my-test\");\n// first logs 23, then logs 42\n```\n\nThis decorator is particularly useful if you need to run `@reactive()` methods\nonce on component initialization. Decorated members are run with no arguments\nand _always_ right after the constructor finishes. This even extends to methods\nand class field functions decorated with `@debounce()`.\n\n### `@connected()`\n\n**Method and class field decorator** that runs class members when the component\nconnects to the DOM and the component's `connectedCallback()` fires:\n\n```javascript\nimport { define, connected } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  @connected()\n  log() {\n    console.log(\"Connected!\");\n  }\n}\n\nlet testEl = document.createElement(\"my-test\");\ndocument.body.append(testEl);\n// testEl.log logs \"Connected!\"\n```\n\nDecorated members are run with no arguments. You can also still use the regular\n`connectedCallback()`.\n\nIf `@connectedMove()` is used _anywhere_ in the class definition, `@connected()`\nwill _not_ run its target when the element is moved with\n[`moveBefore()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/moveBefore).\nThis mirrors the behavior of `connectedCallback()` when used in conjunction with\n`connectedMoveCallback()`. If you use `connectedCallback()`, its behavior\ndepends on the presence of `connectedMoveCallback()` - Ornament and vanilla\nlifecycle callbacks operate in separate spheres.\n\n### `@disconnected()`\n\n**Method and class field decorator** that runs decorated class members when the\ncomponent disconnects from the DOM and the component's `disconnectedCallback()`\nfires:\n\n```javascript\nimport { define, disconnected } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  @disconnected()\n  log() {\n    console.log(\"Disconnected!\");\n  }\n}\n\nlet testEl = document.createElement(\"my-test\");\ndocument.body.append(testEl);\ntestEl.remove();\n// testEl.log logs \"Disconnected!\"\n```\n\nDecorated members are run with no arguments. You can also still use the regular\n`disconnectedCallback()`.\n\nIf `@connectedMove()` is used _anywhere_ in the class definition,\n`@disconnected()` will _not_ run its target when the element is moved with\n[`moveBefore()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/moveBefore).\nThis mirrors the behavior of `disconnectedCallback()` when used in conjunction\nwith `connectedMoveCallback()`. If you use `disconnectedCallback()`, its\nbehavior depends on the presence of `connectedMoveCallback()` - Ornament and\nvanilla lifecycle callbacks operate in separate spheres.\n\n### `@connectedMove()`\n\n**Method and class field decorator** that runs decorated class members when the\ncomponent is moved around the DOM with [`moveBefore()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/moveBefore)\nand its `connectedMoveCallback()` fires:\n\n```javascript\nimport { define, connectedMove } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  @connectedMove()\n  log() {\n    console.log(\"Moved!\");\n  }\n}\n\nlet testEl = document.createElement(\"my-test\");\ndocument.body.append(document.createElement(\"div\"), testEl);\ndocument.body.moveBefore(testEl, document.body.firstChild);\n// testEl.log logs \"Moved!\"\n```\n\nDecorated members are run with no arguments. You can also still use the regular\n`disconnectedCallback()`.\n\nIf `@connectedMove()` is used _anywhere_ in the class definition, `@connected()`\nand `@disconnected()` will _not_ run their targets on use of `moveBefore()`.\nThis mirrors the behavior of `connectedCallback()` and `disconnectedCallback()`\nwhen used in conjunction with `connectedMoveCallback()`.\n\nThe execution of vanilla `connectedCallback()` and `disconnectedCallback()` is\nnot influenced by any of the decorators - Ornament and vanilla lifecycle\ncallbacks operate in separate spheres.\n\n### `@adopted()`\n\n**Method and class field decorator** that runs decorated class members when the\ncomponent is moved to a new document and the component's `adoptedCallback()`\nfires:\n\n```javascript\nimport { define, adopted } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  @adopted() log() {\n    console.log(\"Adopted!\");\n  }\n}\n\nlet testEl = document.createElement(\"my-test\");\nconst newDocument = new Document();\nnewDocument.adoptNode(testEl);\n// testEl.log logs \"Adopted!\"\n```\n\nDecorated members are run with no arguments. You can also still use the regular\n`adoptedCallback()`.\n\n### `@formAssociated()`\n\n**Method and class field decorator** that runs decorated class members when a\nform-associated component's form owner changes and its\n`formAssociatedCallback()` fires:\n\n```javascript\nimport { define, formAssociated } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  static formAssociated = true;\n  @formAssociated() log(newOwner) {\n    console.log(newOwner); // null or HTMLFormElement\n  }\n}\n\nlet testEl = document.createElement(\"my-test\");\nlet form = document.createElement(\"form\");\nform.append(testEl);\n// testEl.log logs \"form\"\n```\n\nDecorated members are passed the new form owner (if any) as an argument. You can\nalso still use the regular `formAssociatedCallback()`.\n\n### `@formReset()`\n\n**Method and class field decorator** that runs decorated class members when a\nform-associated component's form owner resets and its `formResetCallback()`\nfires:\n\n```javascript\nimport { define, formReset } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  static formAssociated = true;\n  @formReset() log() {\n    console.log(\"Reset!\");\n  }\n}\n\nlet testEl = document.createElement(\"my-test\");\nlet form = document.createElement(\"form\");\nform.append(testEl);\nform.reset();\n// ... some time passes...\n// testEl.log logs \"Reset!\"\n```\n\nDecorated members are run with no arguments. You can also still use the regular\n`formResetCallback()`.\n\nNote that form reset events are observably asynchronous, unlike all other\nlifecycle events. This is due to the form reset algorithm (and therefore the\nvanilla `formResetCallback()`) itself being async.\n\n### `@formDisabled()`\n\n**Method and class field decorator** that runs decorated class members when a\nform-associated component's fieldset gets disabled and its\n`formDisabledCallback()` fires:\n\n```javascript\nimport { define, formDisabled } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  static formAssociated = true;\n  @formDisabled() log(state) {\n    console.log(\"Disabled via fieldset:\", state); // true or false\n  }\n}\n\nlet testEl = document.createElement(\"my-test\");\nlet fieldset = document.createElement(\"fieldset\");\nlet form = document.createElement(\"form\");\nform.append(fieldset);\nfieldset.append(testEl);\nfieldset.disabled = true;\n// testEl.log logs \"Disabled via fieldset: true\"\n```\n\nDecorated members are passed the new form disabled state as an argument. You\ncan also still use the regular `formDisabledCallback()`.\n\n### `@formStateRestore()`\n\n**Method and class field decorator** that causes runs decorated class methods\nwhen a form-associated component's `formStateRestoreCallback()` fires. This does\nnot work in Chrome-based browsers as of November 2023.\n\n### `@subscribe(...args)`\n\n**Accessor, method or class field decorator** that subscribes to either\n[Event Targets](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget) or\n[signals](https://github.com/preactjs/signals), depending on the arguments. If\nthe decorated class member is a method or a function, it runs when the\nEventTarget dispatches a new event or when the signal receives a new value. If\nthe decorated member is an accessor, it gets updated with the last event object\n(for event targets) or signal values (for signals). You can decorate the\naccessor with `@prop()` to cause methods decorated with `@reactive()` to run\nwhen its value changes.\n\n#### Subscribe to EventTargets: `@subscribe(targetOrTargetFactory: EventTarget | ((instance: T) => EventTarget) | Promise<EventTarget>, eventNames: string, options: EventSubscribeOptions = {})`\n\nSubscribe the decorated class member to one or more events an EventTarget.\n[EventTarget](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget) is\nan interface that objects such as HTMLElement, Window, Document and _many_ more\nobjects implement. You can also create a vanilla event target or extend the\n`EventTarget` class:\n\n```javascript\nimport { define, subscribe } from \"@sirpepe/ornament\";\n\nconst myTarget = new EventTarget();\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  @subscribe(myTarget, \"foo\")\n  log(evt) {\n    // evt = Event({ name: \"foo\", target: myTarget })\n    // this = Test instance\n    console.log(`'${evt.type}' event fired!`);\n  }\n}\n\nlet testEl = document.createElement(\"my-test\");\n\nmyTarget.dispatchEvent(new Event(\"foo\"));\n\n// testEl.log logs \"'foo' event fired!\"\n```\n\nTo subscribe to multiple events, pass a single string with the event names\nseparated by whitespace:\n\n```javascript\nimport { define, subscribe } from \"@sirpepe/ornament\";\n\nconst myTarget = new EventTarget();\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  @subscribe(myTarget, \"foo bar\") #a() {} // subscribed to both \"foo\" and \"bar\"\n}\n```\n\nYou can also provide a target-producing factory or promise in place of the\ntarget itself:\n\n```javascript\nimport { define, subscribe } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  // \"window\" is a perfectly valid event target\n  @subscribe(window, \"update\") #a() {} // same effect as below\n  @subscribe(() => window, \"update\") #b() {} // same effect as above\n  @subscribe(Promise.resolve(window), \"update\") #c() {} // same effect as above\n}\n```\n\nThe target-producing factory function can be used to access targets that depend\non the element instance, such as the element's shadow root. The factory function\ngets called each time an element initializes, with its first argument set to the\ninstance.\n\n<details>\n<summary>Notes for TypeScript</summary>\n\nAn event target can actually be delivered by an _arbitrarily_ long chain of\nnested functions and promises. This is annoying to handle on the type level,\nyou'll just have to `any` your way around that or provide this capability in\na type-safe wrapper.\n\nMaking the `@subscribe()` decorator type-safe for use with events is a gnarly\nprospect. Given an event target and an event name, the decorator _can't_ know\nwhat type of event the method must expect. Therefore the following is possible\nby default:\n\n```typescript\nimport { define, subscribe } from \"@sirpepe/ornament\";\n\nlet target = document.createElement(\"div\");\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  @subscribe(target, \"click\")\n  #handleClicks(evt: MouseEvent) {} // This type checks, as it should\n\n  @subscribe(target, \"click\")\n  #handleAnimations(evt: AnimationEvent) {} // This type checks too!\n}\n```\n\nA mapping between event names and corresponding event types (such as `\"click\"`\n→ `MouseEvent`) exists for specific cases. For example `HTMLElementEventMap`\ncontains the mappings for events emitted by HTML elements. But because\n`@subscribe()` can work with _any event target_, the existence or relevance of\nsuch a mapping can't be assumed. The only way around this is to create an\nabstraction for specific use cases where such a mapping is available. This can\nbe based on `@subscribe()` itself:\n\n```typescript\n// Create a variant of @subscribe() specific to DOM events\nconst listen = <\n  T extends HTMLElement,\n  K extends keyof HTMLElementEventMap,\n>(\n  source: HTMLElement,\n  ...eventNames: K[]\n) =>\n  subscribe<T, HTMLElement, HTMLElementEventMap[K]>(\n    source,\n    eventNames.join(\" \"),\n  );\n\nconst eventSource = document.createElement(\"div\");\nclass Test extends HTMLElement {\n  // Works: \"click\" is a MouseEvent\n  @listen(eventSource, \"click\")\n  handleClick(evt: MouseEvent) {}\n\n  // Works: all event types listed by name are covered in the union\n  @listen(eventSource, \"transitionstart\", \"animationstart\")\n  handleAnimationStart(evt: AnimationEvent | TransitionEvent) {}\n\n  // Type error: \"focus\" is not a mouse event\n  @listen(eventSource, \"focus\")\n  handleFocus(evt: MouseEvent) {}\n\n  // Type error: type \"TransitionEvent\" is not covered\n  @listen(eventSource, \"transitionend\", \"animationend\")\n  handleAnimationEnd(evt: AnimationEvent) {}\n\n  // Type error: \"asdf\" is not a DOM event\n  @listen(eventSource, \"asdf\")\n  handleAsdf(evt: Event) {}\n```\n\n</details>\n\n##### Options for `@subscribe()` for EventTarget\n\n- **`targetOrTargetFactory` (EventTarget | Promise\\<EventTarget\\> | ((instance: T) => EventTarget) | Promise\\<EventTarget\\>)**: The event target (or event-target-returning function/promise) to subscribe to\n- **`eventNames` (string)**: The event(s) to listen to. To subscribe to multiple events, pass a single string with the event names separated by whitespace\n- **`options` (object, optional)**: Event handling options, consisting of...\n  - **predicate (function `(this: T, event: Event, instance: T) => boolean`, optional)**: If provided, controls whether or not the decorated method is called for a given event. Gets passed the element instance and the event object, and must return a boolean. Note that this method always handles the raw event object, before and eventual `transform()` is applied.\n  - **transform (function `<U>(this: T, event: Event, instance: T) => U`, optional)**: If provided, transforms the event object into something else. The decorated class element must be compatible with the type returned from `transform()`.\n  - **activateOn (Array\\<string\\>, optional):** Ornament event on which to activate the subscription (that is, when to actually start listening on the EventTarget). Defaults to `[\"init\", \"connected\"]`.\n  - **deactivateOn (Array\\<string\\>, optional):** Ornament event on which to deactivate the subscription (when to call `removeEventListener()` on the EventTarget). Defaults to `[\"disconnected\"]`.\n  - **capture (boolean, optional):** [option for `addEventListener()`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#parameters)\n  - **once (boolean, optional):** [option for `addEventListener()`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#parameters)\n  - **passive (boolean, optional):** [option for `addEventListener()`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#parameters)\n  - **signal (AbortSignal, optional):** [option for `addEventListener()`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#parameters)\n\n#### Subscribe to Signals: `@subscribe(signal: SignalLike<any>, options: SignalSubscribeOptions = {})`\n\nSubscribe to a signal:\n\n```javascript\nimport { define, subscribe } from \"@sirpepe/ornament\";\nimport { signal } from \"@preact/signals-core\";\n\nconst counter = signal(0);\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  @subscribe(counter)\n  test() {\n    console.log(counter.value);\n  }\n}\nconst instance = new Test();\ncounter.value = 1;\ncounter.value = 2;\ncounter.value = 3;\n// logs 0, 1, 2, 3\n```\n\nAny signal-like object that implements the following API should work:\n\n```typescript\ntype Signal<T> = {\n  // Takes an update callback and returns an unsubscribe function\n  subscribe(callback: () => void): () => void;\n  // Represents the current value\n  value: T;\n};\n```\n\nBecause signals permanently represent reactive values, subscribing itself causes\nthe method to be called with the then-current signal value. This is in contrast\nto subscribing to Event Targets, which (usually) do not represent values, but\njust happen to throw events around.\n\n##### Options for `@subscribe()` for signals\n\n- **`signal` (Signal)**: The signal to subscribe to\n- **`options` (object, optional)**: Update handling options, consisting of...\n  - **predicate (function `(this: T, value, instance: T) => boolean`, optional)**: If provided, controls whether or not the decorated method is called for a given signal update. Gets passed the element instance and the signal's value, and must return a boolean. Note that this method always handles the raw signal value, before and eventual `transform()` is applied.\n  - **transform (function `<U>(this: T, value, instance: T) => U`, optional)**: If provided, transforms the signal value into something else. The decorated class element must be compatible with the type returned from `transform()`.\n  - **activateOn (Array\\<string\\>, optional):** Ornament event on which to activate the subscription (that is, when to actually subscribe to the Signal). Defaults to `[\"init\", \"connected\"]`.\n  - **deactivateOn (Array\\<string\\>, optional):** Ornament event on which to unsubscribe from the signal. Defaults to `[\"disconnected\"]`.\n\n### `@debounce(options: DebounceOptions = {})`\n\n**Method and class field decorator** for debouncing method/function invocation:\n\n```javascript\nimport { define, debounce } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  // Debounce a class method\n  @debounce()\n  test1(x) {\n    console.log(x);\n  }\n  // Debounce a class field function\n  @debounce() test2 = (x) => console.log(x);\n}\n\nconst el = new Test();\n\nel.test1(1);\nel.test1(2);\nel.test1(3);\n// only logs \"3\"\n\nel.test2(\"a\");\nel.test2(\"b\");\nel.test2(\"c\");\n// only logs \"c\"\n```\n\n`@debounce()` works with class methods, static methods, and class field\nfunctions.\n\n<details>\n<summary>Notes for TypeScript</summary>\n\nDebouncing a method or class field function makes it impossible for the method\nor function to return anything but `undefined`. TypeScript does currently not\nallow decorators to modify its target's type, so `@debounce()` can't do that. If\nyou apply `@debounce()` to a method `(x: number) => number`, TypeScript will\nkeep using this signature, even though the decorated method will no longer be\nable to return anything but `undefined`.\n\n</details>\n\n#### Options for `@debounce()`\n\n- **`fn` (function, optional)**: The debounce function to use. Defaults to `debounce.raf()`. The following debounce functions are available:\n  - `debounce.raf()`: uses `requestAnimationFrame()`\n  - `debounce.timeout(ms: number)`: uses `setTimeout()`\n  - `debounce.asap()`: runs the function after the next microtask\n\n### `@observe(ctor: ObserverConstructor, options: ObserverOptions = {})`\n\n**Method and class field decorator** that sets up a [MutationObserver](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver), [ResizeObserver](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver), or [IntersectionObserver](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) with the element instance as the target and the decorated method as the callback. This enables the component to observe itself:\n\n```javascript\nimport { define, observe } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  // Pass the observer constructor and relevant options\n  @observe(MutationObserver, { childList: true })\n  reactToChanges(mutations, observer) {\n    // \"mutations\" = array of MutationRecord objects\n    // \"observer\" = the observer instance\n    console.log(mutations);\n  }\n}\n\nconst el = new Test();\nel.innerText = \"Test\"; // cause mutation\n\n// Test.reactToChanges() gets called asynchronously by the observer\n```\n\n`@observe()` always observes the element that the decorated method belongs to and its reactions are always observably (heh) asynchronous. The decorator does little more than create an observer object with the options provided and the decorated method as the callback function. In theory this should work with every kind of DOM-related observer, but has only been tested with MutationObserver, ResizeObserver and IntersectionObserver so far.\n\n#### Options for `@observe()`\n\n- **`Ctor` (function)**: The observer constructor function (probably one of `MutationObserver`, `ResizeObserver`, and `IntersectionObserver`)\n- **`options` (object, optional)**: A mixin type consisting of\n  - All options for the relevant observer type (see MDN for options for [MutationObserver](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver/observe#options), [ResizeObserver](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/IntersectionObserver#options), [IntersectionObserver](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver/observe#options))\n  - **`predicate` (function `(instance: T, records, observer) => boolean`)**: If provided, controls whether or not an observer callback invocation calls the decorated method. Gets passed the observer's callback arguments (an array of records and the observer object) as well as the element instance and must return a boolean.\n  - **activateOn (Array\\<string\\>, optional):** Ornament event on which to start observing the element. Defaults to `[\"init\", \"connected\"]`.\n  - **deactivateOn (Array\\<string\\>, optional):** Ornament event on which to stop observing the element. Defaults to `[\"disconnected\"]`.\n\n## Transformers\n\nTransformers define how the accessor decorators `@attr()` and `@prop()`\nimplement attribute handling and type transformations. This includes converting\ncontent attributes from and to DOM properties, type checks on setters, and\nrunning side effects.\n\n### Transformers overview\n\n| Transformer | Type                                           | Options                              |\n| ----------- | ---------------------------------------------- | ------------------------------------ |\n| `string()`  | `string`                                       |                                      |\n| `href()`    | `string` (URL)                                 | `location`                           |\n| `bool()`    | `boolean`                                      |                                      |\n| `number()`  | `number`                                       | `min`, `max`, `allowNaN`, `nullable` |\n| `int()`     | `bigint`                                       | `min`, `max`, `nullable`             |\n| `json()`    | Any (JSON serializable for use with `@attr()`) | `reviver`, `replacer`                |\n| `list()`    | Array                                          | `separator`, `transform`             |\n| `literal()` | Any                                            | `values`, `transform`                |\n| `any()`     | `any`                                          |                                      |\n| `event()`   | `function \\| null`                             |                                      |\n\nA transformer is just a bag of functions with the following type signature:\n\n```typescript\nexport type Transformer<\n  T extends HTMLElement,\n  Value,\n  IntermediateValue = Value,\n> = {\n  // Validates and/or transforms a value before it is used to initialize the\n  // accessor. Can also be used to run a side effect when the accessor\n  // initializes. Defaults to the identity function.\n  init: (\n    this: T,\n    value: Value,\n    context: ClassAccessorDecoratorContext<T, Value>,\n    isContentAttribute: boolean,\n  ) => Value;\n  // Turns content attribute values into DOM property values. Must never throw\n  // exceptions, and instead always just deal with its input. Must not cause any\n  // observable side effects. May return NO_VALUE in case the content attribute\n  // can't be parsed, in which case the @attr() decorator must not change the\n  // property value\n  parse: (this: T, value: string | null) => Value | typeof NO_VALUE;\n  // Decides if setter inputs, which may be of absolutely any type, should be\n  // accepted or rejected. Should throw for invalid values, just like setters on\n  // built-in elements may. Must not cause any observable side effects.\n  validate: (\n    this: T,\n    value: unknown,\n    isContentAttribute: boolean,\n  ) => asserts value is IntermediateValue;\n  // Transforms values that were accepted by validate() into the proper type by\n  // eg. clamping numbers, normalizing strings etc.\n  transform: (this: T, value: IntermediateValue) => Value;\n  // Turns DOM property values into content attribute values (strings), thereby\n  // controlling the attribute representation of an accessor together with\n  // updateContentAttr(). Must never throw, defaults to the String() function\n  stringify: (this: T, value: Value) => string;\n  // Determines whether a new attribute value is equal to the old value. If this\n  // method returns true, reactive callbacks will not be triggered. Defaults to\n  // simple strict equality (===).\n  eql: (this: T, a: Value, b: Value) => boolean;\n  // Optionally run a side effect immediately before the accessor's setter is\n  // invoked. Required by the event transformer.\n  beforeSet: (\n    this: T,\n    value: Value,\n    context: ClassAccessorDecoratorContext<T, Value>,\n    attributeRemoved: boolean,\n  ) => void;\n  // Optionally transform the getter's response. Required by the href\n  // transformer.\n  transformGet: (this: T, value: Value) => Value;\n  // Decides if, based on a new value, an attribute gets updated to match the\n  // new value (true/false) or removed (null). Only gets called when the\n  // transformer's eql() method returns false. Defaults to a function that\n  // always returns true.\n  updateContentAttr: (\n    oldValue: Value | null,\n    newValue: Value | null,\n  ) => boolean | null;\n};\n```\n\nBecause transformers need to potentially do a lot of type juggling and\nbookkeeping, they are somewhat tricky to get right, but they are also always\nonly a few self-contained lines of code. If you want to extend Ornament, you\nshould simply clone one of the built-in transformers and modify it to your\nliking.\n\n### Notes for all transformers\n\n#### For use with both `@prop()` and `@attr()`\n\nIn principle all transformers can be used with both `@prop()` and `@attr()`.\nVery few transformers are limited to use with either decorator, such as\n`event()` (which makes very little sense outside of content attributes).\n\nThe accessor's initial value serves as fallback value in case no other data is\navailable (eg. when a content attribute gets removed). Transformers validate\ntheir initial value and most transformers contain reasonable default values\n(`\"\"` for `string()`, `0` for `number()` etc.).\n\n#### For use with `@attr()`\n\nA content attribute's property value can be unset to the accessor's initial\nvalue by removing a previously set content attribute:\n\nAs an example:\n\n```javascript\nimport { define, attr, string } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  @attr(string()) accessor foo = \"default value\";\n  @attr(string()) accessor bar = \"default value\";\n  @attr(string()) accessor baz;\n}\n\ndocument.body.innerHTML += `<my-test foo=\"other value\"></my-test>`;\n```\n\nThe attributes `foo`, `bar` and `baz` behave as follows:\n\n- The element initializes with a content attribute **`foo`** already set in HTML. The property `foo` will therefore (because it uses the string type via the `string()` transformer) contain `\"other value\"`. Should the content attribute `foo` get removed, the DOM property will contain `\"default value\"`.\n- The content attribute **`bar`** is not set in HTML, which will result in the property `bar` containing the accessor's default value `\"default value\"`.\n- The content attribute **`baz`** is also not set in HTML _and_ the accessor has no initial value, so the `string()` transformer's built-in fallback value `\"\"` gets used.\n\n### Transformer `string()`\n\nImplements a string attribute or property. Modeled after built-in string\nattributes such as `id` and `lang`, it will always represent a string and\nstringify any and all non-string values.\n\n```javascript\nimport { define, attr, string } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  @attr(string()) accessor foo = \"default value\";\n}\n```\n\n#### Behavior overview for transformer `string()`\n\n| Operation                | DOM property value      | Content attribute (when used with `@attr()`) |\n| ------------------------ | ----------------------- | -------------------------------------------- |\n| Set property to `x`      | `String(x)`             | DOM property value                           |\n| Set content attribute    | Content attribute value | As set (equal to property value)             |\n| Remove content attribute | Initial value or `\"\"`   | Removed                                      |\n\n### Transformer `href({ location = window.location }: { location?: Location } = {})`\n\nImplements a string attribute or property that works exactly like the `href`\nattribute on `<a>` in that it automatically turns relative URLs into absolute\nURLs.\n\n```javascript\nimport { define, attr, href } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  @attr(href()) accessor foo = \"\";\n}\n\nlet testEl = new Test();\n\n// Assuming that the page is served from localhost:\nconsole.log(testEl.foo); // > \"\"\ntestEl.foo = \"asdf\";\nconsole.log(testEl.foo); // > \"http://localhost/asdf\"\ntestEl.foo = \"https://example.com/foo/bar/\";\nconsole.log(testEl.foo); // > \"https://example.com/foo/bar/\"\n```\n\nIf you want to run your component code in a non-browser environment like JSDOM,\nyou can pass the JSDOM's `window.location` as the option `location`.\n\n#### Behavior overview for transformer `href()`\n\n| Operation                                      | DOM property value          | Content attribute (when used with `@attr()`) |\n| ---------------------------------------------- | --------------------------- | -------------------------------------------- |\n| Set property to absolute URL (string)          | Absolute URL                | DOM property value                           |\n| Set property to any other value `x`            | Relative URL to `String(x)` | DOM property value                           |\n| Set content attribute to absolute URL (string) | Absolute URL                | As set                                       |\n| Set content attribute to any other string `x`  | Relative URL to `x`         | As set                                       |\n| Remove content attribute                       | Initial value or `\"\"`       | Removed                                      |\n\n### Transformer `number(options: NumberOptions = {})`\n\nImplements a number attribute with optional range constraints.\n\n```javascript\nimport { define, attr, number } from \"@sirpepe/ornament\";\n\n@define(\"my-test\")\nclass Test extends HTMLElement {\n  // With default options (see below)\n  @attr(number()) accessor foo = 0;\n\n  // With all options set\n  @attr(number({ min: 0, max: 10 })) accessor bar = 0;\n}\n```\n\nNon-numbers get converted to numbers. The transformer allows `null` and\n`undefined` (with the latter converting to `null`) if the option `nullable` is\nset to `true`. If converting a non-number to a number results in `NaN` and the\noption `allowNaN` is not set to `true`, the property setter and the accessor's\ninitializer throw exceptions.\n\n#### Options for transformer `number()`\n\n- **`min` (number, optional)**: Smallest possible value. Defaults to `-Infinity`. Content attribute values less than `min` get clamped, property values get validated and (if too small) rejected with an exception. Can be omitted or set to `null` or `undefined` to signify no minimum value.\n- **`max` (number, optional)**: Largest possible value. Defaults to `Infinity`. Content attribute values greater than `max` get clamped, property values get validated and (if too large) rejected with an exception. Can be omitted or set to `null` or `undefined` to signify no maximum value.\n- **`allowNaN` (boolean, optional)**: Whether or not `NaN` is al","readmeFilename":"Readme.md"}