{"_id":"@armniko/canvas","_rev":"7-b73471c4982cd978d25d74a233d6d24c","name":"@armniko/canvas","dist-tags":{"latest":"2.2.0"},"versions":{"1.0.0":{"name":"@armniko/canvas","version":"1.0.0","keywords":["canvas","drawing","html canvas","object-based"],"author":{"name":"Armīns Nikolajevs","email":"armins.nikolajevs@gmail.com"},"license":"MIT","_id":"@armniko/canvas@1.0.0","maintainers":[{"name":"armins.nikolajevs","email":"armins.nikolajevs@gmail.com"}],"dist":{"shasum":"428875705fd1b5bf76aa91c69564b45327cacc4a","tarball":"https://registry.npmjs.org/@armniko/canvas/-/canvas-1.0.0.tgz","fileCount":68,"integrity":"sha512-fBwVHKrKiu8Z2tVmcCUxchvkU5LGTGSQYX4BUVhP/wJYLE5cYvgmfdc9g/i773xcfJ+5VhS47HPEFrz4MjzLvQ==","signatures":[{"sig":"MEYCIQCISfPYKUOHr+bm19V8H2qP3Rs98eerkGnSfTk0Ork/IAIhAMG8cPxswqPJJvG1oIgq51SzBkLOMei9aU+65iKgascT","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":53590},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"2875359274ca44ff3f33b6b1d4ca1bc87557ded1","scripts":{"dev":"node test/server/main.js & babel src -d dist --extensions .ts --watch","lint":"eslint src --max-warnings=0","test":"jest --runInBand","build":"babel src -d dist --extensions .ts --delete-dir-on-start && tsc","lint:fix":"eslint src --max-warnings=0 --fix","test:coverage":"JEST_COVERAGE=true npm run test -- --collect-coverage"},"_npmUser":{"name":"armins.nikolajevs","email":"armins.nikolajevs@gmail.com"},"_npmVersion":"10.5.0","description":"Simplified and object-based drawing on HTML canvas!","directories":{},"_nodeVersion":"18.19.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.1.2","prettier":"^3.2.5","puppeteer":"^22.5.0","@babel/cli":"^7.23.9","typescript":"^5.3.3","@babel/core":"^7.24.0","@types/jest":"^29.5.12","find-process":"^1.4.7","jest-puppeteer":"^10.0.1","jest-image-snapshot":"^6.4.0","babel-plugin-istanbul":"^6.1.1","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.1.3","jest-puppeteer-istanbul":"^0.5.3","@babel/preset-typescript":"^7.23.3","@typescript-eslint/parser":"^7.2.0","@types/jest-image-snapshot":"^6.4.0","jest-environment-puppeteer":"^10.0.1","@typescript-eslint/eslint-plugin":"^7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/canvas_1.0.0_1710674751879_0.41622594446206884","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"@armniko/canvas","version":"1.1.0","keywords":["canvas","drawing","html canvas","object-based"],"author":{"name":"Armīns Nikolajevs","email":"armins.nikolajevs@gmail.com"},"license":"MIT","_id":"@armniko/canvas@1.1.0","maintainers":[{"name":"armins.nikolajevs","email":"armins.nikolajevs@gmail.com"}],"dist":{"shasum":"f561a61adc134eb4bc5c52224748f90d8b7a3ade","tarball":"https://registry.npmjs.org/@armniko/canvas/-/canvas-1.1.0.tgz","fileCount":93,"integrity":"sha512-SetPXs6Y/1tRvUptW27RyvBhy/4GgMKu9lPmzU/+QYQF7nHKmoBsItQOg919LTQeNBB3ME8XA9PAwaUY5SDbZA==","signatures":[{"sig":"MEUCIEtbT1Eftc5/Tu/ETHuaoOOtTmaCbT7UzzjNMZGGyWIyAiEA/AX2pH4NdY66fEPFRzxdPcV4x39SEyHVVq0rHra7Zvo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":70024},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"00e8876920fb2e8c61bd8e51c3319d523ca326b2","scripts":{"dev":"node test/server/main.js & babel src -d dist --extensions .ts --watch","lint":"eslint src --max-warnings=0","test":"jest --runInBand","build":"babel src -d dist --extensions .ts --delete-dir-on-start && tsc","lint:fix":"eslint src --max-warnings=0 --fix","test:coverage":"JEST_COVERAGE=true npm run test -- --collect-coverage"},"_npmUser":{"name":"armins.nikolajevs","email":"armins.nikolajevs@gmail.com"},"_npmVersion":"10.5.0","description":"Simplified and object-based drawing on HTML canvas!","directories":{},"_nodeVersion":"18.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.1.2","prettier":"^3.2.5","puppeteer":"^22.5.0","@babel/cli":"^7.23.9","typescript":"^5.3.3","@babel/core":"^7.24.0","@types/jest":"^29.5.12","find-process":"^1.4.7","jest-puppeteer":"^10.0.1","jest-image-snapshot":"^6.4.0","babel-plugin-istanbul":"^6.1.1","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.1.3","jest-puppeteer-istanbul":"^0.5.3","@babel/preset-typescript":"^7.23.3","@typescript-eslint/parser":"^7.2.0","@types/jest-image-snapshot":"^6.4.0","jest-environment-puppeteer":"^10.0.1","@typescript-eslint/eslint-plugin":"^7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/canvas_1.1.0_1711614365878_0.3221980674302032","host":"s3://npm-registry-packages"}},"1.1.1":{"name":"@armniko/canvas","version":"1.1.1","keywords":["canvas","drawing","html canvas","object-based"],"author":{"name":"Armīns Nikolajevs","email":"armins.nikolajevs@gmail.com"},"license":"MIT","_id":"@armniko/canvas@1.1.1","maintainers":[{"name":"armins.nikolajevs","email":"armins.nikolajevs@gmail.com"}],"bugs":{"email":"armins.nikolajevs@gmail.com"},"dist":{"shasum":"eac1738461334308f3ab0f41d62eede30a7eb4fa","tarball":"https://registry.npmjs.org/@armniko/canvas/-/canvas-1.1.1.tgz","fileCount":89,"integrity":"sha512-ii8AeDo4ku4OxfX72eStzcI0DtK3greFloVF42nI8DlkOkn9KVubxKALF/lkVLrAcAB/aEMob8nrGpl0j//+IQ==","signatures":[{"sig":"MEYCIQDiyQ3sGCyLvXnY3Hfc0stqmmmBpgk3aLrJKDfWUL1KJQIhAIoyR+ytDp6nmCGrtDXWBlsa4PSxwzCNHRALDsyji29a","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":70632},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"2a7e77d723d2eff928ffa2d0f47efd953661b9d7","scripts":{"dev":"node test/server/main.js & babel src -d dist --extensions .ts --watch","lint":"eslint src --max-warnings=0","test":"jest --runInBand","build":"babel src -d dist --extensions .ts --delete-dir-on-start && tsc --project tsconfig.build.json","lint:fix":"npm run lint -- --fix","test:coverage":"JEST_COVERAGE=true npm run test -- --collect-coverage"},"_npmUser":{"name":"armins.nikolajevs","email":"armins.nikolajevs@gmail.com"},"_npmVersion":"10.5.0","description":"Simplified and object-based drawing on HTML canvas!","directories":{},"_nodeVersion":"18.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.1.2","prettier":"^3.2.5","puppeteer":"^22.5.0","@babel/cli":"^7.23.9","typescript":"^5.3.3","@babel/core":"^7.24.0","@types/jest":"^29.5.12","find-process":"^1.4.7","jest-puppeteer":"^10.0.1","jest-image-snapshot":"^6.4.0","babel-plugin-istanbul":"^6.1.1","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.1.3","jest-puppeteer-istanbul":"^0.5.3","@babel/preset-typescript":"^7.23.3","@typescript-eslint/parser":"^7.2.0","@types/jest-image-snapshot":"^6.4.0","jest-environment-puppeteer":"^10.0.1","@typescript-eslint/eslint-plugin":"^7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/canvas_1.1.1_1711968693478_0.6216883668044433","host":"s3://npm-registry-packages"}},"1.2.0":{"name":"@armniko/canvas","version":"1.2.0","keywords":["canvas","drawing","html canvas","object-based"],"author":{"name":"Armīns Nikolajevs","email":"armins.nikolajevs@gmail.com"},"license":"MIT","_id":"@armniko/canvas@1.2.0","maintainers":[{"name":"armins.nikolajevs","email":"armins.nikolajevs@gmail.com"}],"bugs":{"email":"armins.nikolajevs@gmail.com"},"dist":{"shasum":"75e4f24ff382522b80e0a3e299b051f35e99ced9","tarball":"https://registry.npmjs.org/@armniko/canvas/-/canvas-1.2.0.tgz","fileCount":48,"integrity":"sha512-BxXEAVeiW9AK4EBreGKeSqHiYOcCJPNSLIOWoJucHa+9k69LPwuqE0TEp3Q7x9ypig4zU1t3QrNq9bVdYCygdw==","signatures":[{"sig":"MEUCIDC+N0IEG8QAH/I+fFxzGA+PeqyNqCxB19yaOz4p5a2nAiEA0TFZE/Q8FRXsVjL821sn6xQEzABKikVuj7VsiaPwVVQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":73050},"main":"./dist/index.umd.js","type":"module","module":"./dist/index.esm.js","gitHead":"cd27469e2dc33ed4726f22e9f37431a8fe5ba926","scripts":{"dev":"node test/server/main.js & webpack --watch","lint":"tsc --noEmit && eslint src --max-warnings=0","test":"npm run build && jest --runInBand","build":"rimraf dist && webpack && tsc --project tsconfig.build.json","lint:fix":"npm run lint -- --fix","test:coverage":"JEST_COVERAGE=true npm run test -- --collect-coverage"},"typings":"./dist/index.d.ts","_npmUser":{"name":"armins.nikolajevs","email":"armins.nikolajevs@gmail.com"},"_npmVersion":"10.5.0","description":"Simplified and object-based drawing on HTML canvas!","directories":{},"_nodeVersion":"18.20.2","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.1.2","webpack":"^5.91.0","prettier":"^3.2.5","puppeteer":"^22.5.0","typescript":"^5.3.3","@types/jest":"^29.5.12","webpack-cli":"^5.1.4","babel-loader":"^9.1.3","find-process":"^1.4.7","jest-puppeteer":"^10.0.1","jest-image-snapshot":"^6.4.0","babel-plugin-istanbul":"^6.1.1","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.1.3","jest-puppeteer-istanbul":"^0.5.3","@babel/preset-typescript":"^7.23.3","@typescript-eslint/parser":"^7.2.0","@types/jest-image-snapshot":"^6.4.0","jest-environment-puppeteer":"^10.0.1","@typescript-eslint/eslint-plugin":"^7.2.0"},"_npmOperationalInternal":{"tmp":"tmp/canvas_1.2.0_1714245471026_0.015015211641187243","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"@armniko/canvas","version":"2.0.0","keywords":["canvas","drawing","html canvas","object-based"],"author":{"name":"Armīns Nikolajevs","email":"armins.nikolajevs@gmail.com"},"license":"MIT","_id":"@armniko/canvas@2.0.0","maintainers":[{"name":"armins.nikolajevs","email":"armins.nikolajevs@gmail.com"}],"bugs":{"email":"armins.nikolajevs@gmail.com"},"dist":{"shasum":"1918f6b822ffb39f2bf55ce74e2b432567aea1f0","tarball":"https://registry.npmjs.org/@armniko/canvas/-/canvas-2.0.0.tgz","fileCount":55,"integrity":"sha512-0ZZYWlx0ExpVKcYkltFNLp95/WTje8IzD/L9oPTT/lqISF6gy57RAWyAQKKuDtvsnzhSfZbkOvJHQx+U0G4Tqw==","signatures":[{"sig":"MEUCIBoNKD4fPTZOB5tDc5HI8stlBS7xW+349KInHKPKm+7lAiEA6WZyvx7qTy16Vx8/+y1SgRNBzg0pymvbt+dDIYxfnbk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":92207},"main":"./dist/index.umd.js","type":"module","module":"./dist/index.esm.js","gitHead":"e91c21f408e2be9af3fded3a385bf354d0476d51","scripts":{"dev":"vite build --watch","lint":"tsc --noEmit && eslint ./src ./test --max-warnings=0","test":"vitest run","build":"vite build","lint:fix":"npm run lint -- --fix","test:all":"npm run test && npm run test:e2e","test:e2e":"vitest run --config vitest.e2e.config.ts","test:coverage":"vitest run --coverage","test:e2e:coverage":"VITE_COVERAGE=true vitest run --config vitest.e2e.config.ts && nyc report"},"typings":"./dist/index.d.ts","_npmUser":{"name":"armins.nikolajevs","email":"armins.nikolajevs@gmail.com"},"_npmVersion":"11.12.1","description":"Simplified and object-based drawing on HTML canvas!","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","vite":"^8.0.8","eslint":"^10.2.1","terser":"^5.46.1","vitest":"^4.1.4","prettier":"^3.8.3","puppeteer":"^24.41.0","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^24.12.2","vite-plugin-dts":"^4.5.4","typescript-eslint":"^8.58.2","@vitest/coverage-v8":"^4.1.4","jest-image-snapshot":"^6.5.2","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.58.2","@types/jest-image-snapshot":"^6.4.1","@typescript-eslint/eslint-plugin":"^8.58.2"},"_npmOperationalInternal":{"tmp":"tmp/canvas_2.0.0_1776610411012_0.920694494945274","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@armniko/canvas","version":"2.1.0","keywords":["canvas","html5-canvas","canvas-2d","2d-graphics","2d-drawing","drawing","graphics","rendering","typescript","object-oriented","gradient","shapes","text-rendering","reactive","change-detection"],"author":{"name":"Armīns Nikolajevs","email":"armins.nikolajevs@gmail.com"},"license":"MIT","_id":"@armniko/canvas@2.1.0","maintainers":[{"name":"armins.nikolajevs","email":"armins.nikolajevs@gmail.com"}],"bugs":{"email":"armins.nikolajevs@gmail.com"},"dist":{"shasum":"d2123b12d87b5cb1aff3ea72a0796a3f8b02c311","tarball":"https://registry.npmjs.org/@armniko/canvas/-/canvas-2.1.0.tgz","fileCount":35,"integrity":"sha512-qTDYB4Q63n24T3k+otdG7BwiYKbsEz4AWo8/pf7n6Vrhqp+HoB5tRPyu7m98pNvitZyjauAnnuMiZkIoowSPaQ==","signatures":[{"sig":"MEQCIErhkweKJ3cSgiU5vBQX2dRL8fm7TK4j16kQav9hzGvQAiAqXLToJnPS8/bFpnYfd+Qu11R3ayE2GfZi++ASM3xl4Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":135971},"main":"./dist/index.umd.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.esm.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.esm.js","default":"./dist/index.umd.js","require":"./dist/index.umd.js"},"./package.json":"./package.json"},"gitHead":"ca99d3bd2cdfd211b32dcba6d74678b4b60e3787","scripts":{"dev":"vite build --watch","lint":"tsc --noEmit && eslint ./src ./test --max-warnings=0","test":"vitest run","build":"vite build","lint:fix":"npm run lint -- --fix","test:all":"npm run test && npm run test:e2e","test:e2e":"vitest run --config vitest.e2e.config.ts","test:coverage":"vitest run --coverage","test:e2e:coverage":"VITE_COVERAGE=true vitest run --config vitest.e2e.config.ts && nyc report"},"_npmUser":{"name":"armins.nikolajevs","email":"armins.nikolajevs@gmail.com"},"_npmVersion":"11.12.1","description":"A lightweight, object-based abstraction over the HTML Canvas 2D API. Compose drawings declaratively with chainable element builders.","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"nyc":"^18.0.0","vite":"^8.0.10","eslint":"^10.2.1","vitest":"^4.1.5","prettier":"^3.8.3","puppeteer":"^24.42.0","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^24.12.2","vite-plugin-dts":"^4.5.4","typescript-eslint":"^8.59.0","@vitest/coverage-v8":"^4.1.5","jest-image-snapshot":"^6.5.2","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.59.0","@types/jest-image-snapshot":"^6.4.1","@typescript-eslint/eslint-plugin":"^8.59.0"},"_npmOperationalInternal":{"tmp":"tmp/canvas_2.1.0_1777145722234_0.726256405556134","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@armniko/canvas","version":"2.2.0","description":"A lightweight, object-based abstraction over the HTML Canvas 2D API. Compose drawings declaratively with chainable element builders.","author":{"name":"Armīns Nikolajevs","email":"armins.nikolajevs@gmail.com"},"license":"MIT","bugs":{"email":"armins.nikolajevs@gmail.com"},"keywords":["canvas","html5-canvas","canvas-2d","2d-graphics","2d-drawing","drawing","graphics","rendering","typescript","object-oriented","gradient","shapes","text-rendering","reactive","change-detection"],"type":"module","sideEffects":false,"main":"./dist/index.umd.js","module":"./dist/index.esm.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.esm.js","require":"./dist/index.umd.js","default":"./dist/index.umd.js"},"./package.json":"./package.json"},"scripts":{"build":"vite build","dev":"vite build --watch","lint":"tsc --noEmit && eslint ./src ./test --max-warnings=0","lint:fix":"npm run lint -- --fix","test":"vitest run","test:e2e":"vitest run --config vitest.e2e.config.ts","test:all":"npm run test && npm run test:e2e","test:coverage":"vitest run --coverage","test:e2e:coverage":"VITE_COVERAGE=true vitest run --config vitest.e2e.config.ts && nyc report"},"devDependencies":{"@eslint/js":"^10.0.1","@types/jest-image-snapshot":"^6.4.1","@types/node":"^24.12.2","@typescript-eslint/eslint-plugin":"^8.59.0","@typescript-eslint/parser":"^8.59.0","@vitest/coverage-v8":"^4.1.5","eslint":"^10.2.1","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","jest-image-snapshot":"^6.5.2","nyc":"^18.0.0","prettier":"^3.8.3","puppeteer":"^24.42.0","typescript":"^6.0.3","typescript-eslint":"^8.59.0","vite":"^8.0.10","vite-plugin-dts":"^4.5.4","vitest":"^4.1.5"},"gitHead":"c8917f3eacc338d061f5a7b2bd4f8c51890822bd","_id":"@armniko/canvas@2.2.0","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-qiF6r5RgKSUABRs0uMJ8XkGU/HYYwhJCvN0AXvxZam/xFDVA9ik9dZmBjYoxGBbvXeKFWWxT/9InQRftqxfB7Q==","shasum":"e94b9cbd9c029cec5e81c54657fa5b62ac9d8717","tarball":"https://registry.npmjs.org/@armniko/canvas/-/canvas-2.2.0.tgz","fileCount":35,"unpackedSize":145183,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAf5RBUnKSfxiVYwsP/rc/8CeLVAiWq/pDrk7cBcx8LzAiEAjdNxDNX0k5zrxQOA+3m1wXFsJTUtRUmogpbBjYj/NdA="}]},"_npmUser":{"name":"armins.nikolajevs","email":"armins.nikolajevs@gmail.com"},"directories":{},"maintainers":[{"name":"armins.nikolajevs","email":"armins.nikolajevs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/canvas_2.2.0_1782767403150_0.31151738786358707"},"_hasShrinkwrap":false}},"time":{"created":"2024-03-17T11:25:51.763Z","modified":"2026-06-29T21:10:03.400Z","1.0.0":"2024-03-17T11:25:52.056Z","1.1.0":"2024-03-28T08:26:06.013Z","1.1.1":"2024-04-01T10:51:33.626Z","1.2.0":"2024-04-27T19:17:51.185Z","2.0.0":"2026-04-19T14:53:31.161Z","2.1.0":"2026-04-25T19:35:22.382Z","2.2.0":"2026-06-29T21:10:03.276Z"},"bugs":{"email":"armins.nikolajevs@gmail.com"},"author":{"name":"Armīns Nikolajevs","email":"armins.nikolajevs@gmail.com"},"license":"MIT","keywords":["canvas","html5-canvas","canvas-2d","2d-graphics","2d-drawing","drawing","graphics","rendering","typescript","object-oriented","gradient","shapes","text-rendering","reactive","change-detection"],"description":"A lightweight, object-based abstraction over the HTML Canvas 2D API. Compose drawings declaratively with chainable element builders.","maintainers":[{"name":"armins.nikolajevs","email":"armins.nikolajevs@gmail.com"}],"readme":"# Canvas\n\n[![npm](https://img.shields.io/npm/v/@armniko/canvas)](https://www.npmjs.com/package/@armniko/canvas)\n![last published](https://img.shields.io/npm/last-update/@armniko/canvas)\n![zero dependencies](https://img.shields.io/badge/zero-dependencies-brightgreen)\n[![types](https://img.shields.io/npm/types/@armniko/canvas)](https://www.npmjs.com/package/@armniko/canvas)\n\nA lightweight, object-based abstraction over the HTML Canvas 2D API. Compose drawings declaratively with chainable\nelement builders.\n<hr>\n\n### Why Canvas?\n\n- 🧩 **Object-based** — describe what to draw, not how to draw it\n- 🧮 **Reactive-friendly** — pass functions (or signals) into any setter; attributes update with your app state, no\n  manual rewiring\n- 🔍 **Built-in change detection** — every element exposes `getHash()`, making memoization and dirty-checking trivial\n- 🌐 **Framework-agnostic** — drop into Vue, Angular, React, or vanilla TS\n- 📦 **Zero dependencies** and fully typed\n\n### Installation\n\n```bash\nnpm install @armniko/canvas\n```\n\n### Usage\n\nCreate a canvas with existing HTMLCanvasElement:\n\n```typescript\nimport { Canvas, TextElement, PositionPoint } from '@armniko/canvas';\n\n// assuming that there is <canvas id=\"canvas\"></canvas> in dom\nconst canvas: Canvas = new Canvas(document.getElementById('canvas'));\n\ncanvas.draw(\n    new TextElement()\n        .setText('Hello world!')\n        .setFillColor('#ff0000')\n        .setFontSize(20)\n        .setPosition({ x: 100, y: 50 }, PositionPoint.Center)\n);\n```\n\n### Changelog\n\n<table>\n<tr>\n    <td>v2.2.0</td>\n    <td>\n        <b>Features:</b><br>\n        - option to set border radius for a rectangle element<br>\n        - more precise text fitting in bounds<br><br>\n    </td>\n</tr>\n<tr>\n    <td>v2.1.0</td>\n    <td>\n        <b>Technical:</b><br>\n        - removed minification of build<br>\n        - added <code>exports</code> field for proper module resolution and types<br>\n        - marked package as side-effect free\n    </td>\n</tr>\n<tr>\n    <td>v2.0.0</td>\n    <td>\n        <b>Features:</b><br>\n        - pass callable attributes to element set methods<br>\n        - method to get hash for each element<br>\n        - option to set multiple rotations for all elements with `setRotations()` method which replaces `setDegrees()`<br>\n        - option to set scale for all elements<br>\n        - option to set crop area for an image element<br>\n        - option to set radius scale for radial gradient<br>\n        - option to pass position, scale, opacity and rotations into draw method<br>\n        - removed interface suffix from interfaces<br><br>\n         <b>Bugfixes:</b><br>\n        - incorrect linear gradient position when rotating<br><br>\n         <b>Technical:</b><br>\n        - migrated from webpack to vite<br>\n        - update all dependencies\n    </td>\n</tr>\n<tr>\n    <td>v1.2.0</td>\n    <td>\n        <b>Technical:</b><br>\n        - precompile UMD and ESM\n    </td>\n</tr>\n<tr>\n    <td>v1.1.1</td>\n    <td>\n        <b>Bugfixes:</b><br>\n        - missing ImageSource type<br>\n        - no shadow for an image element with border radius\n    </td>\n</tr>\n<tr>\n    <td>v1.1.0</td>\n    <td>\n        <b>Features:</b><br>\n        - added line element<br>\n        - added gradient colors for usage as fill and border color for all elements<br>\n    </td>\n</tr>\n<tr>\n    <td>v1.0.0</td>\n    <td>\n        Initial version\n    </td>\n</tr>\n</table>\n","readmeFilename":"README.md"}