{"_id":"ice-web-components","_rev":"48-b53ee49544275d0719ef241c9e452dbd","name":"ice-web-components","dist-tags":{"latest":"1.22.4"},"versions":{"1.0.0":{"name":"ice-web-components","version":"1.0.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.0.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"dist":{"shasum":"ecbe7368cb9f95c292361854185ab8870c2102ec","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.0.0.tgz","fileCount":114,"integrity":"sha512-oOXZommB96nU3CU9ORINgADxGvv1OlxV+Pcx8iq24aFkT35j9fo5PeOBT4Ri5Jk103nbEyJb67XJe3ehhArK6w==","signatures":[{"sig":"MEUCICwtvHmu1dwlUgL64+0Oo5+XKeHGGu12zUaVEBdyfwIeAiEAq6osxKAXTxxtoU1Wa4QO+VL0U/bWGKgEQY7QuGBy76o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1285243},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","gitHead":"c2584d56475eab888584e9764163627916cf281e","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:arcade":"node scripts/qa-arcade.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","qa:workbench":"node scripts/qa-workbench.mjs"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ice-render":"^1.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"25.4.0","rimraf":"3.0.2","rollup":"2.70.1","typescript":"4.6.2","@babel/core":"7.17.8","@types/jest":"^27.5.2","@types/node":"^14.18.63","@babel/preset-env":"7.16.11","@rollup/plugin-json":"4.1.0","rollup-plugin-babel":"4.4.0","rollup-plugin-terser":"5.3.0","@rollup/plugin-commonjs":"21.0.2","@babel/preset-typescript":"7.9.0","@rollup/plugin-node-resolve":"13.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.0.0_1789222934741_0.1767516150974504","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"ice-web-components","version":"1.1.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.1.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"dist":{"shasum":"65d416a49b3ffdff8141c396c8ae8c36acb0f11f","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.1.0.tgz","fileCount":115,"integrity":"sha512-QRYE5BeiruEYyVws/oDdzE3PfNMIsdfSinOcYmxvuMDBrtwWbt4/pVcd9Z9EHxeu3cCRxFAu6S9W2PDvOyHn9A==","signatures":[{"sig":"MEYCIQDQCc0BkBi7oTBW6SU+UsGrvnwNvWdy2N9ueyxgdZwv6QIhALVdtk49RdRCDJ2EMZ6aWwZ6srLeSU98EevfD/gH0I8M","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1307384},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","gitHead":"73c150a20b18902c030a0b59bbe0300ee20e9dbc","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:arcade":"node scripts/qa-arcade.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","qa:workbench":"node scripts/qa-workbench.mjs"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ice-render":"^1.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"25.4.0","rimraf":"3.0.2","rollup":"2.70.1","typescript":"4.6.2","@babel/core":"7.17.8","@types/jest":"^27.5.2","@types/node":"^14.18.63","@babel/preset-env":"7.16.11","@rollup/plugin-json":"4.1.0","rollup-plugin-babel":"4.4.0","rollup-plugin-terser":"5.3.0","@rollup/plugin-commonjs":"21.0.2","@babel/preset-typescript":"7.9.0","@rollup/plugin-node-resolve":"13.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.1.0_1789225596457_0.8186586340380906","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"ice-web-components","version":"1.2.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.2.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"dist":{"shasum":"70a236f099359353a5fbfd3ca3137dbccb15b9b3","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.2.0.tgz","fileCount":117,"integrity":"sha512-ny6kBxWndtuzr97mNMQrNfVty1TCju3zXXXjlX1kydCnwH53Kq3p418m1ycO6OoR5bIFDWMiQPJTnceq/oITpQ==","signatures":[{"sig":"MEUCIQCdQGjcd1PJU7uY3YKjmtcB0OntdmwTiGHvn7MAQTbtxwIgcWUWQfD2lY94bY7CChliCyhwvGYD08eJhBpbhOunivM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1339375},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","gitHead":"5f6196d335459d8549814ec5466828f55950f25d","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","qa:arcade":"node scripts/qa-arcade.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","qa:workbench":"node scripts/qa-workbench.mjs"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ice-render":"^1.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"25.4.0","rimraf":"3.0.2","rollup":"2.70.1","typescript":"4.6.2","@babel/core":"7.17.8","@types/jest":"^27.5.2","@types/node":"^14.18.63","@babel/preset-env":"7.16.11","@rollup/plugin-json":"4.1.0","rollup-plugin-babel":"4.4.0","rollup-plugin-terser":"5.3.0","@rollup/plugin-commonjs":"21.0.2","@babel/preset-typescript":"7.9.0","@rollup/plugin-node-resolve":"13.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.2.0_1789226467809_0.3417863389399318","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"ice-web-components","version":"1.3.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.3.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"dist":{"shasum":"e25239ee1392b59f1dee9539d8e0fc6d3599d89f","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.3.0.tgz","fileCount":118,"integrity":"sha512-bzQsxuDoQg2Fs2li8DjjArIP//q5y/hVZj1n9cEzpcHgWt10FApOLjUy8E5tUjyrdx9sbrbjLv0zRjEwAv/uDw==","signatures":[{"sig":"MEQCIHGLgQjBYQHPaOl2+8FvMyYPohV6VVGk/m5EUjFhYA7cAiAn5th1MiBm0iLU2gSD7b6UpiuClib/eKevDEZ1+j96pw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1361292},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","gitHead":"7c1c1da3e16b155e6df2e8fc7bceed1d2ff95f31","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","qa:arcade":"node scripts/qa-arcade.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","qa:workbench":"node scripts/qa-workbench.mjs"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ice-render":"^1.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"25.4.0","rimraf":"3.0.2","rollup":"2.70.1","typescript":"4.6.2","@babel/core":"7.17.8","@types/jest":"^27.5.2","@types/node":"^14.18.63","@babel/preset-env":"7.16.11","@rollup/plugin-json":"4.1.0","rollup-plugin-babel":"4.4.0","rollup-plugin-terser":"5.3.0","@rollup/plugin-commonjs":"21.0.2","@babel/preset-typescript":"7.9.0","@rollup/plugin-node-resolve":"13.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.3.0_1789259260692_0.3560766139281135","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"ice-web-components","version":"1.4.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.4.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"dist":{"shasum":"06834e7194fb01547caf04c376c9b0cacf8f581e","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.4.0.tgz","fileCount":122,"integrity":"sha512-k1nVEAocTbzEMRsmIxvzKZ/hDThvCJrGKyxCYEb96Mt4G6s0d4hmv3E70eejfmA9hHpCQZPvw1OL/nMUsY5vrg==","signatures":[{"sig":"MEYCIQClOekJatJGVGfkHzzcPnucHK3oYA8lUT3bPJVeAeS35QIhANbJPd54fgj7ur1aG6QV5m1bw6IiSs+TsmxnCy2hOU5r","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1438395},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","gitHead":"d83a33521bf6ecbb672eb5e768c50c360f86f9f5","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs","qa:algo":"node scripts/qa-algo.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","qa:arcade":"node scripts/qa-arcade.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","qa:workbench":"node scripts/qa-workbench.mjs"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ice-render":"^1.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"25.4.0","rimraf":"3.0.2","rollup":"2.70.1","typescript":"4.6.2","@babel/core":"7.17.8","@types/jest":"^27.5.2","@types/node":"^14.18.63","@babel/preset-env":"7.16.11","@rollup/plugin-json":"4.1.0","rollup-plugin-babel":"4.4.0","rollup-plugin-terser":"5.3.0","@rollup/plugin-commonjs":"21.0.2","@babel/preset-typescript":"7.9.0","@rollup/plugin-node-resolve":"13.1.3"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.4.0_1789260330209_0.7787817588486805","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"ice-web-components","version":"1.5.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.5.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"dist":{"shasum":"aafb1cc9f1950f8f9ea82061f0011dfd5c299249","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.5.0.tgz","fileCount":122,"integrity":"sha512-JntEprifUwIcFq7/m6+hbhU0wMUVqT0OE0ivw0pLHc2ZTthY8dRZ8luhgxUAbYi/IPVCSMHgHm5GzpVokoLygQ==","signatures":[{"sig":"MEYCIQCS1pS+csDwyRLZ4z9smVSJoTITfKOVHxhgJddGmJU6eQIhAJJ2nb8VDUnsjIzHGGfj9xv9sv8dUvZITYt/Z6DY5Q5c","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1438358},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"eb53ed1bee755e2b4cf9f7da6782d3d6ad8f599c","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs","qa:algo":"node scripts/qa-algo.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","qa:arcade":"node scripts/qa-arcade.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","qa:workbench":"node scripts/qa-workbench.mjs"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^1.4.11","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^1.4.11"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.5.0_1789269032140_0.7198138456724803","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"ice-web-components","version":"1.5.1","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.5.1","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"dist":{"shasum":"b4ee08f12c6a00b5e7ab8429a7e82154328c01d1","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.5.1.tgz","fileCount":122,"integrity":"sha512-mnELSU3N2MPEMHnsw4/d5MuZeKmttl2oT5tE/G+SFwmK8EK4F5oScGE1UCBXci379UgrcVwI9wzgqJyh6uY6mA==","signatures":[{"sig":"MEQCICQW9YzQms00a8zzqzDZ5A/D+H95IizmBsN3rndfjbB4AiA1TqU1q6qKew5qc01avPxMIqwmxG+RZS30ALaLuVIYQg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1438356},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"a185f8da732d230b9541b795bbfaa53f22dee1fd","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs","qa:algo":"node scripts/qa-algo.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","qa:arcade":"node scripts/qa-arcade.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","qa:workbench":"node scripts/qa-workbench.mjs"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.0.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.5.1_1789281904477_0.991828948754238","host":"s3://npm-registry-packages-npm-production"}},"1.5.2":{"name":"ice-web-components","version":"1.5.2","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.5.2","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"febe685a13564327610496ddfe84196a6c476dcb","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.5.2.tgz","fileCount":122,"integrity":"sha512-CSx9zGJZCiT83bPiSbUQ7EJ0G9Wl5xCJrDHnr0zKF0KMokhUv2YCsIEba0e0KTdoNIj3zJACOZkYiy0fLOmJvA==","signatures":[{"sig":"MEQCIDm7kvDeP7ukGihpsMncAQbTszqW+Jb9U87/ezLf2QxEAiAjlsgmDAMLCXhGOMtTkszJELZ35w+LK4NSMNu8kVhNQA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1455805},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"06faf3be30e296375145f11463e33991dd511484","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs","qa:algo":"node scripts/qa-algo.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","qa:arcade":"node scripts/qa-arcade.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","qa:workbench":"node scripts/qa-workbench.mjs"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.2.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.5.2_1789292094077_0.5996745635516019","host":"s3://npm-registry-packages-npm-production"}},"1.5.3":{"name":"ice-web-components","version":"1.5.3","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.5.3","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"eb948a2440d0e4e4736e4c2a56510c15bd363c3e","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.5.3.tgz","fileCount":122,"integrity":"sha512-3UN0qczKyvPzc+xn+I8Cr69kbO1ocwkduaG7C2c5hRRYILlxWpIhAvwQnZWSehZwC1CRsn+FB1uEGjBQOmL3pg==","signatures":[{"sig":"MEQCIDDt5uQf+XX1oEmk93CZWhL+0YI0k6Vbne9GwW84pQd3AiAKqHwuX+8lUBSvjDl4PaWM8SbuGu1BI9oJA/9K1yEBEA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1456154},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"02abf8abd4925b710768fe527b749d7cabd18f75","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs","qa:algo":"node scripts/qa-algo.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e","qa:workbench":"node scripts/qa-workbench.mjs"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.2.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.5.3_1789307449184_0.9942887651486938","host":"s3://npm-registry-packages-npm-production"}},"1.5.4":{"name":"ice-web-components","version":"1.5.4","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.5.4","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"c84cf8e6a1a439c1348797d77ca33b353d84515c","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.5.4.tgz","fileCount":122,"integrity":"sha512-7OR8Wy5JEWCWnJT89+YvE2D1BgDLBUxuF+PIaL8rAvtTAsdIk9hCP0KqEsXy2AQ3n1eCAVud446wRtNyDa09nQ==","signatures":[{"sig":"MEUCICNZpJLNFC94NcJq9xyBnEOzKdwRmlOmU64OYyQ6+vjTAiEAz6C6fcH1kfQlnv59keGpFGv0F4UsMu+/jy1vS98NjyY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1457651},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"eff33acc9cc08f7e216f7f55d19359ae41649b89","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs","qa:algo":"node scripts/qa-algo.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e","qa:workbench":"node scripts/qa-workbench.mjs"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.3.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.5.4_1789347492445_0.5268811417458599","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"ice-web-components","version":"1.6.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.6.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"1e2b1b1f0eb7ffa2988b7908e85deb234bf5e037","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.6.0.tgz","fileCount":131,"integrity":"sha512-gxOrH6MnT5X2zB/SImObrT7/L3O0exRHq+I+pzewl0KP4k9IzG+sHk0X3MGx5ykfRuPdLsMjoCC9jwYs3U05yw==","signatures":[{"sig":"MEQCIDaIWGsUcR6XqcR+cjTRupS+QinemzAWkhLRQhLjJnHGAiA8liGOXDCVq1PoWNjNqTD7++tGE5RwKQsQW2efsWJinA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1856875},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"736cd60f43a768386a6e71fc23c4bf17b5991a68","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.4.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.6.0_1789375117153_0.9830297234062935","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"ice-web-components","version":"1.7.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.7.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"4c24b95f3cab2a664538410d8df1a316250d3c9f","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.7.0.tgz","fileCount":131,"integrity":"sha512-9YDUJwbdjSg50oFtsglHGIncYBWAoKIvTkBiw/QSL7+lHLkQKiPk5vO5NK9BE/cEVIK4szoK8KPFG+HwgsgCQQ==","signatures":[{"sig":"MEUCIQDJQTPe4/UwCN1oS3GEcSa3lEyUkzfjkhlkqfONP7auIQIgDNQbwrXXwNKEL/lN4YT4/f1+fm9PoXQFq2AbFNm0zis=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1862047},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"6f6101a88dd6bb63140b2ed0cdd1f1a81c8f5087","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.4.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.7.0_1789381518976_0.6847385258010268","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"ice-web-components","version":"1.8.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.8.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"74c1c470a0a621595e1ed5faf9c060b34fa92e64","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.8.0.tgz","fileCount":131,"integrity":"sha512-kXrhbB1zWjKDJOiGslou3GLkFiJkf+EL/4EcmxN0RoRZ786fOfGkslc4LV/yjG16hVQos1Bw8FQDi10qBUVr9g==","signatures":[{"sig":"MEQCICnKv4ZVl6fW7IC6oQWVJtQTgg51RUdvZAEptr64o15PAiBy3dK5FUaeFNEynO4W4Q0h5103wFB/uzbJ6QB4O5y88w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1867995},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"cac08f7676158c186b128d11a5af84625dc820d3","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.6.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.8.0_1789393351871_0.17202913494591443","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"ice-web-components","version":"1.9.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.9.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"6239e667618f15a93b40149a54d681ffb8e7baa3","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.9.0.tgz","fileCount":131,"integrity":"sha512-RzHz5ib445XE/O+kP7AdQPXlbuza5Wz7Rxn75+0H8kQ8H+2w67kxqc3wz+rHXQxq2PmBpZ81zdvAEUcztVG+0w==","signatures":[{"sig":"MEUCIQDEZPgbTHgqGZ0EBnlQDNNA7lGfM614iZkiD9gTWCUO0AIgMCKkmGCUXe3kJT5OM9LTJWax2vIRDve/cfcf47qrFy8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1890556},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"92ae02035b95ec9f4f842e3197348554e93781a6","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.8.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.9.0_1789437653256_0.709818092070635","host":"s3://npm-registry-packages-npm-production"}},"1.9.1":{"name":"ice-web-components","version":"1.9.1","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.9.1","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"21e66ab6c9b38fcfef51c160b7dde582546a6337","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.9.1.tgz","fileCount":131,"integrity":"sha512-KVLjQPTBCs/RL1U+qzPfagOdlZUmMlWFIu2cwrudFCUp/oL/wG5FHLHzj4PjhC4Z3XrtpbSvdpjpdBIRQHndtQ==","signatures":[{"sig":"MEQCIBBVy+tq+14hm5dgxulrLDfXL8jrvtw9g7dE8CIJcTx6AiAyulFNqP2X5Did+7VsL7qoI/Xf09/8hnm3TFBpciR5QA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1892304},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"69e05d3417802ea9099d53df7898ba9d59bd5713","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.8.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.9.1_1789438097701_0.9353842047031105","host":"s3://npm-registry-packages-npm-production"}},"1.9.2":{"name":"ice-web-components","version":"1.9.2","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.9.2","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"14c0d9263e885959927dcf17ee612a7ffae2c642","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.9.2.tgz","fileCount":131,"integrity":"sha512-h1taruXQiP5JrSYFn8bwPkje26uqqz8oywgEQF06s5lpwe8dTET1klJrTSpl16vb1Rfn758nazmMOpva4QH5PQ==","signatures":[{"sig":"MEUCIHZ+P1xkzkRSfFUMN9jvIqj/s7GLYCuP7dp6Z9mG4FItAiEAwzQ6ejveMDE0A4ZRT9HZZy9OEC5za5DMvVJ/UIyoujQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1895159},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"f4b0ff44ec09ab02c05d4351382819cd254e048b","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.8.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.8.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.9.2_1789439301461_0.6567730831811829","host":"s3://npm-registry-packages-npm-production"}},"1.10.0":{"name":"ice-web-components","version":"1.10.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.10.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"f6b522c5f05832b86a2f2c2c3489c66e3fed33d4","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.10.0.tgz","fileCount":131,"integrity":"sha512-nX7di8plJfpNLpBm4piaGoNRo7KJofIyA1YlUBEb6m2Q6ElyN/QM3uIK2XZGPy0wbCUCtgkE4cGuX1c4jrCApg==","signatures":[{"sig":"MEUCIGTeGZA0MAL8Rne1olZTGLxTS6xamNK+NLuOsRsC/hSbAiEAoWoyj1shB/UF4ndu0WLbC9zfVQIayV7Mk9PoP02YfiI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1895162},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"dae32fbfbf3193135efa7e51669f8c0981f1055c","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.10.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.10.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.10.0_1789441147189_0.7517517014922823","host":"s3://npm-registry-packages-npm-production"}},"1.10.1":{"name":"ice-web-components","version":"1.10.1","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.10.1","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"f17fc83b168df64f10f82e18708b77312c4e2a84","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.10.1.tgz","fileCount":131,"integrity":"sha512-C8vr2P+C4yZi45HkMMYqYHscd6RumwmJXNulS0PZdX2cm6Cw/v0iSKO2f9kEpVMNFvOAHA6WOHX1y1sBmOd6Hw==","signatures":[{"sig":"MEUCIGcOnsT+5zUt65xVsOvLQOsIYK9IGxlG2IjdvxL0guu4AiEAjh5S0K9v0adjR5yYVsgKuy9zbHsZAyjZc6TQMZgO72I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1895353},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"1a90da27c4ec9d2cab1018510044185c83bd9d0c","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.10.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.10.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.10.1_1789444379266_0.6721751732575219","host":"s3://npm-registry-packages-npm-production"}},"1.10.2":{"name":"ice-web-components","version":"1.10.2","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.10.2","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"293eddaeaea30b190cf22e58bad1b8baa8c30128","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.10.2.tgz","fileCount":131,"integrity":"sha512-Wr44q5+XG3CfkddKxViKYz9IIsKtFU8knZ5vxiL4kpG6KKpcU8dRFmbmOqVDsvZI8hIxJ4AWq8Kn/0G2MXSb0Q==","signatures":[{"sig":"MEYCIQDScB6dWKcNudsqX7WiJlx+dHpGx2rZs8/8/fYZKsYsPAIhAIzuz5dj2DgYSj/sEsPgZIU28D6DCIAvtZhZ0E+blvLQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1897382},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"97a0762db1771e6720570aac7b65c616ff9160e4","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.10.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.10.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.10.2_1789445610929_0.8721350768601983","host":"s3://npm-registry-packages-npm-production"}},"1.10.3":{"name":"ice-web-components","version":"1.10.3","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.10.3","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"c7c7e71b6f1645e1b102ac4c14d9d15163da6bf7","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.10.3.tgz","fileCount":131,"integrity":"sha512-ykGe+BWjZIEleJTavxP/nwi+Aoxvvlpgb3AH3VB33soOuBXDJMPL3rASdupu0VOTLHQrOjhykJMsfzAVwORFzQ==","signatures":[{"sig":"MEYCIQDhPrTAVDHqzdC00ShYvhCjjJW6mM7384wPpyG/mOrR8gIhAPNIui3naIPTcPCdAMxZyVUVNSNwHoqBp74JCNhx7RXs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1897354},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"189156f67e207aa067ba2a2893922777d0f2ac6b","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.10.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.10.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.10.3_1789449432025_0.14651036496419212","host":"s3://npm-registry-packages-npm-production"}},"1.11.0":{"name":"ice-web-components","version":"1.11.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.11.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"7949a5b4d660d2ed980281cbeac49cc635fb27f2","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.11.0.tgz","fileCount":131,"integrity":"sha512-adlkdoLYyeF90QtYPjxiNIf12lvAQ9+cN75+3tWz9A0CbERpp1g34uZWBJ0lsViJZM9ClaeSaDVaIUV1N8nQkg==","signatures":[{"sig":"MEUCIBxKIgOXZqmcjuUuyNvlCAhPQJyh3XjRT0hNBG93OKYXAiEAsv0OeadXJq/pkSiV/yGMTMKVMhFofKQfv773STPlJnk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1897426},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"d7349b3fd80e06c48991d30801e3ba2880e6d3cb","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.11.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.11.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.11.0_1789456658914_0.020752870690436298","host":"s3://npm-registry-packages-npm-production"}},"1.11.1":{"name":"ice-web-components","version":"1.11.1","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.11.1","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"032a4875efdc23b17bdfa0f0d34ec1e69de41abb","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.11.1.tgz","fileCount":131,"integrity":"sha512-rePgLYCfoIiEXzrNyKYuBJD0m4VIpgtGyEIDEQdaL9Q+IXyIcya2oouHnQOH4kUKFR7+G0F10JmSagxXbiZyMA==","signatures":[{"sig":"MEUCIBFz3OZdDSWvJczlzFhoxN1NrJcF7AsWQClK9iE+igo9AiEA6sCehXw2jXfBZ0sXsmYMBgYwPZKecKApqcrT5TWBX9E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1897426},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"1f07f77668eff72bac58a3c7c1a9dd74c15619ee","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.11.2","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.11.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.11.1_1789468009015_0.09696252730919674","host":"s3://npm-registry-packages-npm-production"}},"1.11.2":{"name":"ice-web-components","version":"1.11.2","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.11.2","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"b4210956192cbadff4779ba0e3bbe44a22e302d6","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.11.2.tgz","fileCount":131,"integrity":"sha512-tTgjgMVlnxiqsSosbWtT39AX6aVwv/eBOAEFTYxtHQLo+bUBdt2xbdJqB7it6h+Njdp1HB3KDEe6yg4+ClCGeQ==","signatures":[{"sig":"MEQCIHdQXxWAgQr8n5fiyKHzGh6NK9yjOnCC8hqIwernkFpxAiAGOy7IFuxA2ceIkazl8SX9KxFxhLtd0qNBWnsmWb4Niw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1897426},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"8daf7c0621472f634d504f0ae3538233151e993f","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.12.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.11.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.11.2_1789475011478_0.5231050767914882","host":"s3://npm-registry-packages-npm-production"}},"1.12.0":{"name":"ice-web-components","version":"1.12.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.12.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"899950366eb3de738bb631fdcdd442e324846228","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.12.0.tgz","fileCount":131,"integrity":"sha512-vkoHsshGhlMweetAInu/GjjYyfLhOERz4H7MIE51dEatYgo7frtlU6MVooRy08pJbmqImhX9S/dpq1YLG7XQ0g==","signatures":[{"sig":"MEUCIQDZ2OLdRqnbmgbydvJnrUGYckwLHoECIKmSxIViyu0p2wIgbmXWyEZsC8sAbtrD4vv8/SdR4TEqHAXNjeYpE1YdBKY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1945099},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"b20252e4bc5b6563dbc2d2782b3fd5cdfea7ef70","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.12.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.11.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.12.0_1789486455489_0.23555428743709572","host":"s3://npm-registry-packages-npm-production"}},"1.13.0":{"name":"ice-web-components","version":"1.13.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.13.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"72506ecc3e2d9e030a32ef691035f4965fb2d007","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.13.0.tgz","fileCount":131,"integrity":"sha512-MsRxxgo+HnaafKNXqc1h5EqgJgog0jL2OuentvbzQ7j4PnPHfdCuN+Th2veAXbjS1+AQMzSWEerRSnXJUe4Pmg==","signatures":[{"sig":"MEQCIEfxTrhNtR3Bd5eYgRpOP5+IsaRdz0Y1eJMgoh9BR9GmAiA9aFYaGMAB92PjZYqTcdFHOHKv9BAr2wfBqsylmBlzPQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1950763},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"9da5c9a88726354a932925369a0823b8c44c5758","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.12.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.11.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.13.0_1789615800447_0.23598385992419346","host":"s3://npm-registry-packages-npm-production"}},"1.13.1":{"name":"ice-web-components","version":"1.13.1","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.13.1","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"6e7418690042d6913955fd3fad23d57f1d682829","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.13.1.tgz","fileCount":131,"integrity":"sha512-/evZ5Yq4nOOilcuGtwJEHXAgVZ/xNeW78megtm7KzuZa+N0mOxmtg6FhbMvTL0/IyvR8p5H1j/sXBvJjEBMLJQ==","signatures":[{"sig":"MEUCID5MmRGFb+hUN4iiRM/5PkmTq3iltMXnDlCb/3VKkBd+AiEA02hSuGNLLwnQv2EFSKPHvk+/u9FPnCvvGhxVTDpvpC4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1950781},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"1fe2b5561fa1f570284656bc65771273d7e9cabd","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.12.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.11.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.13.1_1789623735488_0.4126462895453529","host":"s3://npm-registry-packages-npm-production"}},"1.13.2":{"name":"ice-web-components","version":"1.13.2","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.13.2","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"769848c014fa690598aaa9e9fd6e4c52b6719576","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.13.2.tgz","fileCount":131,"integrity":"sha512-fhmBCwbZ8fZezsBca1YVk1KuZClsX3xI91yC1zy5IngFz6Z7nrHz5vFGml04GYWgpDRBAPhUWc7jHpL7lEsS7A==","signatures":[{"sig":"MEUCIG2N2z0rxkSEK9zDZnWSmA/R6dOFpTgoQRM1Q/u/KmPjAiEApbRp5H4oikqqypzxSRMQ1E8WYUZ48BWaJtOwA2b8vRM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1951072},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"b7b9beee6ecaf864a71412618a5ca893e3abfe44","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.12.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.11.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.13.2_1789630363914_0.07256548103939076","host":"s3://npm-registry-packages-npm-production"}},"1.13.3":{"name":"ice-web-components","version":"1.13.3","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.13.3","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"9212a88742175955623e60f43ee3b18bd3254d7f","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.13.3.tgz","fileCount":131,"integrity":"sha512-wd8yZfjXCxAekwh8Xkbtvgk4/ot8sCrcVvJuWx8JGwMqoKrc8/uOv8Tb0uYjDtX3AQ5R4T3xzsLxo1L7Pr56Dw==","signatures":[{"sig":"MEYCIQCBpxSbp7QhQaENeTWbF1GrOW4s5G3LBmjieAHL12imxAIhALySpv3E8LUgDnRvRK8BNiG2hdJabkOn4uGiwZKyGR9s","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1953021},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"2530785c4b26092b57154f305ca13adf2fcb87a9","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.12.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.11.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.13.3_1789631584289_0.039050265911573234","host":"s3://npm-registry-packages-npm-production"}},"1.14.0":{"name":"ice-web-components","version":"1.14.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.14.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"55ee1577bb133cc2d5afb9b144f7bb5f61721115","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.14.0.tgz","fileCount":131,"integrity":"sha512-MVfgPK7fP/Jxnn9bhqcV59/8sqhaHY/IT7mtPy22hSrriP84s1udMDuSHz5MZh4kFXC27DzP9fMLJZ41lxPuyw==","signatures":[{"sig":"MEUCIQCds56TUuORjD7ETKay5uoYPE67NSe0L65c7y2+gkX6FQIgFZI3avDRsGfz1QLn0MYlMgZIyARzCe+Hf1s33e9gQ/Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1954586},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"3e67d09b157dc63c545751f283b9dbe74bb01a77","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.12.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.11.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.14.0_1789634374523_0.5791864936742137","host":"s3://npm-registry-packages-npm-production"}},"1.14.1":{"name":"ice-web-components","version":"1.14.1","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.14.1","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"05d56b6da885c1d37b7305f5b74b182938b555dc","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.14.1.tgz","fileCount":131,"integrity":"sha512-egfCn+wZLwhOIjzwIpzOfDHLS/nJesWLe/xGlqk0LBlknZoZaSYD4FtfejXaKav2fGlX21MQFPSvmWT0kdpcig==","signatures":[{"sig":"MEUCIDk7zTfYHveizA6XUB/m1PP6GcR5DpVHErrap0Oz0GwQAiEAhzLiDHpNelXU2WUgxgyBhmO3F69+jfAQgstQ0OzJc/4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1954634},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"d9d83b524b1472ab054d41dffa62b081c4309bdd","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.12.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.11.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.14.1_1789634747987_0.21684294621132727","host":"s3://npm-registry-packages-npm-production"}},"1.15.0":{"name":"ice-web-components","version":"1.15.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.15.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"5ef317c23f56212db96a10cab0c034ed76fb5968","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.15.0.tgz","fileCount":132,"integrity":"sha512-h2VXGeKpUj/tg41nZX/s5H0Lky7IpRsvO85ATe/RjuLbkT+5tiqdLbI9Lu4ik+g9HcSef42Sm7OpAqc6shrwgg==","signatures":[{"sig":"MEUCIQD/vqy/9Lf+NQDCoqljgvMuSRKuheTByhLrKEFlQ6d6ZAIgOV1D4X5sz+Mz1Vrvqe489vDiRERCrP195Iw3hfeUFT0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1975690},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"5792fc98c2f396ab315abeacbbbd635015b269d0","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.12.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.11.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.15.0_1789637002452_0.7660282508762468","host":"s3://npm-registry-packages-npm-production"}},"1.15.1":{"name":"ice-web-components","version":"1.15.1","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.15.1","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"6d55dd53e75972aed5a2741699a3ae2e9ad3cf30","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.15.1.tgz","fileCount":132,"integrity":"sha512-nSbDSZ/i036L2T4tf8hFVEkCV7mSPPAabXXCi8SH9wGBeHD7BS9T2Ypy8mV6gYFgniubXG7yUsPZZogiClQEcg==","signatures":[{"sig":"MEUCIQCEr3y7NY8XOdkyTlV2YneFOqW9tFSpoZPG9N2tbuTH6AIgdxcrOSXCVT7GzN2Mx1yKg7+CbsmH9jvkeyAPdt2zxtk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1976057},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"145730cc6aabf04cada92bf9d590b92d730eae6a","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.12.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.11.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.15.1_1789637270438_0.39394933289858547","host":"s3://npm-registry-packages-npm-production"}},"1.15.2":{"name":"ice-web-components","version":"1.15.2","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.15.2","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"465146a02921f19d8125d9c8619a4e1821cce7c0","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.15.2.tgz","fileCount":132,"integrity":"sha512-7vvzLNQdKkolVCs5CXsiL2hc6RsSAr631dUgyIEFQgX4/a3cfq4xPBBNAWZfzCR9vuRcSyt4VUGtIOJwSLgOvg==","signatures":[{"sig":"MEUCIQDZpyet4H3RyKkFsP0uEJCsEtCXv1UnLyihawO9V2KsWAIgF7P4OTpgRYRiGeJjFtjXh7sQUOEZYocLFpoRjceHcN4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1977308},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"b6cbf7dd6b4f9486e56e5646967c79c2e1df458e","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.12.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.11.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.15.2_1789637378597_0.5554097533310232","host":"s3://npm-registry-packages-npm-production"}},"1.16.0":{"name":"ice-web-components","version":"1.16.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.16.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"9d57c7d3df09c8c240e852895ffa5fa4ab48215f","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.16.0.tgz","fileCount":132,"integrity":"sha512-It/VNVTdly0Fgeshjn4TAA+SNNROG9m7ZECqXT7NYYD2kX8Ct5atcq8ExG+ede+DwnPjQnZ4J2YXBpjP3pAXPA==","signatures":[{"sig":"MEUCIQConN4rr6MaxIc2Xgz9oqIZ0cIJ3Cd5H1uVnGuPA4RVbAIgc7isvYfaQVyXvVMjkawEBrVwY6K8vfPwIFSBc08lTTI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1980642},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"5dbfd6a26b43f93e99807c1bd69e1fd69d20bc40","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.12.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.11.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.16.0_1789638709008_0.20539757679070858","host":"s3://npm-registry-packages-npm-production"}},"1.17.0":{"name":"ice-web-components","version":"1.17.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.17.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"7a89ddfe56709867787eac6873d2deebe6e283a9","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.17.0.tgz","fileCount":132,"integrity":"sha512-AfR/1J9J6IQFU/XDcfHSsSdIlKtmL/huEzoxPc/K/y0giM3PJcyijSWattvXj5LCpkuApmm17k5qVjG6X4Jbng==","signatures":[{"sig":"MEQCIF4VpPkHCfh0KtIvw5uNTcjXEfTkbiOGhFD58Rbs1SUnAiAYNDGczS60POfNaeo/bR/9PHQxWYpoSxbmGQ+RWJRBmg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1990133},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"2465bbbdd1874a348d3be56f5a4d74daf108182e","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.12.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.11.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.17.0_1789640564022_0.3245005795224636","host":"s3://npm-registry-packages-npm-production"}},"1.18.0":{"name":"ice-web-components","version":"1.18.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.18.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"5c58d65f296684b7cf4697119154362e6cc5c18c","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.18.0.tgz","fileCount":132,"integrity":"sha512-Jc26TNsEl4zSrXzE+d9KjTYAtZOj4zczRAY1xmRGtR78l6t+PMpp9x/JYCTXLfuejXtufgFgNkZfyppiU4hhog==","signatures":[{"sig":"MEUCIQDEmFA4o+5nnfnIytilo2VSQkgUwG+Y+x+1im6ScU+ClQIgHa05vV9H/t9G1ol+hkFLn6ltPcHBBC/yhSJcABdyjGY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1994321},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"217e5edf76908e42727e0c75b42df93c2bfe69d1","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.12.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.11.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.18.0_1789643716100_0.49978991232776204","host":"s3://npm-registry-packages-npm-production"}},"1.18.1":{"name":"ice-web-components","version":"1.18.1","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.18.1","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"77de5b8c1a25cbbcd56e67260b70a26a1c355c1a","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.18.1.tgz","fileCount":132,"integrity":"sha512-YKpbA/1ilhDL1vnSQDmL9ijEFRO+CYdGEoEkbsOeW0DApqqJ5GOATUppv53kKbISxiudVIK4IHB/7OoiKeI4nQ==","signatures":[{"sig":"MEUCIG3ye7+SZ8HHahkS/ziHvhIpGJQ44cOZp69+m4QKYhR1AiEA0UmOwMayDI5p8/W/8jsO/jMum5LC3d38CfLuBiav8e4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1995116},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"5b2afb4febbca714bec13ba54240184c9018d750","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.13.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.13.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.18.1_1789645823783_0.21025490170193972","host":"s3://npm-registry-packages-npm-production"}},"1.19.0":{"name":"ice-web-components","version":"1.19.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.19.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"5013a0144e5cf4b2f8e88837c23b9a75d3b1b1b9","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.19.0.tgz","fileCount":132,"integrity":"sha512-0Z0zakWixBrv5LG7NPOTFEsRLMKjyXp3aND3BI+CVz5H9UNcAkmGp7oMxaZynNrNa7AWf3vJETrhj2eQLcI9Zg==","signatures":[{"sig":"MEUCIHTnj7Ij7DiHhD3ogTBC2DVzApbyyJmPjD78GZg1wHIZAiEA6c3qaLNdxv9/NWkjwY+p9Amrbv0rYN70h5Nb4mg2DxY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1996251},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"c19246c56bb13209c60cb0cd70490c98abba6120","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.14.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.14.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.19.0_1789649881633_0.953434914210235","host":"s3://npm-registry-packages-npm-production"}},"1.19.1":{"name":"ice-web-components","version":"1.19.1","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.19.1","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"50a14c870bb34aab296be39ff754cdf53053f3b3","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.19.1.tgz","fileCount":132,"integrity":"sha512-YQp+kY8j8DfoSzjSYO0/QygXRUB7o9Ius3FP4LVvpNabibVhmfUt7BPV9sufp6A5EMngcS8DAK4DBaSSAal8jg==","signatures":[{"sig":"MEYCIQDKa+MiFxPLz2birJHSNz5zXSEsR979BuZbZKYtivPplwIhANQZStLmUwEDpxBYO+Qwlm6Ve3RLU4/OH2q616zV/zy4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1996251},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"8934853d585b1de0e8778fcc8740eb9221daabeb","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.14.1","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.14.1"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.19.1_1789659551591_0.6254130423439426","host":"s3://npm-registry-packages-npm-production"}},"1.19.2":{"name":"ice-web-components","version":"1.19.2","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.19.2","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"61ade37dd86832c22bdfa8d3963a0ee93036d625","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.19.2.tgz","fileCount":132,"integrity":"sha512-YThPYwCgNNDusJ7/NGElRJ6KR1RGo9yg+MYlA5K3k7BPlgPo0KIsdN6zbQq4wAA9lkOS/nJlsdycXGksaTCjaA==","signatures":[{"sig":"MEUCIQCrPstvi01AxNOBBuVmuAQNFuaEZcCvnYePaxre+fIHuAIgbpURhSdjeE49KodR2rmb05JFDY/8Hlt7rkWmcrbgr0c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHo122XTtdNej3aw/Rx+MkBdepJaT6r3Ow79geDMD1mRAiBlKavrRD3QaB+d7aA/O9A+zRvonlKibURQ323hScRiwQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1997011},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"9a21911e1b9352aa3947448d3ad608c6279b6f3d","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.14.1","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.14.1"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.19.2_1789706589081_0.20397031166927526","host":"s3://npm-registry-packages-npm-production"}},"1.19.3":{"name":"ice-web-components","version":"1.19.3","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.19.3","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"aabe36b83e1ce1a91cb0b2d3597a0427b8d3908f","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.19.3.tgz","fileCount":132,"integrity":"sha512-826cd0t96VLSJ74szfmP0BEUigKWuxVVB7nlUgPtGvWDl2zJL3IZxwJlyCWlR2Izl3VFFQFxm4LUFTQqaCO9Sg==","signatures":[{"sig":"MEQCIEE4txx51jwPBK7/O+8rq/vyI3lufrLuSZStPwUeqWFJAiBARp5N5NNrRt+3BjJ5yuxIw6mXCxkavm1cECUnVkCGFg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFv573EWPGaOZStpXMCOlcvBcMfFzjxm3ioHURdt0F2LAiBFhF7AtHvYO+Bfe9xndYmdUopVHvRbDZPLIAruukRknA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1996508},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"fb6aa99f979147a5574e4f2d4281195e044cc38b","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.14.1","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.14.1"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.19.3_1789707071539_0.7084879111615903","host":"s3://npm-registry-packages-npm-production"}},"1.20.0":{"name":"ice-web-components","version":"1.20.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.20.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"91d339cf9b3d40449ea6c356296094b21bddc3f6","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.20.0.tgz","fileCount":132,"integrity":"sha512-bA1gFPa+2h8ViGAuPfOJeiE6tI+RG8Bteqrt1t/ovtJpgwuU2Foro5CxljTKbPRGVXSRBE1Ap0x4mpGB5zCKuA==","signatures":[{"sig":"MEUCIGx/PDBEoKZkFPci17+1uC+uUcS9CRGzsAZd6pUIW7bxAiEA2/jh13uKiLXS+GqyOi3pC+7aW2VdIqbDynAMPiv9974=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICO2ihrjSljA1bx1cdYyQ9MKWZ1pvAF3hC94Fca86RKTAiAEsa0i0iRSlV51xJs9Od3Z8AcGOfaBi659U9Q6cin6fw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1996508},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"1a07fd2def92d567b38662bcd768b3a856333d9e","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.16.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.16.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.20.0_1789726061864_0.470894131838437","host":"s3://npm-registry-packages-npm-production"}},"1.21.0":{"name":"ice-web-components","version":"1.21.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.21.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"10eb93324105a187d53deb870b95400338e9d6a7","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.21.0.tgz","fileCount":132,"integrity":"sha512-huT8AeF0wJm8QezpbtXawCGf6iYfXmUZRUS4f5f9/wPpFyGEboqCW+ATIX6wkCjXsKXkExBeUcKbijstEfgVDQ==","signatures":[{"sig":"MEYCIQDDgvqlN5xc/UP4kNxaTdT0yRf3w+1QradY679ZsAn9NAIhANk4zZxHwxGTqlIOx0+8ve2Z9KiNVO58r1SshTE+8NBZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQClmH32iGh0H8MNpGGTNVRIceNbVodJdOmNNZ0fcVfLmgIhAIxfETWdyW7uWPtO8FPjDAmZdPNcVjHw7+9dQS16yrMK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1996590},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"28bbcf4f7cc3c7d59d40668038a631095968895f","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.17.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.17.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.21.0_1789804091933_0.28466940334676294","host":"s3://npm-registry-packages-npm-production"}},"1.22.0":{"name":"ice-web-components","version":"1.22.0","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.22.0","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"3ee1da031a023cfe4c27c8d7058cb613ebdf36e2","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.22.0.tgz","fileCount":132,"integrity":"sha512-PyDzqjJMC70vs4Ei6GdFIbeGabx4EN8YfqScx9l9wdtlUclmd29Dmip2MmBy7IOzPH/qlAgpPkhs9fcMJlPb1Q==","signatures":[{"sig":"MEUCIHmIFn8L0n0o2HpD0czVZd0l/5LSjXFTq+bejLaWzDUIAiEAmDODykfS9w0MiwvkS7R+rTW1CIAb+15gjNNJlcg9PmM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIF9+tMSwDBp80hOmCV/1e5bmI/4vDfMBbGYRvR64cb4pAiEAn4eHI4hMdJE32uSZRNE5FM/Rxqcw7dkX6RycDoZGJsM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1997064},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"e87f7d0708fd404bb45b79cd60430e6b7c4c89c9","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^2.18.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^2.18.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.22.0_1789810957168_0.7462359703505217","host":"s3://npm-registry-packages-npm-production"}},"1.22.1":{"name":"ice-web-components","version":"1.22.1","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.22.1","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"293aacc3160dcc9d5a829dcd3607f92b46427f99","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.22.1.tgz","fileCount":132,"integrity":"sha512-Zgf6PsyTw2iMFbPfstUMWYnSDJowrLwMa4Wokve4yZWmPdDvUYcJF+zTmQsDM8PM9+mjImdyG2XhIMxzrE0L7g==","signatures":[{"sig":"MEQCIGjrP2J2sm9vN+E55uSqzGbb8cQzrndZjhVxm+Pw8Ry4AiBKjr9WsqMH96ohwtmJrWUuZ2u1BU9Orl+bfI3Vn1kdIw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCKLGlrQG2FufE4gEB8LWqIB+Fs0/u/eSF6JWfUGy1JzwIhALUVZ9CrSzOu+vcHThMG19sanNYSVb17eTegMx4k6Yqe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1996963},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"d8f6ebdcd61d35655be15b75bfa09ed60509f1ea","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^3.0.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.22.1_1789879352994_0.896296514518631","host":"s3://npm-registry-packages-npm-production"}},"1.22.2":{"name":"ice-web-components","version":"1.22.2","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.22.2","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"45d9989290589cbb18915adba35744d40118b2f8","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.22.2.tgz","fileCount":132,"integrity":"sha512-ZWm4FZgnjr9RaBZ08HzcI0W32HHSBfp27alw4L5mk/wR2km/tsiHWY1bwJ6M/iOyaBJfuPtAGEkMj6VVrk6UPw==","signatures":[{"sig":"MEUCIB/mcvIiq7M5g+L5F/33+sFNH9qfuVHeStZclFimdGvCAiEA/BDLYQl9RXrteIoOsxhVSTpUWk5DSoefuiU1B77DB9U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD8ZIXmSNMOrm1TcATVUV4Vm22VXKrwDW0OwB9XhTuPLgIhAMfMb7oOOtutDNgAOxafxQDnQQnqYWsB450ySoswcDWD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1996963},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"44beb2cbc35c37c07ea1a4d4ad330e43ebc81643","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^4.0.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.22.2_1789902269808_0.13915526433307224","host":"s3://npm-registry-packages-npm-production"}},"1.22.3":{"name":"ice-web-components","version":"1.22.3","keywords":["canvas","ui","ice-render","swing"],"license":"MIT","_id":"ice-web-components@1.22.3","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"homepage":"https://github.com/ice-render/ice-web-components#readme","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"deaf7e32d3c59198c3c8a77f291794e6a170e98a","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.22.3.tgz","fileCount":132,"integrity":"sha512-4no/qtUX1JOedgNHQ96JawecZJv3veDs7fSZzV6ovshAJAfuK4+es64q3ijpI+QykrrbwhviqL4PXJPlvVyz1g==","signatures":[{"sig":"MEYCIQDWx3yx9xV+H/d1tEW8zR4WtTxsgYqDDvnjCEWoi/u2zQIhALe4mDrOscKREpnM1Ypj7Pe8QMkmttOcU6KcylE7Qonh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEn+fnySGV/y/D3MT/Z2ethbQF2amzipuEmRXANhLqfEAiB0TzPLGt5I/SLkSXc7oxHm07OdoE5NMhh/l2emTdVZeg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1996963},"main":"dist/index.cjs","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"536a91ee242a807c4ec545e7fc3b34cc377f18c7","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^4.1.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^4.1.0"},"_npmOperationalInternal":{"tmp":"tmp/ice-web-components_1.22.3_1789914219288_0.0924850188684947","host":"s3://npm-registry-packages-npm-production"}},"1.22.4":{"_id":"ice-web-components@1.22.4","bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"dist":{"shasum":"12c2c1ab18b9155e721e0693d9f3405a045f279b","tarball":"https://registry.npmjs.org/ice-web-components/-/ice-web-components-1.22.4.tgz","fileCount":132,"integrity":"sha512-d3OsjCpfYLPS9GRQmQIAbZqKjIzEFU47+E5hvGsv0znof4dD2A7zc0SWF5eOZNwqEKsJVLEHLx3t0t4/8u1o4A==","signatures":[{"sig":"MEUCIHDmNrxFsoaFrIUOhA2x8wNcc8KjoD/1fc9SPmIhofBuAiEAjgQIBMQ/lWJOeep2OMjjk0vafeEG7FYST5YFvH6GiyQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD4rxjtdO//VZLrK69n4fbOh5cWQIgp2cPpPnPtNRjvKQIgGAjuaQRQ4YR9EJ+M/ujIcjMVYHZvojlmFVLUT+3sAmU="}],"unpackedSize":1996963},"main":"dist/index.cjs","name":"ice-web-components","types":"dist/types/index.d.ts","module":"dist/index.mjs","browser":"dist/index.umd.js","engines":{"npm":">=9","node":">=18"},"gitHead":"eb1748af3197b1fe43c9505981e0028eb28d8847","license":"MIT","scripts":{"dev":"rollup -c -w --environment NODE_ENV:development","docs":"npm run docs:api && npm run docs:check","test":"jest --runInBand","build":"npm run clean && npm run build:types && npm run build:js","clean":"rimraf dist","qa:xp":"node scripts/qa-xp.mjs","qa:all":"node scripts/qa-all.mjs","qa:dos":"node scripts/qa-dos.mjs","verify":"npm run types:check && npm test && npm run build && npm run docs && node scripts/lib/qa-counts.mjs --check","qa:algo":"node scripts/qa-algo.mjs","qa:perf":"node scripts/qa-perf.mjs","build:js":"rollup -c --environment NODE_ENV:production","docs:api":"node scripts/gen-docs.mjs","qa:admin":"node scripts/qa-admin.mjs","qa:pixel":"node scripts/qa-pixel.mjs","test:e2e":"npm run build && playwright test","qa:arcade":"node scripts/qa-arcade.mjs","qa:counts":"node scripts/lib/qa-counts.mjs","docs:check":"node scripts/check-docs.mjs","qa:gallery":"node scripts/qa-gallery.mjs","build:types":"tsc --emitDeclarationOnly -p tsconfig.build.json","types:check":"tsc --noEmit","verify:full":"npm run verify && npm run test:e2e && npm run qa:all && npm run qa:perf","qa:workbench":"node scripts/qa-workbench.mjs","qa:counts:write":"node scripts/lib/qa-counts.mjs --write"},"version":"1.22.4","_npmUser":{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"},"homepage":"https://github.com/ice-render/ice-web-components#readme","keywords":["canvas","ui","ice-render","swing"],"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"_npmVersion":"11.7.0","description":"Swing-style Canvas UI components built on ice-render.","directories":{},"maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"devDependencies":{"jest":"29.7.0","rimraf":"5.0.10","rollup":"3.29.5","babel-jest":"29.7.0","ice-render":"^4.2.0","typescript":"5.9.3","@babel/core":"7.28.5","@types/jest":"29.5.14","@types/node":"18.19.130","http-server":"^14.1.1","@playwright/test":"^1.63.0","@babel/preset-env":"7.28.5","@rollup/plugin-json":"6.1.0","@rollup/plugin-babel":"6.1.0","@rollup/plugin-terser":"0.4.4","@rollup/plugin-commonjs":"28.0.1","@babel/preset-typescript":"7.28.5","@rollup/plugin-node-resolve":"15.3.1"},"peerDependencies":{"ice-render":"^4.2.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ice-web-components_1.22.4_1789984551612_0.9003156611476539"}}},"time":{"created":"2026-09-12T14:22:14.680Z","modified":"2026-09-21T09:55:51.895Z","1.0.0":"2026-09-12T14:22:14.887Z","1.1.0":"2026-09-12T15:06:36.598Z","1.2.0":"2026-09-12T15:21:07.944Z","1.3.0":"2026-09-13T00:27:40.838Z","1.4.0":"2026-09-13T00:45:30.361Z","1.5.0":"2026-09-13T03:10:32.281Z","1.5.1":"2026-09-13T06:45:04.620Z","1.5.2":"2026-09-13T09:34:54.237Z","1.5.3":"2026-09-13T13:50:49.340Z","1.5.4":"2026-09-14T00:58:12.594Z","1.6.0":"2026-09-14T08:38:37.318Z","1.7.0":"2026-09-14T10:25:19.114Z","1.8.0":"2026-09-14T13:42:32.032Z","1.9.0":"2026-09-15T02:00:53.404Z","1.9.1":"2026-09-15T02:08:17.897Z","1.9.2":"2026-09-15T02:28:21.628Z","1.10.0":"2026-09-15T02:59:07.341Z","1.10.1":"2026-09-15T03:52:59.394Z","1.10.2":"2026-09-15T04:13:31.098Z","1.10.3":"2026-09-15T05:17:12.176Z","1.11.0":"2026-09-15T07:17:39.059Z","1.11.1":"2026-09-15T10:26:49.176Z","1.11.2":"2026-09-15T12:23:31.687Z","1.12.0":"2026-09-15T15:34:15.627Z","1.13.0":"2026-09-17T03:30:00.629Z","1.13.1":"2026-09-17T05:42:15.635Z","1.13.2":"2026-09-17T07:32:44.104Z","1.13.3":"2026-09-17T07:53:04.460Z","1.14.0":"2026-09-17T08:39:34.666Z","1.14.1":"2026-09-17T08:45:48.204Z","1.15.0":"2026-09-17T09:23:22.637Z","1.15.1":"2026-09-17T09:27:50.639Z","1.15.2":"2026-09-17T09:29:39.044Z","1.16.0":"2026-09-17T09:51:49.169Z","1.17.0":"2026-09-17T10:22:44.222Z","1.18.0":"2026-09-17T11:15:16.247Z","1.18.1":"2026-09-17T11:50:23.944Z","1.19.0":"2026-09-17T12:58:01.819Z","1.19.1":"2026-09-17T15:39:11.738Z","1.19.2":"2026-09-18T04:43:09.228Z","1.19.3":"2026-09-18T04:51:11.721Z","1.20.0":"2026-09-18T10:07:41.971Z","1.21.0":"2026-09-19T07:48:12.017Z","1.22.0":"2026-09-19T09:42:37.378Z","1.22.1":"2026-09-20T04:42:33.136Z","1.22.2":"2026-09-20T11:04:29.919Z","1.22.3":"2026-09-20T14:23:39.410Z","1.22.4":"2026-09-21T09:55:51.720Z"},"bugs":{"url":"https://github.com/ice-render/ice-web-components/issues"},"license":"MIT","homepage":"https://github.com/ice-render/ice-web-components#readme","keywords":["canvas","ui","ice-render","swing"],"repository":{"url":"git+https://github.com/ice-render/ice-web-components.git","type":"git"},"description":"Swing-style Canvas UI components built on ice-render.","maintainers":[{"name":"damoqiongqiu","email":"damoqiongqiu@126.com"}],"readme":"# ice-web-components\n\nCanvas-native UI components for [`ice-render`](https://github.com/ice-render/ice-render) —\nSwing-style widgets with a Bootstrap-flavoured look, rendered entirely on a single\n`<canvas>`. No DOM widgets, no CSS framework: every pixel (including popups, focus\nrings and shadows) is drawn by the engine.\n\n![ICE Shop admin dashboard](docs/images/admin-dashboard.png)\n\n> ⚠️ **Just for fun.** This project is created purely for fun and exploration. It is\n> not intended as a production-ready or battle-tested UI library.\n\n## 1. Architecture at a glance\n\n`ice-web-components` sits on top of the `ice-render` engine: the engine draws the\ncanvas and runs the scene graph, layout and hit-testing; this package adds managers,\ncomponents and pure logic models on top of it.\n\n```mermaid\ngraph TD\n    subgraph engine[\"ice-render — the engine\"]\n        E1[\"Canvas + scene graph\"]\n        E2[\"Hit-testing, events, layout, animation\"]\n    end\n    subgraph wc[\"ice-web-components\"]\n        M[\"Managers<br/>Overlay · Focus · Hover · Message\"]\n        C[\"84 UI components<br/>(ICEWidget base)\"]\n        D[\"Pure models<br/>Tetris · Snake · 2048 · CHIP-8 · BIOS<br/>Pixel · Sort · Maze · DOS · …\"]\n    end\n    E1 --> M\n    M --> C\n    C --> D\n    M -. \"popups mounted on the tool layer\" .-> E1\n```\n\n## 2. Highlights\n\n- **84 UI components** (+20 pure models, 5 managers, 2 base classes → 111 exported\n  classes; the count in\n  [`docs/components.md`](./docs/components.md) is generated from the source, so it\n  cannot drift) — buttons, inputs, selects, tables, trees, menus, modals, drawers,\n  notifications, uploads, date/time pickers, cascader, transfer, carousel, colour\n  picker… and the small stuff (tags, badges, avatars, skeletons, spins).\n- **One overlay stack for every popup** — Modal / Drawer / Dropdown / Tooltip /\n  Popover / Popconfirm / Select / DatePicker / Cascader all go through\n  `ICEOverlayManager`: 12 placements, auto flip + clamp to the visible area,\n  Esc / outside-click closing, focus trap, enter/exit animation.\n- **Forms with sync + async validation** — `ICEFormModel` (required / min / max /\n  length / pattern / custom / **asyncValidator**), `ICEFormItem` shows errors and a\n  “validating…” state, `submitAsync()` waits for the async rules.\n- **Keyboard & focus** — Tab / Shift+Tab rotation, Enter/Space activation,\n  arrow keys for sliders, menus, tabs and rate; ring drawn above everything.\n- **Bootstrap 5 token theme** (plus a dark theme) — swap with one call.\n- **No name collisions with the engine** — the package’s runtime exports are\n  disjoint from `ice-render`’s (there is a regression test for it).\n- **Actually tested** — 1356 unit tests (192 suites, as of 2026-09-17: form validation, overlay\n  positioning, keyboard navigation, sort/hover/focus edge cases, the Minesweeper,\n  Tetris, Snake, 2048 and CHIP-8 rule/machine models, the pixel canvas and the undo\n  stack, the console BIOS, the trace player + sorting/pathfinding and the DOS terminal)\n  plus eight browser QA suites (`qa:admin`, `qa:gallery`, `qa:workbench`, `qa:xp`,\n  `qa:arcade`, `qa:pixel`, `qa:algo`, `qa:dos` — 303 assertions) that drive the demo pages with\n  real mouse and keyboard events and fail on any console error.\n\n## 3. Core systems\n\nTwo subsystems are worth a closer look before the examples.\n\n### 3.1 One overlay stack\n\nEvery popup — Modal / Drawer / Dropdown / Tooltip / Popover / Popconfirm / Select /\nDatePicker / Cascader — opens through `getICEOverlayManager(ice)` and is mounted on the\nengine’s tool layer, above the scene and excluded from scene hit-testing. The manager\nowns placement, the close policy and the enter/exit animation:\n\n```mermaid\nflowchart LR\n    P[\"Popup components<br/>Modal · Drawer · Dropdown · Tooltip<br/>Popover · Popconfirm · Select · DatePicker · Cascader\"]\n    O[\"ICEOverlayManager\"]\n    L[\"Engine tool layer<br/>(above scene, not hit-tested)\"]\n    P -->|open| O\n    O -->|\"12 placements\"| O1[\"auto flip + clamp to viewport\"]\n    O -->|\"close\"| O2[\"Esc · outside-click · focus trap\"]\n    O -->|\"enter / exit\"| O3[\"tween animation\"]\n    O -->|mount| L\n```\n\n### 3.2 Forms: sync + async validation\n\n`ICEFormModel` holds the rules, `ICEFormItem` renders the error (or a “validating…”\nstate), and `submitAsync()` waits for the async rules to settle before resolving:\n\n```mermaid\nflowchart LR\n    FM[\"ICEFormModel<br/>required · min · max · length<br/>pattern · custom · asyncValidator\"]\n    FI[\"ICEFormItem<br/>error / validating…\"]\n    S[\"submitAsync()\"]\n    FM -->|validate| FI\n    FM -->|\"await async rules\"| S\n    FI -->|\"blocks until resolved\"| S\n```\n\n## 4. Quick start\n\n> **Install**: both packages are on npm now — `npm install ice-web-components` (it pulls\n> `ice-render` as a dependency). `1.0.0` is the first published release; from a checkout you\n> can also `npm install /path/to/ice-web-components` or `npm install git+https://github.com/ice-render/ice-web-components.git`.\n\n```bash\nnpm install ice-web-components   # + ice-render, pulled automatically\n```\n\nThe published tarball contains `dist/` only (cjs + esm + umd + type declarations).\n\n```ts\nimport { ICE } from 'ice-render';\nimport {\n  ICEButton,\n  ICEHoverManager,\n  ICELabel,\n  ICEMessage,\n  ICEPanel,\n  getICEFocusManager,\n} from 'ice-web-components';\n\nconst ice = new ICE().init('canvas');\nnew ICEHoverManager(ice).start();   // canvas has no native hover: opt in\ngetICEFocusManager(ice).start();    // Tab / Enter / Esc handling\n\nconst panel = new ICEPanel({ left: 24, top: 24, width: 372, height: 192 });\npanel.addChild(new ICELabel({ left: 24, top: 20, text: 'Quick start' }));\n\nconst button = new ICEButton({ left: 24, top: 64, width: 140, text: 'Click me' });\nconst hint = new ICELabel({ left: 24, top: 112, text: 'clicked 0 times' });\nlet count = 0;\nbutton.on('click', () => {\n  count += 1;\n  hint.setText(`clicked ${count} times`);\n  ICEMessage.success(ice, `clicked ${count} times`);\n});\n\npanel.addChildren([button, hint]);\nice.addChild(panel);\n```\n\n![Quick start](docs/images/quick-start.png)\n\n### 4.1 From a script to a page\n\nThe snippet above is the right shape for a **demo**: a canvas, a few components, a module-level\ncounter. But the moment it becomes an actual **page** — several components that must update when\ndata changes, a second page in the same app, a host that pushes fresh data — stop stacking\n`ice.addChild(...)` calls and wrap it in one class. That is the family-wide convention\n(one page = one class):\n\n```ts\nimport { ICE } from 'ice-render';\nimport { ICEContainer, ICELabel, ICETable } from 'ice-web-components';\n\nconst ice = new ICE().init('canvas');\n\nclass DataPage extends ICEContainer {\n  private readonly table: ICETable;                 // ① build the tree once, in the constructor\n\n  constructor() {\n    super({ left: 0, top: 0, width: 960, height: 640 });\n    this.addChild(new ICELabel({ left: 16, top: 12, text: 'Run data' }));\n    this.table = new ICETable({ left: 16, top: 48, width: 928 });\n    this.addChild(this.table);\n  }\n\n  /** ② the single place that writes new data — the host calls it once fresh data is in place */\n  onUpdate(snapshot: { rows: any[] }): void {\n    this.table.setData(snapshot.rows);\n  }\n}\n\nice.addChild(new DataPage());\n```\n\nThree signs it is time to upgrade from script to page: **a second page**, **data pushed by a host**,\nand **the same structure being re-filled over and over**. A page never calls back into its host —\nit *declares* what it needs (`headerActions()` / `statusTags()` / `islandSpecs()`) and the host asks.\n\nThe full contract — who calls `onUpdate()` and when, which layer to pick for what, where the line\nbetween stable structure and mutable content sits, the acceptance checklist and the pitfalls we\nactually hit — is written up as\n[应用层：一个页面怎么写](https://ice-render.github.io/ice-render-doc/docs/conventions/app-pages)\n(Chinese), with the container contract itself in\n[`docs/guides/layout.md`](./docs/guides/layout.md) §6.\n\n## 5. Documentation\n\nFull docs live in [`docs/`](./docs/README.md):\n\n| | |\n|---|---|\n| [Architecture](./docs/architecture.md) | Layers, component model, rendering & repaint, events & hover, overlays / focus / forms / theming, plus a “pitfalls” table |\n| [Component cheat sheet](./docs/components.md) | 80 component classes, one line each, grouped, with links into the API |\n| [API reference](./docs/api/README.md) | Constructor props and public methods for every component (**generated from source**, so it cannot drift) |\n| [Examples & scenarios](./docs/guides/examples.md) | What each of the six demo pages shows, which components it uses, and a checklist for building your own |\n| [Theming & colour](./docs/guides/theming.md) | Token groups, status colours, `*TextEmphasis`, custom themes |\n| [Forms & validation](./docs/guides/forms.md) | The three layers, the rule list, async validation, wiring a custom control |\n| [Overlay guide](./docs/guides/overlays.md) | The three ways to use popups, positioning, close policies, content factories |\n| [Canvas layout](./docs/guides/layout.md) | Coordinates & zIndex, cluster + shelf layout, clipping & scrolling, when sizes are ready |\n| [Writing your own component](./docs/guides/custom-components.md) | Three levels of effort, constructor conventions, interaction / form / overlay / theme hooks, type registration and pitfalls |\n| [Testing](./docs/guides/testing.md) | Unit-test recipes (fake ICE + real components) and the browser QA scripts |\n| [Migration](./docs/guides/migration.md) | `UI*` → `ICE*`, token theming, other breaking changes |\n\n> The guide pages themselves are written in Chinese for now; this README is English-only.\n\n## 6. Demos\n\nAll pages under `examples/` are plain HTML — build the package, then open them\n(or serve the folder with any static server).\n\n### 6.1 `gallery.html` — every component in one page\n\nRendered with a small hand-rolled flow layout (clusters keep their internal\ngeometry, clusters wrap like shelves), so adding a demo never requires hunting for\nfree coordinates.\n\n![Component gallery](docs/images/gallery.png)\n\n### 6.2 `admin.html` — a six-page back-office\n\nA small “ICE Shop” admin: sidebar with submenus, breadcrumb + page search +\nnotifications/user menu in the header, a floating action button, a first-run tour,\nand six pages that switch inside a scroll pane.\n\nThe business flow is deliberately complete: order filtering (keyword / region /\namount range / abnormal-only) with a batch toolbar, an order drawer with\nfulfilment steps and a service timeline, inventory warnings with pagination,\nproduct gallery preview, customer insights with satisfaction scoring, a\nsplitter-based fulfilment workbench with anchors, and a settings pane whose\npassword form validates across fields.\n\n| Dashboard | Orders |\n|---|---|\n| ![Dashboard](docs/images/admin-dashboard.png) | ![Orders](docs/images/admin-orders.png) |\n| ![Fulfilment](docs/images/admin-fulfillment.png) | ![Products](docs/images/admin-products.png) |\n| ![Customers](docs/images/admin-customers.png) | ![Settings](docs/images/admin-settings.png) |\n\nPopup layers used by that demo:\n\n| Order detail drawer | New-order dialog | Notification dropdown |\n|---|---|---|\n| ![Drawer](docs/images/popup-drawer.png) | ![Modal](docs/images/popup-modal.png) | ![Dropdown](docs/images/popup-dropdown.png) |\n\n### 6.3 `custom-component.html` — write your own component\n\nThe same “write a component and plug it into ICE” story as\n[`docs/guides/custom-components.md`](./docs/guides/custom-components.md), but\nrunnable: a hand-written `ICEMetric` card that reacts to clicks, hover and\nkeyboard, and participates in `ICEForm` validation.\n\n![Custom component](docs/images/custom-component.png)\n\n### 6.4 `workbench.html` — customer-support workbench\n\nA second end-to-end scenario (deliberately *not* a dashboard): a three-pane support\nworkbench built with `ICESplitter` — ticket queue with filters and skeleton loading,\nconversation pane with reply composer / quick-reply dropdown / attachment upload /\nticket tags, and a customer profile pane with satisfaction rating, history timeline\nand knowledge base. Session log: ticket selection drives the profile, sending a\nreply appends a message, the floating button opens a 3-step tour, and the\nback-to-top button appears once the conversation scrolls.\n\n![Support workbench](docs/images/workbench.png)\n\n### 6.5 `windows-xp.html` — a full-screen Windows XP desktop\n\nThe fun one: a canvas-only XP desktop that **boots**. Turn it on and you get the black\nboot splash (self-drawn four-colour flag + the running progress blocks), then the blue\nwelcome screen: pick a user tile, type anything (or nothing) into the password box and\npress Enter — *any* credentials are accepted, this is a toy. Then the desktop fades in\nwith a synthesized startup chime.\n\nThe sound is generated live with WebAudio (startup / logoff / shutdown / click cues) —\noriginal tones, no audio files, no Microsoft assets. Hover the tray speaker in the\ntaskbar to mute it. Log off from the Start menu and you drop back to the welcome\nscreen; shut down and you get the black \"it is now safe to turn off your computer\"\nscreen with a power button that boots the machine all over again.\n\nThe desktop itself: wallpaper, desktop icons, taskbar with a\nworking clock, a Start menu, and draggable windows with minimise / maximise / close.\nSeven tiny apps are wired up (My Computer, My Documents, Notepad, Paint, Minesweeper,\nInternet Explorer, Display Properties), and switching the wallpaper in Display\nProperties repaints the desktop immediately.\n\nLooks the part too: it switches to the library's built-in `ICE_XP_THEME` (Luna blue +\nclassic grey controls), draws every icon with engine primitives (no bitmap assets, no\nMicrosoft artwork), and initialises with `dpr` so text stays crisp on Retina screens.\n\nMinesweeper is the full game: beginner / intermediate / expert, first-click-safe mine\nplacement, flood fill, right-click flag cycle (🚩 / ❓), chord on double click, LED\ncounters, a timer that starts on the first click, and per-difficulty best times. Its\nrules live in a tested pure model (`ICEMinesweeperModel`) — the UI only draws it.\n\n![Minesweeper](docs/images/xp-minesweeper.png)\n\nInternet Explorer is a **real** browser too: the address bar `fetch()`es the URL,\n`DOMParser` parses the HTML, and the title / headings / paragraphs / links / images are\ndrawn with canvas components inside a scroll pane (with back / forward / refresh).\nSame-origin pages always work; other sites obey CORS like any browser, and failures\nland on an XP-style error page. Serve the folder over http (`npx serve .`) — `fetch`\ndoes not work from `file://`.\nRight-click works because `ICE.init()` no longer stops the `contextmenu` event on its\nway to the dispatcher (ice-render 1.4.1).\n\n![Internet Explorer](docs/images/xp-ie.png)\n\nTwo new generic components came out of it: `ICEWindow` (window chrome with an XP Luna\ntitle bar, drag, resize, maximise/restore, activate event) and `ICEIconTile`\n(selectable icon tile that opens on double click).\n\nThe eighth app is **ICE Arcade** — the handheld console from `arcade.html`, running\ninside an XP window. It reuses the same two pure models and the same `ICETileMap`\n(so the board is still one node), and the desktop routes the keyboard to it only while\nthat window is active; closing the window stops its step timer.\n\n![ICE Arcade inside a Windows XP window](docs/images/xp-arcade.png)\n![ICE Arcade · Snake inside the XP window](docs/images/xp-arcade-snake.png)\n\n| Boot splash | Welcome screen | Password page |\n|---|---|---|\n| ![XP boot](docs/images/xp-boot.png) | ![XP login](docs/images/xp-login.png) | ![XP password](docs/images/xp-login-password.png) |\n\n![Windows XP desktop](docs/images/xp-desktop.png)\n\n### 6.6 `arcade.html` — ICE Arcade (a handheld console)\n\nNot a web page but a **handheld console**: the shell, the screen bezel, the HUD cards,\nthe buttons and the sound switch are all ICE components, and there is not a single\nbitmap asset in the picture. Four cartridges are plugged in, and the cartridge row at\nthe top switches between them (a fifth slot, Chinese chess, is disabled for now).\n\nBefore any cartridge runs, the console boots through its own **BIOS**: a power-on\nself-test (CPU / RAM / VRAM / SOUND / CART, each line going grey → amber → green with a\nbeep) followed by a classic boot menu, exactly like the real thing.\n\n| POST (power-on self-test) | BIOS boot menu |\n|---|---|\n| ![ICE Arcade BIOS self-test](docs/images/arcade-bios.png) | ![ICE Arcade BIOS menu](docs/images/arcade-bios-menu.png) |\n\n`ICEBiosModel` is the state machine behind it (pure logic, 17 unit tests): the self-test\nis a **timed sequence** the page advances with `tick(dt)` — each step owns its duration and\nreports `pending` / `running` / `ok`; the menu is a cursor + confirm console UI with a\n**wrapping** cursor; `confirm()` returns an *action* (`boot` / `settings` / `menu`) instead\nof executing it, so the whole flow is testable in node. Settings (quick boot + default\ncartridge) persist through an injected storage that degrades gracefully on corrupt JSON\nor a full quota.\n\nThe boot flow is a small state machine the page drives (`tick(dt)` advances the\nself-test; the menu is a cursor + confirm console):\n\n```mermaid\nflowchart TD\n    PWR[\"Power on\"] --> POST[\"POST self-test<br/>CPU · RAM · VRAM · SOUND · CART<br/>grey → amber → green + beep\"]\n    POST --> BM[\"BIOS boot menu<br/>cursor + confirm (wrapping)\"]\n    BM -->|confirm| ACT{\"action\"}\n    ACT -->|boot| GAME[\"load cartridge\"]\n    ACT -->|settings| SET[\"quick boot / default cart\"]\n    ACT -->|menu| BM\n    SET --> BM\n    GAME --> END([\"running\"])\n    POST -. \"any key skips remaining steps\" .-> BM\n    BM -. \"quick boot (default) → last cartridge\" .-> GAME\n```\n\nF2 (or the BIOS button) returns to the menu at any time — on a game page that *is* the\nreset button. Any key during POST skips the rest of the self-test, and with quick boot on\n(the factory default) the console goes straight back to the last cartridge after POST.\n\n| | |\n|---|---|\n| ![ICE Arcade · Tetris](docs/images/arcade-tetris.png) | ![ICE Arcade · Snake](docs/images/arcade-snake.png) |\n\n**Cartridge 1 — Tetris** (`ICETetrisModel`, 16 unit tests). Modern-standard rules:\n7-bag fairness, simple wall kicks (0 / ±1 / ±2), a ghost landing preview, soft drop\n+1/cell, hard drop +2/cell, line scores of 100/300/500/800 × level, a level-up every 10\nlines, and a gravity interval that starts at 800 ms and shrinks with the level.\nKeyboard: `←` / `→` move, `↓` soft drop, `Space` hard drop, `↑` / `X` rotate clockwise,\n`Z` rotate counter-clockwise, `P` pause, `R` restart.\n\n**Cartridge 2 — Snake** (`ICESnakeModel`, 18 unit tests). Classic rules: the snake grows\non every meal (+10 points × level), 5 meals per level, an interval that drops from\n170 ms per cell towards 70 ms, a two-deep turn queue that refuses 180° reversals (and\nlets you survive moving into the tail cell that is about to vacate), and walls that\nkill. Keyboard: arrows or `W` / `A` / `S` / `D` to steer, `P` pause, `R` restart.\nClicking a cell on the board steers towards it — that is the tile map’s `cellclick`,\ni.e. a real hit test inside a single component.\n\n**Cartridge 3 — 2048** (`ICE2048Model`, 21 unit tests). The classic rules: two starting\ntiles, merges score their own value, each tile merges at most once per move (so `2 2 2 2`\nbecomes `4 4`, not `8`), a move that changes nothing spawns nothing, and filling the board\nwithout any merge left is game over. Reaching 2048 wins but lets you keep playing.\nArrows or `W` / `A` / `S` / `D` slide, `P` pauses, `R` restarts. The numbers are drawn by\nthe tile map’s **label layer** — the palette entry for each value carries its font size,\nweight and text colour, so a 4×4 board with 16 numbers is still one node.\n\n![ICE Arcade · 2048](docs/images/arcade-2048.png)\n\n**Cartridge 4 — CHIP-8** (`ICEChip8Model`, 19 unit tests). The odd one out: instead of\n“the rules of a game” it is **an actual virtual machine** — 4 KB of memory, `V0`–`VF`,\nthe 16-bit `I` register, a 64×32 monochrome framebuffer, two 60 Hz timers and a 16-key\nkeypad. 35 opcodes are implemented (`00E0` / `1NNN` / `2NNN` / `DXYN` / `EX9E` / `FX0A` /\n`FX29` / `FX33` / `FX55` …), including `DXYN`’s XOR drawing with the classic\n`VF = collision` flag and `FX0A` blocking key waits.\n\nThe console ships a **self-written demo ROM** (no external ROM, no copyright questions):\nit clears the screen, draws an 8×8 smiley, moves it, flips its velocity when a wall is\nreached, and loops — which exercises conditional skips and two’s-complement arithmetic\nas well as drawing. Both the 2048-cell framebuffer and the 4×4 machine keypad are single\n`ICETileMap` nodes; the keys light up while pressed, which makes the `keydown` / `keyup`\npath visible. On that cartridge the machine owns its 16 keys (`1 2 3 4 / Q W E R / A S D F\n/ Z X C V`), so the console hands even `R` to the ROM and keeps `P` for pause.\n\n![ICE Arcade · CHIP-8](docs/images/arcade-chip8.png)\n\nAll four games are pure models that never touch the canvas; the page only reads the model\nand paints cells. Switching a cartridge tears the old board down, builds the new one\nand re-captions the HUD, so another game is a registry entry plus a `mount()`.\nSwitching away from the tab pauses whatever is running (CHIP-8 also drops its pressed\nkeys, otherwise a lost `keyup` would leave `FX0A` waiting forever).\n\nSwitching cartridges is a teardown-and-rebuild, not a mutation of a shared board:\n\n```mermaid\nflowchart LR\n    SEL[\"user picks cartridge\"] --> TEAR[\"tear down old board<br/>unmount model + stop timers\"]\n    TEAR --> BUILD[\"build new ICETileMap<br/>+ mount model\"]\n    BUILD --> HUD[\"re-caption HUD (fadeIn)\"]\n    HUD --> READY[\"ready to play\"]\n```\n\n| Pause overlay (`Paused`) |\n|---|\n| ![ICE Arcade paused](docs/images/arcade-paused.png) |\n\nUnder the hood this page is where the engine work happens:\n\n- **`ICETileMap`** paints a whole board (10×20 or 20×20 cells) inside **one** node —\n  it extends the widget base, draws the grid in `doRender()` with the engine context and\n  keeps its own dirty flag, so a 400-cell snake board is 1 node instead of 400 (the QA\n  asserts `childNodes.length === 0`). Ghost landing spots go through its highlight layer,\n  line clears and meals go through `pulse()`, which fades the overlay with a `tween`.\n- **`registerTheme('arcade', ICE_ARCADE_THEME)`** moves the game palette into tokens:\n  pieces and snake colours ship as `ICE_ARCADE_PALETTE`, so the board re-skins with the\n  rest of the UI instead of hard-coded hex values in the page.\n- **`ICEHighScoreModel`** keeps a per-cartridge top-5 (sorting, capping, corrupt-storage\n  tolerance, injected storage) and the **Leaderboard (L)** button opens an `ICEModal`\n  containing an `ICETable` inside an `ICEScrollPane`.\n- `fadeIn` on cartridge switch, `scaleIn` on game over, `pulse` on line clears — all\n  from `ICEAnimation`, so the “juice” is library code rather than hand-rolled decay.\n- Toasts are **replaced, not stacked**: a console only needs one status line, and the QA\n  caught a stack of three toasts covering the cartridge row (the click never reached the\n  button). `ICEMessage` still supports stacking for pages that want it.\n- CHIP-8 also drove two engine fixes: an offscreen-cache bug where a bitmap baked the\n  *ancestor’s* opacity (so the pause plate faded in but its “Paused” text never appeared —\n  translucent subtrees are no longer cached, and stale bitmaps are dropped), and\n  keyboard routing that lets a cartridge declare the keys it owns.\n\n| Leaderboard (`ICEModal` + `ICETable` + `ICEScrollPane`) |\n|---|\n| ![Leaderboard](docs/images/arcade-leaderboard.png) |\n\n> This page deliberately does **not** start `ICEFocusManager` — it activates the\n> focused button with Enter/Space, which collides head-on with “Space = hard drop”.\n> A game page keeps the keyboard for itself; mouse hover still goes through\n> `ICEHoverManager`.\n\n### 6.7 `pixel-editor.html` — ICE Pixel Studio (a real pixel editor)\n\nThe other direction: instead of “draw a business screen”, this page is a **tool**.\nThe canvas, tool palette, colour swatches and status bar are all components — only the\npixels themselves are self-drawn, as a single `ICETileMap` node. Pencil, eraser, line,\nrectangle and flood fill, undo/redo, and PNG + SVG export.\n\n![ICE Pixel Studio](docs/images/pixel-editor.png)\n\nTwo pure models carry it (no canvas involved):\n\n```ts\nimport { ICEPixelModel, ICEHistoryModel } from 'ice-web-components';\n\nconst model = new ICEPixelModel({ rows: 32, cols: 32, palette: PALETTE, background: 0 });\nmodel.setPixel(4, 4, 1);        // live change; returns whether it really changed\nmodel.drawLine(0, 0, 0, 7, 2);  // Bresenham\nmodel.fill(3, 3, 5);            // 4-neighbour flood fill (iterative, no recursion)\nmodel.commit();                 // one commit = one undo step\nmodel.toSVG({ cellSize: 16 });  // run-length merged SVG string\nmodel.toRGBA(16);               // feed it straight into ImageData for PNG export\n```\n\nThe three decisions worth stealing:\n\n1. **History is per *operation*, not per pixel** — a 20-cell drag pushes exactly one\n   snapshot (`mousedown` paints, `mouseup` commits). Otherwise undo would need 20\n   presses to walk one stroke back, which decides whether a 1024-cell editor is usable.\n   `ICEHistoryModel` itself is a plain generic stack (push clears redo, trims to a limit,\n   notifies with a reason) — reusable for kanban or table editing too.\n2. **Preview via the highlight layer, not “draw then undo”** — dragging a line or a\n   rectangle lights up `ICETileMap.setHighlights()` from `getLineCells()` /\n   `getRectCells()`, and only `mouseup` commits. Preview and painting share the same\n   coordinate API, so the preview is exactly what you get (a unit test paints both and\n   compares cell by cell).\n3. **Export is pure** — `toSVG()` merges horizontal runs into single `<rect>`s (the\n   32×32 smiley emits 20 elements, not 1024), and `toRGBA(scale)` hands the page an\n   `ImageData` buffer; only the page touches `canvas.toDataURL()`. The QA asserts on the\n   data: the PNG check decodes the **IHDR** chunk to prove the bitmap is 512×512.\n\nThe edit loop keeps history per *operation*, not per pixel:\n\n```mermaid\nflowchart LR\n    D[\"mousedown\"] --> P[\"paint live<br/>preview via highlight layer\"]\n    P --> U[\"mouseup\"]\n    U --> C[\"commit() = 1 undo step\"]\n    C --> H[\"ICEHistoryModel.push<br/>(clears redo, trims to limit)\"]\n    H -->|\"Ctrl+Z / Ctrl+Y\"| R[\"undo / redo\"]\n```\n\n> A component gap this page closed: `ICETileMap` cached `rows`/`cols`/`cellSize` in\n> instance fields, so resizing with only `setState({ rows, cols })` left the internals\n> stale and the next `setTiles` threw (“expected 1024 cells, got 256”). There is now a\n> proper `setSize(rows, cols, cellSize?)` that updates the internals, the state and the\n> default width/height in one go, and clears the old cell data.\n\n### 6.8 `algorithm-sandbox.html` — ICE Algorithm Sandbox\n\nSorting and pathfinding, visualised as **recorded traces**: each algorithm runs to\ncompletion up front and produces a list of frames; the page then plays them back with\nplay / pause / single-step / rewind / speed control.\n\n| Sorting (`quick sort`, mid-run) | Pathfinding (`A*`) |\n|---|---|\n| ![Algorithm sandbox · sorting](docs/images/algorithm-sandbox.png) | ![Algorithm sandbox · A*](docs/images/algorithm-maze.png) |\n\n```ts\nimport { ICESortModel, ICEMazeModel, ICETracePlayerModel } from 'ice-web-components';\n\nconst sort = new ICESortModel({ size: 24, max: 32 });\nconst frames = sort.run('quick');     // one frame = current array + indices being compared/swapped + settled positions\nconst player = new ICETracePlayerModel({ speed: 8 });\nplayer.load(frames);                  // playback: play / pause / stepForward / seek / setSpeed / tick(dt)\n\nconst maze = new ICEMazeModel({ rows: 16, cols: 24 });\nmaze.randomWalls(0.24);\nmaze.solve('astar');                  // also a series of frames: visited cells / frontier / final path\n```\n\nWhy “record a trace first, play it back later” instead of painting while the algorithm\nruns: the algorithm becomes a plain function with a testable output (is the last frame\nsorted? does every frame contain the same multiset? do BFS and A* agree on the shortest\npath?), and the player gives pause/step/rewind for free. Four algorithms are covered on\neach side — bubble / insertion / selection / merge / quick, and BFS / DFS / Dijkstra / A* —\nwith `ICETracePlayerModel` owning the clock (1–60 steps per second, auto-stop at the end).\n\nThe split is: an algorithm model produces a list of frames, then a player owns the\nclock and renders them — so the algorithm is a plain testable function and the player\ngives pause / step / rewind for free:\n\n```mermaid\nflowchart LR\n    M[\"ICESortModel / ICEMazeModel<br/>.run(algo)\"] --> F[\"frames[]<br/>each frame = array state + cursors\"]\n    F --> P[\"ICETracePlayerModel.load(frames)\"]\n    P --> C{\"controls\"}\n    C -->|\"play / pause\"| C\n    C -->|\"step / seek / setSpeed\"| C\n    C -->|\"tick(dt)\"| R[\"render via ICETileMap\"]\n```\n\nBoth visualisations are single `ICETileMap` nodes: the sorting bars are a `max × n` grid\nwhere each column is filled from the bottom (blue = untouched, amber = comparing, red =\nswapping, green = settled), and the maze is a grid of cell states. The A* comparison in\nthe QA is the honest one: same shortest path as BFS, **fewer cells visited** (the tie-break\namong equal `f` values is what makes A* actually faster on an open grid).\n\n### 6.9 `dos-terminal.html` — ICE-DOS Terminal\n\nA terminal you can actually type into: a virtual filesystem plus 16 commands, all in a\npure model (`ICEDosModel`) that never touches the DOM.\n\n![ICE-DOS Terminal](docs/images/dos-terminal.png)\n\n```ts\nimport { ICEDosModel } from 'ice-web-components';\n\nconst dos = new ICEDosModel();\ndos.run('cd games');            // path resolution: \\ / .. . and case-insensitive\ndos.run('dir');                 // { lines: [{ text, type: 'output' | 'error' }], effect? }\ndos.run('echo hi > note.txt');  // redirection (> overwrite / >> append)\ndos.complete('type TET');       // Tab completion → 'type TETRIS.EXE'\ndos.historyPrev();              // ↑ history\n```\n\n`run()` never throws — a typo becomes one `error` line, so the terminal cannot be crashed\nby typing. The page owns the three things a terminal needs on top of that: echoing the\ncommand line, auto-scrolling to the bottom, and a blinking cursor that **simulates** a\nkeyboard buffer (TAB is completion, ↑↓ is history, `Ctrl+L` clears, `exit` shows a\n“powered off” overlay, any key boots again).\n\n> This page deliberately does **not** start `ICEFocusManager` (same call as the arcade\n> page): the focus manager treats TAB as “rotate focus”, which steals the terminal’s\n> completion key — and once focus lands on the window’s “reboot” button, pressing Enter\n> to run a command reboots the machine instead.\n\n## 7. Components\n\n| Group | Components |\n|---|---|\n| Basic | `ICEPanel` `ICEButton` `ICELabel` `ICETypography` `ICEIcon` `ICESvgIcon` `ICEIconTile` `ICESeparator` |\n| Layout | `ICESpace` `ICEGrid` `ICEGridCol` `ICESplitter` `ICEScrollPane` |\n| Data entry | `ICETextField` `ICETextArea` `ICEPasswordField` `ICEInputNumber` `ICESelect` `ICEAutoComplete` `ICECascader` `ICETreeSelect` `ICEDatePicker` `ICETimePicker` `ICECheckBox` `ICECheckboxGroup` `ICERadioButton` `ICERadioGroup` `ICESwitch` `ICESlider` `ICESegmented` `ICERate` `ICEColorPicker` `ICETransfer` `ICEUpload` `ICEForm` `ICEFormItem` |\n| Data display | `ICEVirtualList` `ICEKanban` `ICETable` `ICEList` `ICETree` `ICEStatCard` `ICEStatistic` `ICECard` `ICEComment` `ICEDescriptions` `ICETimeline` `ICEProgressBar` `ICEAvatar` `ICEAvatarGroup` `ICETag` `ICEBadge` `ICEImageView` `ICEImagePreview` `ICECalendar` `ICECarousel` `ICECollapse` `ICEWatermark` `ICETileMap` |\n| Feedback & status | `ICEAlert` `ICEModal` `ICEDrawer` `ICETooltip` `ICEPopover` `ICEPopconfirm` `ICETour` `ICEFloatButton` `ICEEmpty` `ICESkeleton` `ICESpin` `ICEResult` `ICESteps` |\n| Feedback & status (static APIs) | `ICEMessage` `ICENotification` — not classes: namespace objects with static methods (`ICEMessage.show(ice, …)`) |\n| Navigation | `ICEMenu` `ICEBreadcrumb` `ICEAnchor` `ICEBackTop` `ICEDropdown` `ICEPagination` `ICETabs` |\n| Layout & core | `ICEWidget` `ICEContainer` `ICEHoverManager` `ICEFocusManager` `ICEMessageManager` `ICEManager` `ICEOverlayManager` (`ICEPainter` / `ICELayoutManager` are types) |\n| Desktop & canvas-native | `ICEWindow` (draggable/resizable/XP chrome), `ICETileMap` (a whole board in one node — 2048 cells, 1 node) |\n| Models | `ICEButtonModel` `ICEToggleModel` `ICEBoundedRangeModel` `ICESelectionModel` `ICEFormModel` `ICEBiosModel` `ICEHistoryModel` `ICEPixelModel` `ICETracePlayerModel` `ICESortModel` `ICEMazeModel` `ICEDosModel` `ICETetrisModel` `ICESnakeModel` `ICE2048Model` `ICEChip8Model` `ICEMinesweeperModel` `ICEHighScoreModel` |\n\nHelper functions: `attachTooltip` `attachPopover` `attachPopconfirm` `attachDropdown`\n`openModal` `openDrawer` `getICEOverlayManager` `getICEFocusManager` `getICEMessageManager`\n`formatStatisticValue` `formatCountdown` `truncateTextLines` `buildMonthGrid` `formatCalendarDate`\n`openImagePreview` `icePixelParseColor` `tween` `fadeIn` `fadeOut` `slideIn` `scaleIn` and friends.\n\n## 8. Theme\n\nA compact **Bootstrap 5-style** token set (see `ICE_LIGHT_THEME` / `ICE_DARK_THEME`):\n\n- semantic colours — `primary` `#0d6efd`, `success` `#198754`, `warning` `#ffc107`,\n  `error` `#dc3545`, `info` `#0dcaf0`;\n- subtle pairs for soft surfaces — `primaryBg` / `primaryBorder`, `successBg` /\n  `successBorder`, … plus `*TextEmphasis` (Bootstrap’s `*-text-emphasis`) for text\n  sitting on those subtle backgrounds;\n- neutrals — `surface`, `elevated`, `background`, `border`, `borderSecondary`;\n- text hierarchy — `text`, `textSecondary`, `textTertiary`, `textDisabled`;\n- spacing / radius / control sizes, Bootstrap’s three shadows (`sm` / `md` / `lg`,\n  expressed as explicit `shadowColor` `shadowBlur` `shadowOffset*` numbers), and a\n  `focusRing` colour for focused controls.\n\n```ts\nimport { iceUIManager } from 'ice-web-components';\n\niceUIManager.setTheme('dark'); // hot-swaps: component styles hold theme refs, resolved at paint time\n```\n\nComponent styles store **theme references** (`token('ui.colors.text')`, from the engine\n`ice-render`) rather than copying colours at construction time — so switching themes does\n**not** require rebuilding the component tree. App code that computes derived colours\n(`mix` / `shade` / alpha) reads the current theme in `ICEWidget.onThemeChange()`.\n\nStatus chips default to Bootstrap’s solid `.text-bg-*` look (white text, black text\non the light `warning` / `info` colours). Pass `variant: 'soft'` for the subtle\nbackground + emphasis text variant:\n\n```ts\nnew ICETag({ text: 'Paid', status: 'success' });                     // solid green\nnew ICETag({ text: 'Paid', status: 'success', variant: 'soft' });    // #d1e7dd / #0a3622\n```\n\n## 9. Naming & exports\n\nEverything exported by this package uses the **`ICE`** prefix (same convention as\n`ice-render`), and the package’s runtime exports do **not overlap** with the\nengine’s — you can import both namespaces, or name-import from both, without\nambiguity:\n\n| concept | this package | `ice-render` |\n|---|---|---|\n| base class | `ICEWidget` (UI widget base, extends `ICEGroup`) | `ICEComponent` (graphic component base) |\n| image | `ICEImageView` (widget, wraps the primitive) | `ICEImage` (image primitive) |\n\nLayout classes are **not** re-exported — they belong to the engine:\n\n```ts\nimport { ICEFlowLayout } from 'ice-render';\nimport { ICEPanel } from 'ice-web-components';\n\npanel.setLayout(new ICEFlowLayout({ gap: 8 }));\n```\n\n## 10. Interaction notes\n\n- **Hover** — ICE deliberately skips full hit-testing on `mousemove`, so canvas\n  components have no native `mouseenter` / `mouseleave`. Attach\n  `new ICEHoverManager(ice).start()` once and components get lightweight hover\n  states (table rows, menu/tree items, buttons, chips…).\n- **Popups** — always open through `getICEOverlayManager(ice)`; overlay content is\n  mounted on the engine’s tool layer, so it renders above the scene, follows the\n  anchor, and is excluded from scene hit-testing.\n- **Focus** — `getICEFocusManager(ice).start()` gives Tab / Shift+Tab rotation,\n  Enter/Space activation, and a ring drawn on the tool layer. The ring follows\n  `:focus-visible` semantics: it only appears for **keyboard** focus, so mouse\n  clicks and thumb drags stay clean. Text-entry controls (text field, number,\n  select, date/time/cascader, colour picker…) opt into `focusRing: 'always'`;\n  any component can declare `focusRing: 'keyboard' | 'always' | 'never'` (or\n  `setFocusRingMode()`). Overlays that own the keyboard declare `keyboardCaptured`\n  so the scene yields Enter/Space.\n- **Rendering pitfalls worth knowing** — the engine sorts by **global zIndex**\n  (creation order), so build containers before their children; components that wrap\n  caller-provided nodes (carousel slides, card `extra`, modal content) raise those\n  subtrees above themselves.\n- **Container hit-testing** — a container that is created *after* its children and\n  stays interactive will swallow every click inside it (`ICESplitter` and plain\n  layout wrappers therefore ship with `interactive: false`; if you build your own\n  wrapper, do the same).\n- **Focus ring vs. hit-testing** — the two rules above bite together: a form item\n  wrapper left interactive hides its own input from `ice.hitTest()`, so the focus\n  manager can't focus it (no ring, and `getFocused()` returns null while the field\n  still accepts typing through its own point-in-box check). `ICEFormItem`,\n  `ICEForm`, `ICESpace`, `ICEGrid` and `ICESplitter` are all `interactive: false`.\n- **Accessibility** — the engine hands you an accessibility snapshot\n  (`getAccessibilityTree()`: role suggestion, `state.ariaLabel`, screen box, tab order);\n  this library wires the other half: controls carry meaningful labels (buttons use their text,\n  text fields fall back to the placeholder, checkboxes to their label), and\n  `mountICEAccessibilityMirror(ice)` renders that snapshot into invisible-but-real DOM\n  (`role` / `aria-label` / `tabindex`, positioned over the canvas). Clicking or focusing a\n  mirror element focuses and activates the canvas component, so screen readers and keyboard\n  users can drive a canvas UI.\n- **i18n (built-in component text)** — the few strings the components render\n  themselves (table empty state, OK / Cancel, upload hints, the “N items” pagination\n  label, calendar month and weekday headings, default form validation messages…) come\n  from a locale pack: `zh-CN` + `en-US` are built in, `registerICELocale()` adds your\n  own, and `setICELocale('en-US')` changes the **global default**.\n  Components read the strings when they are constructed / laid out, so after switching\n  locale you must rebuild or trigger a relayout.\n  **Per-instance override**: any component with built-in text accepts a `locale`\n  (`new ICEUpload({ locale: 'en-US' })`, or `new ICEFormModel({ locale: 'en-US' })` for\n  the form model), so two panels on the same page can each use their own language — the\n  library holds no global state. `tFor('en-US')` / `t('key', vars)` let your app reuse\n  the same fallback chain (requested language → default language → the key itself).\n  **Priority**: instance `locale` > global `setICELocale()` (the latter is only an\n  “app-level default” that applies when no instance language is set).\n  **First day of the week** for calendars / date pickers is derived from the locale\n  (`Intl.Locale(...).weekInfo.firstDay`: `en-US` starts on Sunday, `zh-CN` on Monday;\n  falls back to Monday when the API is unavailable or the language is unknown), or\n  override explicitly with `weekStart: 0..6`.\n  **Boundary**: business copy does **not** go through this system — your app passes the\n  **final string** to the component via any i18n library (`Intl` / ICU / i18next); line\n  breaking, text direction (`direction` / `textAlign: 'start' | 'end'`) and IME are the\n  engine’s responsibility.\n  The full contract lives in ice-render’s `docs/architecture/17-i18n-boundary.md`.\n- **Text input & IME** — focusing a text field mounts a **fully transparent native\n  `<input>` / `<textarea>`** over it (`ICENativeInput`): the browser and the IME do the\n  typing, `input` / `compositionend` write the value back, and `change` / form binding\n  keep working. So Chinese / Japanese / Korean input works, paste works, and the caret\n  is a real DOM caret — the canvas still draws every pixel (the element is invisible).\n  In a runtime without `document` (Node / headless) it degrades to the old\n  per-key `keydown` path. Pressing Enter emits `submit` on single-line fields.\n\n## 11. Development\n\n```bash\nnpm install\nnpm run types:check      # tsc --noEmit\nnpm test                 # jest (unit tests, node env)\nnpm run build            # cjs + esm + umd + d.ts\n\n# examples smoke: every demo page must render (no console/pageerror, canvas painted)\nnpm run test:e2e\nnpm run verify:full      # verify + test:e2e (the pre-release one-shot)\n\n# browser QA for examples/admin.html: layout consistency + popup open/close\n# (needs playwright; point PLAYWRIGHT_PATH at an existing install if needed)\nnpm run qa:admin\n\n# browser QA for examples/gallery.html: zero overlap + real interactions of the\n# newest components (breadcrumb collapse, countdown, radio/checkbox groups,\n# splitter drag, watermark tiling)\nnpm run qa:gallery\n\n# browser QA for examples/workbench.html: queue → profile, reply composer,\n# quick replies, tags/rating, tour, back-to-top, splitter drag\nnpm run qa:workbench\n\n# browser QA for examples/windows-xp.html: icons, windows (drag/minimise/restore),\n# boot → login (any password) → desktop, logoff/shutdown/power-on, tray mute,\n# start menu, minesweeper, paint strokes, wallpaper switch, clock\nnpm run qa:xp\n\n# browser QA for examples/arcade.html: both cartridges played with real key presses,\n# cartridge switching, the self-drawn tile map, tweens, the leaderboard modal, and\n# real clicks on the HUD\nnpm run qa:arcade\n\n# browser QA for examples/pixel-editor.html: drawing with a real mouse (pencil drag,\n# line/rect preview, flood fill, eraser), undo/redo via buttons and Ctrl+Z/Y, and the\n# PNG (IHDR-checked) / SVG exports\nnpm run qa:pixel\n\n# browser QA for examples/algorithm-sandbox.html: playback (play/pause/step/space),\n# switching algorithms, the A*-vs-BFS comparison, and painting walls with a real drag\nnpm run qa:algo\n\n# browser QA for examples/dos-terminal.html: typing commands, TAB completion, history,\n# redirection, Ctrl+L, exit/reboot and auto-scroll\nnpm run qa:dos\n\n# performance gate: per-page node budget, idle self-draw count and frame time\n# (it pins today's numbers so the \"single-node canvas\" advantage cannot be eaten silently)\nnpm run qa:perf\n\n# docs: regenerate the API reference and check relative links\nnpm run docs\n```\n\n`npm run qa:admin` drives a real browser: it asserts every page has zero overlapping\ntop-level nodes and identical first-element offsets, opens every popup layer and\nasserts it can be closed again, checks that clicking an in-row action button does\nnot select the row, then walks the business scenario — breadcrumb follows the page,\nthe floating button opens the tour, the back-to-top button returns to the top, the\ninventory table pages, the order queue drives the detail pane, anchors scroll the\ndetail, the image preview opens/zooms, and the settings password form revalidates\nacross fields. Every popup is screenshotted to `/tmp/qa-*.png`, and any console\nerror fails the run.\n\n`npm run qa:gallery` does the same for the full gallery page with real mouse\nevents (hit-test path): it asserts no two top-level clusters overlap, drives the\nbreadcrumb collapse, the radio / checkbox groups, drags the splitter divider and\nchecks the watermark tiling, then screenshots to `/tmp/qa-gallery*.png`.\n\n`npm run qa:workbench` covers the support workbench (queue → profile, reply composer,\nquick replies, tags, rating, tour, back-to-top, splitter drag) and `npm run qa:xp`\ncovers the Windows XP desktop: the boot splash → welcome screen → typing a password and\npressing Enter (the run asserts the startup cue actually fired), log off back to the\nwelcome screen, shut down, power back on, logging in again with the **Log in** button, the\ntray mute toggle, icons, window drag/minimise/restore, Start menu,\nMinesweeper (first-click-safe, flag cycle, difficulty, timer, win), the Paint canvas,\nthe wallpaper switch, the clock — and the IE window really fetching pages (plus its\n404 page, back button, `about:xp` table and bookmarks). `qa:xp` starts a small static\nserver itself, because `fetch` does not work from `file://`.\n\n`npm run qa:arcade` plays the arcade page with **real key presses**. On the Tetris\ncartridge it moves, rotates, soft-drops, hard-drops, asserts that `P` really stops\ngravity, builds a deterministic board to force a line clear, keeps dropping until game\nover (the best score lands in `localStorage`) and restarts with `R`. Then it clicks the\nSnake cartridge and checks the swap (new board, re-captioned HUD, a fresh model), steers\nwith arrow keys, feeds the snake to grow it, drives it into a wall, and switches back —\nplus real clicks on the pause / restart buttons and the sound switch. Layout assertions\nkeep both boards inside the screen bezel and the panels from overlapping.\n\nSee [ROADMAP.md](./ROADMAP.md) for the component backlog and what is still missing\nper component.\n\n## 12. License\n\n[MIT](./LICENSE)\n","readmeFilename":"README.md"}