{"_id":"ks-fwork","_rev":"41-8ff4d58f44a0281b0d0bf3edfbd49ee2","name":"ks-fwork","dist-tags":{"latest":"4.7.2"},"versions":{"1.0.0":{"name":"ks-fwork","version":"1.0.0","author":"","license":"ISC","_id":"ks-fwork@1.0.0","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"d56a6b2bcfdf7a4de5bf3da3f5f9224e8bdbe5a1","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-1.0.0.tgz","fileCount":1,"integrity":"sha512-LJraUKJs8Thi9IZ012a6wQUgwNz6o8+n9u4nxcBUKfGNWs4yELNFAiXRFGbxNKvHKohj6Hu0rl/ddVcw8q+yYg==","signatures":[{"sig":"MEQCIBROqCBL/7FsJPv0OjmDU0mx246BO0oMhUpGeI8Ord7OAiB7U1uQAAYpqb6qvRXIzSb/ywTOqTOJdF6wiZmTUKL1kw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":302},"main":"src/index.js","type":"module","exports":"./src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.13.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_1.0.0_1779784418038_0.7791132580614235","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"ks-fwork","version":"1.0.1","author":"","license":"ISC","_id":"ks-fwork@1.0.1","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"80146a01612c4273f584c573e04a0cc1a68d9e9e","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-1.0.1.tgz","fileCount":10,"integrity":"sha512-QWeGeGlQSQdxE+LuAvSZJNROdBOMvJlepyLQplZSrE1U99aKJrimSbgrVJTvWOnLKvvqo/flXtcr0bJn3pMlOQ==","signatures":[{"sig":"MEUCIQDnetNMPrHz+sn1dIWIxVqPlJ53BuwV5BFsVsgiEGUdRAIgfwU9EeMSXUEXTzrPPpwGh9iZFmT7YRDlA1R1Cr3y6nI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8455},"main":"src/index.js","type":"module","exports":"./src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.13.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"ks-fwork":"^1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_1.0.1_1779786562475_0.4532321618690416","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"ks-fwork","version":"1.0.2","author":"","license":"ISC","_id":"ks-fwork@1.0.2","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"e43425bca44bc9c596b1e186ef9590f301080e6d","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-1.0.2.tgz","fileCount":10,"integrity":"sha512-8aCjIDqbr+bpmdN5zsFhHTbKNYf63sIbkPmQxhIKwMWDUUSz/9FefMIUc4vn3fCfG805xwmW9d25rENWMQ3/mg==","signatures":[{"sig":"MEUCIHel0k4g84Ae0bJgjItTuPV1cC6Pg1QoV/NmoYtK5YxfAiEAiX6mJ1FV2oBXXAxD4RGDbcjPzgrhYzXGCv5yparSjhM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8453},"main":"src/index.js","type":"module","exports":"./src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.13.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"ks-fwork":"^1.0.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_1.0.2_1779790884149_0.8384340709515972","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"ks-fwork","version":"1.0.3","author":"","license":"ISC","_id":"ks-fwork@1.0.3","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"355fcea0de8bd2fe01fcb95c9cdbc2d47883dd6b","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-1.0.3.tgz","fileCount":10,"integrity":"sha512-ChyijznHVQt9XLtsAY7PJ2p9JdLzwaREdxYpQstiH977XuVGktirFbyMk4Rh3/h8oLC/xsy/ZfOrFNPT6I8g4A==","signatures":[{"sig":"MEYCIQCUnZrvJDz+zGsUhEX29KCG0eOx6zwFAWeMV6X6HxkrkgIhAMumPsvGi5fs4U7Irztov22kwu30TJ7i3iS97D+sV6k8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8455},"main":"src/index.js","type":"module","exports":"./src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.13.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"ks-fwork":"^1.0.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_1.0.3_1779791143460_0.4270779165146341","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"ks-fwork","version":"1.0.4","author":"","license":"ISC","_id":"ks-fwork@1.0.4","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"ad6be2adad2a683a4d765b8b73bd1880341c0413","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-1.0.4.tgz","fileCount":10,"integrity":"sha512-xiHqvnpWKiJ//Vd9LJojIPACzzUFGT7d8pfvx+5a85LDPlebES216py8QZxiXQmejnv2LB8p79kvZE6hXyl83w==","signatures":[{"sig":"MEUCIQCEj6hebYyqXfT4Ab+3CBLV3d3zdf8g2aF7NYq2aqyx7QIgMBAXxCQfvk5dSXpCRffgPa8IABOuFKiWUENMxvG/bk0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8459},"main":"src/index.js","type":"module","exports":"./src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.13.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"ks-fwork":"^1.0.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_1.0.4_1779791409658_0.6505335842106188","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"ks-fwork","version":"1.0.5","author":"","license":"ISC","_id":"ks-fwork@1.0.5","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"14ae3129e04110ebd2ebee910ec59c8b06a8983b","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-1.0.5.tgz","fileCount":10,"integrity":"sha512-9Mm6Ohvf8TGyuOX5N+OiEmDYe7Nx7ja7CIDwlfsUWHJXPTWf/jIq//vKS6EnOaxNMRxJNK75bThq23tRn5nidw==","signatures":[{"sig":"MEUCIQDgh5poqLZKrq17COPg2IobFJ0RWC2zHx7pR3+xDVdWJgIgCQY83Lem77za5PnGOJYHNn+l2SYcLpcijGHpxyVY81A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10948},"main":"src/index.js","type":"module","exports":"./src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.13.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"ks-fwork":"^1.0.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_1.0.5_1779868947059_0.7421696695442519","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"ks-fwork","version":"1.0.6","author":"","license":"ISC","_id":"ks-fwork@1.0.6","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"5a50c5dee9696009ee62bb754ef0318a60e58543","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-1.0.6.tgz","fileCount":10,"integrity":"sha512-Bc7ggKfrLw9OCVMzS0O7Kwap9FTjkOCkRThYgN+T7IlbVUjmgpi0jJKu/Ee1XbAInRbEk6RdpCN5Zn9vJvfwVA==","signatures":[{"sig":"MEQCIEsRQmJuOe19jsHna8vd0CKQZNHBOWTUmXSZIzAeDZ0HAiAaaBO4H648yQXfyDGxPB2CYKKmiocvFkQb2JTiUyCr0Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10953},"main":"src/index.js","type":"module","exports":"./src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.13.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"ks-fwork":"^1.0.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_1.0.6_1779875055915_0.14107606396577554","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"ks-fwork","version":"2.0.0","author":"","license":"ISC","_id":"ks-fwork@2.0.0","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"be542cb7b76437218823482f31ec53c71d260e17","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-2.0.0.tgz","fileCount":14,"integrity":"sha512-CGCEc7Hao+4a2j8uJ3Q84N2LS1KenEeA/8fZBTIB+w3P5l7A60TNrlxhmlnhHiJtu2eFPkkYNepF8XWpnZq1gw==","signatures":[{"sig":"MEUCIHB3IBnJSposI3HRuVxpFGQmQh0emEcRaWXZhEKsKFNjAiEAlsEl+s3ap3BWZWrUfNxCIXD1NfJHUQFD24MophS5DMU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22728},"main":"src/index.js","type":"module","exports":"./src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.13.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_2.0.0_1780039583611_0.7554748950001322","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"ks-fwork","version":"2.0.1","author":"","license":"ISC","_id":"ks-fwork@2.0.1","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"290ee42e8950bc7052e88f13e11657981363c20e","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-2.0.1.tgz","fileCount":14,"integrity":"sha512-yFBntKYOyPbDm9gcWJK/ShwPqteNg7pmDPow098GwgQh9nXb2uMgiBOkAzdXoxEDfiepk2Qw/023dBgaK8WiIQ==","signatures":[{"sig":"MEYCIQC8bfWxymsldkYWCCXmaYWvLMKB9Ga2nug/i1pMMei8lQIhALEvAFWHsoQQEtgRdGuGXy7aCPtqhG1fuHBEJ8OQ6fZw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22786},"main":"src/index.js","type":"module","exports":"./src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.13.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_2.0.1_1780048856460_0.4159832513907862","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"ks-fwork","version":"3.0.0","author":"","license":"ISC","_id":"ks-fwork@3.0.0","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"f2946aef43232f7338f0dc0b142fd8dbe2b9a86e","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-3.0.0.tgz","fileCount":16,"integrity":"sha512-J35vvC3r9xwyi+1mLO7slL9CbYkimifK40ma4dKDShkDNOKLlGwGteYREBCiP2Eo2JGMr1USuB+Wci1KEt8uiQ==","signatures":[{"sig":"MEQCIFqMWp13ACavdCrQ2lC+zI1C/BoRxi4ZCeFAHn+byYfYAiBdT+2iwSVewxp2wyNcWhMt79Xx8Ok17OkLaWvqQzOFtw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31113},"main":"src/index.js","type":"module","exports":"./src/index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"rollup -c"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.24.0","rollup-plugin-cleanup":"^3.2.1","rollup-plugin-filesize":"^10.0.0","@rollup/plugin-commonjs":"^29.0.3","@rollup/plugin-node-resolve":"^16.0.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_3.0.0_1783269757750_0.02328752590144534","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"ks-fwork","version":"3.0.1","author":"","license":"ISC","_id":"ks-fwork@3.0.1","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"015b2afeb1f589d6468cc329a6a68894a1b54c13","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-3.0.1.tgz","fileCount":17,"integrity":"sha512-fIQ0cVHYXrSE7qtem6dL0aiI+oG382mE/LOlndqhsNCSGiwyo8bBMwWL2E8NDSwRH3rc/QL7eOUVpTdKYzMyog==","signatures":[{"sig":"MEQCIExRQu2eKGLGUfLoncZHBLijNDC+mLyJVTFdHJS+P0S+AiBMOq8OuWFSBCWgD0VN37Q5wmcMBk2P5gtX8/L0COuk4g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53970},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"rollup -c"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.24.0","rollup-plugin-cleanup":"^3.2.1","rollup-plugin-filesize":"^10.0.0","@rollup/plugin-commonjs":"^29.0.3","@rollup/plugin-node-resolve":"^16.0.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_3.0.1_1783270920442_0.42702388379064526","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"ks-fwork","version":"3.0.2","author":"","license":"ISC","_id":"ks-fwork@3.0.2","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"91f992b22179b70d63476da16d5ec023c662726e","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-3.0.2.tgz","fileCount":17,"integrity":"sha512-sLEyFkay7SI+wNNa2rps2VeSc/GE9N3F7vq6pyjpfvsSgK8CeAilN3BvdXYX6sdkf2FlefkZK70aZLaFFVaWGw==","signatures":[{"sig":"MEQCIGcoF7vWlw/uAWiM+6SvHsXnwNaT8CqYVat6ic5BPXGFAiBxrSK8pz2XGSVs4EfFPq2oYgW6NNglLsydB9D/3509Qg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":55258},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"rollup -c"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.24.0","rollup-plugin-cleanup":"^3.2.1","rollup-plugin-filesize":"^10.0.0","@rollup/plugin-commonjs":"^29.0.3","@rollup/plugin-node-resolve":"^16.0.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_3.0.2_1783271174959_0.7699730749761602","host":"s3://npm-registry-packages-npm-production"}},"3.0.3":{"name":"ks-fwork","version":"3.0.3","author":"","license":"ISC","_id":"ks-fwork@3.0.3","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"9d80ebbeca273d29d1cede5b11b385f2e65ce63d","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-3.0.3.tgz","fileCount":17,"integrity":"sha512-iCDFhIYHvKFW0Fdz416pBfLTwf46yZ1f1Syej7EhG3vyX4K3IsVNjITyUQq0LvPXN23e9erOht4iYUxFtZ9g3w==","signatures":[{"sig":"MEUCIFCvPQUSe4PwFBJO+NU13DPwTDpZLdHiOb1UNLiwkDYSAiEA/kt+M9jEqPK2uavDL7xnziu9JdF9PFtpQHTMZ+TqoKg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":55070},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"rollup -c"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.24.0","rollup-plugin-cleanup":"^3.2.1","rollup-plugin-filesize":"^10.0.0","@rollup/plugin-commonjs":"^29.0.3","@rollup/plugin-node-resolve":"^16.0.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_3.0.3_1783271615353_0.7383832242956363","host":"s3://npm-registry-packages-npm-production"}},"3.0.4":{"name":"ks-fwork","version":"3.0.4","author":"","license":"ISC","_id":"ks-fwork@3.0.4","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"3e3ed484341ce209b26aae8cdc0b6bbf2a4d265d","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-3.0.4.tgz","fileCount":17,"integrity":"sha512-DyipG7jP90PUVVMGbDpWt8JGpkoopj6zDXZtrYDiOHR8aeSfXWw4xI8W4H+vlHU/acaGXnZf5TfOYmylOMuFtw==","signatures":[{"sig":"MEYCIQDMud9LDDUfsJXDVFiQLTwjxhs7+8xOEX1gHY0eehkQXwIhALMLnAtiH6kocxjGDYv2Hw496eX+13iRKiqYIBNSkCJk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54994},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"rollup -c"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.24.0","rollup-plugin-cleanup":"^3.2.1","rollup-plugin-filesize":"^10.0.0","@rollup/plugin-commonjs":"^29.0.3","@rollup/plugin-node-resolve":"^16.0.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_3.0.4_1783271977136_0.3981444960029059","host":"s3://npm-registry-packages-npm-production"}},"3.0.5":{"name":"ks-fwork","version":"3.0.5","author":"","license":"ISC","_id":"ks-fwork@3.0.5","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"eedd5ad73ccdf1bb2bfcd703d50fd291847f8782","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-3.0.5.tgz","fileCount":17,"integrity":"sha512-C/iWqdBqoS/Lysdrda/Lkyt9xFiNP2npCjpYq1E7OWowz+ff3l1dy2AXwxIkQi63uoPw1Hb7KabZilDQI6uLjQ==","signatures":[{"sig":"MEQCIG0dmIFy3MurwDUzZFGTDsh8Rm4PdJE+jVQYD3KkNGciAiB9ebbbyruTe8ZcohmfVdTADsqhcRwODDOJOOG8uAE//g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":55008},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"rollup -c"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.24.0","rollup-plugin-cleanup":"^3.2.1","rollup-plugin-filesize":"^10.0.0","@rollup/plugin-commonjs":"^29.0.3","@rollup/plugin-node-resolve":"^16.0.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_3.0.5_1783272597939_0.48484018788792294","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"ks-fwork","version":"4.0.0","author":"","license":"ISC","_id":"ks-fwork@4.0.0","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"770edf0cd1aa456c21f4abe0bc08d91aa38825ff","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.0.0.tgz","fileCount":18,"integrity":"sha512-snhxIC6KfOgkkbMiapYJz7AdD22oGiP9qpJMuGVIinspzqdbbZVa9rI+lNittMHLogYx7aE/fupHldTwovJ8Gw==","signatures":[{"sig":"MEQCIDFn5QKPVNtHPkoxJo9GrV+K4niXbrUi/xzvl0RW+I8RAiBtOAS5xIlvsiVwlkAZvHJalboTxDxwhFY3wXv7H/btmQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57018},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"rollup -c"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.24.0","rollup-plugin-cleanup":"^3.2.1","rollup-plugin-filesize":"^10.0.0","@rollup/plugin-commonjs":"^29.0.3","@rollup/plugin-node-resolve":"^16.0.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.0.0_1783426227956_0.5863876762694289","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"name":"ks-fwork","version":"4.1.0","author":"","license":"ISC","_id":"ks-fwork@4.1.0","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"7d26702fba21007d82aabc13186136f2a5032d5c","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.1.0.tgz","fileCount":18,"integrity":"sha512-QSzfiUEcqHY4Ppk/yk6QgBx7u2VSNm4QkfR2FchUu+Jft+eUe2yfcgBAvdlFP1Kv0k/6tRcxO25RUUBdV77giQ==","signatures":[{"sig":"MEUCICnLuzLcPhMJYV0NFJ2A/Yz50FDn64GzQyogDo+2yfPpAiEA6uh0sLxjLFqoBniRFXOyW4srI5SJwsGG5XlTUtmREok=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57401},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"rollup -c"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"rollup":"^4.24.0","rollup-plugin-cleanup":"^3.2.1","rollup-plugin-filesize":"^10.0.0","@rollup/plugin-commonjs":"^29.0.3","@rollup/plugin-node-resolve":"^16.0.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.1.0_1783508390166_0.35668344167244803","host":"s3://npm-registry-packages-npm-production"}},"4.1.1":{"name":"ks-fwork","version":"4.1.1","author":"","license":"ISC","_id":"ks-fwork@4.1.1","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"8767465d1fc09954e761165f4cca65540810e2b1","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.1.1.tgz","fileCount":18,"integrity":"sha512-ktrEvMt2wejs5tXiqgMo0U9d3ReNgzAQCD28+OMyymX9czAvw2WsuEGBEXGvc6Qw/8qh6sW1tGN3YuJhQMCWSA==","signatures":[{"sig":"MEUCIQD3K1YAICOf8zCMkQde5obWYv4uBto8Ujx0RFBS7g+dZgIgJFou4KFkRdd2NBvtrygzvdAjdrHBZ4904WWIKKxhcRc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46065},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"7a32c62b2b707cbac97eccfe5fc75732b97a4795","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3","rollup-plugin-cleanup":"^3.2.1"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.1.1_1783535858346_0.21454485244723354","host":"s3://npm-registry-packages-npm-production"}},"4.1.2":{"name":"ks-fwork","version":"4.1.2","author":"","license":"ISC","_id":"ks-fwork@4.1.2","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"5620b62afd6257f2f5a9087a5bad09ae431852d5","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.1.2.tgz","fileCount":2,"integrity":"sha512-IlYohcF717rx7lKw+Vz56Ogk0+RckKQTVW5cX03vq8QafzB3gHiEMY8Lpo69uo2fUYLsadHpiAY5ixHK8ZHvag==","signatures":[{"sig":"MEUCIAweQ1o/RpC2jMo30NXBIhSaboK5cBUq59WPH7ivoNMzAiEA0Z9ukmMu8gRGRsBXSNUKGfeqV6O9diiFcgywdWgFHmE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14480},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"7a32c62b2b707cbac97eccfe5fc75732b97a4795","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3","rollup-plugin-cleanup":"^3.2.1"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.1.2_1783536042681_0.8635426706225691","host":"s3://npm-registry-packages-npm-production"}},"4.1.3":{"name":"ks-fwork","version":"4.1.3","author":"","license":"ISC","_id":"ks-fwork@4.1.3","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"5c847427bf388d9e448be0d7d3243f79016cc033","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.1.3.tgz","fileCount":2,"integrity":"sha512-4SONhNpHCk8UURsL+sOKrno53Q1XXqpG+Tu74ZT7MNGWKuzMYHUy5OPUcuI2Zqzv5+WHlcB4640JiFfKH5jqaQ==","signatures":[{"sig":"MEYCIQC2nzlIsgfTuRspwS3kwfljxJVHuWf7aMO2Dz9F6ZBL1QIhAOcLgwHh0EoUyv25h8EaDqcfnMoETaa84f0J61Ts+wMc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14441},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"7a32c62b2b707cbac97eccfe5fc75732b97a4795","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.1.3_1783536350408_0.10014841947863973","host":"s3://npm-registry-packages-npm-production"}},"4.1.4":{"name":"ks-fwork","version":"4.1.4","author":"","license":"ISC","_id":"ks-fwork@4.1.4","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"0161e90e4e7d363d9c5b9f6aa24a290fdcfd08e8","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.1.4.tgz","fileCount":2,"integrity":"sha512-+MTp2FRmlVf5AKT10mrt7iaSUmaQE0VREuA6hpiWlYPIk6b8Z94bxv+6JgGCiCdECJbpfjRGjspqJMpW7ysMBw==","signatures":[{"sig":"MEYCIQC3hSdotuNidIvXVsLprnUEKjsOzGLDoEjMqG31zuk8vAIhANT2fg68UuYCaEHsEKIdwzx/xFHvwQp9HrNpsfybVUNL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14459},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"4b068b4ec02bb7c5a45199062886e75bb0b7e655","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.1.4_1783539874312_0.41681829362368505","host":"s3://npm-registry-packages-npm-production"}},"4.2.0":{"name":"ks-fwork","version":"4.2.0","author":"","license":"ISC","_id":"ks-fwork@4.2.0","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"13314f748925ac6ead86d7ae57e646b717589795","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.2.0.tgz","fileCount":2,"integrity":"sha512-6pvR0tFtj+8L6DOiaalLwOeYr/bz3UeLxoxoATQKxQcAnx+0Z6tQQEyFJ3/sEOnlwWLNs6di0PNYJlNntSpeZg==","signatures":[{"sig":"MEYCIQCOio6wwLTDVZbrSf2ghxlsKSu/8oTMIwWH2m+FhyRfBwIhAMv+29COYIUQ2Y2bUsEZtVo7wM2K7RN50ddKcicPsiRT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15393},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"3cd065cebef96f3e6d9a3664b5657e988de0473c","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.2.0_1783596483755_0.3870190881911799","host":"s3://npm-registry-packages-npm-production"}},"4.2.1":{"name":"ks-fwork","version":"4.2.1","author":"","license":"ISC","_id":"ks-fwork@4.2.1","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"41a29bb19cb41f48e79896de62653ee164cdb709","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.2.1.tgz","fileCount":2,"integrity":"sha512-8E3JeakfnqTyapXUgbkq0k3zBJSBBIoWqmMh2OA8gfNv8mPtxb62dgB64DfLN9k9RkxSvQ1E48bAeWc0mf0SQA==","signatures":[{"sig":"MEUCIBKFN5fV88S5W+9i7vyBM3IDeilKJwF684iXhCz0XpIvAiEAsfcejHc8pe7ino43p4tAuqebcSg4i+tPBS8jKYW3LZo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15352},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"a9bc5fe402e4901d3fa8105cb1bdea401366a378","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.2.1_1783598079160_0.6576435100224265","host":"s3://npm-registry-packages-npm-production"}},"4.3.0":{"name":"ks-fwork","version":"4.3.0","author":"","license":"ISC","_id":"ks-fwork@4.3.0","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"f39b5b12c78932e011b2b7e32e7b3c828df52652","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.3.0.tgz","fileCount":2,"integrity":"sha512-eLIyBmcTyCHAdVE6qbCyf8Ja6lB/BS/aA7kuX3GFwLQvXC59dmIGVu5vjSZ6kDKFnfkwpX3K+K7xH7q8xT1c1w==","signatures":[{"sig":"MEUCIQCAaTCqhLdvFU/OpPufsIvuSM/EtLqBFgF3YOTymoJehQIgSWIRGMujhVt1G0xwujROHO3KbUMflICeXzQg0AhBHkk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19868},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"9a432effaa9305eab248ed9b37c41feb29830379","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.3.0_1783681186234_0.069376428327103","host":"s3://npm-registry-packages-npm-production"}},"4.3.1":{"name":"ks-fwork","version":"4.3.1","author":"","license":"ISC","_id":"ks-fwork@4.3.1","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"b72ef5ef6c415dba9d24f8f743f7590a69c46eee","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.3.1.tgz","fileCount":2,"integrity":"sha512-JiQri4o4qES413g0ZeVHPhqTxGzFAoGgFi974CKl1Ua6KxTDeLBiWvI9Wl3RYw/D8fNREWCOFSdsAzzkW7pQVg==","signatures":[{"sig":"MEQCIEmdaOga5dQhiad8aVhzHmom+2lds0WMi5wZUR9yocEGAiAzPwu5EVT9dVCVGBLamV1VKJbI6i6KDTYhj32uQjkHlw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19839},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"91cbb3df9cc54782df1c2e54ed3b35ba892a3984","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.3.1_1783943458336_0.7744857766487583","host":"s3://npm-registry-packages-npm-production"}},"4.3.2":{"name":"ks-fwork","version":"4.3.2","author":"","license":"ISC","_id":"ks-fwork@4.3.2","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"f49ebe607e9e04e86ae647d0fe905dfb4e91a6bc","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.3.2.tgz","fileCount":2,"integrity":"sha512-+NJhpgUMALXqlB7BdgtYJdROjfMgEetBYiEXHHbcRcyitRaTLIw5cJcAXthZZMKrmcha9M32/mLrxjWvgJd87g==","signatures":[{"sig":"MEYCIQD7aVN48UD7D/01mQotvPcwJAMexiK3K4vit5sxxm+z9QIhANAObx4prUPQAc2CwQhbTGIM7R0AJYJUG6mooy/f5ES8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19862},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"5833f67f8b027d398a29f9cc20d2fc50ced97bcd","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.3.2_1783943967654_0.7308166147448911","host":"s3://npm-registry-packages-npm-production"}},"4.3.3":{"name":"ks-fwork","version":"4.3.3","author":"","license":"ISC","_id":"ks-fwork@4.3.3","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"d688afdb926ab27cdbb306ab96eacbe1f0bf0583","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.3.3.tgz","fileCount":2,"integrity":"sha512-wr5uABQ90aSUl/6NwCMu8uEEpTHdsgDog9zZ/72ttAPO6neCCTzCGM6G8g5VhbnvP5i3RvCNzWWiwYedjUfEFg==","signatures":[{"sig":"MEYCIQDg0QzX6k4EmYAnzmb4A3mShX6B2t5C1n/M26haFHXAcgIhAPN2AncpfXkNxJm+XvzGrxDsQYVjh8gYdqcqFtYariFD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19862},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"70d049f72c1412d081e010babd5d0ab20d889a84","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.3.3_1783954310886_0.7250132980069761","host":"s3://npm-registry-packages-npm-production"}},"4.3.4":{"name":"ks-fwork","version":"4.3.4","author":"","license":"ISC","_id":"ks-fwork@4.3.4","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"a41de5063e3cd1cd3ce1148adf7946a854e3cf0d","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.3.4.tgz","fileCount":2,"integrity":"sha512-7IE60QxjsPtdxLbFlim3SM+FMdl/kpsVBMtyvfsg31SvJrne1MAwlDHNw8LcHKfjZMYztx+cSfTkY3VnsTyxBw==","signatures":[{"sig":"MEQCIGOjoCNzl8KJTtlDpPSnj8bhKbgXRSxg2qMpDZFHf7CFAiBf+rygrnbdlKCFPs70orSMTbb3GO+PZXX/DpAXczA7Uw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19891},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"848c4504f9dcbe75c36d49ca82a112504bf856d9","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.3.4_1783954846493_0.725588893877688","host":"s3://npm-registry-packages-npm-production"}},"4.4.0":{"name":"ks-fwork","version":"4.4.0","author":"","license":"ISC","_id":"ks-fwork@4.4.0","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"afbac8f4700ff96e55e4eeca0a9718de8bd270f2","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.4.0.tgz","fileCount":2,"integrity":"sha512-iGttf42byPVAtUyl/EhpM9y6U1lLsc3/L5T432E5aEK5HlZ/NLq5Vm60Lc5COgPJibKZ1syXaZj/rV6SEU4LWQ==","signatures":[{"sig":"MEUCIBJgugkVukWRXWOD0XB4KeXq1kM79SpVn98bPnkp47iBAiEAoV0wWdBJrLW0ea7PTKvSAa/E66LHJIwo8jTfzm6ggos=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20848},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"30a94e211617e285cc8c8894a55e8f90d02d8a5d","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.4.0_1783955519025_0.7217029571621647","host":"s3://npm-registry-packages-npm-production"}},"4.4.1":{"name":"ks-fwork","version":"4.4.1","author":"","license":"ISC","_id":"ks-fwork@4.4.1","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"5712ff69f8c04e4c1a30d0d4035581218b86a032","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.4.1.tgz","fileCount":2,"integrity":"sha512-1BJU/d4GdRIob76RiJu0sfX1QdQnANWZmqvF5UrwTb2Az+K4+5RGwO+jM73Ny/GiJxmsszc7KYA0CBq8oTuhOw==","signatures":[{"sig":"MEQCIGUVZHPvT4s2i6i5EpXHxIVNvtEKlYudkfN2tNLSD63lAiBPJg+E08s056Bgl8ikDrPLdMYukrP/hm3VQnm3Gm9W/w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20868},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"126f5c87a3b4a8ad629e6f8e7d973ad8dc6c3c86","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.4.1_1784014557242_0.6636133857836728","host":"s3://npm-registry-packages-npm-production"}},"4.4.2":{"name":"ks-fwork","version":"4.4.2","author":"","license":"ISC","_id":"ks-fwork@4.4.2","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"5c1d253f0b986a0f211f9ded25b050f48f859c91","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.4.2.tgz","fileCount":2,"integrity":"sha512-ipLRfGFfyae9RqIJBYrsklrnUBopWMkSI63Moa4yL/CvvAgeVhqYU+nXlsUdf6G7YXXkzWzqeSBoT7MYS1AbbA==","signatures":[{"sig":"MEUCIQDyKAmGdFTyksa2Cs1VilTLolZSLpC8QBMKe2ruJNqZYwIgasVlNYn+im5qrPy/SEQKbHbPVbHalvE0RjbGMvHk29c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20912},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"9026b2391f27d853df9ee9d62b55fbe52c7d9e66","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.4.2_1784023350784_0.3112937724115217","host":"s3://npm-registry-packages-npm-production"}},"4.5.0":{"name":"ks-fwork","version":"4.5.0","author":"","license":"ISC","_id":"ks-fwork@4.5.0","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"54b941612d7b33ec58ceaccd4893f97dcb21538a","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.5.0.tgz","fileCount":2,"integrity":"sha512-zJtrDARgqIqZD+SbvcDDj6t8bLS+oiEABpILq38WR79R1SYmlbzjLHsbSfSX180opkgF7wxlWDdMRixKinMjTA==","signatures":[{"sig":"MEUCIFOO4EZyJ6cWFJnsdvr5U27XS9/j1w1z7HcZpsYnwGKbAiEA/aVvhPJloiA8CTPZZZa3zTDZ93g1aYaM3CesJ5kDbLw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20881},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"f87a5161d68b13d1dc16951e92852b45a0724302","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.5.0_1784032530696_0.10069682674660152","host":"s3://npm-registry-packages-npm-production"}},"4.5.2":{"name":"ks-fwork","version":"4.5.2","author":"","license":"ISC","_id":"ks-fwork@4.5.2","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"1b71e5223cda29e99dc58218603dad4b8e8072a7","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.5.2.tgz","fileCount":2,"integrity":"sha512-j8ybJm+7qHt2eB8jt2EnbN92nw2upMjPX1USmvZ84R6LlyGE/bbOZOgqzGky27I9yetepcb70EZ0TkQtQ7LuMg==","signatures":[{"sig":"MEYCIQCkjcq5NsHxNAyUiXgykcBaD096fR9EC9kKDJi0Wh7pNQIhAIAHdxHA3pwQLGPmlwHBWk6yBavU5v3KwcXwEVJKWiyI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21210},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"fcd046e1336023f985f9c99674098a48d0b53e55","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.5.2_1784097161803_0.9280801639670466","host":"s3://npm-registry-packages-npm-production"}},"4.5.3":{"name":"ks-fwork","version":"4.5.3","author":"","license":"ISC","_id":"ks-fwork@4.5.3","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"ad13a192b50d94fc60d45026e4879ab2ab7a7c86","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.5.3.tgz","fileCount":2,"integrity":"sha512-WFmhBEX9lvn4/cbZdTtQZlAS60iPNQWeWoWVJlg6WjqEm4/pFVOIGh+q0M+S+8M7teD3JxXtXUKFmhvx93Fqqg==","signatures":[{"sig":"MEUCIA7XHL0ufVfHcPQ0Y0h53nPjxSyXxwdROdrIrT0Kjdv6AiEAq8PavOSHygJ9i2VxP6X60zRIei5KkomD+NZ+/TxqmoM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20881},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"fcd046e1336023f985f9c99674098a48d0b53e55","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.5.3_1784098974437_0.3375520348092087","host":"s3://npm-registry-packages-npm-production"}},"4.5.4":{"name":"ks-fwork","version":"4.5.4","author":"","license":"ISC","_id":"ks-fwork@4.5.4","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"ed4c4773560149d59faf3a5dbb625deb444afb9e","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.5.4.tgz","fileCount":2,"integrity":"sha512-+j5l6PmRcyW9E0W3jo2/AwU4OrtlJdZHTR2wSAVzzpMOlyB9hrDItMEd4yTwBHLQbpBzpPDnkrLwORv0ER2gcQ==","signatures":[{"sig":"MEUCIQD2p5N1UcRVMRmHW8IBVYBga8t7k0B9qMAXVxNIoEZgqgIgScgr7jF3n93bG7jUofCNZ7tck+ctxJiM+YivPsWKsAs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21717},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"d026944cd580d6a60fe3350c61e387276fbd8b24","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.5.4_1784118046170_0.4981057859582825","host":"s3://npm-registry-packages-npm-production"}},"4.5.5":{"name":"ks-fwork","version":"4.5.5","author":"","license":"ISC","_id":"ks-fwork@4.5.5","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"5b6465332ef7e2dbdeba06b98e638794ce22b4af","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.5.5.tgz","fileCount":2,"integrity":"sha512-2cHqJBie3PI4OL4oTxYAakrp9lIcjzc5dwFlv7ppihD50PgDoCMZvTL32DXlzlr9PbgQ6RsMxp43omj9BeOAVw==","signatures":[{"sig":"MEUCIQC2sOGg1Zv+oXbf/8tj6/dVBpAWCtDsx1gG+3CEr1WDvgIgdneq18YukufqdUaWZRiWbqlYOBkdteTOK8KtSWNyR2Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21938},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"5c16174b42e6be9add5da83a2045b757b4f7ac56","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.5.5_1784121288037_0.360683539092453","host":"s3://npm-registry-packages-npm-production"}},"4.5.6":{"name":"ks-fwork","version":"4.5.6","author":"","license":"ISC","_id":"ks-fwork@4.5.6","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"c2ac7a3ddcfe2cc4c17a3e05da27b9660712651e","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.5.6.tgz","fileCount":2,"integrity":"sha512-nRU9X6UXMgdeCXeBJ0nqFegFzKDse3UnVX97ZSHZaG929X5oiZauAsxz9mU5oTjPW8Q5ufnglS8TiGL1C1YbQg==","signatures":[{"sig":"MEUCIAeyOnR4zuoD2ifaiqrHLxhq7JxtmEemWMrZ0bkwiZ1EAiEAvp91+mTBb8OeHs7SvYowTqMCc74RJNxQ93K5D2fJoNQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21891},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"0c33a0695596bd712fc403bddc94d5a460d6b965","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.5.6_1784181221416_0.033056777756865774","host":"s3://npm-registry-packages-npm-production"}},"4.6.0":{"name":"ks-fwork","version":"4.6.0","author":"","license":"ISC","_id":"ks-fwork@4.6.0","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"4014d94882e74948049469cb2c67c3b88fe38b19","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.6.0.tgz","fileCount":2,"integrity":"sha512-R3CleGNyjPnrAGnpF1c1D34TJz6n7s4RGvhLBP6z6B86csoZQh/2DoRg6mVd32cXSgsB22DvrGqr+bq6WkcU7g==","signatures":[{"sig":"MEYCIQCpZQK5mHdUzxoeD3bp5KzCpYdOGHGQscaVm7Rgusw0nAIhAL/LeyNIp/2i7WyIuw24Bjsh+6Ka9Z+BY76E7y0De48Y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22065},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"0c84d52cc4b729d350994a30f050e40b5b2edb34","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.6.0_1784184686595_0.013824529079811132","host":"s3://npm-registry-packages-npm-production"}},"4.7.0":{"name":"ks-fwork","version":"4.7.0","author":"","license":"ISC","_id":"ks-fwork@4.7.0","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"f1ba09052eb29fa142281db84d9d5608dd0f911e","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.7.0.tgz","fileCount":2,"integrity":"sha512-gg0rDy1yp2EyiulpWbFuPPpJbGNHlxc3tmRt5fp3PUMWmlFYbYQY9qPgdk+5XADib2EtmE2XN5szQg8VUAfteg==","signatures":[{"sig":"MEUCIBqIZ0zhtvT0fB0ts3tI3OiRCB3SLeQlw1oes2rEY/zqAiEAgnbeeVt7r+nl8HCeiQB77tH8jSMO6Sy1M7rL7JPPJGM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22445},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"ea4cc209fc747bde69aef0a633ff9a0692dd6071","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.7.0_1784197127560_0.35243288915537185","host":"s3://npm-registry-packages-npm-production"}},"4.7.1":{"name":"ks-fwork","version":"4.7.1","author":"","license":"ISC","_id":"ks-fwork@4.7.1","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"dist":{"shasum":"b792aab9c6b875d7f9ea5bf2d4376af948575969","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.7.1.tgz","fileCount":2,"integrity":"sha512-QEGCa/DzjbTT2+uS8eo89ny7Ww8/JP5JixLG74B9Lz4ztl/S3ibtkNUrVFHODTCZOUdDbCUxJSU1ksFOm1rPQw==","signatures":[{"sig":"MEQCIG1aHKV+UTafx1kt6sEPL4FQ4GuieW7uuQANi70C6qJhAiAVFWS0PFYNySDRELSj8hH/DZcFv96Qnwa7+U0C4XPssA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22460},"main":"dist/ks-fwork.js","type":"module","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","gitHead":"e5e1dc87d31537ac65b94fbeaaddf52198d6013c","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"_npmVersion":"11.17.0","description":"Demo Frontend Framework","directories":{},"_nodeVersion":"25.8.2","dependencies":{"fast-deep-equal":"^3.1.3"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ks-fwork_4.7.1_1784198733099_0.5753094874515261","host":"s3://npm-registry-packages-npm-production"}},"4.7.2":{"name":"ks-fwork","version":"4.7.2","description":"Demo Frontend Framework","license":"ISC","author":"","type":"module","main":"dist/ks-fwork.js","module":"dist/ks-fwork.js","exports":"./dist/ks-fwork.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"vite build"},"dependencies":{"fast-deep-equal":"^3.1.3"},"devDependencies":{"vite":"^8.1.3"},"gitHead":"a792af5f2e7b489fde3c459d1b0436fd3cd01aea","_id":"ks-fwork@4.7.2","_nodeVersion":"25.8.2","_npmVersion":"11.17.0","dist":{"integrity":"sha512-b2VQpLr0wJczYI8mOdw4MZ7lxNkSGKVfN7FKvwLk03g3r/rcppofgAWscwKliMs2bOg9CX6IDsfutVF8Pb82zg==","shasum":"813112454fc946638bd17d242f329eb34733114d","tarball":"https://registry.npmjs.org/ks-fwork/-/ks-fwork-4.7.2.tgz","fileCount":3,"unpackedSize":46496,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCcYcXRADsSX+dsRCc+f7h0eQAVCMwIoi3rpvqdbL/uCAIhAMv+klcM+x9L+q3a3Ns8mqk4NwZSDELH7z2u2hQu3E1v"}]},"_npmUser":{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"},"directories":{},"maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ks-fwork_4.7.2_1784618220731_0.7971635013343821"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-26T08:33:38.006Z","modified":"2026-07-21T07:17:00.990Z","1.0.0":"2026-05-26T08:33:38.200Z","1.0.1":"2026-05-26T09:09:22.608Z","1.0.2":"2026-05-26T10:21:24.334Z","1.0.3":"2026-05-26T10:25:43.596Z","1.0.4":"2026-05-26T10:30:09.796Z","1.0.5":"2026-05-27T08:02:27.198Z","1.0.6":"2026-05-27T09:44:16.044Z","2.0.0":"2026-05-29T07:26:23.753Z","2.0.1":"2026-05-29T10:00:56.607Z","3.0.0":"2026-07-05T16:42:37.880Z","3.0.1":"2026-07-05T17:02:00.585Z","3.0.2":"2026-07-05T17:06:15.099Z","3.0.3":"2026-07-05T17:13:35.483Z","3.0.4":"2026-07-05T17:19:37.258Z","3.0.5":"2026-07-05T17:29:58.085Z","4.0.0":"2026-07-07T12:10:28.085Z","4.1.0":"2026-07-08T10:59:50.298Z","4.1.1":"2026-07-08T18:37:38.508Z","4.1.2":"2026-07-08T18:40:42.832Z","4.1.3":"2026-07-08T18:45:50.542Z","4.1.4":"2026-07-08T19:44:34.434Z","4.2.0":"2026-07-09T11:28:03.918Z","4.2.1":"2026-07-09T11:54:39.269Z","4.3.0":"2026-07-10T10:59:46.361Z","4.3.1":"2026-07-13T11:50:58.472Z","4.3.2":"2026-07-13T11:59:27.793Z","4.3.3":"2026-07-13T14:51:51.017Z","4.3.4":"2026-07-13T15:00:46.632Z","4.4.0":"2026-07-13T15:11:59.148Z","4.4.1":"2026-07-14T07:35:57.422Z","4.4.2":"2026-07-14T10:02:30.914Z","4.5.0":"2026-07-14T12:35:30.848Z","4.5.2":"2026-07-15T06:32:41.939Z","4.5.3":"2026-07-15T07:02:54.569Z","4.5.4":"2026-07-15T12:20:46.304Z","4.5.5":"2026-07-15T13:14:48.186Z","4.5.6":"2026-07-16T05:53:41.541Z","4.6.0":"2026-07-16T06:51:26.723Z","4.7.0":"2026-07-16T10:18:47.677Z","4.7.1":"2026-07-16T10:45:33.218Z","4.7.2":"2026-07-21T07:17:00.858Z"},"license":"ISC","description":"Demo Frontend Framework","maintainers":[{"name":"kaarelsirel","email":"sirelkaarel@gmail.com"}],"readme":"# ks-fwork\n\nA small, vanilla-JavaScript frontend framework built from scratch — no React, Vue, or any other rendering library underneath. It gives you a virtual DOM with keyed reconciliation, a component system, client-side hash routing, a shared-state store with persistence, and a native-events-based event system, all wired together by a single `createApp` entry point.\n\nThis document covers the framework's architecture, how to install and start using it, every feature with runnable examples, and the best practices and performance decisions behind it.\n\n> Built following the design taught in [*Build a Frontend Web Framework (From Scratch)*](https://www.manning.com/books/build-a-frontend-web-framework-from-scratch) by Ángel Sola Orbaiceta — the virtual DOM, mount/patch pipeline, dispatcher-based pub/sub, and keyed list diffing all follow that book's approach, extended here with a store layer, HTTP wrapper, hash router, and declarative event delegation.\n\n## Table of contents\n\n- [Architecture & design principles](#architecture--design-principles)\n- [Installation](#installation)\n- [Getting started](#getting-started)\n- [Features](#features)\n  - [Elements and components](#elements-and-components)\n  - [State](#state)\n  - [Store — shared & persisted state](#store--shared--persisted-state)\n  - [Routing & URL-driven state](#routing--url-driven-state)\n  - [Styles and attributes](#styles-and-attributes)\n  - [Events](#events)\n  - [Forms and user input](#forms-and-user-input)\n  - [HTTP requests](#http-requests)\n- [Best practices](#best-practices)\n- [Performance](#performance)\n\n## Architecture & design principles\n\nks-fwork is a **framework**, not a library: instead of a collection of functions you call from your own `main()`, you hand the framework your component definitions and it owns the render loop, the event loop, and the application lifecycle. You write `defineComponent({...})` and `class MyStore extends Store`; the framework calls into your code (`render()`, `onMounted()`, store subscribers), not the other way around. That inversion of control is the dividing line between a library and a framework, and it's deliberate throughout the design.\n\n**Virtual DOM.** Every component's `render()` returns a plain object tree (a \"vNode\") built with `h()`, not real DOM nodes. On first mount, `mountDOM` walks that tree and creates real elements. On every subsequent render, `patchDOM` diffs the new vNode tree against the previous one and applies the minimal set of DOM operations needed — it never tears down and rebuilds the whole page on a state change.\n\n**Keyed reconciliation.** When a component renders a list, giving each item a stable `key` prop lets the diffing algorithm (`arraysDiffSequence` in `utils/arrays.js`) tell the difference between \"this item moved\" and \"this item was removed and a different one was added.\" Without keys, the framework falls back to matching by type and position, which is fine for static content but causes unnecessary DOM churn for reorderable lists.\n\n**Components as classes, defined declaratively.** `defineComponent({ state, render, onMounted, onUnmounted, ...methods })` returns a real class under the hood, but you never write `class` or `extends` yourself for components — you describe behavior as a plain configuration object, and the framework builds the class. `state()` produces the initial state from props, `render()` returns a vNode tree, and any other keys become instance methods you can call from your own code (`this.someMethod()`).\n\n**One-way data flow, two ways up.** Data flows down through props (`h(Child, { someProp })`). Children never mutate a parent's data directly. Reporting back up happens in one of two ways, and the framework supports both deliberately:\n\n- **Component-level delegation** — a child calls `this.emit('eventName', payload)`, and a parent handling `on: { eventName: handler }` receives it. The parent owns the decision of what the event means; the child just reports what happened. This is the framework's primary answer to \"event handling delegated to parent elements.\"\n- **Native DOM delegation** — the exported `delegate(rootEl, eventName, selector, handler)` primitive attaches one real listener to a container and resolves which descendant triggered it via `event.target.closest(selector)`, exactly the classic vanilla-JS delegation pattern. See [Events](#events) for both, side by side, in the same real feature.\n\n**Real native events, not synthetic ones.** Some frameworks (React, historically) wrap native events in a synthetic event system and attach a single listener at the app root, so your `onClick` handler never touches a real `Event` object. ks-fwork doesn't do this: `on: { click: handler }` attaches a real `addEventListener` call, and your handler receives the real, unmodified native `Event`. This is why native patterns like DOM delegation and `<form method=\"dialog\">` behave exactly as they would in plain HTML — the framework never gets in the way of the platform.\n\n**Shared application context.** `createApp(RootComponent, props, { router, stores })` threads a single `appContext` object (containing your router instance and your named stores) down through every component in the tree via `setAppContext`. Any component can declare `stores: ['todoStore']` and get automatic, lifecycle-managed access — no manual prop drilling required to reach shared state from a deeply nested component.\n\n## Installation\n\n```bash\nnpm install ks-fwork\n```\n\nks-fwork ships as an ES module (`\"type\": \"module\"`) with a single bundled entry point (`dist/ks-fwork.js`). Its only runtime dependency is [`fast-deep-equal`](https://www.npmjs.com/package/fast-deep-equal), a general-purpose comparison utility, not a frontend framework or rendering library — the framework itself (virtual DOM, diffing, components, router, store, events) is implemented from scratch.\n\n## Getting started\n\nA minimal app: one component, mounted to the page.\n\n```js\n// main.js\nimport { createApp, defineComponent, h } from 'ks-fwork';\n\nconst App = defineComponent({\n    state() {\n        return { count: 0 };\n    },\n\n    render() {\n        const { count } = this.state;\n\n        return h('div', {}, [\n            h('p', {}, [`Count: ${count}`]),\n            h('button', {\n                on: { click: () => this.updateState({ count: count + 1 }) },\n            }, ['Increment']),\n        ]);\n    },\n});\n\ncreateApp(App).mount(document.getElementById('app'));\n```\n\nThat's the whole surface area needed to get something on screen: `defineComponent` describes behavior, `h` builds the tree `render()` returns, `updateState` triggers a re-render, and `createApp(...).mount(...)` bootstraps everything into a real DOM element. Everything else in this document — routing, shared stores, HTTP, events — layers on top of this same shape.\n\n## Features\n\n### Elements and components\n\n`h(tag, props, children)` creates an element vNode; `tag` can be a string (a real HTML tag) or a component:\n\n```js\nh('div', { className: 'card' }, [\n    h('h1', {}, ['Title']),\n    h(SomeComponent, { someProp: 42 }),\n]);\n```\n\nElements nest naturally — `children` is just an array, and it can mix strings (auto-converted to text nodes), elements, and other components. `hFragment([...])` groups multiple top-level nodes without an extra wrapping element (useful when a component's `render()` needs to return several siblings). `hSlot()` marks where a caller's children should be inserted into a component's own markup — see `RouterLink`, which renders whatever children you pass it inside its own `<a>`:\n\n```js\nexport const Card = defineComponent({\n    render() {\n        return h('div', { className: 'card' }, [\n            h('h2', {}, [this.props.title]),\n            hSlot(), // caller's children land here\n        ]);\n    },\n});\n\nh(Card, { title: 'Hello' }, [\n    h('p', {}, ['This paragraph is the slot content.']),\n]);\n```\n\nComponents are reusable by construction: a `defineComponent` definition is just a plain object describing behavior, so the same component can be instantiated many times with different props (see `TodoItem`, instantiated once per todo in `TodoList`).\n\n### State\n\nEvery component can define its own local `state()`, seeded from its initial props:\n\n```js\ndefineComponent({\n    state(props) {\n        return { text: '' };\n    },\n    render() {\n        const { text } = this.state;\n        // ...\n    },\n});\n```\n\n`this.updateState(partial)` shallow-merges `partial` into the current state and triggers a re-render (a diff against the previous render, not a full rebuild). State is local to the component instance — for state that needs to be shared across components or across pages, use a `Store`.\n\n### Store — shared & persisted state\n\n`Store` is a base class you extend for each piece of shared application state:\n\n```js\nimport { Store } from 'ks-fwork';\n\nexport class TodoStore extends Store {\n    constructor() {\n        super(\n            { todos: [] },\n            { persistKey: 'todo-store', persistenceEnabled: true }\n        );\n    }\n\n    get todos() {\n        return this.state.todos;\n    }\n\n    addTodo(text) {\n        const todo = { id: crypto.randomUUID(), text, completed: false };\n        this.updateState({ todos: [...this.todos, todo] });\n    }\n}\n\nexport const todoStore = new TodoStore();\n```\n\n`persistKey` + `persistenceEnabled` make the store's state survive page reloads and browser restarts automatically, backed by `localStorage` — this is how the framework satisfies \"stores and updates application state between sessions.\" Toggle persistence at runtime with `setPersistenceEnabled(bool)`.\n\n**Sharing state between elements and pages.** Register your store instances once, at app bootstrap:\n\n```js\ncreateApp(RootComponent, {}, {\n    router,\n    stores: { todoStore, settingsStore },\n}).mount(document.getElementById('app'));\n```\n\nAny component, anywhere in the tree, can then opt in with the declarative `stores` option:\n\n```js\nexport const Home = defineComponent({\n    stores: ['todoStore', 'settingsStore'],\n\n    render() {\n        const { todoStore, settingsStore } = this.appContext.stores;\n        // reads are always live — this re-renders automatically on store changes\n    },\n});\n```\n\nDeclaring `stores: [...]` does two things automatically, for every component that uses it: it subscribes to each named store on mount (triggering a re-render whenever that store's state changes) and unsubscribes on unmount. You never write manual `onMounted`/`onUnmounted` subscription code — this is what makes the same store usable from a component on the home page and a completely different component on a settings page, with both staying in sync for free.\n\n### Routing & URL-driven state\n\n`HashRouter` drives client-side, hash-based routing:\n\n```js\nimport { HashRouter } from 'ks-fwork';\n\nexport const router = new HashRouter([\n    { path: '/', component: Home, meta: { title: 'Home' } },\n    { path: '/users/:id', component: UserPage, meta: { title: 'User' } },\n    { path: '/settings', component: Settings, meta: { title: 'Settings' } },\n    {\n        path: '/protected',\n        component: Protected,\n        meta: { title: 'Protected' },\n        beforeEnter: async () => settingsStore.isAuthenticated || '/',\n    },\n    { path: '*', component: NotFound, meta: { title: 'Not found' } },\n]);\n```\n\nPass the router into `createApp`, then render a `RouterOutlet` where the matched page should appear, and use `RouterLink` for in-app navigation instead of plain `<a>` tags (it prevents a real page navigation and calls the router directly):\n\n```js\nh(RouterOutlet);\nh(RouterLink, { to: '/users/42' }, ['View user']);\n```\n\nEvery route's component receives `params` (from `:id`-style segments), `query` (from `?key=value` query strings), and `meta` as props automatically — read them the same way you'd read any other prop:\n\n```js\nexport const UserPage = defineComponent({\n    render() {\n        const { id } = this.props.params;\n        const { title } = this.props.meta;\n        // ...\n    },\n});\n```\n\n**`beforeEnter` guards** control access to a route: return `false` to block navigation, a path string to redirect elsewhere, or anything else to allow it through.\n\n**The application state changes based on the URL**, and the URL changes based on application state — both directions are supported. A filter toggle backed by the URL's query string looks like this:\n\n```js\nh(RouterLink, { to: '/?filter=active' }, ['Active']);\nh(RouterLink, { to: '/?filter=completed' }, ['Completed']);\n\n// In the page component:\nrender() {\n    const { filter } = this.props.query;\n    const visibleTodos = filter === 'active' ? todoStore.active\n        : filter === 'completed' ? todoStore.completed\n        : todoStore.todos;\n}\n```\n\nClicking a filter link changes the URL, which changes `this.props.query`, which changes what's rendered — state and URL stay in sync in both directions.\n\n### Styles and attributes\n\n`className` (string or array) and `style` (an object of CSS properties) are handled specially by the attribute system; every other prop is set directly on the element:\n\n```js\nh('div', {\n    className: 'card active',              // or: className: ['card', 'active']\n    style: { color: 'red', fontSize: '14px' },\n    id: 'my-card',\n    'data-testid': 'card-1',                // data-* attributes are set via setAttribute\n    disabled: true,\n}, [...]);\n```\n\nOn patch, only what actually changed is touched: classes are diffed and added/removed individually via `classList`, styles are diffed key by key, and attributes are diffed and only the added/removed/updated ones are written — an unrelated attribute doesn't get rewritten just because a sibling attribute changed.\n\n### Events\n\n**Registering listeners.** Any element or component can declare event listeners under `on:`, and they're wired up as real `addEventListener` calls the moment the element is mounted:\n\n```js\nh('button', {\n    on: { click: () => this.doSomething() },\n}, ['Click me']);\n```\n\n**Preventing default behavior and stopping propagation** can be declared inline, without touching the event object yourself, by passing a config object instead of a plain function:\n\n```js\nh('form', {\n    on: {\n        submit: {\n            handler: () => this.submitForm(),\n            preventDefault: true,\n        },\n    },\n}, [...]);\n\nh('input', {\n    type: 'checkbox',\n    on: {\n        click: {\n            handler: () => this.emit('complete', id),\n            stopPropagation: true,\n        },\n    },\n});\n```\n\nThis is a thin layer on top of `addEventListener`, not a replacement for it — the underlying listener is real, the event object passed to your handler is the real, unmodified native `Event`, and plain function handlers (`on: { click: fn }`) keep working exactly as before. `preventDefault`/`stopPropagation` can be static booleans or computed from state/props at render time, letting you toggle the behavior at runtime (see the example app's Settings page, which lets you flip these on and off live to see the effect).\n\n**Event handling delegated to parent elements** is supported two different ways, deliberately:\n\n*Component-level delegation* — the idiomatic framework convention. A child emits, a parent decides:\n\n```js\n// Child\nthis.emit('remove', id);\n\n// Parent\nh(TodoItem, { on: { remove: (id) => todoStore.removeTodo(id) } });\n```\n\n*Native DOM delegation* — a lower-level primitive for when you want one real listener handling many descendants instead of one listener per element:\n\n```js\nimport { delegate } from 'ks-fwork';\n\n// One-off, outside any component's lifecycle:\nconst unsubscribe = delegate(document.getElementById('app'), 'click', '[data-action=\"remove-todo\"]', function (event) {\n    console.log('removing', this.dataset.id); // `this` is the matched element\n});\n\n// Or declaratively on a component, lifecycle-managed automatically:\ndefineComponent({\n    delegate: [\n        {\n            event: 'click',\n            selector: '[data-action=\"remove-todo\"]',\n            handler(event, matchedEl) {\n                this.emit('remove', matchedEl.dataset.id); // `this` is the component\n            },\n        },\n    ],\n    render() { /* children carry data-action/data-id, no listeners of their own */ },\n});\n```\n\nThe declarative `delegate: [...]` option binds to the component's own root element on mount and unbinds on unmount — the same lifecycle-management pattern as `stores: [...]`. The standalone `delegate()` export is the primitive underneath it, usable anywhere you have a real DOM node, independent of any component.\n\n**It does not just reimplement `addEventListener`.** The framework adds real behavior on top of the platform primitive: declarative `preventDefault`/`stopPropagation` configuration, automatic listener cleanup tied to component unmount, event listener diffing on re-render (a changed handler is swapped, not endlessly re-added), and the `delegate()` primitive built on real event bubbling. None of that exists if you only call `addEventListener` directly.\n\n### Forms and user input\n\nForms work like any other element — the `submit` event is just an event:\n\n```js\nh('form', {\n    on: {\n        submit: {\n            handler: () => this.addTodo(),\n            preventDefault: true,\n        },\n    },\n}, [\n    h('input', {\n        value: this.state.text,\n        on: { input: ({ target }) => this.updateState({ text: target.value }) },\n    }),\n    h('button', { type: 'submit' }, ['Add']),\n]);\n```\n\n`preventDefault: true` stops the browser's native form submission (which would otherwise navigate the page) so the app's own `submit` handler is the single source of truth for what happens. Native, browser-handled form behaviors — like `<form method=\"dialog\">` inside a `<dialog>` element — are unaffected, since the framework never wraps or intercepts the native `Event` object.\n\n### HTTP requests\n\nThe `http` export wraps `fetch` with sensible defaults for a typical JSON API — automatic `Content-Type: application/json` when a body is present, automatic JSON body serialization, automatic response parsing based on the response's actual `Content-Type` (falling back to plain text, and to `null` for an empty body like a `204 No Content`), and a thrown `Error` for any non-2xx response:\n\n```js\nimport { http } from 'ks-fwork';\n\nconst users = await http.get('https://api.example.com/users');\nawait http.post('https://api.example.com/users', { name: 'Ada' });\nawait http.put(`https://api.example.com/users/${id}`, { name: 'Ada Lovelace' });\nawait http.delete(`https://api.example.com/users/${id}`);\n```\n\nBecause it throws on failure, the natural pattern is a `try`/`catch` around the call, updating component or store state either way:\n\n```js\nasync fetchTodos() {\n    this.updateState({ loading: true, error: null });\n\n    try {\n        const data = await http.get('/api/todos');\n        todoStore.setState({ todos: data.todos });\n    } catch (error) {\n        this.updateState({ error: error.message });\n    } finally {\n        this.updateState({ loading: false });\n    }\n}\n```\n\nThis is how HTTP requests feed data sharing across the application: the fetched data is written into a `Store`, so every component subscribed to that store — on any page — picks up the new data automatically, the same way it would for a local mutation.\n\n## Best practices\n\n**Keep components focused on presentation; let a parent own the decision.** A component like `TodoItem` should know how to render a todo and report that it was clicked — it shouldn't know what \"completing a todo\" means to the rest of the app. Emit generic events (`complete`, `remove`) with just enough payload (an `id`) for a parent to act on, rather than reaching into a store directly from a deeply nested, otherwise-reusable component. Reserve direct `stores: [...]` access in a \"generic\" component for reading cross-cutting state that isn't a business decision (feature flags, auth status, settings) — not for triggering domain mutations.\n\n**Always give keyed lists a stable `key`.** Without a `key`, list diffing falls back to positional/type matching, which can cause unrelated DOM nodes (and their internal state, like focus or scroll position) to be reused for the wrong item after a reorder. Use a stable, unique identifier (`todo.id`, never an array index) as the key.\n\n**Prefer `preventDefault`/`stopPropagation` config over manually touching the event object**, when the behavior is meant to be static or state-driven — it keeps `render()` declarative and makes the behavior visible directly in the vNode tree rather than buried inside a handler body.\n\n**Guard routes with `beforeEnter` rather than checking auth inside the page component.** Redirecting before a protected page ever mounts avoids a flash of protected content and keeps the access-control logic in one place (the route table) instead of scattered across every protected page.\n\n**Don't let unrelated store subscriptions cause implicit ordering assumptions.** Because `stores: [...]` triggers `updateState({})` synchronously on a store change, a store update can cascade into further synchronous DOM operations (mounts and unmounts) within the same call stack. Handlers subscribed to a store should stay simple (usually just \"re-render me\") — put actual business logic inside the store's own methods, not inside a subscriber callback.\n\n## Performance\n\n**Decision: keyed reconciliation to avoid unnecessary DOM churn.** List diffing (`arraysDiffSequence`) classifies each item into `ADD`, `REMOVE`, `MOVE`, or `NOOP` by comparing type, tag, and `key` (via `areNodesEqual`), instead of always tearing down and rebuilding a list wholesale on every render. A `MOVE` reuses the existing DOM node (`insertBefore`) instead of destroying and remounting it, and a `NOOP` skips straight to patching just the node's own attributes/children rather than replacing it.\n\n*Why it matters:* destroying and remounting a DOM node loses anything the browser was tracking about it — input focus, scroll position, CSS transition state, and (in this framework specifically) it also tears down and recreates any component instance rooted there, discarding its local state. Keying avoids all of that for items that didn't actually change.\n\n*How to validate it:* render a list of `TodoItem`s, focus the checkbox on one item, then trigger a re-render that adds a new todo to the *front* of the list (shifting every existing item's array index by one). Without keys, the diffing algorithm would match by position and reuse each old DOM node for whatever now sits at that index — the focused checkbox would visually \"jump\" to a different todo, because the DOM node kept its focus but the data next to it changed. With `key: todo.id` (as the example app does), the algorithm instead detects that this is an `ADD` at index 0 followed by `NOOP`s for every existing item — the existing nodes, and the browser's focus tracking on them, stay attached to the correct todo.\n\n**Decision: skip re-rendering when incoming props/children haven't changed.** `Component#updateProps` and `#setExternalContent` compare the incoming value against the current one with a deep-equality check (`fast-deep-equal`) before doing anything else, and return immediately — without calling `render()` or running the diff/patch cycle — when nothing actually changed.\n\n*Why it matters:* a parent re-rendering doesn't necessarily mean every child's props changed. Without this guard, every re-render anywhere in a subtree would call `render()` and run a full diff on every descendant component, even ones whose inputs are byte-for-byte identical to last time.\n\n*How to validate it:* add a temporary `console.count('render:' + this.constructor.name)` at the top of a component's `render()`, then trigger a state update in a sibling or parent that does *not* change this component's own props. With the equality guard in place, the counter for the untouched component does not increment on that update — only components whose actual props or children changed re-render.\n","readmeFilename":"README.md"}