{"_id":"@dardino/chess-board","_rev":"12-c0c7b583bf6929db4070f354f2cc88f8","name":"@dardino/chess-board","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"@dardino/chess-board","version":"0.1.0","keywords":["chess","board","web-component","typescript"],"author":{"name":"Dardino"},"license":"MIT","_id":"@dardino/chess-board@0.1.0","maintainers":[{"name":"dardino","email":"dardino@hotmail.com"}],"dist":{"shasum":"6d47d244aec084ccf92f6e177f2c3c75ecba19bd","tarball":"https://registry.npmjs.org/@dardino/chess-board/-/chess-board-0.1.0.tgz","fileCount":27,"integrity":"sha512-BUY7fP7KvRcNt8lBrUmDqwEECFqpih3HahgnAFXx/zuNPHrlsmJACP4sWviAryn/p46eLtt8791phd0CdwgzVg==","signatures":[{"sig":"MEQCIDi2jWb2wDxJViMLW1qRrXwZFv1D8PmAINdiXgrhBj38AiAf3hazBKOQQHARSqlZh7DUo2oXYFJHsePKXjGyFYfZDA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2842950},"main":"./dist/chess-board.umd.js","types":"./dist/types/index.d.ts","module":"./dist/chess-board.es.js","exports":{".":{"css":"./dist/assets/ScacchiPainter.css","types":"./dist/types/index.d.ts","assets":"./dist/assets","import":"./dist/chess-board.es.js","require":"./dist/chess-board.umd.js"}},"gitHead":"85e115d8473dff0ef2f09e68856551f74809d8b7","scripts":{"dev":"vite","demo":"vite --open demo.html","lint":"eslint","test":"vitest","build":"vite build && pnpm tsc --project tsconfig.lib.json","preview":"vite preview","lint:fix":"eslint --fix","test:run":"vitest run","type-check":"tsc --noEmit","test:coverage":"vitest run --coverage","type-check:lib":"tsc --noEmit --project tsconfig.lib.json","type-check:node":"tsc --noEmit --project tsconfig.node.json","type-check:test":"tsc --noEmit --project tsconfig.test.json"},"_npmUser":{"name":"dardino","email":"dardino@hotmail.com"},"_npmVersion":"11.17.0","description":"Web component for displaying a chess board","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.22.0+sha512.1ff870c4c6133dfd88fb2afc46dd13d47f09c9794b438c6fdb47ca98caf3bc16381ee0be93a091b8e3824cf01f889f46d7d9e20910fb0be1ab0fb5baa80dd621","devDependencies":{"jiti":"^2.7.0","vite":"^8.2.1","eslint":"^10.8.1","vitest":"^4.1.11","globals":"^17.11.0","happy-dom":"^20.11.2","@eslint/js":"^10.0.1","typescript":"npm:@typescript/typescript6@^6.0.2","@eslint/css":"^1.4.0","@types/node":"^26.2.0","@eslint/json":"^2.0.1","@eslint/markdown":"^8.0.3","typescript-eslint":"^8.67.0","@typescript/native":"npm:typescript@^7.0.2","vite-plugin-static-copy":"^4.1.1"},"_npmOperationalInternal":{"tmp":"tmp/chess-board_0.1.0_1787225459977_0.7595335157562753","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@dardino/chess-board","version":"0.1.1","keywords":["chess","board","web-component","typescript"],"author":{"name":"Dardino"},"license":"MIT","_id":"@dardino/chess-board@0.1.1","maintainers":[{"name":"dardino","email":"dardino@hotmail.com"}],"homepage":"https://github.com/dardino/chess-board#readme","bugs":{"url":"https://github.com/dardino/chess-board/issues"},"dist":{"shasum":"88566b58670a56965831887fcf090de251598f5a","tarball":"https://registry.npmjs.org/@dardino/chess-board/-/chess-board-0.1.1.tgz","fileCount":27,"integrity":"sha512-bVsFIih/IJclgwSfy4c9P5LuAYICWdj2dIe57acVfBgIZNMINVPLF3T0fKbsF7ssmXYLd8BcdSgIuaDsFNK7gw==","signatures":[{"sig":"MEYCIQDpJ0eMdjNj65N2h8hKuOdkZhg56rXvBXC+v667d4KW1AIhALl4Vd1hGxsOLZCQcJUTYLeZoVKWxcJBcoF0ZfdroYmX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dardino%2fchess-board@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2843044},"main":"./dist/chess-board.umd.js","types":"./dist/types/index.d.ts","module":"./dist/chess-board.es.js","exports":{".":{"css":"./dist/assets/ScacchiPainter.css","types":"./dist/types/index.d.ts","assets":"./dist/assets","import":"./dist/chess-board.es.js","require":"./dist/chess-board.umd.js"}},"gitHead":"020b0887b5c9bdf8768fe529f54c7565501a3e34","scripts":{"dev":"vite","demo":"vite --open demo.html","lint":"eslint","test":"vitest","build":"vite build && pnpm tsc --project tsconfig.lib.json","preview":"vite preview","lint:fix":"eslint --fix","test:run":"vitest run","type-check":"tsc --noEmit","test:coverage":"vitest run --coverage","type-check:lib":"tsc --noEmit --project tsconfig.lib.json","type-check:node":"tsc --noEmit --project tsconfig.node.json","type-check:test":"tsc --noEmit --project tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c0192f77-7b53-4c2a-a63f-25eecfa40f7f"}},"repository":{"url":"git+https://github.com/dardino/chess-board.git","type":"git"},"_npmVersion":"11.17.0","description":"Web component for displaying a chess board","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.22.0+sha512.1ff870c4c6133dfd88fb2afc46dd13d47f09c9794b438c6fdb47ca98caf3bc16381ee0be93a091b8e3824cf01f889f46d7d9e20910fb0be1ab0fb5baa80dd621","devDependencies":{"jiti":"^2.7.0","vite":"^8.2.1","eslint":"^10.8.1","vitest":"^4.1.11","globals":"^17.11.0","happy-dom":"^20.11.2","@eslint/js":"^10.0.1","typescript":"npm:@typescript/typescript6@^6.0.2","@eslint/css":"^1.4.0","@types/node":"^26.2.0","@eslint/json":"^2.0.1","@eslint/markdown":"^8.0.3","typescript-eslint":"^8.67.0","@typescript/native":"npm:typescript@^7.0.2","vite-plugin-static-copy":"^4.1.1"},"_npmOperationalInternal":{"tmp":"tmp/chess-board_0.1.1_1787227744122_0.030788350135348086","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@dardino/chess-board","version":"0.1.2","keywords":["chess","board","web-component","typescript"],"author":{"name":"Dardino"},"license":"MIT","_id":"@dardino/chess-board@0.1.2","maintainers":[{"name":"dardino","email":"dardino@hotmail.com"}],"homepage":"https://github.com/dardino/chess-board#readme","bugs":{"url":"https://github.com/dardino/chess-board/issues"},"dist":{"shasum":"341f96f87891780ef10f4cc57a371758cac98a7b","tarball":"https://registry.npmjs.org/@dardino/chess-board/-/chess-board-0.1.2.tgz","fileCount":27,"integrity":"sha512-BJTn/zB3HbqSHjJOED5+bsqhY2kelEHj0k4LhvLUgB2HhIRsAAW4gBrwoVM4gsJuttdxO8QDONtjY7O0T2HqHA==","signatures":[{"sig":"MEUCIQCcxEUhS6PtMBBAnvmxN663hpEBvJHspcgIqhSiqdHDLAIgKxJ/wM3WQnALBMjqzIu9kfTDia8dD98aSpvdUHENU9k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dardino%2fchess-board@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":6101069},"main":"./dist/chess-board.umd.js","types":"./dist/types/index.d.ts","module":"./dist/chess-board.es.js","exports":{".":{"css":"./dist/assets/ScacchiPainter.css","types":"./dist/types/index.d.ts","assets":"./dist/assets","import":"./dist/chess-board.es.js","require":"./dist/chess-board.umd.js"}},"gitHead":"dedc1d8943b8c63fd92ff685cd3d28b3a7058c63","scripts":{"dev":"vite","demo":"vite --open demo.html","lint":"eslint","test":"vitest","build":"vite build && pnpm tsc --project tsconfig.lib.json","preview":"vite preview","lint:fix":"eslint --fix","test:run":"vitest run","type-check":"tsc --noEmit","test:coverage":"vitest run --coverage","type-check:lib":"tsc --noEmit --project tsconfig.lib.json","type-check:node":"tsc --noEmit --project tsconfig.node.json","type-check:test":"tsc --noEmit --project tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c0192f77-7b53-4c2a-a63f-25eecfa40f7f"}},"repository":{"url":"git+https://github.com/dardino/chess-board.git","type":"git"},"_npmVersion":"11.17.0","description":"Web component for displaying a chess board","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.22.0+sha512.1ff870c4c6133dfd88fb2afc46dd13d47f09c9794b438c6fdb47ca98caf3bc16381ee0be93a091b8e3824cf01f889f46d7d9e20910fb0be1ab0fb5baa80dd621","devDependencies":{"jiti":"^2.7.0","vite":"^8.2.1","eslint":"^10.8.1","vitest":"^4.1.11","globals":"^17.11.0","happy-dom":"^20.11.2","@eslint/js":"^10.0.1","typescript":"npm:@typescript/typescript6@^6.0.2","@eslint/css":"^1.4.0","@types/node":"^26.2.0","@eslint/json":"^2.0.1","@eslint/markdown":"^8.0.3","typescript-eslint":"^8.67.0","@typescript/native":"npm:typescript@^7.0.2","vite-plugin-static-copy":"^4.1.1"},"_npmOperationalInternal":{"tmp":"tmp/chess-board_0.1.2_1787605435606_0.5482436944672984","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@dardino/chess-board","version":"0.1.3","keywords":["chess","board","web-component","typescript"],"author":{"name":"Dardino"},"license":"MIT","_id":"@dardino/chess-board@0.1.3","maintainers":[{"name":"dardino","email":"dardino@hotmail.com"}],"homepage":"https://dardino.github.io/chess-board/","bugs":{"url":"https://github.com/dardino/chess-board/issues"},"dist":{"shasum":"3a84b724c28d96f3d708220390fb2392b525d169","tarball":"https://registry.npmjs.org/@dardino/chess-board/-/chess-board-0.1.3.tgz","fileCount":17,"integrity":"sha512-fuGlyT1XgFWse/UJj4WECIqAFkcjb68SpcHucZjPv/5VwTbHcpJaKtlTdXI6JaeUsxxz/d5OWr+ZgbHkG63/Zw==","signatures":[{"sig":"MEUCIQDnIwmHuukKYIulQ1xuW0qiyRSqTma0wj70pZ4QnenongIgGobFv6bEEcQUsTTpNekL5d4gh7EEdMr2exl2zrOX968=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dardino%2fchess-board@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4334900},"main":"./dist/chess-board.umd.js","types":"./dist/types/index.d.ts","module":"./dist/chess-board.es.js","exports":{".":{"css":"./dist/assets/ScacchiPainter.css","types":"./dist/types/index.d.ts","assets":"./dist/assets","import":"./dist/chess-board.es.js","require":"./dist/chess-board.umd.js"}},"gitHead":"406fd1698508a1ab922b8199bfe6aa474c0571a1","scripts":{"dev":"vite --config vite.config.pages.mts","demo":"vite --config vite.config.pages.mts --open demo.html","lint":"eslint","test":"vitest","build":"vite build && pnpm tsc --project tsconfig.lib.json","preview":"vite --config vite.config.pages.mts  preview","lint:fix":"eslint --fix","test:run":"vitest run","type-check":"tsc --noEmit","build:pages":"vite build --config vite.config.pages.mts","test:coverage":"vitest run --coverage","type-check:lib":"tsc --noEmit --project tsconfig.lib.json","type-check:node":"tsc --noEmit --project tsconfig.node.json","type-check:test":"tsc --noEmit --project tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c0192f77-7b53-4c2a-a63f-25eecfa40f7f"}},"repository":{"url":"git+https://github.com/dardino/chess-board.git","type":"git"},"_npmVersion":"11.17.0","description":"Web component for displaying a chess board","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.22.0+sha512.1ff870c4c6133dfd88fb2afc46dd13d47f09c9794b438c6fdb47ca98caf3bc16381ee0be93a091b8e3824cf01f889f46d7d9e20910fb0be1ab0fb5baa80dd621","devDependencies":{"jiti":"^2.7.0","vite":"^8.2.1","eslint":"^10.8.1","vitest":"^4.1.11","globals":"^17.11.0","happy-dom":"^20.11.2","@eslint/js":"^10.0.1","typescript":"npm:@typescript/typescript6@^6.0.2","@eslint/css":"^1.4.0","@types/node":"^26.2.0","@eslint/json":"^2.0.1","@eslint/markdown":"^8.0.3","typescript-eslint":"^8.67.0","@typescript/native":"npm:typescript@^7.0.2","@vitest/coverage-v8":"4.1.11","vite-plugin-static-copy":"^4.1.1"},"_npmOperationalInternal":{"tmp":"tmp/chess-board_0.1.3_1787751511942_0.4649881458832428","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@dardino/chess-board","version":"0.1.4","keywords":["chess","board","web-component","typescript"],"author":{"name":"Dardino"},"license":"MIT","_id":"@dardino/chess-board@0.1.4","maintainers":[{"name":"dardino","email":"dardino@hotmail.com"}],"homepage":"https://dardino.github.io/chess-board/","bugs":{"url":"https://github.com/dardino/chess-board/issues"},"dist":{"shasum":"b94a1b77c29a05e213371c6ed915fc1516b06afe","tarball":"https://registry.npmjs.org/@dardino/chess-board/-/chess-board-0.1.4.tgz","fileCount":17,"integrity":"sha512-L9Jt2jlTNySVuMpm0phQ+kqnmrvtDrBd+eJVjr1J2YrxYW0Hjy7EBi8CkTf2Lw5z8MwpI3pvv0p2VjYDIrEW8g==","signatures":[{"sig":"MEQCIEy7FlGHzAGTy/RT98mdhwvVJPKYJnU2GwudsJ0zgQRQAiBkSSlQR0PWiAhugSPBH2Ny4k6jdUnBkGYSqGWVif3cDg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dardino%2fchess-board@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4040064},"main":"./dist/chess-board.umd.js","types":"./dist/types/index.d.ts","module":"./dist/chess-board.es.js","exports":{".":{"node":"./dist/chess-board.cjs","types":"./dist/types/index.d.ts","import":"./dist/chess-board.es.js","default":"./dist/chess-board.umd.js","require":"./dist/chess-board.umd.js","module-sync":"./dist/chess-board.es.js"},"./css":"./dist/assets/ScacchiPainter.css","./assets":"./dist/assets"},"gitHead":"a19d14c5b18174cc511eb01e53f6e615e68c54e5","scripts":{"dev":"vite --config vite.config.pages.mts","demo":"vite --config vite.config.pages.mts --open demo.html","lint":"eslint","test":"vitest","build":"vite build && pnpm tsc --project tsconfig.lib.json","preview":"vite --config vite.config.pages.mts  preview","lint:fix":"eslint --fix","test:run":"vitest run","type-check":"tsc --noEmit","build:pages":"vite build --config vite.config.pages.mts","test:coverage":"vitest run --coverage","type-check:lib":"tsc --noEmit --project tsconfig.lib.json","type-check:node":"tsc --noEmit --project tsconfig.node.json","type-check:test":"tsc --noEmit --project tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c0192f77-7b53-4c2a-a63f-25eecfa40f7f"}},"repository":{"url":"git+https://github.com/dardino/chess-board.git","type":"git"},"_npmVersion":"11.17.0","description":"Web component for displaying a chess board","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0+sha512.bd27e345e976dcb0be0b7a1228217b049a817e21b1f355c90dbe7dc46671895a8bc1e6d06c24554505ea93ea0b45f489a27ec1bfbc8de6a9659fca0f16fa0000","devDependencies":{"jiti":"^2.7.0","vite":"^8.2.1","eslint":"^10.8.1","vitest":"^4.1.11","globals":"^17.11.0","happy-dom":"^20.11.2","@eslint/js":"^10.0.1","@vitest/ui":"4.1.11","typescript":"npm:@typescript/typescript6@^6.0.2","@eslint/css":"^1.4.0","@types/node":"^26.2.0","html2canvas":"^1.4.1","@eslint/json":"^2.0.1","@eslint/markdown":"^8.0.3","typescript-eslint":"^8.67.0","@typescript/native":"npm:typescript@^7.0.2","@vitest/coverage-v8":"4.1.11","vite-plugin-static-copy":"^4.1.1"},"_npmOperationalInternal":{"tmp":"tmp/chess-board_0.1.4_1787772875929_0.3957245786012573","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@dardino/chess-board","version":"0.1.5","keywords":["chess","board","web-component","typescript"],"author":{"name":"Dardino"},"license":"MIT","_id":"@dardino/chess-board@0.1.5","maintainers":[{"name":"dardino","email":"dardino@hotmail.com"}],"homepage":"https://dardino.github.io/chess-board/","bugs":{"url":"https://github.com/dardino/chess-board/issues"},"dist":{"shasum":"4286b941806b8b92a8b475e2df544f88a01e9a10","tarball":"https://registry.npmjs.org/@dardino/chess-board/-/chess-board-0.1.5.tgz","fileCount":17,"integrity":"sha512-mwntVl/5o8m3+TrNyn0ZYFe/d+vDK3VbrJmOK9nE4Lb001vdL14gpAHsiMtrPZ881//BcfdJnYvClUC9+R8Y+Q==","signatures":[{"sig":"MEYCIQCE3q6IFKvKK9TJdADcqmDyXyJKgBksPJUD6mL8iXunWAIhAPwRMtAnAqeML51GtkL+IArAkflMwUNHf7Uh8jtzmbSv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dardino%2fchess-board@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4039741},"main":"./dist/chess-board.umd.js","types":"./dist/types/index.d.ts","module":"./dist/chess-board.es.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/chess-board.es.js","default":"./dist/chess-board.es.js","require":"./dist/chess-board.umd.js"},"./css":"./dist/assets/ScacchiPainter.css","./assets":"./dist/assets"},"gitHead":"91212cc42631c26887e72495a09d20b1115bac2f","scripts":{"dev":"vite --config vite.config.pages.mts","demo":"vite --config vite.config.pages.mts --open demo.html","lint":"eslint","test":"vitest","build":"vite build && pnpm tsc --project tsconfig.lib.json","preview":"vite --config vite.config.pages.mts  preview","lint:fix":"eslint --fix","test:run":"vitest run","type-check":"tsc --noEmit","build:pages":"vite build --config vite.config.pages.mts","test:coverage":"vitest run --coverage","type-check:lib":"tsc --noEmit --project tsconfig.lib.json","type-check:node":"tsc --noEmit --project tsconfig.node.json","type-check:test":"tsc --noEmit --project tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c0192f77-7b53-4c2a-a63f-25eecfa40f7f"}},"repository":{"url":"git+https://github.com/dardino/chess-board.git","type":"git"},"_npmVersion":"11.17.0","description":"Web component for displaying a chess board","directories":{},"_nodeVersion":"24.19.0","_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"jiti":"^2.7.0","vite":"^8.2.1","eslint":"^10.8.1","vitest":"^4.1.11","globals":"^17.11.0","happy-dom":"^20.11.2","@eslint/js":"^10.0.1","@vitest/ui":"4.1.11","typescript":"npm:@typescript/typescript6@^6.0.2","@eslint/css":"^1.4.0","@types/node":"^26.2.0","html2canvas":"^1.4.1","@eslint/json":"^2.0.1","@eslint/markdown":"^8.0.3","typescript-eslint":"^8.67.0","@typescript/native":"npm:typescript@^7.0.2","@vitest/coverage-v8":"4.1.11","vite-plugin-static-copy":"^4.1.1"},"_npmOperationalInternal":{"tmp":"tmp/chess-board_0.1.5_1787819156008_0.27693510824805245","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@dardino/chess-board","version":"0.1.6","keywords":["chess","board","web-component","typescript"],"author":{"name":"Dardino"},"license":"MIT","_id":"@dardino/chess-board@0.1.6","maintainers":[{"name":"dardino","email":"dardino@hotmail.com"}],"homepage":"https://dardino.github.io/chess-board/","bugs":{"url":"https://github.com/dardino/chess-board/issues"},"dist":{"shasum":"db9bfceaf5e4dd45fe8af9f6b308a2e4aa12a449","tarball":"https://registry.npmjs.org/@dardino/chess-board/-/chess-board-0.1.6.tgz","fileCount":23,"integrity":"sha512-MijGBXCLy0lTQ8w1Oj7I1UCfF424PAaTopmm78AslaaZ+1+uq2MdICf9BEo9l9u75GMkZGrudQWYckRAoLn+zA==","signatures":[{"sig":"MEQCID0vajy0QlIs+ExVkxREJd74fxUXm1ciPEEPnoAATLtsAiAS2zfAImtBP9E62HDTINcygLLrr5e0jtpF7VFpfOY6Mg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dardino%2fchess-board@0.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4080225},"main":"./dist/chess-board.umd.js","types":"./dist/types/index.d.ts","module":"./dist/chess-board.es.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/chess-board.es.js","default":"./dist/chess-board.es.js","require":"./dist/chess-board.umd.js"},"./css":"./dist/assets/ScacchiPainter.css","./assets":"./dist/assets"},"gitHead":"ccd514ffce4323778b18fe6557efe96274d85c4c","scripts":{"dev":"vite --config vite.config.pages.mts","demo":"vite --config vite.config.pages.mts --open demo.html","lint":"eslint","test":"vitest","build":"vite build && pnpm tsc --project tsconfig.lib.json","preview":"vite --config vite.config.pages.mts  preview","lint:fix":"eslint --fix","test:run":"vitest run","type-check":"tsc --noEmit","build:pages":"vite build --config vite.config.pages.mts","test:coverage":"vitest run --coverage","type-check:lib":"tsc --noEmit --project tsconfig.lib.json","type-check:node":"tsc --noEmit --project tsconfig.node.json","type-check:test":"tsc --noEmit --project tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c0192f77-7b53-4c2a-a63f-25eecfa40f7f"}},"repository":{"url":"git+https://github.com/dardino/chess-board.git","type":"git"},"_npmVersion":"11.19.0","description":"Web component for displaying a chess board","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0+sha512.bd27e345e976dcb0be0b7a1228217b049a817e21b1f355c90dbe7dc46671895a8bc1e6d06c24554505ea93ea0b45f489a27ec1bfbc8de6a9659fca0f16fa0000","devDependencies":{"jiti":"^2.7.0","vite":"^7.3.6","eslint":"^10.8.1","vitest":"^4.1.11","globals":"^17.11.0","happy-dom":"^20.11.2","@eslint/js":"^10.0.1","@vitest/ui":"4.1.11","typescript":"npm:@typescript/typescript6@^6.0.2","@eslint/css":"^1.4.0","@types/node":"^26.2.0","html2canvas":"^1.4.1","@eslint/json":"^2.0.1","@eslint/markdown":"^8.0.3","typescript-eslint":"^8.67.0","@typescript/native":"npm:typescript@^7.0.2","@vitest/coverage-v8":"4.1.11","vite-plugin-static-copy":"^4.1.1"},"_npmOperationalInternal":{"tmp":"tmp/chess-board_0.1.6_1788847769972_0.2848014118657247","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@dardino/chess-board","version":"0.1.7","keywords":["chess","board","web-component","typescript"],"author":{"name":"Dardino"},"license":"MIT","_id":"@dardino/chess-board@0.1.7","maintainers":[{"name":"dardino","email":"dardino@hotmail.com"}],"homepage":"https://dardino.github.io/chess-board/","bugs":{"url":"https://github.com/dardino/chess-board/issues"},"dist":{"shasum":"b032a31242141b2bae85dbbc46a97da7aa91a583","tarball":"https://registry.npmjs.org/@dardino/chess-board/-/chess-board-0.1.7.tgz","fileCount":23,"integrity":"sha512-TcIB2S5kJnDWaACCjeTf4qE5++Hji0EeaQgtWC+Q9l11C7vZt8M+/t7OwLCqef4cu0Py6n4l+LJ7ktKdeCEwcA==","signatures":[{"sig":"MEUCIQDsSt1/S4Wp30/DLYSdbbGyisq4yKsmvVyS3TRTCkpJkgIgE6z/+12WlyNGWGRXIkg5XGiUyVAJ6TgoLFVyejxn/3c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dardino%2fchess-board@0.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4081373},"main":"./dist/chess-board.umd.js","types":"./dist/types/index.d.ts","module":"./dist/chess-board.es.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/chess-board.es.js","default":"./dist/chess-board.es.js","require":"./dist/chess-board.umd.js"},"./css":"./dist/assets/ScacchiPainter.css","./assets":"./dist/assets"},"gitHead":"39764830eb0c30f12cb6b38c3040d8329c7ace0c","scripts":{"dev":"vite --config vite.config.pages.mts","demo":"vite --config vite.config.pages.mts --open demo.html","lint":"eslint","test":"vitest","build":"vite build && pnpm tsc --project tsconfig.lib.json","preview":"vite --config vite.config.pages.mts  preview","lint:fix":"eslint --fix","test:run":"vitest run","type-check":"tsc --noEmit","build:pages":"vite build --config vite.config.pages.mts","test:coverage":"vitest run --coverage","type-check:lib":"tsc --noEmit --project tsconfig.lib.json","type-check:node":"tsc --noEmit --project tsconfig.node.json","type-check:test":"tsc --noEmit --project tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c0192f77-7b53-4c2a-a63f-25eecfa40f7f"}},"repository":{"url":"git+https://github.com/dardino/chess-board.git","type":"git"},"_npmVersion":"11.19.0","description":"Web component for displaying a chess board","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0+sha512.bd27e345e976dcb0be0b7a1228217b049a817e21b1f355c90dbe7dc46671895a8bc1e6d06c24554505ea93ea0b45f489a27ec1bfbc8de6a9659fca0f16fa0000","devDependencies":{"jiti":"^2.7.0","vite":"^7.3.6","eslint":"^10.8.1","vitest":"^4.1.11","globals":"^17.11.0","happy-dom":"^20.11.2","@eslint/js":"^10.0.1","@vitest/ui":"4.1.11","typescript":"npm:@typescript/typescript6@^6.0.2","@eslint/css":"^1.4.0","@types/node":"^26.2.0","html2canvas":"^1.4.1","@eslint/json":"^2.0.1","@eslint/markdown":"^8.0.3","typescript-eslint":"^8.67.0","@typescript/native":"npm:typescript@^7.0.2","@vitest/coverage-v8":"4.1.11","vite-plugin-static-copy":"^4.1.1"},"_npmOperationalInternal":{"tmp":"tmp/chess-board_0.1.7_1789310538833_0.305405403313046","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@dardino/chess-board","version":"0.1.8","keywords":["chess","board","web-component","typescript"],"author":{"name":"Dardino"},"license":"MIT","_id":"@dardino/chess-board@0.1.8","maintainers":[{"name":"dardino","email":"dardino@hotmail.com"}],"homepage":"https://dardino.github.io/chess-board/","bugs":{"url":"https://github.com/dardino/chess-board/issues"},"dist":{"shasum":"0e900ce3b397080ba2ef8eae3d940736adce8541","tarball":"https://registry.npmjs.org/@dardino/chess-board/-/chess-board-0.1.8.tgz","fileCount":23,"integrity":"sha512-qcly0hj95mR/VernvX/kMiLrgJun1lE8pEB4hN5vCjhMhlFrqIZwgGqV2jBUMPAChQroA8BIiKtk5vSvqvPZ1Q==","signatures":[{"sig":"MEYCIQDDIpqL/ppndhsx9RW8jQSEf3Q4BZSBT2IlRAeRe4LVFQIhAPFmq+kEOlM90Ch0AvBGXnCvmLlsCPUO3G5UtAQjZHpc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dardino%2fchess-board@0.1.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4083843},"main":"./dist/chess-board.umd.js","types":"./dist/types/index.d.ts","module":"./dist/chess-board.es.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/chess-board.es.js","default":"./dist/chess-board.es.js","require":"./dist/chess-board.umd.js"},"./css":"./dist/assets/ScacchiPainter.css","./assets":"./dist/assets"},"gitHead":"a4f939319a69e1f6d3c71366dccefa8819b8e1ba","scripts":{"dev":"vite --config vite.config.pages.mts","demo":"vite --config vite.config.pages.mts --open demo.html","lint":"eslint","test":"vitest","build":"vite build && pnpm tsc --project tsconfig.lib.json","preview":"vite --config vite.config.pages.mts  preview","lint:fix":"eslint --fix","test:run":"vitest run","type-check":"tsc --noEmit","build:pages":"vite build --config vite.config.pages.mts","test:coverage":"vitest run --coverage","type-check:lib":"tsc --noEmit --project tsconfig.lib.json","type-check:node":"tsc --noEmit --project tsconfig.node.json","type-check:test":"tsc --noEmit --project tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c0192f77-7b53-4c2a-a63f-25eecfa40f7f"}},"repository":{"url":"git+https://github.com/dardino/chess-board.git","type":"git"},"_npmVersion":"11.19.0","description":"Web component for displaying a chess board","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0+sha512.bd27e345e976dcb0be0b7a1228217b049a817e21b1f355c90dbe7dc46671895a8bc1e6d06c24554505ea93ea0b45f489a27ec1bfbc8de6a9659fca0f16fa0000","devDependencies":{"jiti":"^2.7.0","vite":"^7.3.6","eslint":"^10.8.1","vitest":"^4.1.11","globals":"^17.11.0","happy-dom":"^20.11.2","@eslint/js":"^10.0.1","@vitest/ui":"4.1.11","typescript":"npm:@typescript/typescript6@^6.0.2","@eslint/css":"^1.4.0","@types/node":"^26.2.0","html2canvas":"^1.4.1","@eslint/json":"^2.0.1","@eslint/markdown":"^8.0.3","typescript-eslint":"^8.67.0","@typescript/native":"npm:typescript@^7.0.2","@vitest/coverage-v8":"4.1.11","vite-plugin-static-copy":"^4.1.1"},"_npmOperationalInternal":{"tmp":"tmp/chess-board_0.1.8_1789502592774_0.6200652208798547","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@dardino/chess-board","version":"0.1.9","keywords":["chess","board","web-component","typescript"],"author":{"name":"Dardino"},"license":"MIT","_id":"@dardino/chess-board@0.1.9","maintainers":[{"name":"dardino","email":"dardino@hotmail.com"}],"homepage":"https://dardino.github.io/chess-board/","bugs":{"url":"https://github.com/dardino/chess-board/issues"},"dist":{"shasum":"9d222827d6c4b80a60f31f796a2265f92e72b010","tarball":"https://registry.npmjs.org/@dardino/chess-board/-/chess-board-0.1.9.tgz","fileCount":23,"integrity":"sha512-1k42PwG8daXnN8vtJm2yTvSLneoJT46h74r78KHombBn69AqXBkXopjJpU28QmaoIyu9Ihz3irQZVCLW81L2yA==","signatures":[{"sig":"MEUCIQD/jGDo+695RBBBu4HvuIGaDBatpPrV+OkCRopx+JWetwIgI8RmUXqs1h36CSl18LKXgisC0pnt5P4KvvHDusrqUiA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dardino%2fchess-board@0.1.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4083623},"main":"./dist/chess-board.umd.js","types":"./dist/types/index.d.ts","module":"./dist/chess-board.es.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/chess-board.es.js","default":"./dist/chess-board.es.js","require":"./dist/chess-board.umd.js"},"./css":"./dist/assets/ScacchiPainter.css","./assets":"./dist/assets"},"gitHead":"680b981a7596c4d19fa8842cef18857d4871bce9","scripts":{"dev":"vite --config vite.config.pages.mts","demo":"vite --config vite.config.pages.mts --open demo.html","lint":"eslint","test":"vitest","build":"vite build && pnpm tsc --project tsconfig.lib.json","preview":"vite --config vite.config.pages.mts  preview","lint:fix":"eslint --fix","test:run":"vitest run","type-check":"tsc --noEmit","build:pages":"vite build --config vite.config.pages.mts","test:coverage":"vitest run --coverage","type-check:lib":"tsc --noEmit --project tsconfig.lib.json","type-check:node":"tsc --noEmit --project tsconfig.node.json","type-check:test":"tsc --noEmit --project tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c0192f77-7b53-4c2a-a63f-25eecfa40f7f"}},"repository":{"url":"git+https://github.com/dardino/chess-board.git","type":"git"},"_npmVersion":"11.19.0","description":"Web component for displaying a chess board","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0+sha512.bd27e345e976dcb0be0b7a1228217b049a817e21b1f355c90dbe7dc46671895a8bc1e6d06c24554505ea93ea0b45f489a27ec1bfbc8de6a9659fca0f16fa0000","devDependencies":{"jiti":"^2.7.0","vite":"^7.3.6","eslint":"^10.8.1","vitest":"^4.1.11","globals":"^17.11.0","happy-dom":"^20.11.2","@eslint/js":"^10.0.1","@vitest/ui":"4.1.11","typescript":"npm:@typescript/typescript6@^6.0.2","@eslint/css":"^2.0.0","@types/node":"^26.2.0","html2canvas":"^1.4.1","@eslint/json":"^2.0.1","@eslint/markdown":"^8.0.3","typescript-eslint":"^8.67.0","@typescript/native":"npm:typescript@^7.0.2","@vitest/coverage-v8":"4.1.11","vite-plugin-static-copy":"^4.1.1"},"_npmOperationalInternal":{"tmp":"tmp/chess-board_0.1.9_1789567626461_0.050497065222474546","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@dardino/chess-board","version":"0.2.0","keywords":["chess","board","web-component","typescript"],"author":{"name":"Dardino"},"license":"MIT","_id":"@dardino/chess-board@0.2.0","maintainers":[{"name":"dardino","email":"dardino@hotmail.com"}],"homepage":"https://dardino.github.io/chess-board/","bugs":{"url":"https://github.com/dardino/chess-board/issues"},"dist":{"shasum":"37079221cfd7f91ded2b0abc4a81d5cb511a8f9a","tarball":"https://registry.npmjs.org/@dardino/chess-board/-/chess-board-0.2.0.tgz","fileCount":23,"integrity":"sha512-o0VqSUTvDQzTawDw22B5qMR47EjuK3akm3Ejwo532sTd8HYXZtYyeN5v1Aiy+yOD4BmKzzvtkkp62SU9TTqKeA==","signatures":[{"sig":"MEYCIQCRVPaZJqjE4/bP3OkHJXuj2cMRb09F18/AGRl/ezDxIwIhAOKxfipWLhHxmAPI6bMjlhB8qDXZNit0Wek60BK1sye0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBrP633dZRCVg5TNcl6Pc1KRR+hBlHZqqftqDR0RT+5+AiEA1m8uSh7a8U6FKqkGOMO/DmNuGy6f7pgmBM7Vny6gsIM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dardino%2fchess-board@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4095815},"main":"./dist/chess-board.umd.js","types":"./dist/types/index.d.ts","module":"./dist/chess-board.es.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/chess-board.es.js","default":"./dist/chess-board.es.js","require":"./dist/chess-board.umd.js"},"./css":"./dist/assets/ScacchiPainter.css","./assets":"./dist/assets"},"gitHead":"5cb285870db999bccf92c40116188e1fab37301a","scripts":{"dev":"vite --config vite.config.pages.mts","demo":"vite --config vite.config.pages.mts --open demo.html","lint":"eslint","test":"vitest","build":"vite build && pnpm tsc --project tsconfig.lib.json","preview":"vite --config vite.config.pages.mts  preview","lint:fix":"eslint --fix","test:run":"vitest run","type-check":"tsc --noEmit","build:pages":"vite build --config vite.config.pages.mts","test:coverage":"vitest run --coverage","type-check:lib":"tsc --noEmit --project tsconfig.lib.json","type-check:node":"tsc --noEmit --project tsconfig.node.json","type-check:test":"tsc --noEmit --project tsconfig.test.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c0192f77-7b53-4c2a-a63f-25eecfa40f7f"}},"repository":{"url":"git+https://github.com/dardino/chess-board.git","type":"git"},"_npmVersion":"11.19.0","description":"Web component for displaying a chess board","directories":{},"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0+sha512.bd27e345e976dcb0be0b7a1228217b049a817e21b1f355c90dbe7dc46671895a8bc1e6d06c24554505ea93ea0b45f489a27ec1bfbc8de6a9659fca0f16fa0000","devDependencies":{"jiti":"^2.7.0","vite":"^7.3.6","eslint":"^10.8.1","vitest":"^4.1.11","globals":"^17.11.0","happy-dom":"^20.11.2","@eslint/js":"^10.0.1","@vitest/ui":"4.1.11","typescript":"npm:@typescript/typescript6@^6.0.2","@eslint/css":"^2.0.0","@types/node":"^26.2.0","html2canvas":"^1.4.1","@eslint/json":"^2.0.1","@eslint/markdown":"^8.0.3","typescript-eslint":"^8.67.0","@typescript/native":"npm:typescript@^7.0.2","@vitest/coverage-v8":"4.1.11","vite-plugin-static-copy":"^4.1.1"},"_npmOperationalInternal":{"tmp":"tmp/chess-board_0.2.0_1789756533070_0.71958089901154","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"_id":"@dardino/chess-board@0.2.1","bugs":{"url":"https://github.com/dardino/chess-board/issues"},"dist":{"shasum":"7437a8c8143f97cfee9dda3fcacb6aca3c14e501","tarball":"https://registry.npmjs.org/@dardino/chess-board/-/chess-board-0.2.1.tgz","fileCount":23,"integrity":"sha512-oiYjb8IVoFtQa39AyU9uEnCaWzLuHijjQX6c1OTdaI1yFuj3BsnK6go2VhrPRFC4SEV43PBXMTurgZCHkZa8dA==","signatures":[{"sig":"MEYCIQCuFaGuOcW1sTnG9iblt1H86K9ftj8xwjqgHIIwzjgobAIhAInPQ2XhV2bZXSy1kEfd/YX1l3pwD9AWnsQaSjh3HMNk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBHoP3t8bpJkH3+KuSpGX+8JCk/nF2tmyYoTPBs7JsyhAiA3vdbZByewcAZY506XVV0p39QRisZAng0xgPosIl/V8A=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dardino%2fchess-board@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":4096442},"main":"./dist/chess-board.umd.js","name":"@dardino/chess-board","types":"./dist/types/index.d.ts","author":{"name":"Dardino"},"module":"./dist/chess-board.es.js","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/chess-board.es.js","default":"./dist/chess-board.es.js","require":"./dist/chess-board.umd.js"},"./css":"./dist/assets/ScacchiPainter.css","./assets":"./dist/assets"},"gitHead":"65d68ae02d934ed0cf524c80cd93c0a907b209b7","license":"MIT","scripts":{"dev":"vite --config vite.config.pages.mts","demo":"vite --config vite.config.pages.mts --open demo.html","lint":"eslint","test":"vitest","build":"vite build && pnpm tsc --project tsconfig.lib.json","preview":"vite --config vite.config.pages.mts  preview","lint:fix":"eslint --fix","test:run":"vitest run","type-check":"tsc --noEmit","build:pages":"vite build --config vite.config.pages.mts","test:coverage":"vitest run --coverage","type-check:lib":"tsc --noEmit --project tsconfig.lib.json","type-check:node":"tsc --noEmit --project tsconfig.node.json","type-check:test":"tsc --noEmit --project tsconfig.test.json"},"version":"0.2.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"c0192f77-7b53-4c2a-a63f-25eecfa40f7f"}},"homepage":"https://dardino.github.io/chess-board/","keywords":["chess","board","web-component","typescript"],"repository":{"url":"git+https://github.com/dardino/chess-board.git","type":"git"},"_npmVersion":"11.19.0","description":"Web component for displaying a chess board","directories":{},"maintainers":[{"name":"dardino","email":"dardino@hotmail.com"}],"_nodeVersion":"24.21.0","_hasShrinkwrap":false,"packageManager":"pnpm@11.24.0+sha512.bd27e345e976dcb0be0b7a1228217b049a817e21b1f355c90dbe7dc46671895a8bc1e6d06c24554505ea93ea0b45f489a27ec1bfbc8de6a9659fca0f16fa0000","devDependencies":{"jiti":"^2.7.0","vite":"^7.3.6","eslint":"^10.8.1","vitest":"^4.1.11","globals":"^17.11.0","happy-dom":"^20.11.2","@eslint/js":"^10.0.1","@vitest/ui":"4.1.11","typescript":"npm:@typescript/typescript6@^6.0.2","@eslint/css":"^2.0.0","@types/node":"^26.2.0","html2canvas":"^1.4.1","@eslint/json":"^2.0.1","@eslint/markdown":"^8.0.3","typescript-eslint":"^8.67.0","@typescript/native":"npm:typescript@^7.0.2","@vitest/coverage-v8":"4.1.11","vite-plugin-static-copy":"^4.1.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/chess-board_0.2.1_1790696058235_0.8058582530408123"}}},"time":{"created":"2026-08-20T11:30:59.736Z","modified":"2026-09-29T15:34:18.751Z","0.1.0":"2026-08-20T11:31:00.172Z","0.1.1":"2026-08-20T12:09:04.436Z","0.1.2":"2026-08-24T21:03:55.799Z","0.1.3":"2026-08-26T13:38:32.119Z","0.1.4":"2026-08-26T19:34:36.133Z","0.1.5":"2026-08-27T08:25:56.153Z","0.1.6":"2026-09-08T06:09:30.133Z","0.1.7":"2026-09-13T14:42:19.010Z","0.1.8":"2026-09-15T20:03:12.926Z","0.1.9":"2026-09-16T14:07:06.654Z","0.2.0":"2026-09-18T18:35:33.196Z","0.2.1":"2026-09-29T15:34:18.383Z"},"bugs":{"url":"https://github.com/dardino/chess-board/issues"},"author":{"name":"Dardino"},"license":"MIT","homepage":"https://dardino.github.io/chess-board/","keywords":["chess","board","web-component","typescript"],"repository":{"url":"git+https://github.com/dardino/chess-board.git","type":"git"},"description":"Web component for displaying a chess board","maintainers":[{"name":"dardino","email":"dardino@hotmail.com"}],"readme":"# Chess Board Web Components\n\nA collection of web components for displaying chess boards and pieces, built with TypeScript and Vite.\n\n## Project HomePage\n\nThis project is hosted on [GitHub Pages](https://dardino.github.io/chess-board/)\n\n## Components\n\n### ChessBoard (`chess-board`)\n\nA web component for displaying a chess board with optional labels.\n\n### ChessPiece (`chess-piece`)\n\nA web component for displaying individual chess pieces.\n\n## Features\n\n- **8x8 Chess Board**: Traditional chess board layout with alternating colors\n- **Individual Chess Pieces**: Separate component for each piece type and color\n- **Piece Rotation**: Rotate pieces in 45° increments (0-315°) with keyboard shortcuts\n- **Fairy Chess Notation**: Support for fairy-name and fairy-condition annotations for problem compositions\n- **Board Labels**: Column letters (a-h) and row numbers (1-8) on all four sides\n- **FEN Support**: Load and display chess positions using Forsyth-Edwards Notation\n- **Board Orientation**: Manual flip between white/black perspective with keyboard shortcuts\n- **Keyboard Navigation**: Full keyboard support for piece placement, rotation, and board manipulation\n- **Responsive Design**: Automatically adapts to container size with container queries\n- **Font Responsiveness**: Chess piece font size scales proportionally with board size using `cqw` units\n- **Web Components**: Native custom elements with Shadow DOM\n- **TypeScript**: Full type safety and modern development experience\n- **Testing**: Comprehensive test suite with Vitest and Happy DOM (108 tests)\n\n## Technologies\n\n- **TypeScript**: ^5.9.3\n- **Vite**: ^7.2.2\n- **Vitest**: ^4.0.8 (Testing framework)\n- **Happy DOM**: ^20.0.10 (DOM environment for tests)\n- **ScacchiPainter Font**: Custom chess piece font with ligatures\n- **vite-plugin-dts**: For TypeScript declaration generation\n\n## TypeScript Support\n\nThis library provides full TypeScript support with comprehensive type definitions. Import the library and use the exported types for type-safe development:\n\n```typescript\nimport {\n  ChessBoard,\n  ChessPiece,\n  ChessPieceType,\n  ChessPieceColor,\n  CellClickPiece,\n  CellClickEventDetail,\n  FenPosition,\n  parseFen,\n  positionToFen\n} from '@dardino/chess-board';\n\n// Types for piece properties\ntype ChessPieceType = 'k' | 'q' | 'r' | 'b' | 'n' | 'p' | 'e' | 't' | 'a';\ntype ChessPieceColor = 'w' | 'b' | 'n';\n\n// Interface for chess pieces on a square\ninterface PieceInfo {\n  type: ChessPieceType;\n  color: ChessPieceColor;\n  rotation?: '0' | '45' | '90' | '135' | '180' | '225' | '270' | '315';\n  fairyName?: string;\n  fairyCondition?: string;\n}\n\n// Interface for complete FEN positions: square -> piece\ninterface FenPosition {\n  pieces: PiecesOnBoard;\n  activeColor: 'w' | 'b';\n  castlingRights: string;\n  enPassantTarget: string;\n  halfmoveClock: number;\n  fullmoveNumber: number;\n}\n\n// Example usage with full type safety\nfunction setupBoard(): void {\n  const board = new ChessBoard();\n\n  // Type-safe FEN parsing\n  const position: FenPosition | null = parseFen('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1');\n  if (position) {\n    console.log('Active color:', position.activeColor); // 'w' | 'b'\n    console.log('Pieces count:', Object.keys(position.pieces).length);\n  }\n\n  // Type-safe piece creation\n  const piece = new ChessPiece();\n  piece.setPiece('q', 'w'); // Only accepts valid piece types and colors\n\n  // Type-safe board methods\n  board.setFen('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1');\n  const currentFen: string = board.getFen();\n\n  // Type-safe event handling\n  board.addEventListener('cellClick', (event: CustomEvent<CellClickEventDetail>) => {\n    const { cell, piece: clickedPiece } = event.detail;\n    console.log(`Clicked ${cell}`);\n    if (clickedPiece) {\n      console.log(`Piece: ${clickedPiece.color} ${clickedPiece.type}`);\n      if (clickedPiece.rotation) {\n        console.log(`Rotation: ${clickedPiece.rotation}°`);\n      }\n      if (clickedPiece.fairyName) {\n        console.log(`Fairy name: ${clickedPiece.fairyName}`);\n      }\n      if (clickedPiece.fairyCondition) {\n        console.log(`Fairy condition: ${clickedPiece.fairyCondition}`);\n      }\n    }\n  });\n}\n```\n\n### Type Definitions Location\n\nTypeScript declaration files are generated in the `dist/types/` directory:\n\n- `dist/types/index.d.ts` - Main entry point with all exports\n- `dist/types/ChessBoard.d.ts` - ChessBoard component types\n- `dist/types/ChessPiece.d.ts` - ChessPiece component types\n- `dist/types/fen.d.ts` - FEN utility function types\n\n### Exported Types\n\n- `ChessPieceType`: Union type for piece types (`'k' | 'q' | 'r' | 'b' | 'n' | 'p' | 'e' | 't' | 'a'`)\n- `ChessPieceColor`: Union type for piece colors (`'w' | 'b' | 'n'`)\n- `ChessPieceRotation`: Union type for piece rotations (`0 | 45 | 90 | 135 | 180 | 225 | 270 | 315`)\n- `ChessPiece`: Interface for individual chess pieces\n- `CellClickPiece`: Interface for piece information in cell click events (includes rotation and fairy notation)\n- `CellClickEventDetail`: Interface for cell click event details\n- `FenPosition`: Interface for complete chess positions\n- `ChessBoard`: Web component class with typed methods\n- `ChessPiece`: Web component class with typed methods\n\n### Exported Functions\n\n- `parseFen(fen: string): FenPosition | null` - Parse FEN string to position\n- `positionToFen(position: FenPosition): string` - Convert position to FEN string\n- `parsePiecePlacement(piecePlacement: string): { pieces: PiecesOnBoard; boardSize: { width: number; height: number } } | null` - Parse FEN piece placement\n- `piecesToFenString(pieces: PiecesOnBoard, isFfen?: boolean, boardSize?: { width: number; height: number }): string` - Convert square-indexed pieces to FEN string\n- `parsePieceChar(char: string): { type: ChessPieceType; color: ChessPieceColor } | null` - Parse piece character\n- `pieceToChar(piece: PieceInfo): string` - Convert piece to character\n- `getStartingPositionFen(): string` - Get starting position FEN\n- `getEmptyBoardFen(): string` - Get empty board FEN\n\n## Installation\n\n```bash\npnpm add @dardino/chess-board\n```\n\n## Chess Pieces\n\nThe components use ligature-based font rendering for chess pieces:\n\n### Standard Pieces\n\n| Piece | White | Black | Description |\n| ------- | ------- | ------- | ------------- |\n| King | `w_k` | `b_k` | King piece |\n| Queen | `w_q` | `b_q` | Queen piece |\n| Rook | `w_r` | `b_r` | Rook (castle) |\n| Bishop | `w_b` | `b_b` | Bishop |\n| Knight | `w_n` | `b_n` | Knight (horse) |\n| Pawn | `w_p` | `b_p` | Pawn |\n\n### Fairy Pieces\n\n| Piece | White | Black | Neutral | Description |\n| ------- | ------- | ------- | --------- | ------------- |\n| Empress | `w_e` | `b_e` | `n_e` | Empress (Rook + Knight) |\n| Dragon | `w_t` | `b_t` | `n_t` | Dragon (Amazon) |\n| Angel/Archbishop | `w_a` | `b_a` | `n_a` | Angel/Archbishop (Bishop + Knight) |\n\n### Color Support\n\n- **White** (`w`): Standard white pieces\n- **Black** (`b`): Standard black pieces  \n- **Neutral** (`n`): Neutral pieces for problem compositions\n\n*Note: Fairy pieces and neutral colors are commonly used in chess problem compositions and artistic chess.*\n\n## Usage\n\n### Animation Attributes\n\nThe board supports a small set of CSS-driven animation attributes that are controlled entirely through CSS variables and the host element state.\n\n```html\n<chess-board rotating=\"left\" translating=\"right\" mirroring=\"horizontal\"></chess-board>\n```\n\n```css\nchess-board {\n  --cb-chess-animating-duration: 0.5s;\n  --cb-chess-rotating-left: rotate(-90deg);\n  --cb-chess-rotating-right: rotate(90deg);\n  --cb-chess-translate-left: -12.5%;\n  --cb-chess-translate-right: 12.5%;\n  --cb-chess-mirroring-horizontal: scaleX(-1);\n  --cb-chess-mirroring-vertical: scaleY(-1);\n}\n```\n\nSupported animation controls:\n\n- `rotating=\"left\" | \"right\"`: animate a 90° turn in either direction.\n- `translating=\"left\" | \"right\" | \"up\" | \"down\"`: shift the piece layer by one cell along the selected axis.\n- `mirroring=\"horizontal\" | \"vertical\"`: flip the piece layer along a single axis.\n\n### Basic Usage\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Chess Board Demo</title>\n  \n  <!-- Load chess piece font (required for piece rendering) -->\n  <link rel=\"stylesheet\" href=\"./assets/ScacchiPainter.css\" />\n</head>\n<body>\n  <!-- Empty chess board -->\n  <chess-board></chess-board>\n\n  <!-- Individual chess pieces -->\n  <chess-piece piece=\"k\" color=\"w\"></chess-piece>\n  <chess-piece piece=\"q\" color=\"b\"></chess-piece>\n  \n  <!-- Fairy pieces -->\n  <chess-piece piece=\"e\" color=\"w\"></chess-piece> <!-- White Empress -->\n  <chess-piece piece=\"t\" color=\"b\"></chess-piece> <!-- Black Dragon -->\n  <chess-piece piece=\"a\" color=\"n\"></chess-piece> <!-- Neutral Angel/Archbishop -->\n\n  <script type=\"module\">\n    import '@dardino/chess-board';\n  </script>\n</body>\n</html>\n```\n\n### Adding Pieces to the Board\n\n```javascript\n// Get a square by coordinate\nconst e4Square = document.querySelector('chess-board')\n  .shadowRoot.querySelector('[data-coordinate=\"e4\"]');\n\n// Create and add a piece\nconst queen = document.createElement('chess-piece');\nqueen.setAttribute('piece', 'q');\nqueen.setAttribute('color', 'w');\ne4Square.appendChild(queen);\n\n// Or use the setPiece method\nconst king = document.createElement('chess-piece');\nking.setPiece('k', 'b');\ne4Square.appendChild(king);\n```\n\n### Board with Labels Hidden\n\n```html\n<chess-board hide-labels></chess-board>\n```\n\n### FEN / FFEN Support\n\nThe chess board accepts a single `fen` attribute that works with either standard Forsyth-Edwards Notation (FEN) or the fairy-aware FFEN format used for composed chess problems and custom piece metadata. The parser automatically detects which notation is being used and applies the right rules.\n\n#### Setting Position with FEN or FFEN\n\n```html\n<!-- Starting position -->\n<chess-board fen=\"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1\"></chess-board>\n\n<!-- Empty board -->\n<chess-board fen=\"8/8/8/8/8/8/8/8 w - - 0 1\"></chess-board>\n\n<!-- Custom position -->\n<chess-board fen=\"r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - 4 4\"></chess-board>\n\n<!-- Fairy-aware FFEN string: format is detected automatically -->\n<chess-board fen=\"8/8/8/8/8/8/8/8 w - - 0 1 e4:gn:Chameleon\"></chess-board>\n```\n\nThe board keeps the internal state synchronized automatically: when the position contains fairy metadata, it preserves it in the returned FFEN-compatible string; otherwise it remains a standard FEN string. There is no separate `ffen` attribute or duplicate state to keep in sync.\n\n#### Board Rotation Based on Active Color\n\nThe board automatically rotates 180 degrees when it's black's turn to move:\n\n```html\n<!-- White to move - normal orientation -->\n<chess-board fen=\"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1\"></chess-board>\n\n<!-- Black to move - rotated 180 degrees -->\n<chess-board fen=\"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR b KQkq - 0 1\"></chess-board>\n```\n\nThis provides a better user experience by orienting the board from the perspective of the player whose turn it is.\n\n#### Programmatic FEN / FFEN Control\n\n```javascript\nconst board = document.querySelector('chess-board');\n\n// Standard FEN\nboard.setFen('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1');\n\n// Fairy-aware FFEN string (auto-detected)\nboard.setFen('8/8/8/8/8/8/8/8 w - - 0 1 e4:gn:Chameleon');\n\nconst currentPosition = board.getFen();\n// Returns the current board state in the appropriate FEN/FFEN form\n// without requiring a separate ffen attribute or getter.\n\n// Set starting position\nboard.setStartingPosition();\n\n// Clear all pieces\nboard.clearBoard();\n```\n\n### Cell Click Events\n\nListen for cell clicks to interact with the board:\n\n```javascript\nconst board = document.querySelector('chess-board');\n\n// Listen for cell click events\nboard.addEventListener('cellClick', (event) => {\n  const { cell, piece } = event.detail;\n  \n  if (piece) {\n    console.log(`Clicked ${cell} - ${piece.color} ${piece.type}`);\n  } else {\n    console.log(`Clicked ${cell} - Empty square`);\n  }\n});\n\n// Example output:\n// Clicked e4 - white p\n// Clicked a1 - Empty square\n```\n\n### Keyboard Navigation\n\nThe board supports keyboard navigation for accessibility:\n\n```javascript\nconst board = document.querySelector('chess-board');\n\n// Focus the board (can be done with Tab key)\nboard.shadowRoot.querySelector('.board').focus();\n\n// Get current selected square\nconst current = board.getCurrentSquare();\nconsole.log('Current square:', current); // e.g., \"a1\"\n\n// Programmatically select a square\nboard.selectSquare('e4');\n\n// Programmatically select the piece on a square\nconst wasSelected = board.selectPiece('e4');\nconsole.log(wasSelected); // true when e4 contains a piece\n```\n\n### Programmatic Piece Management\n\n```javascript\n// Create a piece\nconst piece = document.createElement('chess-piece');\npiece.setPiece('r', 'w'); // White rook\n\n// Create fairy pieces\nconst empress = document.createElement('chess-piece');\nempress.setPiece('e', 'b'); // Black empress\n\nconst neutralAngel = document.createElement('chess-piece');\nneutralAngel.setPiece('a', 'n'); // Neutral angel/archbishop\n\n// Change piece type and color\npiece.setAttribute('piece', 'q'); // Change to queen\npiece.setAttribute('color', 'b'); // Change to black\n\n// Get current piece info\nconsole.log(piece.getPiece()); // 'q'\nconsole.log(piece.getColor()); // 'b'\n```\n\n## Development\n\n```bash\n# Install dependencies\npnpm install\n\n# Start development server\npnpm run dev\n\n# Build for production\npnpm run build\n\n# Testing\npnpm run test           # Run tests in watch mode\npnpm run test:run       # Run tests once\npnpm run test:coverage  # Run tests with coverage\n\n# Linting\npnpm run lint           # Check code style\npnpm run lint:fix       # Auto-fix linting issues\n\n# Type checking\npnpm run type-check          # Check all TypeScript configurations\npnpm run type-check:lib      # Check library source files\npnpm run type-check:node     # Check configuration files\npnpm run type-check:test     # Check test files\n```\n\n## TypeScript Configuration\n\nThe project uses a modular TypeScript configuration:\n\n- **`tsconfig.json`**: Main configuration that references all others\n- **`tsconfig.lib.json`**: Library source files configuration\n- **`tsconfig.node.json`**: Build tools and configuration files\n- **`tsconfig.test.json`**: Test files configuration\n\n## Testing\n\nThe project uses **Vitest** with **Happy DOM** for testing web components.\n\n### Test Structure\n\n```text\ntest/\n├── setup.ts              # Global test setup\n├── ChessBoard.test.ts    # ChessBoard component tests\n└── ChessPiece.test.ts    # ChessPiece component tests\n```\n\n### Writing Tests\n\nTests are written using Vitest's API with Happy DOM providing a browser-like environment:\n\n```typescript\nimport { describe, it, expect } from 'vitest';\n\ndescribe('Component Name', () => {\n  it('should work correctly', () => {\n    // Test implementation\n  });\n});\n```\n\n### Test Commands\n\n- `pnpm run test`: Run tests in watch mode during development\n- `pnpm run test:run`: Run tests once (CI/CD)\n- `pnpm run test:coverage`: Run tests with coverage report\n\n## API\n\n### ChessBoard Component\n\nThe `chess-board` element renders a complete 8x8 chess board with:\n\n- **Board Layout**: CSS Grid-based 10x10 grid (8x8 board squares + labels on all sides)\n- **Data Coordinates**: Each square has a `data-coordinate` attribute (a1-h8)\n- **Board Labels**: Column letters (a-h) on top and bottom, row numbers (8-1) on left and right sides\n- **Responsive Sizing**: Board adapts to container width while maintaining a minimum size of 200px x 200px\n- **Font Scaling**: Piece and label font sizes scale proportionally with board size using `cqw` units\n- **Container Queries**: Uses `container-type: inline-size` for modern responsive design\n- **Shadow DOM**: Isolated styles and markup for safe integration\n- **Event Cleanup**: Automatically removes event listeners when disconnected from DOM to prevent memory leaks\n- **Keyboard Navigation**: Arrow keys navigate between squares, focus selects default square\n- **Current Square Selection**: Visual indication of selected square with green outline\n\n#### Attributes\n\n- `hide-labels`: Boolean attribute to hide file/rank labels without affecting board logic or piece placement. Use it as a DOM attribute (`<chess-board hide-labels>`) or with `toggleAttribute('hide-labels', true/false)`. When set to `false` explicitly, the attribute is treated as off.\n- `disable-piece-removal`: Boolean attribute that disables calls to `removePiece()` and delete-style interactions; the board stays visually editable but no piece can be removed until the attribute is cleared.\n- `disable-piece-movement`: Boolean attribute that disables moving a selected piece to another square while preserving the ability to select pieces.\n- `fen`: Standard FEN or FFEN string to set the board position. The component auto-detects whether the input is a normal FEN or a fairy-aware FFEN string.\n\n#### Methods\n\n##### FEN / FFEN Management\n\n- `setFen(fenOrFfen: string)`: Set board position using either standard FEN or FFEN notation; format is inferred automatically\n- `getFen(): string`: Get the current board state as the active FEN/FFEN string, preserving fairy metadata when present\n- `setStartingPosition()`: Set board to standard starting position\n- `clearBoard()`: Remove all pieces from the board\n\n> There is a single `fen` API now. FFEN support is handled automatically by the same attribute and method, so there is no separate `ffen` state to synchronize.\n\n##### Square Selection\n\n- `getCurrentSquare(): string | null`: Get the current keyboard-navigation square\n- `selectSquare(coordinate: string)`: Set the current square without selecting a piece\n- `getSelectedPieceSquare(): string | null`: Get the selected piece's square, if any\n- `selectPiece(coordinate: string): boolean`: Set the current square and select its piece. Returns `true` when the square contains a piece; otherwise clears the current piece selection and returns `false`. Throws an error for an invalid coordinate.\n- `unselectPiece(): void`: Clears the selected-piece state without changing the underlying board position\n\n```javascript\nconst board = document.querySelector('chess-board');\n\nconst selected = board.selectPiece('e4');\nconsole.log(selected); // true\n\nboard.unselectPiece();\nconsole.log(board.getSelectedPieceSquare()); // null\n\nboard.removePiece('e4');\nconsole.log(board.getCurrentSquare()); // null when the removed square was current\n```\n\nWhen a piece is removed from the current square, the board also clears the current-square state so the UI does not keep a stale active cell.\n\n##### Programmatic Piece Manipulation\n\nThe chess board provides a complete API for programmatic manipulation of pieces, allowing you to build chess applications without relying on keyboard input:\n\n###### Adding and Removing Pieces\n\n```typescript\n// Get the chess board element\nconst board = document.querySelector('chess-board') as ChessBoard;\n\n// Add a piece to a square\nboard.addPiece('e4', 'q', 'w');              // White queen on e4\nboard.addPiece('d4', 'k', 'b', '45');        // Black king on d4, rotated 45°\n\n// Remove a piece from a square\nboard.removePiece('e4');                     // Remove piece from e4\n\n// Check if a square has a piece\nif (board.hasPiece('d4')) {\n  console.log('Square d4 is occupied');\n}\n\n// Get piece information\nconst piece = board.getPieceAt('d4');\nif (piece) {\n  console.log(`Piece at d4: ${piece.color} ${piece.type}, rotation: ${piece.rotation}`);\n  // Output: \"Piece at d4: b k, rotation: 45\"\n}\n```\n\n###### Disabling interactive edits\n\n```html\n<chess-board disable-piece-removal disable-piece-movement hide-labels></chess-board>\n```\n\n```javascript\nconst board = document.querySelector('chess-board');\n\nboard.disablePieceRemoval = true;\nboard.disablePieceMovement = true;\nboard.toggleAttribute('hide-labels', true);\n\nboard.selectPiece('e4');\nboard.unselectPiece();\n```\n\nThe `disable-piece-removal` and `disable-piece-movement` attributes are useful when the board is used for display-only scenarios or when a custom interaction layer handles move and deletion logic explicitly.\n\n**Methods:**\n\n- `addPiece(square: string, type: ChessPieceType, color: ChessPieceColor, rotation?: ChessPieceRotation): void`\n  - Adds a piece to the specified square (replaces existing piece if present)\n  - Throws `Error` if square coordinate is invalid\n- `removePiece(square: string): void`\n  - Removes piece from the specified square (no-op if square is empty)\n  - Throws `Error` if square coordinate is invalid\n- `hasPiece(square: string): boolean`\n  - Returns `true` if square has a piece, `false` if empty\n  - Throws `Error` if square coordinate is invalid\n- `getPieceAt(square: string): Omit<PieceInfo, 'square'> | null`\n  - Returns piece information or `null` if square is empty\n  - Throws `Error` if square coordinate is invalid\n\n###### Bulk Operations\n\n```typescript\n// Get all pieces on the board\nconst pieces = board.getAllPieces();\nconsole.log(`Board has ${pieces.length} pieces`);\npieces.forEach(piece => {\n  console.log(`${piece.color} ${piece.type} on ${piece.square}`);\n});\n\n// Set multiple pieces at once (clears board first)\nboard.setPieces([\n  { square: 'e1', type: 'k', color: 'w', rotation: '0' },\n  { square: 'e8', type: 'k', color: 'b', rotation: '0' },\n  { square: 'd1', type: 'q', color: 'w', rotation: '45' },\n  { square: 'd8', type: 'q', color: 'b' }  // rotation is optional\n]);\n```\n\n**Methods:**\n\n- `getAllPieces(): PieceInfo[]`\n  - Returns array of all pieces currently on the board\n  - Each item includes `square`, `type`, `color`, and `rotation`\n- `setPieces(pieces: Array<Omit<PieceInfo, 'rotation'> & { rotation?: ChessPieceRotation }>): void`\n  - Clears board and sets multiple pieces at once\n  - Validates all coordinates before making any changes\n  - Throws `Error` if any coordinate is invalid\n\n###### Piece Rotation\n\n```typescript\n// Rotate piece by relative amount\nboard.addPiece('e4', 'n', 'w', '0');\nboard.rotatePiece('e4', 45);                // Rotate clockwise by 45°\nboard.rotatePiece('e4', -45);               // Rotate counter-clockwise by 45°\nboard.rotatePiece('e4', 100);               // Rounds to nearest 45° (becomes 90°)\n\n// Set absolute rotation\nboard.setPieceRotation('e4', '180');        // Set to 180°\n\n// Get current rotation\nconst rotation = board.getPieceRotation('e4');\nconsole.log(`Rotation: ${rotation}°`);\n```\n\n**Methods:**\n\n- `rotatePiece(square: string, degrees: number): void`\n  - Rotates piece by relative amount (rounds to nearest 45°)\n  - Throws `Error` if square is invalid or empty\n- `setPieceRotation(square: string, rotation: ChessPieceRotation): void`\n  - Sets absolute rotation (0, 45, 90, 135, 180, 225, 270, 315)\n  - Throws `Error` if square is invalid or empty\n- `getPieceRotation(square: string): ChessPieceRotation | null`\n  - Returns current rotation or `null` if square is empty\n  - Throws `Error` if square coordinate is invalid\n\n###### Board Orientation\n\n```typescript\n// Set board orientation\nboard.setOrientation('white');              // White at bottom (default)\nboard.setOrientation('black');              // Black at bottom (rotated 180°)\n\n// Get current orientation\nconst orientation = board.getOrientation(); // 'white' | 'black'\n\n// Toggle orientation\nboard.toggleOrientation();                  // Switch between white/black\n```\n\n**Methods:**\n\n- `setOrientation(orientation: 'white' | 'black'): void`\n  - Sets which side is at the bottom of the board\n- `getOrientation(): 'white' | 'black'`\n  - Returns current board orientation\n- `toggleOrientation(): void`\n  - Switches between white and black orientation\n\n###### TypeScript Types\n\n```typescript\nimport type { PieceInfo, ChessPieceType, ChessPieceColor, ChessPieceRotation } from '@dardino/chess-board';\n\ninterface PieceInfo {\n  square: string;                           // e.g., 'e4', 'a1'\n  type: ChessPieceType;                     // 'k' | 'q' | 'r' | 'b' | 'n' | 'p' | 'e' | 't' | 'a'\n  color: ChessPieceColor;                   // 'w' | 'b' | 'n'\n  rotation: ChessPieceRotation;             // '0' | '45' | '90' | '135' | '180' | '225' | '270' | '315'\n}\n```\n\n###### Complete Example\n\n```typescript\nimport { ChessBoard, type PieceInfo } from '@dardino/chess-board';\n\n// Setup a chess problem\nconst board = document.querySelector('chess-board') as ChessBoard;\n\n// Clear board and add specific position\nboard.clearBoard();\nboard.addPiece('e1', 'k', 'w');\nboard.addPiece('e8', 'k', 'b');\nboard.addPiece('h7', 'q', 'w', '45');  // Rotated queen for problem composition\n\n// Animate piece rotation\nlet currentRotation = 0;\nsetInterval(() => {\n  currentRotation = (currentRotation + 45) % 360;\n  board.setPieceRotation('h7', currentRotation.toString() as ChessPieceRotation);\n}, 500);\n\n// Save and restore position\nconst savedPosition = board.getAllPieces();\n// ... later ...\nboard.setPieces(savedPosition);\n\n// Check position validity\nfunction hasKing(color: 'w' | 'b'): boolean {\n  return board.getAllPieces().some(p => p.type === 'k' && p.color === color);\n}\n\nif (!hasKing('w') || !hasKing('b')) {\n  console.warn('Invalid position: missing king(s)');\n}\n```\n\n###### HTML Example\n\nComplete HTML page with programmatic API usage:\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Chess Board - Programmatic API Demo</title>\n  \n  <!-- Load chess piece font -->\n  <link rel=\"stylesheet\" href=\"./assets/ScacchiPainter.css\" />\n  \n  <style>\n    body {\n      font-family: Arial, sans-serif;\n      max-width: 800px;\n      margin: 2rem auto;\n      padding: 0 1rem;\n    }\n    \n    chess-board {\n      width: 100%;\n      max-width: 500px;\n      display: block;\n      margin: 2rem auto;\n    }\n    \n    .controls {\n      display: flex;\n      gap: 0.5rem;\n      flex-wrap: wrap;\n      justify-content: center;\n      margin: 1rem 0;\n    }\n    \n    button {\n      padding: 0.5rem 1rem;\n      cursor: pointer;\n    }\n  </style>\n</head>\n<body>\n  <h1>Chess Board - Programmatic API Demo</h1>\n  \n  <chess-board id=\"board\"></chess-board>\n  \n  <div class=\"controls\">\n    <button onclick=\"addQueenE4()\">Add Queen on e4</button>\n    <button onclick=\"rotateE4()\">Rotate e4 +45°</button>\n    <button onclick=\"removeE4()\">Remove e4</button>\n    <button onclick=\"setupPosition()\">Setup Position</button>\n    <button onclick=\"clearBoard()\">Clear Board</button>\n  </div>\n  \n  <div id=\"info\"></div>\n  \n  <script type=\"module\">\n    import '@dardino/chess-board';\n    \n    const board = document.getElementById('board');\n    const info = document.getElementById('info');\n    \n    // Add queen on e4\n    window.addQueenE4 = () => {\n      board.addPiece('e4', 'q', 'w');\n      updateInfo();\n    };\n    \n    // Rotate piece on e4\n    window.rotateE4 = () => {\n      if (board.hasPiece('e4')) {\n        board.rotatePiece('e4', 45);\n        updateInfo();\n      } else {\n        alert('No piece on e4!');\n      }\n    };\n    \n    // Remove piece from e4\n    window.removeE4 = () => {\n      board.removePiece('e4');\n      updateInfo();\n    };\n    \n    // Setup a test position\n    window.setupPosition = () => {\n      board.setPieces([\n        { square: 'e1', type: 'k', color: 'w', rotation: '0' },\n        { square: 'e8', type: 'k', color: 'b', rotation: '0' },\n        { square: 'd1', type: 'q', color: 'w', rotation: '0' },\n        { square: 'e4', type: 'n', color: 'w', rotation: '45' }\n      ]);\n      updateInfo();\n    };\n    \n    // Clear board\n    window.clearBoard = () => {\n      board.clearBoard();\n      updateInfo();\n    };\n    \n    // Update info display\n    function updateInfo() {\n      const pieces = board.getAllPieces();\n      info.innerHTML = `<strong>Pieces on board (${pieces.length}):</strong><br>` +\n        pieces.map(p => `${p.square}: ${p.color} ${p.type} (${p.rotation}°)`).join('<br>');\n    }\n    \n    // Initial update\n    updateInfo();\n  </script>\n</body>\n</html>\n```\n\n###### TypeScript Example\n\nComplete TypeScript example with type safety:\n\n```typescript\nimport { ChessBoard, type PieceInfo, type ChessPieceType, type ChessPieceColor } from '@dardino/chess-board';\n\n// Get board element with proper typing\nconst board = document.querySelector('chess-board') as ChessBoard;\n\n// Example 1: Add pieces with validation\nfunction addPieceWithValidation(square: string, type: ChessPieceType, color: ChessPieceColor): void {\n  try {\n    board.addPiece(square, type, color);\n    console.log(`Added ${color} ${type} on ${square}`);\n  } catch (error) {\n    console.error(`Failed to add piece: ${error.message}`);\n  }\n}\n\n// Example 2: Animate piece rotation\nfunction animateRotation(square: string, duration: number = 2000): void {\n  if (!board.hasPiece(square)) {\n    console.error(`No piece on ${square} to animate`);\n    return;\n  }\n  \n  const steps = 8; // 8 steps = 360° / 45°\n  const interval = duration / steps;\n  let step = 0;\n  \n  const animation = setInterval(() => {\n    if (step >= steps) {\n      clearInterval(animation);\n      return;\n    }\n    \n    try {\n      board.rotatePiece(square, 45);\n      step++;\n    } catch (error) {\n      console.error('Animation stopped:', error.message);\n      clearInterval(animation);\n    }\n  }, interval);\n}\n\n// Example 3: Position validator\ninterface PositionValidation {\n  isValid: boolean;\n  errors: string[];\n}\n\nfunction validatePosition(): PositionValidation {\n  const pieces = board.getAllPieces();\n  const errors: string[] = [];\n  \n  // Check for kings\n  const whiteKings = pieces.filter(p => p.type === 'k' && p.color === 'w');\n  const blackKings = pieces.filter(p => p.type === 'k' && p.color === 'b');\n  \n  if (whiteKings.length === 0) errors.push('Missing white king');\n  if (whiteKings.length > 1) errors.push('Multiple white kings');\n  if (blackKings.length === 0) errors.push('Missing black king');\n  if (blackKings.length > 1) errors.push('Multiple black kings');\n  \n  return {\n    isValid: errors.length === 0,\n    errors\n  };\n}\n\n// Example 4: Save and load positions\nclass PositionManager {\n  private savedPositions: Map<string, PieceInfo[]> = new Map();\n  \n  save(name: string): void {\n    const position = board.getAllPieces();\n    this.savedPositions.set(name, position);\n    console.log(`Saved position \"${name}\" with ${position.length} pieces`);\n  }\n  \n  load(name: string): boolean {\n    const position = this.savedPositions.get(name);\n    if (!position) {\n      console.error(`Position \"${name}\" not found`);\n      return false;\n    }\n    \n    board.setPieces(position);\n    console.log(`Loaded position \"${name}\"`);\n    return true;\n  }\n  \n  list(): string[] {\n    return Array.from(this.savedPositions.keys());\n  }\n}\n\n// Example 5: Interactive piece placement\nclass PiecePlacer {\n  private selectedPieceType: ChessPieceType = 'p';\n  private selectedPieceColor: ChessPieceColor = 'w';\n  \n  constructor(private board: ChessBoard) {\n    this.setupClickHandler();\n  }\n  \n  selectPiece(type: ChessPieceType, color: ChessPieceColor): void {\n    this.selectedPieceType = type;\n    this.selectedPieceColor = color;\n    console.log(`Selected: ${color} ${type}`);\n  }\n  \n  private setupClickHandler(): void {\n    this.board.addEventListener('cellClick', (event: CustomEvent) => {\n      const { cell } = event.detail;\n      \n      try {\n        this.board.addPiece(cell, this.selectedPieceType, this.selectedPieceColor);\n        console.log(`Placed ${this.selectedPieceColor} ${this.selectedPieceType} on ${cell}`);\n      } catch (error) {\n        console.error(`Failed to place piece: ${error.message}`);\n      }\n    });\n  }\n}\n\n// Usage examples\naddPieceWithValidation('e4', 'q', 'w');\naddPieceWithValidation('d4', 'n', 'b');\n\n// Start rotation animation on e4\nanimateRotation('e4', 2000);\n\n// Validate current position\nconst validation = validatePosition();\nif (!validation.isValid) {\n  console.warn('Invalid position:', validation.errors);\n}\n\n// Position management\nconst manager = new PositionManager();\nmanager.save('opening');\n// ... make changes ...\nmanager.load('opening'); // restore\n\n// Interactive placement\nconst placer = new PiecePlacer(board);\nplacer.selectPiece('q', 'w'); // Now clicking board places white queens\n```\n\n#### Events\n\n- `cellMainClick`: Preferred event fired when the main mouse button is used on a square\n  - **Detail**: `{ square: string, piece?: CellClickPiece, button: 'main' }`\n  - **square**: Square coordinate in algebraic notation (e.g., \"e4\", \"a1\")\n  - **piece**: Optional piece information if present on the square\n    - `color`: \"white\" | \"black\" | \"neutral\"\n    - `type`: Piece type (\"p\", \"r\", \"n\", \"b\", \"q\", \"k\", \"e\", \"t\", \"a\")\n    - `rotation?`: Piece rotation in degrees (0-315)\n    - `fairyName?`: Fairy chess name annotation (if present)\n    - `fairyCondition?`: Fairy chess condition annotation (if present)\n- `cellContextClick`: Fired when the context mouse button is used on a square\n- `cellAuxiliaryClick`: Fired when the auxiliary/middle mouse button is used on a square\n- `cellClick`: Deprecated alias for `cellMainClick`, kept for backward compatibility with the pre-3-button event naming\n\n#### Keyboard Navigation\n\nThe chess board supports comprehensive keyboard navigation when focused:\n\n- **Focus**: Tab to focus the board, automatically selects \"a1\" if no square is selected\n- **Arrow Keys**: Navigate between squares\n  - `↑/↓`: Move along ranks (rows), direction respects board rotation\n  - `←/→`: Move along files (columns)\n- **Space / Enter**: Select, deselect, or move the piece on the current square\n- **Shift + move**: Clone the selected piece while moving it\n- **Ctrl + move**: Clone the selected piece and invert its color\n- **Delete**: Remove piece from current square\n- **Escape**: Clear all pieces from the board\n- **Shift+Escape**: Reset board to starting position\n- **Mouse buttons**: Primary click selects/moves; auxiliary (middle) click removes any piece on the target square; context click emits a dedicated context event\n- **Piece Keys**: Add or replace piece on current square\n  - **White pieces**: `P`, `R`, `N`, `B`, `Q`, `K` (uppercase)\n  - **Black pieces**: `p`, `r`, `n`, `b`, `q`, `k` (lowercase)\n  - **Fairy pieces**: `E/e` (Empress), `T/t` (Dragon), `A/a` (Angel/Archbishop)\n- **Piece Rotation** (Alt/Option + Arrow): Rotate piece on current square\n  - `Alt+←` / `Option+←`: Rotate counter-clockwise by 45°\n  - `Alt+→` / `Option+→`: Rotate clockwise by 45°\n  - `Alt+↑` / `Option+↑`: Reset rotation to 0°\n  - `Alt+↓` / `Option+↓`: Set rotation to 180°\n- **Cell Decorators** (Programmatic API): Add an internal overlay to any square under the piece layer\n  - `setCellDecorators({ e4: { backgroundColor: '#ffeb3b', innerBorder: 'solid 2px #d97706' } })`\n- **Board Flip** (Shift + Arrow): Change board orientation\n  - `Shift+↑`: White perspective (normal)\n  - `Shift+↓`: Black perspective (rotated 180°)\n- **Click**: Click any square to select it; auxiliary click removes an occupied piece from that square\n- **Visual Feedback**: Selected square shows green outline when board is focused\n- **Clone editing**: Drag/move a selected piece while holding Shift to clone it; hold Ctrl to clone and invert the color\n\n#### Methods\n\n#### CSS Variables\n\n```css\nchess-board {\n  --chess-border-color: #000;\n  --chess-light-square: #f0d9b5;\n  --chess-dark-square: #b58863;\n  --chess-piece-color: #333;\n  --chess-piece-bg: #fff;\n}\n```\n\n### ChessPiece Component\n\nThe `chess-piece` element renders an individual chess piece with support for rotation and fairy chess notation.\n\n#### Attributes\n\n- `piece`: Piece type (`k`, `q`, `r`, `b`, `n`, `p`, `e`, `t`, `a`)\n- `color`: Piece color (`w` for white, `b` for black, `n` for neutral)\n- `rotation`: Piece rotation in degrees (0, 45, 90, 135, 180, 225, 270, 315)\n- `fairy-name`: Fairy chess name annotation (max 3 characters, displayed top-left)\n- `fairy-condition`: Fairy chess condition annotation (displayed bottom-right)\n\n#### Methods\n\n- `setPiece(piece: ChessPieceType, color: ChessPieceColor)`: Set piece type and color\n- `getPiece(): ChessPieceType`: Get current piece type\n- `getColor(): ChessPieceColor`: Get current piece color\n- `setRotation(degrees: ChessPieceRotation)`: Set piece rotation\n- `getRotation(): ChessPieceRotation`: Get current rotation\n- `setFairyName(name: string)`: Set fairy name (max 3 chars)\n- `getFairyName(): string`: Get fairy name\n- `setFairyCondition(condition: string)`: Set fairy condition\n- `getFairyCondition(): string`: Get fairy condition\n\n#### Types\n\n```typescript\ntype ChessPieceType = 'k' | 'q' | 'r' | 'b' | 'n' | 'p' | 'e' | 't' | 'a';\ntype ChessPieceColor = 'w' | 'b' | 'n';\ntype ChessPieceRotation = 0 | 45 | 90 | 135 | 180 | 225 | 270 | 315;\n```\n\n#### Examples\n\n```html\n<!-- Rotated piece -->\n<chess-piece piece=\"n\" color=\"w\" rotation=\"90\"></chess-piece>\n\n<!-- Fairy chess notation -->\n<chess-piece piece=\"e\" color=\"w\" fairy-name=\"EMP\" fairy-condition=\"(a)\"></chess-piece>\n\n<!-- Combined rotation and fairy notation -->\n<chess-piece piece=\"t\" color=\"b\" rotation=\"45\" fairy-name=\"T\" fairy-condition=\"(h)\"></chess-piece>\n```\n\n## FEN Utilities\n\nThe library provides comprehensive utilities for working with Forsyth-Edwards Notation.\n\n### FEN Format\n\nFEN uses the format: `rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1`\n\n- **Piece placement**: 8 ranks separated by `/`, empty squares as numbers\n- **Active color**: `w` (white) or `b` (black)\n- **Castling rights**: `KQkq` (kingside/queenside for both colors) or `-`\n- **En passant target**: Square coordinate or `-`\n- **Halfmove clock**: Moves since last capture/pawn advance\n- **Fullmove number**: Current move number\n\n### Piece Notation\n\n| Piece | White | Black | Description |\n| ------- | ------- | ------- | ------------- |\n| King | `K` | `k` | King |\n| Queen | `Q` | `q` | Queen |\n| Rook | `R` | `r` | Rook |\n| Bishop | `B` | `b` | Bishop |\n| Knight | `N` | `n` | Knight |\n| Pawn | `P` | `p` | Pawn |\n\n### FEN Functions\n\n```typescript\nimport { parseFen, positionToFen, parsePiecePlacement, piecesToFenString, getStartingPositionFen, getEmptyBoardFen } from '@dardino/chess-board';\n\n// Parse complete FEN string\nconst position = parseFen('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1');\nconsole.log(position ? Object.keys(position.pieces).length : 0); // 32\nconsole.log(position?.activeColor); // 'w'\n\n// Convert position back to FEN\nconst fen = positionToFen(position);\n\n// Parse only piece placement\nconst placement = parsePiecePlacement('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR');\nconsole.log(placement ? Object.keys(placement.pieces).length : 0); // 32\n\n// Convert pieces back to FEN string\nconst pieceFen = placement ? piecesToFenString(placement.pieces) : '';\nconsole.log(pieceFen); // 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR'\n\n// Get standard positions\nconst startingFen = getStartingPositionFen();\nconst emptyFen = getEmptyBoardFen();\n```\n\n### Types\n\n```typescript\ninterface PieceInfo {\n  type: ChessPieceType;\n  color: ChessPieceColor;\n  rotation?: ChessPieceRotation;\n  fairyName?: string;\n  fairyCondition?: string;\n}\n\ninterface FenPosition {\n  pieces: Record<string, PieceInfo | null>;\n  activeColor: 'w' | 'b';\n  castlingRights: string;\n  enPassantTarget: string;\n  halfmoveClock: number;\n  fullmoveNumber: number;\n}\n```\n\n### Examples\n\n#### Parse Starting Position\n\n```typescript\nconst startingPosition = parseFen('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1');\n\nconsole.log(startingPosition?.pieces.e1);\n// { type: 'k', color: 'w' }\n\nconsole.log(startingPosition?.pieces.e8);\n// { type: 'k', color: 'b' }\n```\n\n#### Create Custom Position\n\n```typescript\nconst customPieces: Record<string, PieceInfo> = {\n  e1: { type: 'k', color: 'w' },\n  d1: { type: 'q', color: 'w' },\n  e8: { type: 'k', color: 'b' }\n};\n\nconst customFen = piecesToFenString(customPieces);\nconsole.log(customFen); // '4k3/8/8/8/8/8/8/8/3QK3'\n```\n\n#### Validate FEN\n\n```typescript\nconst validPosition = parseFen('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1');\nconst invalidPosition = parseFen('invalid-fen');\n\nconsole.log(validPosition !== null); // true\nconsole.log(invalidPosition === null); // true\n```\n\n## Responsive Behavior\n\nThe chess board automatically adapts to its container size using modern **CSS Container Queries**:\n\n- **Container Type**: `inline-size` for width-based responsive design\n- **Grid Layout**: 10x10 CSS Grid (8x8 board squares + border labels on all sides)\n- **Font Scaling**:\n  - Pieces: `12.5cqw` for squares, `0.8em` for pieces (80% of square font size)\n  - Labels: `8cqw` for column/row labels on all sides\n- **Aspect Ratio**: Maintains perfect square proportions with `aspect-ratio: 1`\n- **Minimum Size**: 200px x 200px to ensure readability\n\n### Label Positioning\n\nStandard chess notation labels on all four sides:\n\n- **Top & Bottom**: Column letters (a-h) for coordinate reference\n- **Left & Right**: Row numbers (8-1) for coordinate reference\n- **Orientation**: Viewed from white player's perspective (8th rank at top, 1st rank at bottom)\n- **Symmetry**: Labels duplicated on opposite sides for better readability\n\n### Container Query Implementation\n\n```css\n.board {\n  container-type: inline-size;\n  display: grid;\n  grid-template-columns: repeat(10, 1fr); /* 10 columns for labels + board */\n  grid-template-rows: repeat(10, 1fr);    /* 10 rows for labels + board */\n}\n\n.square {\n  font-size: 12.5cqw; /* Scales with container width */\n}\n\n.label {\n  font-size: 8cqw; /* Smaller labels that also scale */\n}\n```\n\nThis ensures the chess board remains perfectly proportioned and readable at any size while providing comprehensive chess notation reference.\n","readmeFilename":"README.md"}