{"_id":"@cubingcenter/viz","_rev":"7-5988f87c4f1451d9195d0832992fa166","name":"@cubingcenter/viz","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.0":{"name":"@cubingcenter/viz","version":"0.1.0","author":{"name":"CubingCenter"},"license":"MIT","_id":"@cubingcenter/viz@0.1.0","maintainers":[{"name":"cubingcenter","email":"cubingdotcenter@gmail.com"}],"dist":{"shasum":"e0030a15edc67d303fb3d198451aa9ccbafdfcf6","tarball":"https://registry.npmjs.org/@cubingcenter/viz/-/viz-0.1.0.tgz","fileCount":57,"integrity":"sha512-BN66ioEEymhpACcST+tKRYBarPdB+HndrIWd07NhkaeQQYMaVA2J7w2FUNhe4xeEQsWgax0kcaqCj9fnukebtA==","signatures":[{"sig":"MEYCIQC+Ia2Av8Zs70f4X4WXctua+Ze5U6gxMbVECFA6JB3eoAIhAIldCmB1V25lLQYA3tM6vJ+rbeA6By270zYEOQspyFLf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":426964},"type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"214859d8e13247a37b08e515cc0e958a22880188","scripts":{"lint":"tsc -p tsconfig.json --noEmit","build":"tsc -p tsconfig.json"},"_npmUser":{"name":"cubingcenter","email":"cubingdotcenter@gmail.com"},"_npmVersion":"11.8.0","description":"2D puzzle visualizer for CubingCenter projects. Canvas-based, framework-agnostic.","directories":{},"_nodeVersion":"24.13.1","_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"typescript":"^5.9.0"},"_npmOperationalInternal":{"tmp":"tmp/viz_0.1.0_1784770887517_0.14311174585241582","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@cubingcenter/viz","version":"0.2.0","author":{"name":"CubingCenter"},"license":"MIT","_id":"@cubingcenter/viz@0.2.0","maintainers":[{"name":"cubingcenter","email":"cubingdotcenter@gmail.com"}],"dist":{"shasum":"e9e163b4638deffc7af0d7a850790981e0d25ee2","tarball":"https://registry.npmjs.org/@cubingcenter/viz/-/viz-0.2.0.tgz","fileCount":65,"integrity":"sha512-KvfSQqBuTLu9hiGDGsIqfPz+LmdeHC1BBjmfnKaloNukkLLS4cnstRa7Dl4AY//nWjn+kt6OHJbnWTF/gFLl8g==","signatures":[{"sig":"MEUCIHv1LWny6vUWGfPNMSIAT8j0TlntFm7KJDuhpFKbA9iWAiEAqd/Vp90DmtfTWerzJFIi71fHMm81UkFwSTwZifU1Vns=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":475911},"type":"module","_from":"file:cubingcenter-viz-0.2.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"lint":"tsc -p tsconfig.json --noEmit","build":"tsc -p tsconfig.json"},"_npmUser":{"name":"cubingcenter","email":"cubingdotcenter@gmail.com"},"_resolved":"/tmp/270c5283f8d5db38b6c0b8c3436c9bd1/cubingcenter-viz-0.2.0.tgz","_integrity":"sha512-KvfSQqBuTLu9hiGDGsIqfPz+LmdeHC1BBjmfnKaloNukkLLS4cnstRa7Dl4AY//nWjn+kt6OHJbnWTF/gFLl8g==","_npmVersion":"11.8.0","description":"2D puzzle visualizer for CubingCenter projects. Canvas-based, framework-agnostic.","directories":{},"_nodeVersion":"24.13.1","dependencies":{"cubing":"0.60.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0"},"_npmOperationalInternal":{"tmp":"tmp/viz_0.2.0_1786123548208_0.9111043078565977","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@cubingcenter/viz","version":"0.3.0","keywords":["cubing","visualizer","canvas","rubiks-cube","speedcubing","2d","wca","puzzle"],"author":{"name":"CubingCenter"},"license":"MIT","_id":"@cubingcenter/viz@0.3.0","maintainers":[{"name":"cubingcenter","email":"cubingdotcenter@gmail.com"}],"homepage":"https://github.com/diegoagdiaz/cubingcenter-viz#readme","bugs":{"url":"https://github.com/diegoagdiaz/cubingcenter-viz/issues"},"dist":{"shasum":"d2d400658b0c622b033376049fa72acc6ed275b5","tarball":"https://registry.npmjs.org/@cubingcenter/viz/-/viz-0.3.0.tgz","fileCount":62,"integrity":"sha512-eVIWmaLgwz92YjZAI85Mg+qQEUd6eB2peeUskl2UaxedDeHRi7ZzGWIhq6AmRr29I96kBFbuTzQoGxO+BqIyDQ==","signatures":[{"sig":"MEYCIQCdnjOhFcKudSzgpFTn0b8/yYfzPGyRoRcDjChEAc8/tAIhAJyLwgoFaku/se4OE9jJJsJbTfxv84cR128nhLCD/8/I","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":579216},"main":"./dist/index.js","type":"module","_from":"file:cubingcenter-viz-0.3.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"pnpm build && node test/test-pyraminx.mjs && node test/test-skewb.mjs && node test/test-fto.mjs && node test/test-sq1.mjs","build":"pnpm clean && tsc -p tsconfig.json","clean":"node -e \"const fs = require('fs'); fs.rmSync('dist', { recursive: true, force: true });\"","verify":"pnpm lint && pnpm test && pnpm package:check","preview":"python3 -m http.server 3333","package:check":"pnpm build && npm pack --dry-run"},"_npmUser":{"name":"cubingcenter","email":"cubingdotcenter@gmail.com"},"_resolved":"/tmp/99b00bd4e2da4530e2af1fd3755df758/cubingcenter-viz-0.3.0.tgz","_integrity":"sha512-eVIWmaLgwz92YjZAI85Mg+qQEUd6eB2peeUskl2UaxedDeHRi7ZzGWIhq6AmRr29I96kBFbuTzQoGxO+BqIyDQ==","repository":{"url":"git+https://github.com/diegoagdiaz/cubingcenter-viz.git","type":"git"},"_npmVersion":"11.16.0","description":"2D puzzle visualizer for CubingCenter projects. Canvas-based, framework-agnostic.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.0","cubing":"0.60.0","playwright":"^1.62.1","typescript":"^5.9.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/viz_0.3.0_1788224495477_0.3898764434886728","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@cubingcenter/viz","version":"0.3.1","keywords":["cubing","visualizer","canvas","rubiks-cube","speedcubing","2d","wca","puzzle"],"author":{"name":"CubingCenter"},"license":"MIT","_id":"@cubingcenter/viz@0.3.1","maintainers":[{"name":"cubingcenter","email":"cubingdotcenter@gmail.com"}],"homepage":"https://github.com/diegoagdiaz/cubingcenter-viz#readme","bugs":{"url":"https://github.com/diegoagdiaz/cubingcenter-viz/issues"},"dist":{"shasum":"14d06e1af58ef90b5df35c29adf4918fdec2878a","tarball":"https://registry.npmjs.org/@cubingcenter/viz/-/viz-0.3.1.tgz","fileCount":62,"integrity":"sha512-+hEWJV9ATrvHiSVgYr3vCyRCWqcTTmj61XdhGGsigJbPXQj+0byg+I9ABZvF7EJq9WZF0lOvRLsU1P/W6WOotA==","signatures":[{"sig":"MEUCIHniaBqF3tn65jjhmWQCJQS1y7Ey7IYJjXvV04qFh0U5AiEAtBjgjp7iDcCH+vSaquNQP683o4MfV1duTCVpe/DrmGA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":579734},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"bccf9645676ec925d1b9d0d36a098f92a93d19d8","scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"pnpm build && node test/test-pyraminx.mjs && node test/test-skewb.mjs && node test/test-fto.mjs && node test/test-sq1.mjs","build":"pnpm clean && tsc -p tsconfig.json","clean":"node -e \"const fs = require('fs'); fs.rmSync('dist', { recursive: true, force: true });\"","verify":"pnpm lint && pnpm test && pnpm package:check","preview":"python3 -m http.server 3333","package:check":"pnpm build && npm pack --dry-run"},"_npmUser":{"name":"cubingcenter","email":"cubingdotcenter@gmail.com"},"repository":{"url":"git+https://github.com/diegoagdiaz/cubingcenter-viz.git","type":"git"},"_npmVersion":"11.16.0","description":"2D puzzle visualizer for CubingCenter projects. Canvas-based, framework-agnostic.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"tsx":"^4.20.0","cubing":"0.60.0","playwright":"^1.62.1","typescript":"^5.9.0","@playwright/test":"^1.62.1"},"_npmOperationalInternal":{"tmp":"tmp/viz_0.3.1_1788310356117_0.23444794225012688","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@cubingcenter/viz","version":"0.4.0","keywords":["cubing","visualizer","canvas","rubiks-cube","speedcubing","2d","3d","three","wca","puzzle"],"author":{"name":"CubingCenter"},"license":"MIT","_id":"@cubingcenter/viz@0.4.0","maintainers":[{"name":"cubingcenter","email":"cubingdotcenter@gmail.com"}],"homepage":"https://github.com/diegoagdiaz/cubingcenter-viz#readme","bugs":{"url":"https://github.com/diegoagdiaz/cubingcenter-viz/issues"},"dist":{"shasum":"bfddbdcfc7c365b3f6b268bff5275b181255726f","tarball":"https://registry.npmjs.org/@cubingcenter/viz/-/viz-0.4.0.tgz","fileCount":74,"integrity":"sha512-QF3xqWjAGh1LtW8stB57TKBr21Q448DU1HaU3BGmzF7r7vgQrJqGDUpJdmnfDyz39Cl/NKCiTgYFYgVviYkpzg==","signatures":[{"sig":"MEYCIQDIdlWMmo7liw6xuKsBPp8lA3OXoJohj2etu6pUAwP0xwIhALxVT4DoKmmqEK0l+L29LnPq8F4pORvO27qe8Rir6x0/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC+RiHvdidgiqSj8zBN8uOVUW1Ds7RbICWZ6fhmWKekSQIgIhpmrfhHtwrDc4vLDjrLNfAnTu6Md9tqFdriHlFioBA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":672401},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./3d":{"types":"./dist/3d.d.ts","import":"./dist/3d.js"},"./package.json":"./package.json"},"gitHead":"d5b278973d2767c2b0e0a82f730ea3879d1acc1f","scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"pnpm build && node test/test-pyraminx.mjs && node test/test-skewb.mjs && node test/test-fto.mjs && node test/test-sq1.mjs && node test/test-cube3d-state.mjs","build":"pnpm clean && tsc -p tsconfig.json","clean":"node -e \"const fs = require('fs'); fs.rmSync('dist', { recursive: true, force: true });\"","verify":"pnpm lint && pnpm test && pnpm package:check","preview":"python3 -m http.server 3333","package:check":"pnpm build && npm pack --dry-run"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:047b8159-3691-4a38-b9b6-c48f1557e968"}},"repository":{"url":"git+https://github.com/diegoagdiaz/cubingcenter-viz.git","type":"git"},"_npmVersion":"11.20.0","description":"2D and 3D puzzle visualizer for CubingCenter projects. Canvas-based, framework-agnostic.","directories":{},"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"tsx":"^4.20.0","three":"^0.185.1","cubing":"0.60.0","playwright":"^1.62.1","typescript":"^5.9.0","@types/three":"^0.185.4","@playwright/test":"^1.62.1"},"peerDependencies":{"three":">=0.170.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/viz_0.4.0_1790512198103_0.17086858580134234","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@cubingcenter/viz","version":"0.4.1","keywords":["cubing","visualizer","canvas","rubiks-cube","speedcubing","2d","3d","three","wca","puzzle"],"author":{"name":"CubingCenter"},"license":"MIT","_id":"@cubingcenter/viz@0.4.1","maintainers":[{"name":"cubingcenter","email":"cubingdotcenter@gmail.com"}],"homepage":"https://github.com/diegoagdiaz/cubingcenter-viz#readme","bugs":{"url":"https://github.com/diegoagdiaz/cubingcenter-viz/issues"},"dist":{"shasum":"ba7c2c416b8270296587cbba141ce70af39d7ba9","tarball":"https://registry.npmjs.org/@cubingcenter/viz/-/viz-0.4.1.tgz","fileCount":74,"integrity":"sha512-w7jN4cE4jB49YOwzUKsDv3L132c+q6h03h/5TvqEc8AIdhQe7Gk8W9WyaG9N+XXZFsf/E4kobzRd3CeoIu3A5Q==","signatures":[{"sig":"MEUCIGdSRw5diBddM7mkKqnTkTOKSEYthWW28eEkr2+5kNj/AiEAhoDNCuysoWdOYimmVErkEO6IFX/r/KSuZIkE7D+Mukg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCT7QkzxTRCSgab+rhsxW2zzJL91WcsWphwozXUaunZvwIgPE6pgU5kbTSlb0TTxqupIdMep9tfrolCVa9fccCr5ik=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":675532},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./3d":{"types":"./dist/3d.d.ts","import":"./dist/3d.js"},"./package.json":"./package.json"},"gitHead":"158f6226dd69906faf1db4378bcb3765614222e6","scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"pnpm build && node test/test-pyraminx.mjs && node test/test-skewb.mjs && node test/test-fto.mjs && node test/test-sq1.mjs && node test/test-cube3d-state.mjs","build":"pnpm clean && tsc -p tsconfig.json","clean":"node -e \"const fs = require('fs'); fs.rmSync('dist', { recursive: true, force: true });\"","verify":"pnpm lint && pnpm test && pnpm package:check","preview":"python3 -m http.server 3333","package:check":"pnpm build && npm pack --dry-run"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:047b8159-3691-4a38-b9b6-c48f1557e968"}},"repository":{"url":"git+https://github.com/diegoagdiaz/cubingcenter-viz.git","type":"git"},"_npmVersion":"11.20.0","description":"2D and 3D puzzle visualizer for CubingCenter projects. Canvas-based, framework-agnostic.","directories":{},"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"tsx":"^4.20.0","three":"^0.185.1","cubing":"0.60.0","playwright":"^1.62.1","typescript":"^5.9.0","@types/three":"^0.185.4","@playwright/test":"^1.62.1"},"peerDependencies":{"three":">=0.170.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/viz_0.4.1_1790523308468_0.03681231442701316","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"_id":"@cubingcenter/viz@0.5.0","bugs":{"url":"https://github.com/diegoagdiaz/cubingcenter-viz/issues"},"dist":{"shasum":"7b324f0ba7d213c70e8370e0c7cbafdecba749ba","tarball":"https://registry.npmjs.org/@cubingcenter/viz/-/viz-0.5.0.tgz","fileCount":74,"integrity":"sha512-VE1CGjb9GXgmjBuRk7ut3sIYERgNoydhpJhdkSgyNyp8h6yO1fkADpm8zfOBWsz3Pv0md45u8ps5tCiUGrH6ZQ==","signatures":[{"sig":"MEYCIQDelWdv2GPa3t4VdH4GpDNTVoEeUFm6yQbI6CIGEdP6nwIhAOBF/eDFz218DEuodeTcKdPbvhMoTr35zD2HWApTJcFW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDCzdGomL8rnTubhCXvTqaEB7URPjcZNRh7IcsbIGoICAiEA+oTdk41gasIrP01iZQ+G8Rdp+DGr6q1H3El4q6qJJhg="}],"unpackedSize":679511},"main":"./dist/index.js","name":"@cubingcenter/viz","type":"module","types":"./dist/index.d.ts","author":{"name":"CubingCenter"},"module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./3d":{"types":"./dist/3d.d.ts","import":"./dist/3d.js"},"./package.json":"./package.json"},"gitHead":"81b7570797b99c250e26866721bf7a06b78c86ce","license":"MIT","scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"pnpm build && node test/test-pyraminx.mjs && node test/test-skewb.mjs && node test/test-fto.mjs && node test/test-sq1.mjs && node test/test-cube3d-state.mjs","build":"pnpm clean && tsc -p tsconfig.json","clean":"node -e \"const fs = require('fs'); fs.rmSync('dist', { recursive: true, force: true });\"","verify":"pnpm lint && pnpm test && pnpm package:check","preview":"python3 -m http.server 3333","package:check":"pnpm build && npm pack --dry-run"},"version":"0.5.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:047b8159-3691-4a38-b9b6-c48f1557e968"}},"homepage":"https://github.com/diegoagdiaz/cubingcenter-viz#readme","keywords":["cubing","visualizer","canvas","rubiks-cube","speedcubing","2d","3d","three","wca","puzzle"],"repository":{"url":"git+https://github.com/diegoagdiaz/cubingcenter-viz.git","type":"git"},"_npmVersion":"11.20.0","description":"2D and 3D puzzle visualizer for CubingCenter projects. Canvas-based, framework-agnostic.","directories":{},"maintainers":[{"name":"cubingcenter","email":"cubingdotcenter@gmail.com"}],"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.0","devDependencies":{"tsx":"^4.20.0","three":"^0.185.1","cubing":"0.60.0","playwright":"^1.62.1","typescript":"^5.9.0","@types/three":"^0.185.4","@playwright/test":"^1.62.1"},"peerDependencies":{"three":">=0.170.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/viz_0.5.0_1790524673321_0.2396889766803092"}}},"time":{"created":"2026-07-23T01:41:27.317Z","modified":"2026-09-27T15:57:53.608Z","0.1.0":"2026-07-23T01:41:27.696Z","0.2.0":"2026-08-07T17:25:48.356Z","0.3.0":"2026-09-01T01:01:35.619Z","0.3.1":"2026-09-02T00:52:36.262Z","0.4.0":"2026-09-27T12:29:58.188Z","0.4.1":"2026-09-27T15:35:08.581Z","0.5.0":"2026-09-27T15:57:53.435Z"},"bugs":{"url":"https://github.com/diegoagdiaz/cubingcenter-viz/issues"},"author":{"name":"CubingCenter"},"license":"MIT","homepage":"https://github.com/diegoagdiaz/cubingcenter-viz#readme","keywords":["cubing","visualizer","canvas","rubiks-cube","speedcubing","2d","3d","three","wca","puzzle"],"repository":{"url":"git+https://github.com/diegoagdiaz/cubingcenter-viz.git","type":"git"},"description":"2D and 3D puzzle visualizer for CubingCenter projects. Canvas-based, framework-agnostic.","maintainers":[{"name":"cubingcenter","email":"cubingdotcenter@gmail.com"}],"readme":"<p align=\"center\">\n  <img src=\"docs/img/logo.png\" alt=\"Cubing Center\" width=\"96\" />\n</p>\n\n<h1 align=\"center\">@cubingcenter/viz</h1>\n\n<p align=\"center\">\n  Visualizador 2D en canvas de cubos y puzzles WCA, sin dependencias.<br />\n  Es el que dibuja las mezclas en <a href=\"https://cubing.center\"><strong>cubing.center</strong></a>.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/@cubingcenter/viz\"><img alt=\"npm\" src=\"https://img.shields.io/npm/v/@cubingcenter/viz?logo=npm&color=CB3837\" /></a>\n  <img alt=\"TypeScript\" src=\"https://img.shields.io/badge/TypeScript-ESM-3178C6?logo=typescript&logoColor=white\" />\n  <img alt=\"Canvas 2D\" src=\"https://img.shields.io/badge/Canvas-2D-E34F26?logo=html5&logoColor=white\" />\n  <img alt=\"Sin dependencias\" src=\"https://img.shields.io/badge/dependencias-0-brightgreen\" />\n  <img alt=\"Licencia MIT\" src=\"https://img.shields.io/badge/licencia-MIT-blue\" />\n</p>\n\n---\n\n`@cubingcenter/viz` recibe una mezcla en notación WCA y la dibuja sobre un\n`<canvas>` como el estado que tiene que quedar en el puzzle. No depende de\nningún framework ni de ninguna librería en tiempo de ejecución, así que\nfunciona igual en Svelte, React, Vue o HTML plano.\n\n<picture>\n  <source media=\"(prefers-color-scheme: dark)\" srcset=\"docs/img/galeria-oscuro.png\" />\n  <img alt=\"Galería: 2x2, 3x3, 4x4, 5x5, 7x7, Megaminx, Pyraminx, Skewb, Square-1 y FTO dibujados con @cubingcenter/viz a partir de mezclas reales.\" src=\"docs/img/galeria-claro.png\" />\n</picture>\n\n<sub>Mezclas generadas por <a href=\"https://github.com/diegoagdiaz/cubingcenter-scrambler\"><code>@cubingcenter/scrambler</code></a> con la semilla <code>readme</code>. Fuente de la imagen: <code>docs/img/galeria.html</code>.</sub>\n\n## Funciones\n\n- **Todas las categorías con dibujo**: cubos de 2x2 a 7x7, Megaminx,\n  Pyraminx, Skewb, Square-1, Clock y FTO.\n- **Mezclas completas**: cada visualizador interpreta su notación, incluidos\n  giros anchos (`Rw`, `3Rw`), rotaciones (`x y z`), cortes (`M E S`), puntas\n  de Pyraminx y giros de Square-1.\n- **Vista de última capa** para OLL y PLL en 3x3 (`mask: \"ll\"`), con flechas\n  para los ciclos de PLL.\n- **Estilo configurable**: tamaño, separación entre stickers y caras, bordes,\n  esquinas redondeadas, fondo y paleta de colores.\n- **Funciones puras de estado**: aplicar movimientos y obtener los facelets\n  sin tocar el canvas, útil para tests o para comparar estados.\n\n## Instalación\n\n```sh\npnpm add @cubingcenter/viz\n# o\nnpm install @cubingcenter/viz\n```\n\nEl paquete es solo ESM y trae sus propios tipos de TypeScript.\n\n## Uso\n\n```html\n<canvas id=\"cubo\"></canvas>\n\n<script type=\"module\">\n  import { Cube3Viz } from \"@cubingcenter/viz\";\n\n  const viz = new Cube3Viz(document.getElementById(\"cubo\"), {\n    width: 280,\n    stickerRadius: 4,\n    gap: 2,\n    faceGap: 8,\n  });\n\n  viz.setScramble(\"D2 L2 B2 R2 F2 D' R2 D' L2 U R2 U2 F' D2 L' R' B L D2 F\");\n</script>\n```\n\nTodos los visualizadores siguen el mismo patrón: se crean sobre un canvas,\nreciben opciones y exponen `setScramble`, `applyMove` y `reset`. La mayoría\ntambién tiene `setFacelets` y `getFacelets` para trabajar con el estado\ndirectamente.\n\n### Otros puzzles\n\n```ts\nimport { PyraminxViz, SkewbViz, Square1Viz } from \"@cubingcenter/viz\";\n\nnew PyraminxViz(canvasPyraminx, { width: 300 }).setScramble(\n  \"L' B L R B' L' R' U u' l r' b'\",\n);\n\n// \"hybrid\" (por defecto) muestra las seis caras en perspectiva; \"net\", la red plana.\nnew SkewbViz(canvasSkewb, { width: 280, view: \"net\" }).setScramble(\n  \"B L B U' B R U' B R L' R'\",\n);\n\nnew Square1Viz(canvasSq1, { width: 320, showSliceLine: true }).setScramble(\n  \"(0, -4) / (0, -3) / (-3, 6) /\",\n);\n```\n\n### Última capa (OLL / PLL)\n\n```ts\nimport { Cube3Viz } from \"@cubingcenter/viz\";\n\nconst viz = new Cube3Viz(canvas, {\n  width: 200,\n  mask: \"ll\", // cara U y la fila superior de las caras laterales\n  arrows: [\n    { from: 0, to: 2 }, // índices 0–8 de la cara U, por filas\n    { from: 2, to: 8 },\n  ],\n});\n\nviz.setScramble(\"R U R' U' R' F R2 U' R' U' R U R' F'\");\n```\n\n### Colores\n\nLas caras que no se indiquen usan el esquema WCA (`WCA_COLORS`).\n\n```ts\nimport { Cube3Viz } from \"@cubingcenter/viz\";\n\nconst viz = new Cube3Viz(canvas, {\n  colors: { U: \"#fef08a\", F: \"#22c55e\" },\n  backgroundColor: \"#0f172a\",\n});\n```\n\n### Estado sin canvas\n\n```ts\nimport {\n  createSolvedCube3State,\n  parseCube3Algorithm,\n  applyCube3Algorithm,\n  toCube3Facelets,\n  formatCube3Facelets,\n} from \"@cubingcenter/viz\";\n\nconst estado = applyCube3Algorithm(\n  createSolvedCube3State(),\n  parseCube3Algorithm(\"R U R' U'\"),\n);\nconst facelets = toCube3Facelets(estado); // { U, R, F, D, L, B }, nueve stickers por cara\nconsole.log(formatCube3Facelets(facelets)); // cadena de 54 caracteres\n```\n\nHay funciones equivalentes para 2x2 a 7x7, Skewb, Square-1 y FTO.\n\n## 3D cube\n\n`@cubingcenter/viz/3d` adds an interactive 3x3 built on three.js: glossy stickerless\npieces in the style of modern speed cubes, a black stickered version, a see-through mode, animated turns\nand an isometric view with white, green and red in front. It needs `three`\ninstalled; the 2D entry stays dependency-free. See [docs/3d.md](docs/3d.md).\n\n<picture>\n  <source media=\"(prefers-color-scheme: dark)\" srcset=\"docs/img/cube3d-dark.png\" />\n  <img alt=\"3D cube: stickerless, stickered and see-through.\" src=\"docs/img/cube3d-light.png\" />\n</picture>\n\n## Puzzles y notación\n\n| Clase                   | Notación                                                                                    |\n| ----------------------- | ------------------------------------------------------------------------------------------- |\n| `Cube2Viz` … `Cube7Viz` | `U D R L F B`, anchos (`Rw`, `r`, `3Rw`), rotaciones (`x y z`), cortes (`M E S`), `'` y `2` |\n| `MegaminxViz`           | Notación WCA / Pochmann (`R++ R-- D++ D-- U U'`)                                            |\n| `PyraminxViz`           | `U L R B`, puntas (`u l r b`) y `'`                                                         |\n| `SkewbViz`              | `U R L B F D`, `'` y `2`                                                                    |\n| `Square1Viz`            | Giros `(x, y)` y cortes `/`                                                                 |\n| `ClockViz`              | Notación WCA de Clock (`UR5- DR5+ … ALL2- y2`)                                              |\n| `FtoViz`                | `U D F B L BR R BL` y `'`                                                                   |\n\n### Opciones comunes\n\n| Opción            | Por defecto  | Descripción                                          |\n| ----------------- | ------------ | ---------------------------------------------------- |\n| `width`           | `300`        | Ancho del canvas en píxeles                          |\n| `height`          | automático   | Alto; si no se indica, se calcula para la red        |\n| `gap`             | `2`          | Separación entre stickers de una cara                |\n| `faceGap`         | `8`          | Separación entre caras                               |\n| `stickerRadius`   | `2`          | Radio de las esquinas de cada sticker                |\n| `borderColor`     | `#1a1a1a`    | Color del borde de los stickers                      |\n| `borderWidth`     | `1`          | Grosor del borde                                     |\n| `colors`          | `WCA_COLORS` | Colores por cara; los que falten usan el esquema WCA |\n| `backgroundColor` | transparente | Fondo del canvas                                     |\n| `mask`            | `\"none\"`     | `\"ll\"` para la vista de última capa (3x3)            |\n| `arrows`          | `[]`         | Flechas sobre la cara U en la vista `\"ll\"`           |\n\n`SkewbViz` acepta además `view` (`\"hybrid\"` o `\"net\"`) y `Square1Viz`,\n`showSliceLine`.\n\n## Desarrollo local\n\nRequisitos: Node.js y [pnpm](https://pnpm.io).\n\n```sh\npnpm install\npnpm build\npnpm preview   # http://localhost:3333/preview.html\n```\n\n`preview.html` es una página de pruebas: aplica movimientos a mano sobre un\ncanvas y compara el resultado con la proyección de la mezcla en otro, marcando\nlas diferencias. Para generar mezclas usa `@cubingcenter/scrambler` compilado\nen `../cubingcenter-scrambler`.\n\n| Comando              | Descripción                                                  |\n| -------------------- | ------------------------------------------------------------ |\n| `pnpm build`         | Compila `src/` a `dist/`                                     |\n| `pnpm lint`          | Chequeo de tipos con `tsc`                                   |\n| `pnpm test`          | Compila y corre los tests de Pyraminx, Skewb, FTO y Square-1 |\n| `pnpm package:check` | Verifica el contenido del paquete con `npm pack --dry-run`   |\n| `pnpm verify`        | Todo lo anterior; es lo que corre antes de publicar          |\n| `pnpm preview`       | Servidor estático para `preview.html`                        |\n\n### Estructura del repo\n\n```text\nsrc/\n├── index.ts       API pública\n├── types.ts       tipos de facelets y opciones\n├── core/          renderer compartido y colores WCA\n└── puzzles/       un archivo por puzzle: estado, movimientos y dibujo\ntest/              tests por puzzle\npreview.html       página de pruebas y comparación de estados\ndocs/img/          imágenes del README\n```\n\n## Publicación en npm\n\nCada versión se publica sola al mergear a `main` un cambio de `version` en\n`package.json`. El workflow [`publish.yml`](.github/workflows/publish.yml)\ncorre `pnpm verify`, publica en npm con _trusted publishing_ (sin tokens en el\nrepo, con provenance) y crea el tag `vX.Y.Z` y su release en GitHub. Si esa\nversión ya está en npm no hace nada, y las prerreleases (`1.2.0-beta.1`) van\na la etiqueta `next`.\n\n## Proyectos hermanos\n\n- [Cubing Center](https://github.com/diegoagdiaz/cubingcenter): la aplicación\n  de speedcubing (cronómetro, estadísticas y torneos) que usa este paquete.\n- [`@cubingcenter/scrambler`](https://github.com/diegoagdiaz/cubingcenter-scrambler):\n  generador de mezclas de estado aleatorio para todas las categorías WCA.\n\n## Licencia\n\nMIT © [CubingCenter](https://github.com/diegoagdiaz)\n","readmeFilename":"README.md"}