{"_id":"@nemanjan00/qrp","_rev":"26-a8a14c0dc765e9e90cf60eec90f7d8e7","name":"@nemanjan00/qrp","dist-tags":{"latest":"0.9.6"},"versions":{"0.1.0":{"name":"@nemanjan00/qrp","version":"0.1.0","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"_id":"@nemanjan00/qrp@0.1.0","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp-xdl4.onrender.com/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"bbfba37b25d432487035705bac8e0096edecfc45","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.1.0.tgz","fileCount":47,"integrity":"sha512-rj5zvvtayrrl72xCr6WkmBfvYqVcOG+VVDdPeQEfIglgG6XQ8TMypcJveFn/zCfeV9mdmXo/33VrljT7aMeCtA==","signatures":[{"sig":"MEUCIQCjpcegFL9+SfBQxgZj7+Fu20HlJ4yzjfQTJUeooex1QgIgY/VjtsfriuxIu5P6llFMVVS0r8D1y7NXqC/iYKu7qm8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":169723},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./qrp/index.js"},"./html":{"types":"./html/index.d.ts","default":"./html/index.js"},"./http":{"types":"./http/index.d.ts","default":"./http/index.js"},"./forms":{"types":"./forms/index.d.ts","default":"./forms/index.js"},"./proto":{"types":"./proto/index.d.ts","default":"./proto/index.js"},"./table":{"types":"./table/index.d.ts","default":"./table/index.js"},"./utils":{"types":"./utils/index.d.ts","default":"./utils/index.js"},"./events":{"types":"./events/index.d.ts","default":"./events/index.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./toasts/index.js"},"./browser":{"types":"./browser/index.d.ts","default":"./browser/index.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./utils/*.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./behaviors/index.js"},"./collection":{"types":"./collection/index.d.ts","default":"./collection/index.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"b8f140c42beaa094eaddd88936edc26e585942a2","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero RUNTIME dependencies, zero build step — the devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.1.0_1784055634355_0.7840374561043613","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@nemanjan00/qrp","version":"0.1.1","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.1.1","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp-xdl4.onrender.com/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"f89b0b0c8b52515df724d0aff83b241415ee25aa","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.1.1.tgz","fileCount":48,"integrity":"sha512-e4McVcvysuDzzw4+M+aZtSzDoRpCN7eFlK3SzjHf4D3QBPuA0xCe1ChrmqXCIsybP7UtwBaouzhc8TOTt2i3iw==","signatures":[{"sig":"MEUCICU8fu1FR7wLsWG+nMlc7VZoIuah7dfubEeMLV+tdDlzAiEA0gfKInX9w8vsI4mliCZpUIzYTfe0arV4dGw0zbYlGEg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171328},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./qrp/index.js"},"./html":{"types":"./html/index.d.ts","default":"./html/index.js"},"./http":{"types":"./http/index.d.ts","default":"./http/index.js"},"./forms":{"types":"./forms/index.d.ts","default":"./forms/index.js"},"./proto":{"types":"./proto/index.d.ts","default":"./proto/index.js"},"./table":{"types":"./table/index.d.ts","default":"./table/index.js"},"./utils":{"types":"./utils/index.d.ts","default":"./utils/index.js"},"./events":{"types":"./events/index.d.ts","default":"./events/index.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./toasts/index.js"},"./browser":{"types":"./browser/index.d.ts","default":"./browser/index.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./utils/*.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./behaviors/index.js"},"./collection":{"types":"./collection/index.d.ts","default":"./collection/index.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"e32e6f7653001a4c895b6ea7c36ae75b4aba1da3","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero RUNTIME dependencies, zero build step — the devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.1.1_1784055783410_0.2164262487881985","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@nemanjan00/qrp","version":"0.2.0","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.2.0","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp-xdl4.onrender.com/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"4ae94f7a9ab9b1d59035f44e4f434f11f3be2721","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.2.0.tgz","fileCount":61,"integrity":"sha512-WRpw7T1hljAuaHL2ksTWf0SODAEocZafOybL5nlE44o2C1OxGJEx/RJuJEAMDcjZrwLRyPjR6bz8AWAtJMmkiw==","signatures":[{"sig":"MEUCIQDQyTrTpC1mASqazpLNuwalTYi7jsEcpCwpZNVNSHD2SwIgKkjo8dJfDIcRsnRVAW5RtHxAvVz+3QgGdnR8rQMzlL0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93880},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"f5c5c80c6499e0fcba83e11a0fad899992e5f13f","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero RUNTIME dependencies, zero build step — the devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.2.0_1784056556823_0.11050177268111772","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@nemanjan00/qrp","version":"0.2.1","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.2.1","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp-xdl4.onrender.com/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"ab4fc356e5aec566b119b72cf63f295459c08cd1","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.2.1.tgz","fileCount":61,"integrity":"sha512-MGZ5w3dZTPtPsj8+EOPVa+VuveI051+JM46/6KITTFAOpoV+HHGRxDZZuLiJOIxbNDUM79cpdcgd+ksusiQMBw==","signatures":[{"sig":"MEUCIQDuX9xG+wUwYJfJQgLErDOiZsb0ChI5I+NbKI9czqLXYQIgBPXfHArItaTaJyUqu230F4yKwgmr7X0T0Aa/PPCHZPg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95433},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"a1a679b73d550a95e3fb35999c8ddf79771a4fe7","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero RUNTIME dependencies, zero build step — the devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.2.1_1784059359674_0.8585000374747356","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@nemanjan00/qrp","version":"0.4.0","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.4.0","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp-xdl4.onrender.com/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"410c9b6725035e599120636668e6e05b7a5da4fd","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.4.0.tgz","fileCount":65,"integrity":"sha512-IadZy3etT0/Y0vxZKqa9HdK2qzzkd78msrifxydsHMY5O+nfbVr+e+rDdjcMhVVEd3pj9GUmas0z2qFqSQ7THA==","signatures":[{"sig":"MEUCIDNvPCRFBgC7SAxa7jZ3p02P9r3mKmQ+6wPoHKXW2PoGAiEAmGnVQJcMkX1+rdz4lKvxeNNJrZuGJZj1erPgJW/9RTM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107088},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"050e4d1dfd12134c0a54998bc7eef3cb13f5ea99","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero RUNTIME dependencies, zero build step — the devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.4.0_1784070712890_0.051673682358953865","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@nemanjan00/qrp","version":"0.4.1","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.4.1","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp-xdl4.onrender.com/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"e62ee3f1fc3e4536cba06605249b1b94d5314b01","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.4.1.tgz","fileCount":73,"integrity":"sha512-8FvFVRNXkJDANsxYY/qa1nofYRqgqRZg7u0ffgW/AyDyMmpALg7xXf0iQsQF0uWsjCOqMHNVvD2UOwPmA1RSBw==","signatures":[{"sig":"MEUCIQCjg/qf0Wf9lpktW/Psmk8xZjpYR9Bdqri3pw64kCzEUQIgW1upWFewkuvxNHPqQUuPgKtDAg+mUbzaxrSspt626DI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108190},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"22586768445c75575d51770074b50b59c793861a","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero RUNTIME dependencies, zero build step — the devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.4.1_1784071360034_0.408546626877498","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@nemanjan00/qrp","version":"0.4.2","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.4.2","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp-xdl4.onrender.com/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"4fa5044012e70384d2846a70f8c9773a6568b469","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.4.2.tgz","fileCount":73,"integrity":"sha512-ieKoK0bAKVf2tOPpTJTpsO1Th0Ue6/hBCwZDqFjwF9ybdfU9sz7K2/pQZhOUfXlRNF8xKuFIr87BdSSLugbTjg==","signatures":[{"sig":"MEQCIFxvdjb6O7W6v9kzG1RjXH6EQcBgAnnsJYg2k2fK4EqQAiAHOIjYaru7V4153d/ZzPPVOGNRRcEKaoYhgB/Daa5yWw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108768},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"6538f6376d2f97f2bd0c6360d52dfba8c532897f","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero RUNTIME dependencies, zero build step — the devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.4.2_1784100679185_0.8524959295866703","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@nemanjan00/qrp","version":"0.4.5","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.4.5","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp-xdl4.onrender.com/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"994a2ce13e2e45251eb60780d680e36744accc32","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.4.5.tgz","fileCount":73,"integrity":"sha512-LeSs3hDNdE3UUdsNK3TSvoYokKXxxl3Qxqd6I65SFQOfBkf2By/u7t6V16kj96o2Q5+8UvzL4/t4pwGl2Xe4ew==","signatures":[{"sig":"MEUCIQCeRoc/auaj4y12kGLu2/s3JznxWU7PzCWqk5dZQLRefwIgR0WZ7y2q7Xmb88gmtxlrG34PBUkwpEfKmOEoCx5w2Xw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114864},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"b17b8732e5e114f699297749d9e5f58a267ee112","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero RUNTIME dependencies, zero build step — the devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.4.5_1784103707892_0.00024230831418825538","host":"s3://npm-registry-packages-npm-production"}},"0.4.6":{"name":"@nemanjan00/qrp","version":"0.4.6","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.4.6","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp-xdl4.onrender.com/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"91faab66f5edb2ae548ae5a51722718bd7fda211","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.4.6.tgz","fileCount":73,"integrity":"sha512-9boe2Pp3wPeAmLFlgEYoJrLYOpNHfMXddrRgZ9t5ii2mBOKRvuhTrat8xv2UNwZs2q1NEB6+vYnKS0Rv7NXMxg==","signatures":[{"sig":"MEQCIDU8HsBjY37r1w8OeA6Syj9ONXyc9imv1YD9gJbbsopbAiB9wNzPZaVjrRxiXqvBJfSZ3pZF8TcQaaQZZs9Kg6/6ig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114934},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"0a9b621b1988395869933d17cbf2a65289671f11","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero RUNTIME dependencies, zero build step — the devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.4.6_1784105226489_0.8110968115325226","host":"s3://npm-registry-packages-npm-production"}},"0.4.7":{"name":"@nemanjan00/qrp","version":"0.4.7","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.4.7","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp-xdl4.onrender.com/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"1f56aeea75058ee7d258826c687cf671556a8a33","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.4.7.tgz","fileCount":73,"integrity":"sha512-4UZ1HSngNQC7Pt8u22+Wk2/aJqUOjrH8lVKiawtUuwnmIiCDwRVllAblutbJit6avNOIaku6MSHVaGmzS0Bc6Q==","signatures":[{"sig":"MEQCIBP27YqhyObfYe9g8HvB7cUVmvgLqBxbL1E4832Zxdk6AiACeevlLZenqpAX08TAo1NyT5rTk6jbpbqx3pUkvX3EyQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115673},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"2c4fb6bb922ef284bf227b79939219cf33d1387e","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero RUNTIME dependencies, zero build step — the devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.4.7_1784107253714_0.05753960930020896","host":"s3://npm-registry-packages-npm-production"}},"0.4.8":{"name":"@nemanjan00/qrp","version":"0.4.8","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.4.8","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp-xdl4.onrender.com/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"decba59caf9c3f21910a8c6ec77fe187fa5678a1","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.4.8.tgz","fileCount":73,"integrity":"sha512-4H8Wnegw27xE1fhKPmCDeUja5ERAcL8eM5cG42ZIoSHZ4jZJ4FiQ5PRcO5ViizQ+Sp1kyKVgAXH261gDrgn+CA==","signatures":[{"sig":"MEUCIQCIYw2NKwZnVaujsGD51Cbn4PacUOrggKBHc5sCX1biPAIgOTZVchi7glPFBdYfvyYW8IEwc9Nm8OUTKSvtPCm/gpM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115988},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"b15ea0c1342a224c235b571ec1a1084722adb9b9","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero RUNTIME dependencies, zero build step — the devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.4.8_1784111361829_0.5267033529502019","host":"s3://npm-registry-packages-npm-production"}},"0.4.10":{"name":"@nemanjan00/qrp","version":"0.4.10","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.4.10","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp.nemanja.top/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"d9fe6bfbcc3bb20fc963237d64268c8d69f982be","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.4.10.tgz","fileCount":73,"integrity":"sha512-K9j9o3JuVO+pajJAgSq6Msd01N1927HdwfeO8GD4KXmvMYuwvE4pC8RG0xx/HGEinsjLkouIOpSkzNrkNnr/jg==","signatures":[{"sig":"MEQCIG6MOf4lqZmwsfu9c2i4sGS/HZmp/Mwl2NC2dNxPWJi8AiAHarShXdwVrFl/N077h92R1q5Cs6knjstdQbsu7Sg23A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":117087},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"fde5b7d75c5ef18d8f1791043e2d802919899dd2","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero RUNTIME dependencies, zero build step — the devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.4.10_1784134229414_0.029544315889828976","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@nemanjan00/qrp","version":"0.5.0","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.5.0","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp.nemanja.top/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"c1e4d9ae4513c4ddc5cccac00d9abbd38b55ff57","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.5.0.tgz","fileCount":75,"integrity":"sha512-rLbvsY2pUhBN/1QmhK1+GbdtRum8AIENWF5KgXDdxd9IcySQzK3WOZgKxDHZQeqQBMiTcLakCFaA6J0QG+LBRQ==","signatures":[{"sig":"MEYCIQDYVg0qvOhyrIgASqRTjNJxKbAlV/SqppcYSoyx3NnbUQIhAMyc+IAsy56WpNWI9vZMKD12ooRiO9NE6u2vxquyFsp8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":124782},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./datagrid":{"types":"./datagrid/index.d.ts","default":"./dist/datagrid.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"9d8c351a780ba8fbd272cce549306d1db95e9ded","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero RUNTIME dependencies, zero build step — the devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.5.0_1784138767001_0.23818444494198232","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@nemanjan00/qrp","version":"0.5.1","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.5.1","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp.nemanja.top/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"dcd71746a93cf887daa2a1ed0be7e90a3c5bccf7","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.5.1.tgz","fileCount":75,"integrity":"sha512-mNIBfachf/8JnwTyu7p7KEyp8OAzwy0ZEeoHny8990SqTZx1/q/KRY/v4yHZeIUPWyHM5TrBde6UUq8tdJpQpg==","signatures":[{"sig":"MEUCIQDQKCKdBc5fMciuTnopqNDmAjagkX72tKPvM0gadnh/yQIgTIpfkO3jYad83yRZbxoy+bD0qUvCA2jqdB1FOOCXEMI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":124866},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./datagrid":{"types":"./datagrid/index.d.ts","default":"./dist/datagrid.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"6cd00211217a587a1421ec67f7c2bfd07ce675d2","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero RUNTIME dependencies, zero build step — the devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.5.1_1784143508631_0.25346534007953303","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@nemanjan00/qrp","version":"0.5.2","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.5.2","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp.nemanja.top/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"74a5420cbf03c781d5c1eae7a04ec46b57344ccd","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.5.2.tgz","fileCount":80,"integrity":"sha512-vgy7zWPEF5cOfnJZYHjbqfIFoojpFd86BUwLkCoQWywU+4ksfNY+EBozjq3R6w2+MMtjPxMnL2ilQcS7lFnbJQ==","signatures":[{"sig":"MEUCIDyBuhsryXAsiea8E+nGTe4djKtnfcyUEpj6X6pSKZ3MAiEAzdRa3Al95IRb1W9st/xU+V0kotCOqc2sS2oBkNW4r0o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":210198},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./datagrid":{"types":"./datagrid/index.d.ts","default":"./dist/datagrid.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"16f5ba4712576ba356123c19db8f921fa4860682","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero RUNTIME dependencies, zero build step — the devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.5.2_1784195431874_0.5987174989662112","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@nemanjan00/qrp","version":"0.6.0","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.6.0","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp.nemanja.top/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"7ebe9578e4adbcd069b387e6fde169a676f0fa9d","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.6.0.tgz","fileCount":63,"integrity":"sha512-ZDMGaCipTKceWHyeklxbNHNqULsppr2FKeP+J6P046e6Cw6HFfBF1GK4bQwmXRbb7EhVIs32hfKT3IYRvs5g/w==","signatures":[{"sig":"MEUCIQCLHuQDlCDSTVp0LWA9eXIRu9q5tFsY6ujz0TbJOaucEAIgdbpDfL8Kgo5UW5oaWWTrhVDKteUC9RWEig5p72BgzhM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":213911},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./datagrid":{"types":"./datagrid/index.d.ts","default":"./dist/datagrid.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"0daa09dd9470160e6bced575ae2604a04a57715d","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero runtime dependencies, no build step required (works with any bundler — Vite/webpack/Rollup/esbuild — or none). The devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.6.0_1784197902038_0.9953293488733881","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@nemanjan00/qrp","version":"0.6.1","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.6.1","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp.nemanja.top/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"cbcc8c1199771d7e4fc00479eba1e1e015193f56","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.6.1.tgz","fileCount":63,"integrity":"sha512-00QqnKOJFLwhJ6SgJL6jh6iMCjUZDfftdrrsgKim3ZWvUxZnEKRrZQaGHd200bnCD9lb4heWgwnSAX18vELutA==","signatures":[{"sig":"MEUCIAWdU8Cjlqcu9zGqWlm6kzqvd5LmrhCGQe/5jtHKs60ZAiEA++rSUmNgIJ4mEnaVfT3kyjCK1hivdDbWNsTJBb2PJPs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":215658},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./datagrid":{"types":"./datagrid/index.d.ts","default":"./dist/datagrid.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"0c3e1cec0bfc0b0c1fb5c2a4e95830d5ee101014","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero runtime dependencies, no build step required (works with any bundler — Vite/webpack/Rollup/esbuild — or none). The devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.6.1_1784241325419_0.9509631989806571","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@nemanjan00/qrp","version":"0.7.0","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.7.0","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp.nemanja.top/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"3be22a9b20d22cd19bc34b4f053ad965b305f607","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.7.0.tgz","fileCount":63,"integrity":"sha512-N9S3A1Vm3R4QnuY933eMP5dYuPSwgu8fjvackCsBKoqtZLqXFbaS+hRjjnhGWgioq8cOzjUDSl4E1BXABxXWkg==","signatures":[{"sig":"MEUCICfH2joDGC+v1HV4jrla3dMBlHFBUZMlthbjbNaDdpvAAiEA/YCEZW6yrsuG+D465jy8Y5D8oeHYHhjEB9E9E3h6288=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":214231},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./datagrid":{"types":"./datagrid/index.d.ts","default":"./dist/datagrid.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"ea7183479bbd1581280f33be6d5428ffd9c323c9","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero runtime dependencies, no build step required (works with any bundler — Vite/webpack/Rollup/esbuild — or none). The devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.7.0_1784248061347_0.38184720394116","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@nemanjan00/qrp","version":"0.8.0","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.8.0","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp.nemanja.top/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"c4b5bc4a6972247bc19d942b17267b327b99c6ad","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.8.0.tgz","fileCount":63,"integrity":"sha512-QUuSCLcMz3oRhoADvClpWWB3z0Vw7Qk64a9dsXcKq8M+53wZWpuowt0ovdiZNhAsz2EYvSgcAyDqRwLugFv9oA==","signatures":[{"sig":"MEUCIQDSCFc/BvwKaclxr8zH9BctS7dpdlOblQ3JNPPPSn3nuwIgCFMaZ9lR37RbhdrqCDMh1PQqyOtJvx75ktg74MLpFyQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":217691},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./datagrid":{"types":"./datagrid/index.d.ts","default":"./dist/datagrid.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"e9f5991e1d7e501e584f01f3525a16cf7ad79620","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero runtime dependencies, no build step required (works with any bundler — Vite/webpack/Rollup/esbuild — or none). The devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.8.0_1784724877523_0.7639453230282498","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@nemanjan00/qrp","version":"0.9.0","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.9.0","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp.nemanja.top/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"253a356331d57954bdd31b7f75d11f22f660cda0","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.9.0.tgz","fileCount":75,"integrity":"sha512-Vfyl/MQV1B93SPcJZeIGTg6M/b19vZwcCaxyvIh09Tmsjm4r39ORtu/mqu4Kbq6uNtlbQTZZAil3pKFRPqsJIw==","signatures":[{"sig":"MEUCIFIinel6x03GsKVKh1awJfFEygJurnphqC7325FxEVjvAiEA6YZsSVV9EETktyIydkX90EClbtfIv33Iay+Pnzl2Xt4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":242006},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./scale":{"types":"./scale/index.d.ts","default":"./dist/scale.js"},"./spark":{"types":"./spark/index.d.ts","default":"./dist/spark.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./export":{"types":"./export/index.d.ts","default":"./dist/export.js"},"./format":{"types":"./format/index.d.ts","default":"./dist/format.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./datagrid":{"types":"./datagrid/index.d.ts","default":"./dist/datagrid.js"},"./resource":{"types":"./resource/index.d.ts","default":"./dist/resource.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./timeseries":{"types":"./timeseries/index.d.ts","default":"./dist/timeseries.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"197d11e5c394e69bf6edb10a7079377635181b7e","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero runtime dependencies, no build step required (works with any bundler — Vite/webpack/Rollup/esbuild — or none). The devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.9.0_1784726824527_0.14497900767160732","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"@nemanjan00/qrp","version":"0.9.1","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.9.1","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp.nemanja.top/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"68efaaf77e5cceb6f0e321a7f068e32e9a15b69d","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.9.1.tgz","fileCount":75,"integrity":"sha512-0H1iw8vNP8ncXg7P8rSMtsKj8UpHt6oXoAvmZRg/mgCksgKYkSrs6Th2tzKI9KNrWCqHKlWRmJvePkJEnWLaWQ==","signatures":[{"sig":"MEQCIAsbnL2toroPVBwcD4tqgWewjh0UTPnYUil05YHPoa+vAiAmKqiteRjiHk6BdGkA02c2oGlAIaOmhZxOhCBMH+t0Zg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":243862},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./scale":{"types":"./scale/index.d.ts","default":"./dist/scale.js"},"./spark":{"types":"./spark/index.d.ts","default":"./dist/spark.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./export":{"types":"./export/index.d.ts","default":"./dist/export.js"},"./format":{"types":"./format/index.d.ts","default":"./dist/format.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./datagrid":{"types":"./datagrid/index.d.ts","default":"./dist/datagrid.js"},"./resource":{"types":"./resource/index.d.ts","default":"./dist/resource.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./timeseries":{"types":"./timeseries/index.d.ts","default":"./dist/timeseries.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"66147235326677fa122f46f6df5eb737346b6b12","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero runtime dependencies, no build step required (works with any bundler — Vite/webpack/Rollup/esbuild — or none). The devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.9.1_1784727577887_0.5583284506964643","host":"s3://npm-registry-packages-npm-production"}},"0.9.2":{"name":"@nemanjan00/qrp","version":"0.9.2","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.9.2","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp.nemanja.top/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"2bad32fa2554e10f72a5e209a64b2b6941ba2166","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.9.2.tgz","fileCount":75,"integrity":"sha512-1bOqBl2iZQrZagWwOaPpiyHxdBVC9XDpyGe1QS0T9xkfy3HB0IngdozKswvwGGJ/KMmZHixW9duBw1dFRcTS8w==","signatures":[{"sig":"MEUCIAamAziQ/i8pFYjr7Lt3wEC5tC9wZt5ZTrGGwt63PZXHAiEAvEdP/zKI6EgHmXaXHZiJEHfq/iZ2XoBc+5TklfJhcOE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":252174},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./scale":{"types":"./scale/index.d.ts","default":"./dist/scale.js"},"./spark":{"types":"./spark/index.d.ts","default":"./dist/spark.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./export":{"types":"./export/index.d.ts","default":"./dist/export.js"},"./format":{"types":"./format/index.d.ts","default":"./dist/format.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./datagrid":{"types":"./datagrid/index.d.ts","default":"./dist/datagrid.js"},"./resource":{"types":"./resource/index.d.ts","default":"./dist/resource.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./timeseries":{"types":"./timeseries/index.d.ts","default":"./dist/timeseries.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"cdf07a33557f871509e94b626969850fb0fdec12","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero runtime dependencies, no build step required (works with any bundler — Vite/webpack/Rollup/esbuild — or none). The devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.9.2_1786118797367_0.9148916190519094","host":"s3://npm-registry-packages-npm-production"}},"0.9.3":{"name":"@nemanjan00/qrp","version":"0.9.3","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.9.3","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp.nemanja.top/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"eadb1fefaa9f1d68c074c82a0102ee13dfdca250","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.9.3.tgz","fileCount":75,"integrity":"sha512-dbQSRb8XJPlEOBwCY5vVUDaOGXxBppl667B4OlK05m7tukkilzpcDVGIKkCFo4pxPnV+NR8ZQNEwQjEKN1uG+Q==","signatures":[{"sig":"MEUCICBL2Vu/OFnzrPf0FI4l8LN8BwWlQkA07cW8v19x8lJtAiEA48OoPgYTExcN/UPmlOhnargwr10MKz4eZzrHY3G6QOA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257989},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./scale":{"types":"./scale/index.d.ts","default":"./dist/scale.js"},"./spark":{"types":"./spark/index.d.ts","default":"./dist/spark.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./export":{"types":"./export/index.d.ts","default":"./dist/export.js"},"./format":{"types":"./format/index.d.ts","default":"./dist/format.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./datagrid":{"types":"./datagrid/index.d.ts","default":"./dist/datagrid.js"},"./resource":{"types":"./resource/index.d.ts","default":"./dist/resource.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./timeseries":{"types":"./timeseries/index.d.ts","default":"./dist/timeseries.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"7b0dc4abb37e77763c5ecaaf5a323efe78491927","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"10.9.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero runtime dependencies, no build step required (works with any bundler — Vite/webpack/Rollup/esbuild — or none). The devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.9.3_1786285552743_0.5008674416440602","host":"s3://npm-registry-packages-npm-production"}},"0.9.4":{"name":"@nemanjan00/qrp","version":"0.9.4","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.9.4","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp.nemanja.top/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"c1b3e1482208cd04969508a89c031fd924065703","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.9.4.tgz","fileCount":75,"integrity":"sha512-pIetRJVCLzSdxAWwksM1rpYPWPdmsEOMXeotL8azodsYowkPrGiuaWTHVehdsbYNjEqK7oisMQSLAMfJMmCvPg==","signatures":[{"sig":"MEUCIFXY7LgeHcpXeKAIaiJ5wxJqxlwIkzbpeNZ0CnsNQ7vCAiEAkuI9ATdC+u+1ob+xUfaBRrpm6hggw8ZIeEnX1PyVKgU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDh44sARAal/W7u9ieuemChtYPqt/zBbpkiJpMIUgqQugIgbuyRW7+t8TSKxK3fQD4gXJRl3CjfbSdyuZDcy4kbROY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":259164},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./scale":{"types":"./scale/index.d.ts","default":"./dist/scale.js"},"./spark":{"types":"./spark/index.d.ts","default":"./dist/spark.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./export":{"types":"./export/index.d.ts","default":"./dist/export.js"},"./format":{"types":"./format/index.d.ts","default":"./dist/format.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./datagrid":{"types":"./datagrid/index.d.ts","default":"./dist/datagrid.js"},"./resource":{"types":"./resource/index.d.ts","default":"./dist/resource.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./timeseries":{"types":"./timeseries/index.d.ts","default":"./dist/timeseries.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"2869d0652c1dab306f2c031948225f2f85abf516","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"12.0.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero runtime dependencies, no build step required (works with any bundler — Vite/webpack/Rollup/esbuild — or none). The devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"26.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.9.4_1789474561689_0.9399658994954825","host":"s3://npm-registry-packages-npm-production"}},"0.9.5":{"name":"@nemanjan00/qrp","version":"0.9.5","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","_id":"@nemanjan00/qrp@0.9.5","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"homepage":"https://qrp.nemanja.top/","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"76e25b95bb0e06c9a78c3a42c1d5e8127145f754","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.9.5.tgz","fileCount":75,"integrity":"sha512-SdfZQr64cO1G+weqRLHRxM+2kLl0Um1YDu6P8S09TR95UP74NDK24N/3OEgeXGdqAp9c/cI/iMvUylaZQ4kCNQ==","signatures":[{"sig":"MEYCIQCyiqgKANcIcSBTOzc1wm0uK2dzmBFbUxzDYWo/x3U/vQIhAOiWTB1JkorJljuleQntBu3OuV52/NbicCVPYD5N2Wjn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBAnZSKVkBvHOKY9pvc5O00w81BvFju3zb8Do7r0yb4CAiEAnGinWQy8yLYB3/MsvTkhsqfsAoEa7HIkKJJ/VcXs1oA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":263752},"type":"module","types":"./qrp/index.d.ts","exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./scale":{"types":"./scale/index.d.ts","default":"./dist/scale.js"},"./spark":{"types":"./spark/index.d.ts","default":"./dist/spark.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./export":{"types":"./export/index.d.ts","default":"./dist/export.js"},"./format":{"types":"./format/index.d.ts","default":"./dist/format.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./datagrid":{"types":"./datagrid/index.d.ts","default":"./dist/datagrid.js"},"./resource":{"types":"./resource/index.d.ts","default":"./dist/resource.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./timeseries":{"types":"./timeseries/index.d.ts","default":"./dist/timeseries.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"51666a494fdcefdebd46ab6bad5a1a84e5310a8d","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"12.0.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero runtime dependencies, no build step required (works with any bundler — Vite/webpack/Rollup/esbuild — or none). The devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"sideEffects":["**/*.css"],"_nodeVersion":"26.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/qrp_0.9.5_1789476514736_0.6770818805705356","host":"s3://npm-registry-packages-npm-production"}},"0.9.6":{"_id":"@nemanjan00/qrp@0.9.6","bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"dist":{"shasum":"9f28894afe7c44c9f9d633b1eaabc0de5ad5bdce","tarball":"https://registry.npmjs.org/@nemanjan00/qrp/-/qrp-0.9.6.tgz","fileCount":75,"integrity":"sha512-lzrnqITfTPg+FWq1tziHTWUOIfBOEG7w+2S1nl6TvXOYtR78TvqzmkmsPiz1essPnpowBCgSCf1osAcuziqVzw==","signatures":[{"sig":"MEYCIQCTPystK4AQL4kdQCOnwLYLGlLCB0avcJHdb5KjwFWcRAIhAK0hIEWCnRFkmHobZjz/Da/bmqpgFa8BhdnP9pJnoJYL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD7PoHqMMPX1djobz0rYS/cKtZOjX6mxXzsdnH1Pe6nYQIhAOP1N99I5mdADtJia7sNZ3pGt3ZB3oD8iwMw7SA7TbJ2"}],"unpackedSize":265738},"name":"@nemanjan00/qrp","type":"module","types":"./qrp/index.d.ts","author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"exports":{".":{"types":"./qrp/index.d.ts","default":"./dist/qrp.js"},"./html":{"types":"./html/index.d.ts","default":"./dist/html.js"},"./http":{"types":"./http/index.d.ts","default":"./dist/http.js"},"./forms":{"types":"./forms/index.d.ts","default":"./dist/forms.js"},"./proto":{"types":"./proto/index.d.ts","default":"./dist/proto.js"},"./scale":{"types":"./scale/index.d.ts","default":"./dist/scale.js"},"./spark":{"types":"./spark/index.d.ts","default":"./dist/spark.js"},"./table":{"types":"./table/index.d.ts","default":"./dist/table.js"},"./utils":{"types":"./utils/index.d.ts","default":"./dist/utils.js"},"./events":{"types":"./events/index.d.ts","default":"./dist/events.js"},"./export":{"types":"./export/index.d.ts","default":"./dist/export.js"},"./format":{"types":"./format/index.d.ts","default":"./dist/format.js"},"./toasts":{"types":"./toasts/index.d.ts","default":"./dist/toasts.js"},"./browser":{"types":"./browser/index.d.ts","default":"./dist/browser.js"},"./qrp.css":"./qrp.css","./utils/*":{"types":"./utils/*.d.ts","default":"./dist/utils/*.js"},"./datagrid":{"types":"./datagrid/index.d.ts","default":"./dist/datagrid.js"},"./resource":{"types":"./resource/index.d.ts","default":"./dist/resource.js"},"./behaviors":{"types":"./behaviors/index.d.ts","default":"./dist/behaviors.js"},"./collection":{"types":"./collection/index.d.ts","default":"./dist/collection.js"},"./timeseries":{"types":"./timeseries/index.d.ts","default":"./dist/timeseries.js"},"./behaviors/*":{"types":"./behaviors/*.d.ts","default":"./dist/behaviors/*.js"},"./package.json":"./package.json"},"gitHead":"a06910dadfd62f991df0fda54e4626ff5c6b31e9","license":"MIT","scripts":{"docs":"node bin/gen-api.js","lint":"eslint qrp forms browser events toasts proto http utils behaviors collection table html test","test":"node --test 'test/*.test.js'","build":"node bin/build.js","prepack":"node bin/build.js","prepare":"husky","typecheck":"tsc --noEmit"},"version":"0.9.6","_npmUser":{"name":"nemanjan00","email":"nemanjan00@gmail.com"},"homepage":"https://qrp.nemanja.top/","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"_npmVersion":"12.0.2","description":"A data-first, declarative, low-overhead framework for dashboards. Zero runtime dependencies, no build step required (works with any bundler — Vite/webpack/Rollup/esbuild — or none). The devDependencies below are only for tests, lint, and git hooks.","directories":{},"lint-staged":{"*.js":"eslint --fix"},"maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"sideEffects":["**/*.css"],"_nodeVersion":"26.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","eslint":"^8.57.1","esbuild":"^0.28.1","happy-dom":"^15.11.7","typescript":"^7.0.2","@babel/core":"^7.29.7","lint-staged":"^17.0.8","@babel/eslint-parser":"^7.29.7"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/qrp_0.9.6_1789477529429_0.35553930999780237"}}},"time":{"created":"2026-07-14T19:00:34.180Z","modified":"2026-09-15T13:05:29.713Z","0.1.0":"2026-07-14T19:00:34.513Z","0.1.1":"2026-07-14T19:03:03.675Z","0.2.0":"2026-07-14T19:15:56.996Z","0.2.1":"2026-07-14T20:02:39.811Z","0.4.0":"2026-07-14T23:11:53.045Z","0.4.1":"2026-07-14T23:22:40.232Z","0.4.2":"2026-07-15T07:31:19.325Z","0.4.5":"2026-07-15T08:21:48.043Z","0.4.6":"2026-07-15T08:47:06.637Z","0.4.7":"2026-07-15T09:20:53.853Z","0.4.8":"2026-07-15T10:29:21.983Z","0.4.10":"2026-07-15T16:50:29.562Z","0.5.0":"2026-07-15T18:06:07.183Z","0.5.1":"2026-07-15T19:25:08.766Z","0.5.2":"2026-07-16T09:50:32.047Z","0.6.0":"2026-07-16T10:31:42.181Z","0.6.1":"2026-07-16T22:35:25.595Z","0.7.0":"2026-07-17T00:27:41.501Z","0.8.0":"2026-07-22T12:54:37.693Z","0.9.0":"2026-07-22T13:27:04.674Z","0.9.1":"2026-07-22T13:39:38.084Z","0.9.2":"2026-08-07T16:06:37.542Z","0.9.3":"2026-08-09T14:25:52.899Z","0.9.4":"2026-09-15T12:16:01.795Z","0.9.5":"2026-09-15T12:48:34.829Z","0.9.6":"2026-09-15T13:05:29.530Z"},"bugs":{"url":"https://github.com/nemanjan00/qrp/issues"},"author":{"name":"Nemanja Nedeljkovic","email":"nemanjan00@gmail.com"},"license":"MIT","homepage":"https://qrp.nemanja.top/","keywords":["dashboard","reactive","proxy","declarative","framework","frontend","no-build","zero-dependency","dom","forms","table"],"repository":{"url":"git+https://github.com/nemanjan00/qrp.git","type":"git"},"description":"A data-first, declarative, low-overhead framework for dashboards. Zero runtime dependencies, no build step required (works with any bundler — Vite/webpack/Rollup/esbuild — or none). The devDependencies below are only for tests, lint, and git hooks.","maintainers":[{"name":"nemanjan00","email":"nemanjan00@gmail.com"}],"readme":"<div align=\"center\">\n\n<img src=\"./assets/qrp-logo.svg\" alt=\"qrp\" width=\"420\">\n\n### Turn data into a dashboard. Nothing else.\n\nA data-first, declarative frontend framework for the browser — reactivity is a `Proxy`, the DOM is real, and no build step is required — bring a bundler or skip it, your call.\n\n[![npm](https://img.shields.io/npm/v/@nemanjan00/qrp?style=flat-square&labelColor=0a0d12&color=ffb23e&logo=npm)](https://www.npmjs.com/package/@nemanjan00/qrp)\n[![CI](https://img.shields.io/github/actions/workflow/status/nemanjan00/qrp/ci.yml?branch=master&style=flat-square&labelColor=0a0d12&label=CI)](https://github.com/nemanjan00/qrp/actions/workflows/ci.yml)\n[![dependencies](https://img.shields.io/badge/dependencies-0-34d399?style=flat-square&labelColor=0a0d12)](#-tests--tooling)\n[![build step](https://img.shields.io/badge/build_step-optional-34d399?style=flat-square&labelColor=0a0d12)](#-what-is-qrp)\n[![core size](https://img.shields.io/badge/core-~4.8_KB_min%2Bgzip-ffb23e?style=flat-square&labelColor=0a0d12)](#-performance)\n[![tests](https://img.shields.io/badge/tests-263_passing-34d399?style=flat-square&labelColor=0a0d12)](#-tests--tooling)\n[![types](https://img.shields.io/badge/TypeScript-.d.ts_included-ffb23e?style=flat-square&labelColor=0a0d12)](#-typescript)\n[![license](https://img.shields.io/npm/l/@nemanjan00/qrp?style=flat-square&labelColor=0a0d12&color=34d399)](LICENSE)\n\n**[🚀 Getting started](docs/GETTING-STARTED.md)** · **[📦 npm](https://www.npmjs.com/package/@nemanjan00/qrp)** · **[▶ Live demo](https://qrp.nemanja.top/)** · **[📖 API reference](docs/API.md)** · **[📝 Changelog](CHANGELOG.md)** · **[💡 Why it exists](#-why-it-exists)**\n\n</div>\n\n---\n\nZero runtime dependencies and **no required build step**. Drop it into a\n`<script type=\"module\">` and run with zero tooling — **or** `npm install` it and\nlet your bundler (Vite, webpack, Rollup, esbuild) resolve subpaths and tree-shake.\nSame library either way; the build is your choice, not qrp's. Reactivity is a\n`Proxy`, the DOM is real, and the published core is **~4.8 KB min+gzip** — the\nnumber that lines up next to Solid (~7 KB) or React (~45 KB). The whole library,\nevery module, is **~22.5 KB min+gzip**.\n\n> The npm package ships a minified build (esbuild) — a flat per-module mirror in\n> `dist/`, so a browser pulls the small file — still no build step on *your* end. The readable source,\n> JSDoc and all, is ~16 KB gzipped if you load it raw; CDNs like esm.sh minify it\n> on the fly, so only the vendored-raw path serves the larger file.\n\n```js\nimport { state, el, mount } from \"@nemanjan00/qrp\";\n\nconst counter = state({ n: 0 });\n\nmount(document.body, () =>\n  el(\"button\", { onclick: () => counter.n++ }, () => `clicked ${counter.n}×`));\n```\n\nThat's the entire setup. No `createRoot`, no providers, no hydration. You mutate\ndata, the DOM follows.\n\n> **⚠️ Before implementing anything, read [`docs/SHARP-EDGES.md`](docs/SHARP-EDGES.md).**\n> qrp uses the platform directly, so a few behaviors follow from how the DOM and\n> `Proxy` actually work — thunk-vs-value reactivity, `list()` key uniqueness, the\n> runaway-effect guard. None are bugs; each bites exactly once. Five minutes there\n> saves an afternoon of \"why doesn't this update / where did my rows go\".\n\n---\n\n## 🛰️ Small enough to run on a microcontroller\n\nBecause the whole library is ~22.5 KB min+gzip, a useful qrp app doesn't need a\nserver or a CDN — it fits **in flash on an ESP32**. Not a static form, either: a\n**live dashboard** — telemetry streaming into reactive bindings, an LED you drive,\na config form that rewrites itself with `when()`, and a WiFi-scan modal built from\n`portal` + `trapFocus` + `dismissable`.\n\n**[▶ Live demo](https://qrp.nemanja.top/examples/esp32/dashboard.html)** ·\n**[full example →](https://github.com/nemanjan00/qrp/tree/master/examples/esp32)** (PlatformIO project + build)\n\n| what the browser loads | size |\n|---|---|\n| qrp core + behaviors + the app, minified | ~12.7 KB |\n| the whole self-contained HTML page | ~17.4 KB |\n| **gzipped — the total baked into flash** | **~7 KB** |\n\n`react-dom` alone is ~45 KB gzipped — **~6× this entire live dashboard**, before a\nline of your own UI. The chip serves the page from PROGMEM over its own WiFi AP:\nno filesystem, no internet, no build step on the device. This is the\nzero-dependency premise at its literal limit — the \"server\" is an $8\nmicrocontroller and the \"build pipeline\" is `gzip | xxd -i`.\n\n```cpp\n// the entire web app, served straight from flash:\nvoid handleRoot() {\n  server.sendHeader(\"Content-Encoding\", \"gzip\");\n  server.send_P(200, \"text/html\", dashboard_html_gz, dashboard_html_gz_len);\n}\n```\n\n---\n\n## 📥 Install\n\n> New here? The **[Getting Started guide](docs/GETTING-STARTED.md)** is a\n> ten-minute, zero-to-dashboard walkthrough of the five core ideas. This section\n> is the reference; that's the tutorial.\n\n```sh\nnpm i @nemanjan00/qrp\n```\n\nThe bare `@nemanjan00/qrp/*` specifiers in the snippets below resolve through the\npackage's `exports` map, so **with any bundler they just work** — and unused\nsubpaths tree-shake away.\n\n**Prefer no tooling? Vendor it + an import map — the solid no-build path.** Copy\nthe package's `dist/` folder to your server and map the name once. `dist/` is a\nflat, minified mirror — one file per module, plain names, no hashes — so serving\nit is just static files:\n\n```html\n<script type=\"importmap\">\n{ \"imports\": {\n  \"@nemanjan00/qrp\":          \"/vendor/qrp/qrp.js\",\n  \"@nemanjan00/qrp/table\":    \"/vendor/qrp/table.js\",\n  \"@nemanjan00/qrp/behaviors/portal\": \"/vendor/qrp/behaviors/portal.js\"\n} }\n</script>\n<script type=\"module\">\n  import { state, el, mount } from \"@nemanjan00/qrp\";\n  import { table } from \"@nemanjan00/qrp/table\";\n</script>\n```\n\nCopy the whole `dist/` directory — modules import their siblings by relative path\n(`table.js` → `./qrp.js`), so the core is shared, not duplicated. This site's own\npages vendor it this way (see the import map in [`index.html`](index.html)); it's\nwhat I'd reach for in production.\n\n**Quick demo? A CDN works too** — no install at all:\n\n```html\n<script type=\"module\">\n  import { state, el, mount } from \"https://esm.sh/@nemanjan00/qrp\";\n  import { table } from \"https://esm.sh/@nemanjan00/qrp/table\";\n</script>\n```\n\nFine for a prototype or a REPL, but a CDN is a network dependency: one flaky\nfetch and the page comes up blank, with no graceful degradation. For anything\nreal, vendor it (above) — it's the same code, served by you.\n\n## 🧭 What is qrp?\n\nqrp does **one thing well**: it turns **data** into a **dashboard** — the\nsettings panels, forms, tables, and control UIs that make up an admin or\ninternal tool. It is not trying to be a general-purpose app framework that\ncompetes with React. It's the right tool for the enormous class of apps that\nare, at heart, *\"render this data, let me edit it, reflect the changes.\"*\n\n- **Reactive state** is a `Proxy`. Read a key inside an `effect`, and that effect\n  re-runs when the key changes — nothing else does.\n- **The DOM is real.** `el()` returns actual elements; there's no virtual DOM and\n  no reconcile pass on update. A field edit touches exactly one text node.\n- **Keyed lists reuse elements.** Sort, filter, or paginate 10,000 rows and qrp\n  moves nodes instead of rebuilding them.\n- **Batteries where dashboards need them:** declarative forms, a data table, a\n  fetch client, a toast system, an event bus — each an independent module you\n  import only if you use it.\n\n## 💡 Why it exists\n\nModern frontend split one app into two — a \"frontend app\" and a \"backend app\" —\nand in doing so **duplicated** state, validation, types, and auth across the wire.\nThen it papered over the duplication with more machinery than it removed: a\ncompiler, a bundler, a hydration pass, a client-side cache to hold a copy of data\nthe server already has.\n\nFor a dashboard behind a login, most of that machinery is paying for problems you\ndon't have. Nobody SEOs an admin panel, so you don't need SSR or hydration. Your\ndata lives one `fetch` away, so you don't need a normalized client store. What you\nactually need is: *show the data, let me sort and edit it, send it back.*\n\nqrp keeps the good ideas the platform already ships — the DOM, `URL`,\n`EventTarget`, the History API, `Proxy` — and adds only the thin reactive layer\nthat ties them together. The result is small, fast, and boring in the way\ninfrastructure should be.\n\n## 🚀 5-minute example\n\nA live, sortable, filterable table with a modal — the whole thing, no build step required:\n\n```js\nimport { state, el } from \"@nemanjan00/qrp\";\nimport { table } from \"@nemanjan00/qrp/table\";\nimport { portal } from \"@nemanjan00/qrp/behaviors/portal\";\nimport { trapFocus } from \"@nemanjan00/qrp/behaviors/trap-focus\";\nimport { dismissable } from \"@nemanjan00/qrp/behaviors/dismissable\";\nimport { notify, toasts } from \"@nemanjan00/qrp/toasts\";\nimport { html } from \"@nemanjan00/qrp/html\";\n\nconst users = state({ rows: await fetch(\"/api/users\").then(r => r.json()) });\nconst filter = state({ q: \"\" });\n\nconst t = table({\n  rows: () => users.rows,\n  key: (u) => u.id,                                  // the :key equivalent\n  filter,\n  filterFn: (u, f) => u.name.toLowerCase().includes(f.q.toLowerCase()),\n  page: state({ index: 0, size: 20 }),\n  fields: [\n    { key: \"name\",   label: \"Name\",   sortable: true },\n    { key: \"email\",  label: \"Email\",  sortable: true },\n    { key: \"signups\",label: \"Signups\",sortable: true, formatter: (v) => v.toLocaleString() },\n    { key: \"actions\",label: \"\",       render: (u) => el(\"button\", { onclick: () => open(u) }, \"View\") }\n  ]\n});\n\n// a search box wired to the filter, written as HTML:\nconst search = html`\n  <input type=\"search\" placeholder=\"Filter users…\"\n         oninput=${(e) => { filter.q = e.target.value; }}>`;\n\ndocument.querySelector(\"#app\").append(search, t);\n\n// a modal from three headless behaviors + an html template\nfunction open(user) {\n  const dialog = html`\n    <div class=\"qrp-modal\">\n      <h3>${user.name}</h3>\n      <p>${user.email} — ${() => user.signups.toLocaleString()} signups</p>\n      <button onclick=${() => close()}>Close</button>\n    </div>`;\n  const backdrop = el(\"div\", { class: \"qrp-modal-backdrop\" }, dialog);\n\n  const remove = portal(backdrop);          // → document.body\n  const untrap = trapFocus(dialog);         // focus trap + restore\n  const undismiss = dismissable(dialog, () => close());  // Esc / outside-click\n\n  function close() { undismiss(); untrap(); remove(); notify.info(\"Closed\"); }\n}\n```\n\nSorting, filtering, pagination, keyed row reuse, a focus-trapped modal, and\ntoasts — with no framework runtime to boot. Ship it through your bundler or drop\nit in a `<script>`; the code above is the same either way.\n\n## ✨ Features\n\n**Two ways to write markup.** Prefer functions, or prefer HTML — both are\nfirst-class and produce the same real DOM.\n\n```js\n// el() — plain-DOM helper; function props/children are reactive\nel(\"span\", {}, () => `count: ${counter.n}`);\n\n// html`` — for people who think in HTML. Interpolated text values are escaped;\n// ${() => …} holes are reactive; onX=${fn} wires listeners.\nhtml`<button onclick=${() => counter.n++}>${() => counter.n}</button>`;\n```\n\n**Storable templates.** `${}` is JavaScript's interpolation — gone before html()\nsees it. For a template you keep in a file or config and fill later, use\n`html.template` with `#{}` placeholders — parsed once, reactive when filled with\nstate:\n\n```js\nconst row = html.template(\"<tr><td>#{name}</td><td>#{email}</td></tr>\");\nrow(user);                       // → DOM bound to user.name / user.email\nrow(state({ name: \"R2\" }));      // reactive; #{} fields escaped as text\n```\n\n**On escaping (the precise guarantee).** A value interpolated in **text**\nposition (a child hole, `${}` or `#{}`) is rendered as a text node — it can never\ninject an element, `<script>`, or event handler, whatever string it holds.\nAttribute holes are set as the attribute *value* verbatim (via `setAttribute` /\nproperty, never re-parsed as HTML — so a value can't break out into a new\nattribute or tag), **but qrp does not sanitize URL schemes**: a `javascript:`\nvalue in an `href` passes through, same as Lit. Don't put untrusted data in\n`href`/`src`/`style` without your own check. The full set of attack vectors —\n`<script>`/`<img onerror>` in text holes, unquoted-attribute breakout attempts,\nthe `javascript:` boundary — lives in `test/html-xss.test.js` and is verified in\nreal Chromium.\n\nAnd to drop a live node into a plain concatenated string (no tagged template),\n`ref()` gives you an opt-in token — no prototype patching:\n\n```js\nhtml(\"<div class='card'>\" + ref(myButton) + \"</div>\");   // real node, injected\n```\n\n**Reactive state that tracks per key.**\n\n```js\nconst s = state({ first: \"Ada\", last: \"Lovelace\", tags: [] });\nconst full = derive(() => `${s.first} ${s.last}`);   // recomputed on change\neffect(() => console.log(full.value));               // logs on change\ns.tags.push(\"math\");                                 // arrays are reactive too\n```\n\n**Declarative forms with an open input registry.** Describe fields as data; add\nyour own input types at runtime.\n\n```js\nregisterInput(\"callsign\", (settings, key, field) => {\n  const input = inputs.text(settings, key, field);\n  input.addEventListener(\"input\", () => settings[key] = input.value.toUpperCase());\n  return input;\n});\n\nform({ settings, fields: {\n  name: { label: \"Name\", type: \"text\" },\n  call: { label: \"Callsign\", type: \"callsign\" },       // your custom type\n  mode: { label: \"Mode\", type: \"select\", options: { dmr: \"DMR\", ysf: \"YSF\" } }\n}});\n```\n\n**Keyed lists that reuse elements.** The primitive under every table.\n\n```js\nel(\"tbody\", {}, list(\n  () => view.items(),                     // reactive source (items() is a method)\n  (row) => row.id,                         // stable key\n  (row) => html`<tr><td>${() => row.name}</td></tr>`  // built once per key\n));\n```\n\n**Conditional subtrees, with cleanup.** `when()` swaps a branch on a condition\nand disposes the old branch's effects — no leaks, no DOM surgery. It's\n**value-keyed**, so it drives tabs directly (re-renders when the value changes,\nnot just on true⇄false):\n\n```js\n// edit vs display\nel(\"div\", {}, when(() => editing.on,\n  () => html`<input value=${row.name}>`,\n  () => html`<span>${() => row.name}</span>`));\n\n// a tab switcher — re-renders on every tab\nel(\"div\", {}, when(() => ui.tab, (tab) => TABS[tab]()));\n```\n\n**A fetch client built for dashboards.** URL shaping, auth headers, a **reactive**\nin-flight loader, and errors routed to the toast bus.\n\n```js\nconst http = createHttp({ baseUrl: \"/api\", token: () => session.token });\nhttp.get(\"/things\", { params: { page: 2, ids: [1, 2, 3] } });   // → parsed JSON\neffect(() => bar.hidden = http.loading.pending === 0);          // a spinner in one line\nhttp.get(\"/export.msgpack\", { responseType: \"arraybuffer\" });  // binary, not just JSON\n```\n\n**Dashboard utilities that carry the boring parts.** Rate-limit, debounce,\nvalidate — the stuff every admin tool hand-rolls.\n\n```js\nconst search = debounce((q) => http.get(\"/find\", { params: { q } }), 300);\nconst sync   = limit((id) => http.post(`/follow/${id}`), { max: 5 });  // ≤5 in flight\nconst { errors, value } = validate(schema, form);  // value is coerced; [] = ok\n```\n\n**Reactive routing & owned side-effects.** The route is state; UI built outside a\nrender stays owned.\n\n```js\nel(\"a\", { class: () => currentRoute.path === \"/users\" ? \"active\" : \"\" }, \"Users\");\nconst { value: modal, dispose } = scoped(() => buildDialog());  // no ownerless effects\nonEffectError((err) => Sentry.captureException(err));           // central crash reporting\n```\n\nPlus: a global event bus, cross-tab persistence, HTML5 routing with `:param`\npatterns (keep-alive on same-pattern navigation), and headless behaviors for\nmodals, dropdowns, tooltips, and disclosures.\n\n## 📦 Modules\n\nEach module is an independent file — import only what you use; with a bundler,\nunused exports tree-shake away.\n\n| Module | What it gives you |\n|--------|-------------------|\n| `@nemanjan00/qrp` | Core: `state`, `effect`, `derive`, `untracked`, `raw`, `onEffectError`, `el`, `reactive`, `bind`, `list` (keyed), `when`, `clear`, `mount`, `scope`, `onDispose`, `router`, `navigate`, `currentRoute`, `compilePath` |\n| `@nemanjan00/qrp/html` | `` html`` `` / `html()` (inline, `${}` holes), `html.template` (storable, `#{}` placeholders), `ref` (inject a live node into a plain string) — author DOM as HTML; text holes escaped (see escaping guarantee above) |\n| `@nemanjan00/qrp/forms` | Declarative forms + open input-type registry (`registerInput`, `field`, `form`, `parseKV`) |\n| `@nemanjan00/qrp/table` | Declarative data table: sortable headers, keyed row reuse, per-column accessor/formatter/render |\n| `@nemanjan00/qrp/collection` | Reactive sort/filter/paginate over a dataset — drives a keyed `list()` |\n| `@nemanjan00/qrp/datagrid` | Headless data-grid state over `collection`: keyed selection (select-all/indeterminate), column visibility, page-size, windowed pager — no markup |\n| `@nemanjan00/qrp/http` | `createHttp` — fetch client with auth headers, reactive loader, error bus routing, per-request `responseType` (json/text/binary), pluggable `fetch` |\n| `@nemanjan00/qrp/resource` | Reactive async data: `{ data, loading, error, reload }` over a fetcher thunk; `refreshOn` bus event for global refresh; `asyncView` → `when` branches |\n| `@nemanjan00/qrp/format` | Intl-backed pure formatters: `num`, `compact`, `pct`, `bytes`, `duration`, `relTime`, `date` (nullish → \"\") |\n| `@nemanjan00/qrp/spark` | Charting primitive: data → a reactive `<svg>` (line/area/bar). Not a chart library — the sparkline 80% |\n| `@nemanjan00/qrp/scale` | Micro scales `linear`/`ordinal`/`quantize`/`ticks` + a colourblind-safe categorical `palette` |\n| `@nemanjan00/qrp/timeseries` | Pure `{x,y}` math: `deltas`, `rate`, `rolling`, `bucket`, `downsample` (LTTB) |\n| `@nemanjan00/qrp/export` | `toCSV` / `download` / `copy` — get table/collection data out |\n| `@nemanjan00/qrp/events` | Global event bus on native `EventTarget`: `bus`, `emitter`, `request`/`respond`, `channel` |\n| `@nemanjan00/qrp/toasts` | Notifications off the bus: `notify.*`, mountable `toasts`; content is any renderable |\n| `@nemanjan00/qrp/browser` | Reactive wrappers over native APIs: `persisted`, `query`, `media`, `viewport`, `online`, `cookies`, `seen`, `poll` (scope-aware interval, pauses when hidden) |\n| `@nemanjan00/qrp/behaviors/*` | Headless helpers to build styled components: `portal`, `dismissable`, `trapFocus`, `anchored`, `disclosure`, `busyWhile` |\n| `@nemanjan00/qrp/utils/*` | Pure data helpers for dashboards: `memoize` (+ttl/invalidate), `lru`, `cache`, `paginate`, `limit` (concurrency/rate/timeout), `debounce`/`throttle`, `validate`, `loadScript` |\n| `@nemanjan00/qrp/proto` | Prototype-level enhancement (objects & `__proto__`, no classes): `findProto`, `wrapMethod`, `onceOnly`, `delegate` |\n| `qrp.css` | Optional minimal baseline (design tokens + semantic classes). Link it yourself. |\n\n## 📊 Performance\n\n### The headline: change one field in a 10,000-row table\n\nThis is the operation where qrp's architecture is *categorically* different from\na virtual-DOM framework — so it deserves its own measurement. Mutate one row's\nfield; the `Proxy` setter fires exactly one tracked effect, which writes the one\ntext node it already holds a reference to. Measured in real Chromium with a\n`MutationObserver` watching the whole table:\n\n> **1 DOM node touched, out of 40,002.** No diff. No component re-render. No\n> reconcile pass. The cost is **~0.8 µs** of reactivity bookkeeping.\n\nThat \"1 of 40,002\" is the important number — it's machine-independent and\nfalsifiable: rerun it on any hardware and you get the same answer, because it's\narchitectural, not a timing.\n\n**Measured against React 18**, same operation, same `MutationObserver`. The\nsetup, stated precisely so the number defends itself: React 18.2 production\nbuild; rows are keyed and wrapped in `React.memo`; the update replaces one row\nobject in a new array; `flushSync` makes the reconcile synchronous so it can be\ntimed.\n\n| Change one cell in 10,000 rows | JS per update | DOM nodes touched |\n|---|---|---|\n| **qrp** | **~0.8 µs** | **1** of 40,002 |\n| React 18 | **~800 µs** | 1 of 40,002 |\n\nBoth touch **exactly one DOM node**. Where React's ~800 µs goes: `React.memo`\nstops each row's DOM from re-rendering, **but the parent still re-runs and\nallocates 10,000 element descriptors, and the reconciler still walks all 10,000\nchildren to find the one that changed** — that walk is the cost. qrp has no walk;\nthe `Proxy` subscription already points at the one text node, so it spends\n~0.8 µs. Same DOM outcome, **~1000× the work** — the reconcile pass qrp doesn't\nhave. It's O(1) and independent of table size.\n\nTwo things people rightly challenge, answered up front:\n\n- ***`flushSync` is cheating / concurrent mode defers.*** `flushSync` doesn't add\n  work — it stops batching from smearing the reconcile across a later frame so it\n  can be timed. Concurrent mode can slice that walk and interleave it, but the\n  total CPU is the same; we're measuring it, not hiding it behind a frame.\n- ***You wrote slow React.*** Colocating state per row (a store per row) does\n  narrow the gap — but that's the point: you have to restructure to avoid the\n  reconcile; qrp is O(1) for free with the ordinary \"data in a parent array\"\n  pattern.\n\nReproduce it: `examples/react-compare.html` (the objections are answered in its\ncomments too).\n\nTo put ~0.8 µs in perspective without overclaiming: it's ~20,000 single-cell\nupdates' worth of *bookkeeping* inside one 16 ms frame budget. In practice you'd\nnever do that many — layout and paint dominate long before (see \"update every\n10th row\" below, which is 8 ms paint-timed for 1,000 cells: ~10% reactivity,\n~90% paint). That internal consistency is the point: the reactivity is real and\nsmall, and paint is the rest.\n\n**Honest footnote — vs hand-written vanilla, not React:** this is a win over\n*virtual-DOM frameworks*. A bare `textContent =` when you already hold the node\nreference is ~0.27 µs; finding the cell with `querySelector` first is ~0.46 µs.\nqrp's ~0.8 µs is slightly more — reactivity isn't free, and that ~0.5 µs is\nexactly what buys the automatic dependency tracking. qrp *derives* the node\nreference from the subscription, so you never write or maintain the `id → node`\nmap the fast vanilla depends on.\n\n### The rest of the suite\n\nPaint-timed (time until the frame is painted, not just the synchronous write),\nmedian of 5 after warmup, against a hand-written keyed vanilla-DOM control —\n*\"the floor\"*, not another framework.\n\n| Operation | qrp | vanilla DOM | ratio |\n|---|---|---|---|\n| create 1,000 rows | 29 ms | 31 ms | **0.9×** |\n| create 10,000 rows | 271 ms | 214 ms | 1.3× |\n| replace all 1,000 rows | 32 ms | 33 ms | **1.0×** |\n| update every 10th row | 8 ms | 9 ms | **0.9×** |\n| swap 2 rows in 10,000 | 44 ms | 34 ms | 1.3× |\n| remove 1 row in 10,000 | 58 ms | 48 ms | 1.2× |\n| select 1 row in 10,000 | 10 ms | 7 ms | 1.5× |\n| clear 10,000 rows | 40 ms | 22 ms | 1.8× |\n\nOn create, replace, update, and remove, qrp is at **hand-written DOM parity\n(0.9–1.3×)** — there's no reconcile pass to pay for, because updates are\nfine-grained. The swap case was 5.9× before a longest-increasing-subsequence\nreconcile brought it to 1.3×. The remaining gaps are per-row subscriptions\n(select) and scope disposal (clear). **`clear` at 1.8× is the honest weak\nspot**: it disposes each row scope's effects individually, so it scales with\nbindings-per-row — fatter rows make it worse. A bulk scope-drop that frees\nchildren without visiting each dep-set would fix it; not done yet.\n\nRun it yourself: `examples/bench.html` exposes the suite on `window.bench`\n(`runAll()`, `updateOneNs()`, `mutationsForOne()`).\n\n## 🧠 Philosophy\n\nFour commitments gate every design decision:\n\n1. **Data first.** Reactive state is the single source of truth; the DOM is a\n   reflection of it. You never imperatively poke the DOM to stay in sync.\n2. **Declarative first.** Forms are data, routes are patterns, tables are column\n   configs. You say *what*, not *how*.\n3. **Low overhead.** No runtime to boot, no hydration, no virtual DOM. Small\n   gzipped size, fast first paint, cheap updates.\n4. **Do one thing well.** Small, sharp, composable modules. qrp ships **helpers\n   to build styled components**, not components — a table is `collection` +\n   `list`; a modal is `portal` + `trapFocus` + `dismissable`. You bring the\n   markup and CSS; the helpers carry the platform and a11y hard parts.\n\nAnd underneath all of it: **use the platform.** `URL`, `URLSearchParams`,\n`EventTarget`, `IntersectionObserver`, the History API — qrp wraps them reactively\ninstead of reinventing them.\n\n## 🔬 Advanced implementation details\n\n**Reactivity is a `Proxy` with per-key dependency tracking.** `state()` wraps a\nplain object; the `get` trap records `(effect, key)` pairs, the `set` trap\nre-runs exactly the effects that read that key. Writes use `Object.is`, so\n`NaN`-over-`NaN` doesn't spuriously re-trigger. Arrays track `length` explicitly\nso `push()` updates length-only readers. Frozen objects are returned as-is —\n`Object.freeze(bigStaticData)` is the documented opt-out from reactivity, and it\nmakes reads free.\n\n**Ownership-based cleanup.** Every effect created during a component's render is\nadopted by its `scope`; unmounting disposes them all — no manual unsubscribe.\n`onDispose(fn)` registers arbitrary cleanup against the current scope, which is\nhow `list()`, `when()`, and every `browser/` factory tear down their\nsubscriptions on unmount. An effect that throws is torn down (unsubscribed) and\nthe error propagates — no dangling subscriptions.\n\n**Keyed reconciliation with minimal moves.** `list()` keeps a `Map<key, element>`\nand a `WeakMap<element, item>` (the latter powers `itemFor()` for one-listener\nevent delegation over huge lists). On change it diffs new positions against old,\nkeeps the longest increasing subsequence as a stable backbone that never moves,\nand inserts only new or genuinely-displaced rows. A 2-row swap does 1 DOM move,\nnot O(n).\n\n**The DOM rejects `Proxy`-wrapped nodes** (`appendChild` brand-checks its\nargument), verified in Chromium — so `reactive(node)` unwraps to the raw node on\ninsert, and `state()` never proxies DOM nodes, `Map`/`Set`, or class instances\nstored inside it. A DOM node also lives in exactly one place, so reusing content\nacross sites means a thunk `() => el(...)`, never a shared live node.\n\n**Synchronous by design.** qrp writes to the DOM synchronously — there's no\nscheduler and no batching, which is why updates are cheap and why it's *not*\ninterruptible the way React's concurrent renderer is. For a dashboard that's the\nright trade; if you need to coalesce a high-frequency stream, do it upstream of\n`state`.\n\n## ▶️ Running the demos\n\nThe demos use HTML5 History routing, so serve over HTTP (not `file://`):\n\n```sh\npython -m http.server 8000\n# then open http://localhost:8000/examples/table.html\n```\n\n`examples/` — `table.html` (styled data table + modal), `todomvc.html` (the\nclassic, built with `list()` + `when()`), `index.html` (forms, routing, toasts),\n`bench.html` (the performance harness).\n\n> Note: a plain static server has no SPA fallback, so refreshing a deep route\n> (e.g. `/settings/user`) 404s. That's expected for a History-API app, not a qrp\n> bug.\n\n## 🟦 TypeScript\n\nTypes ship as `*.d.ts` next to each module, so importing `./qrp/index.js`\nresolves them automatically — no `@types` package, no build step, no change to\nhow qrp loads. Generics flow through: `state<T>`, `list<T>`, `collection<T>`,\n`table<T>`, `memoize`, and the rest.\n\n```ts\nimport { state, el, list } from \"@nemanjan00/qrp\";\n\ninterface User { id: number; name: string; }\nconst users = state<{ rows: User[] }>({ rows: [] });\nel(\"ul\", {}, list(() => users.rows, (u) => u.id, (u) => el(\"li\", {}, () => u.name)));\n```\n\n`npm run typecheck` runs `tsc --noEmit` over the declarations and a usage suite\nin strict mode.\n\n## 🧫 Testable in plain Node\n\nBecause qrp writes to the **real DOM** — no virtual DOM, no hydration, no\nframework-specific test renderer — a headless DOM like `happy-dom` (or jsdom) is\nall you need to unit-test a component in a plain `node --test` script. Mount it,\nwrite to state, assert the DOM changed. No browser, no `@testing-library`\nadapter, no jsdom-vs-framework glue.\n\n```js\nimport { GlobalRegistrator } from \"@happy-dom/global-registrator\";\nGlobalRegistrator.register();   // a DOM in Node — `npm i -D @happy-dom/global-registrator`\n\nimport test from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { state, el, list, mount } from \"@nemanjan00/qrp\";\n\ntest(\"rows render and react to a state write\", () => {\n  const store = state({ rows: [] });\n  const { dispose } = mount(document.body, (view) =>\n    view.appendChild(el(\"table\", {}, el(\"tbody\", {}, list(\n      () => store.rows, (r) => r.id, (r) => el(\"tr\", {}, el(\"td\", {}, () => r.name)))))));\n\n  assert.equal(document.querySelectorAll(\"tbody tr\").length, 0);\n  store.rows = [{ id: 1, name: \"Ada\" }, { id: 2, name: \"Bea\" }, { id: 3, name: \"Cy\" }];\n  assert.equal(document.querySelectorAll(\"tbody tr\").length, 3);   // reacted, synchronously\n\n  dispose();\n});\n```\n\nWrites are synchronous, so there's nothing to `await` — the assertion runs right\nafter the state write. This is how qrp tests *itself* (263 tests, `node --test` +\nhappy-dom); your app tests the same way.\n\n## 📖 API reference\n\nFull reference — every export, signature, and a usage snippet per module — in\n[`docs/API.md`](docs/API.md). Gotchas worth knowing once: [`docs/SHARP-EDGES.md`](docs/SHARP-EDGES.md). Styling & theming: [`docs/STYLING.md`](docs/STYLING.md).\n\n## 🧪 Tests & tooling\n\n```sh\nnpm install     # dev-only: happy-dom (tests), eslint, typescript, husky\nnpm test        # node --test — 263 tests across every module\nnpm run lint    # eslint (eslint:recommended + house style)\nnpm run typecheck  # tsc --noEmit over the .d.ts + a usage suite (strict)\n```\n\nThe framework has **zero runtime dependencies**; everything in `devDependencies`\nis for tests, lint, types, and the pre-commit hook. Nothing is required to *use*\nqrp — just load the modules.\n\n## 📄 License\n\n[MIT](LICENSE) © Nemanja Nedeljkovic\n\n---\n\n*Named after QRP — the ham-radio practice of getting the job done with the least\npossible power.*\n","readmeFilename":"README.md"}