{"_id":"@basiclines/rampa-sdk","_rev":"15-b47d651740cdbd862629213ad68bb454","name":"@basiclines/rampa-sdk","dist-tags":{"latest":"6.0.0"},"versions":{"1.4.0":{"name":"@basiclines/rampa-sdk","version":"1.4.0","keywords":["color","palette","sdk","design","oklch","accessibility"],"author":{"name":"ismael.fyi"},"license":"SEE LICENSE IN LICENSE.md","_id":"@basiclines/rampa-sdk@1.4.0","maintainers":[{"name":"basiclines","email":"igonzaleznicolas@gmail.com"}],"homepage":"https://github.com/basiclines/rampa-studio#readme","bugs":{"url":"https://github.com/basiclines/rampa-studio/issues"},"dist":{"shasum":"6d3dd2997819d2e88958c9799f760d4e34cf1890","tarball":"https://registry.npmjs.org/@basiclines/rampa-sdk/-/rampa-sdk-1.4.0.tgz","fileCount":3,"integrity":"sha512-F+mOsxG6ZTBh8USUP3TBx9rw43oW272dqXvqR/QtDJlnOCclG9euP2MQ1vGDwhJio6h1aEW4+yfuk7LmFxx2rA==","signatures":[{"sig":"MEUCIQCepiSfU4TIzCyjEBgpyEO1dYzqXljmZCql9AU5rogaUQIgevUdECntpqIpmQfjL4FLTksEUXDhBjC9rxiJ5fuL5s0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":250384},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"00f3f171f51c9ac653c0737dc4ddbcc9443abf70","scripts":{"test":"bun test","build":"bun build ./src/index.ts --outfile=./dist/index.js --target=node"},"_npmUser":{"name":"basiclines","email":"igonzaleznicolas@gmail.com"},"repository":{"url":"git+https://github.com/basiclines/rampa-studio.git","type":"git"},"_npmVersion":"11.6.4","description":"Programmatic JavaScript SDK for generating color palettes with rampa","directories":{},"_nodeVersion":"25.2.1","dependencies":{"culori":"^4.0.1","chroma-js":"^3.1.2"},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.17","typescript":"^5.5.3","@types/chroma-js":"^3.1.1"},"_npmOperationalInternal":{"tmp":"tmp/rampa-sdk_1.4.0_1771590649141_0.64150845755117","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"@basiclines/rampa-sdk","version":"1.5.1","keywords":["color","palette","sdk","design","oklch","accessibility"],"author":{"name":"ismael.fyi"},"license":"SEE LICENSE IN LICENSE.md","_id":"@basiclines/rampa-sdk@1.5.1","maintainers":[{"name":"basiclines","email":"igonzaleznicolas@gmail.com"}],"homepage":"https://github.com/basiclines/rampa-studio#readme","bugs":{"url":"https://github.com/basiclines/rampa-studio/issues"},"dist":{"shasum":"52b435b9ec29f7d4dfffa44877e27c8609f40f91","tarball":"https://registry.npmjs.org/@basiclines/rampa-sdk/-/rampa-sdk-1.5.1.tgz","fileCount":12,"integrity":"sha512-b2SmDZFlq/5RDXGrh1esMo66ZHONJ2eyRwpRv6hYyAeDk5WTjdb0nzzRT7P9TU9RDvnq5ECf6FL0CfzhWs8hEA==","signatures":[{"sig":"MEUCIGH27VTRSQjs0Fq2H5PGB7VwML0w61WgnlAQvp8lBBKMAiEA69XiNkUTvc8mGh422zWvNZ0/46EohNOGjnVoNZrXQEE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@basiclines%2frampa-sdk@1.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":270668},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"cee75970e209979f4a75633066a9e6cc994854b5","scripts":{"test":"bun test","build":"bun build ./src/index.ts --outfile=./dist/index.js --target=node && tsc -p tsconfig.declarations.json && cp dist/sdk/src/*.d.ts dist/ && cp -r dist/sdk/src/formatters dist/formatters 2>/dev/null; rm -rf dist/sdk dist/src"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:832d7622-3b04-49df-8e43-5fe122038d8f"}},"repository":{"url":"git+https://github.com/basiclines/rampa-studio.git","type":"git"},"_npmVersion":"11.10.1","description":"Programmatic JavaScript SDK for generating color palettes with rampa","directories":{},"_nodeVersion":"22.22.0","dependencies":{"culori":"^4.0.1","chroma-js":"^3.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.17","typescript":"^5.5.3","@types/chroma-js":"^3.1.1"},"_npmOperationalInternal":{"tmp":"tmp/rampa-sdk_1.5.1_1771841667841_0.582395707499062","host":"s3://npm-registry-packages-npm-production"}},"1.5.2":{"name":"@basiclines/rampa-sdk","version":"1.5.2","keywords":["color","palette","sdk","design","oklch","accessibility"],"author":{"name":"ismael.fyi"},"license":"SEE LICENSE IN LICENSE.md","_id":"@basiclines/rampa-sdk@1.5.2","maintainers":[{"name":"basiclines","email":"igonzaleznicolas@gmail.com"}],"homepage":"https://github.com/basiclines/rampa-studio#readme","bugs":{"url":"https://github.com/basiclines/rampa-studio/issues"},"dist":{"shasum":"2ba584933a98d8594fccfe3ec067919bedc5bb2a","tarball":"https://registry.npmjs.org/@basiclines/rampa-sdk/-/rampa-sdk-1.5.2.tgz","fileCount":12,"integrity":"sha512-lDz8mQzCgThUGqvpKbtKA7IxH0HFTyL6GatSixq1x+hkd+uINCjJymtqg7yH4b9qMLHLee8WRC1+S522ZaPweQ==","signatures":[{"sig":"MEQCIEmZ9u+3iYsZFjzzo8dvXmrLfdK89dGjMdymOEDvYxKWAiB/H5PdKvansiL4IrjPTG51shC3OpJP4Pez9CuY2KO0oA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@basiclines%2frampa-sdk@1.5.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":270961},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"aee0a40865ac7f79f14caf714eca39b3595c4e9c","scripts":{"test":"bun test","build":"bun build ./src/index.ts --outfile=./dist/index.js --target=node && tsc -p tsconfig.declarations.json && cp dist/sdk/src/*.d.ts dist/ && cp -r dist/sdk/src/formatters dist/formatters 2>/dev/null; rm -rf dist/sdk dist/src"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:832d7622-3b04-49df-8e43-5fe122038d8f"}},"repository":{"url":"git+https://github.com/basiclines/rampa-studio.git","type":"git"},"_npmVersion":"11.10.1","description":"Programmatic JavaScript SDK for generating color palettes with rampa","directories":{},"_nodeVersion":"22.22.0","dependencies":{"culori":"^4.0.1","chroma-js":"^3.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.17","typescript":"^5.5.3","@types/chroma-js":"^3.1.1"},"_npmOperationalInternal":{"tmp":"tmp/rampa-sdk_1.5.2_1771862444065_0.18187358390580521","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@basiclines/rampa-sdk","version":"1.6.0","keywords":["color","palette","sdk","design","oklch","accessibility"],"author":{"name":"ismael.fyi"},"license":"SEE LICENSE IN LICENSE.md","_id":"@basiclines/rampa-sdk@1.6.0","maintainers":[{"name":"basiclines","email":"igonzaleznicolas@gmail.com"}],"homepage":"https://github.com/basiclines/rampa-studio#readme","bugs":{"url":"https://github.com/basiclines/rampa-studio/issues"},"dist":{"shasum":"92e0a07c690d14e1fb4ba53e754d50d16fb39e5c","tarball":"https://registry.npmjs.org/@basiclines/rampa-sdk/-/rampa-sdk-1.6.0.tgz","fileCount":12,"integrity":"sha512-5ai4vBdx6lRML2qWcn3MEG3Xg3I5UgJ41qdwPmVTInbV/wb49+h0RrtsVl92v9QWv5FC/uYFJYPSr/PZY5/omQ==","signatures":[{"sig":"MEYCIQCdTayU2qfZlDo2eFxRUoap/adumkPTRsNYnom70lcc1gIhAL1KKHpF7gj/yAAMbTHyYp3fv+fBKFrPgcIqIrZEcK5z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@basiclines%2frampa-sdk@1.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":275343},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"056d92d388087c3b1f79f40b1441d1ac212c2b2d","scripts":{"test":"bun test","build":"bun build ./src/index.ts --outfile=./dist/index.js --target=node && tsc -p tsconfig.declarations.json && cp dist/sdk/src/*.d.ts dist/ && cp -r dist/sdk/src/formatters dist/formatters 2>/dev/null; rm -rf dist/sdk dist/src"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:832d7622-3b04-49df-8e43-5fe122038d8f"}},"repository":{"url":"git+https://github.com/basiclines/rampa-studio.git","type":"git"},"_npmVersion":"11.10.1","description":"Programmatic JavaScript SDK for generating color palettes with rampa","directories":{},"_nodeVersion":"22.22.0","dependencies":{"culori":"^4.0.1","chroma-js":"^3.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.17","typescript":"^5.5.3","@types/chroma-js":"^3.1.1"},"_npmOperationalInternal":{"tmp":"tmp/rampa-sdk_1.6.0_1771866007416_0.233997216168089","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@basiclines/rampa-sdk","version":"1.7.0","keywords":["color","palette","sdk","design","oklch","accessibility"],"author":{"name":"ismael.fyi"},"license":"SEE LICENSE IN LICENSE.md","_id":"@basiclines/rampa-sdk@1.7.0","maintainers":[{"name":"basiclines","email":"igonzaleznicolas@gmail.com"}],"homepage":"https://github.com/basiclines/rampa-studio#readme","bugs":{"url":"https://github.com/basiclines/rampa-studio/issues"},"dist":{"shasum":"5cb99f455de50b7c8bd03bb68ae0dde22dfd1120","tarball":"https://registry.npmjs.org/@basiclines/rampa-sdk/-/rampa-sdk-1.7.0.tgz","fileCount":3,"integrity":"sha512-Ut5pXvD0J3GDeweZwdxq8o5NYvMHfXKKDjeKJkeYPk+uNnqqpV9MKEVkbBP2i+dBNWRzzoR8P6W2p5OZ6UdHsw==","signatures":[{"sig":"MEYCIQCySnuot+xRhgFr2pHL1P5imfF9ocFDzeQdHpWDRCam3AIhANR4qteoqsLTX6VIwkn/pta57qN3SfAiloNPKHp2QeFv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@basiclines%2frampa-sdk@1.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":267788},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"2915bd40a71e17f3fb59618fbe740fdd8e5d7c7b","scripts":{"test":"bun test","build":"bun build ./src/index.ts --outfile=./dist/index.js --target=node && tsc -p tsconfig.declarations.json && cp dist/sdk/src/*.d.ts dist/ && cp -r dist/sdk/src/formatters dist/formatters 2>/dev/null; rm -rf dist/sdk dist/src"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:832d7622-3b04-49df-8e43-5fe122038d8f"}},"repository":{"url":"git+https://github.com/basiclines/rampa-studio.git","type":"git"},"_npmVersion":"11.10.1","description":"Programmatic JavaScript SDK for generating color palettes with rampa","directories":{},"_nodeVersion":"22.22.0","dependencies":{"culori":"^4.0.1","chroma-js":"^3.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.17","typescript":"^5.5.3","@types/chroma-js":"^3.1.1"},"_npmOperationalInternal":{"tmp":"tmp/rampa-sdk_1.7.0_1771938062770_0.8204163935286557","host":"s3://npm-registry-packages-npm-production"}},"1.7.1":{"name":"@basiclines/rampa-sdk","version":"1.7.1","keywords":["color","palette","sdk","design","oklch","accessibility"],"author":{"name":"ismael.fyi"},"license":"SEE LICENSE IN LICENSE.md","_id":"@basiclines/rampa-sdk@1.7.1","maintainers":[{"name":"basiclines","email":"igonzaleznicolas@gmail.com"}],"homepage":"https://github.com/basiclines/rampa-studio#readme","bugs":{"url":"https://github.com/basiclines/rampa-studio/issues"},"dist":{"shasum":"e9f344dbff5911e3597c749d686ad9de0a78a456","tarball":"https://registry.npmjs.org/@basiclines/rampa-sdk/-/rampa-sdk-1.7.1.tgz","fileCount":13,"integrity":"sha512-GyZDlkjveIV2JqU9dDdRsqpBQ5tC9kqX9DgIKDfBYi2dWByPAuX3A1liEjQ78dSet4Yb23SMJ0ktesT//hZ5BA==","signatures":[{"sig":"MEYCIQDcBPjuedQ0IgUguT0bGHamdNqBjleBvGDnje+xyeIqKQIhAPE0wzthoUjdaEVtJBRqbtD12uxctJUfVZxZntqO67U6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@basiclines%2frampa-sdk@1.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":280730},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"442c1b814a96ce0fa65ddf0eed284385599c1e7f","scripts":{"test":"bun test","build":"bun build ./src/index.ts --outfile=./dist/index.js --target=node && tsc -p tsconfig.declarations.json && cp dist/sdk/src/*.d.ts dist/ && cp -r dist/sdk/src/formatters dist/formatters 2>/dev/null; rm -rf dist/sdk dist/src"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:832d7622-3b04-49df-8e43-5fe122038d8f"}},"repository":{"url":"git+https://github.com/basiclines/rampa-studio.git","type":"git"},"_npmVersion":"11.10.1","description":"Programmatic JavaScript SDK for generating color palettes with rampa","directories":{},"_nodeVersion":"22.22.0","dependencies":{"culori":"^4.0.1","chroma-js":"^3.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.17","typescript":"^5.5.3","@types/chroma-js":"^3.1.1"},"_npmOperationalInternal":{"tmp":"tmp/rampa-sdk_1.7.1_1771947219245_0.3892175887646927","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"@basiclines/rampa-sdk","version":"1.8.0","keywords":["color","palette","sdk","design","oklch","accessibility"],"author":{"name":"ismael.fyi"},"license":"SEE LICENSE IN LICENSE.md","_id":"@basiclines/rampa-sdk@1.8.0","maintainers":[{"name":"basiclines","email":"igonzaleznicolas@gmail.com"}],"homepage":"https://github.com/basiclines/rampa-studio#readme","bugs":{"url":"https://github.com/basiclines/rampa-studio/issues"},"dist":{"shasum":"56025f7669c535a1866fbc6b230195aa491981b9","tarball":"https://registry.npmjs.org/@basiclines/rampa-sdk/-/rampa-sdk-1.8.0.tgz","fileCount":14,"integrity":"sha512-swDWcF7dcsUshKCB6r4vajgsrL6MLblX+grZQXX9ppIX08fD3iyOOn0u1miQYUpMlSyIHfCvuciV9maO0jmjmw==","signatures":[{"sig":"MEUCIHOdvlNnDwwJ/AiEGiNkegqwN+4UiHWxdm7VyiMW/jgBAiEApxdbwyGDE9cygFvnvf7e1CxhR2QL00CMv2W7loRCArs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@basiclines%2frampa-sdk@1.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":291038},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"bbd611c448e2122f262f3a9e0ae8b2ff38c1de0d","scripts":{"test":"bun test","build":"bun build ./src/index.ts --outfile=./dist/index.js --target=node && tsc -p tsconfig.declarations.json && cp dist/sdk/src/*.d.ts dist/ && cp -r dist/sdk/src/formatters dist/formatters 2>/dev/null; rm -rf dist/sdk dist/src"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:832d7622-3b04-49df-8e43-5fe122038d8f"}},"repository":{"url":"git+https://github.com/basiclines/rampa-studio.git","type":"git"},"_npmVersion":"11.10.1","description":"Programmatic JavaScript SDK for generating color palettes with rampa","directories":{},"_nodeVersion":"22.22.0","dependencies":{"culori":"^4.0.1","apca-w3":"^0.1.9","chroma-js":"^3.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.17","typescript":"^5.5.3","@types/chroma-js":"^3.1.1"},"_npmOperationalInternal":{"tmp":"tmp/rampa-sdk_1.8.0_1772035497103_0.4903009606630617","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"@basiclines/rampa-sdk","version":"1.9.0","keywords":["color","palette","sdk","design","oklch","accessibility"],"author":{"name":"ismael.fyi"},"license":"SEE LICENSE IN LICENSE.md","_id":"@basiclines/rampa-sdk@1.9.0","maintainers":[{"name":"basiclines","email":"igonzaleznicolas@gmail.com"}],"homepage":"https://github.com/basiclines/rampa-studio#readme","bugs":{"url":"https://github.com/basiclines/rampa-studio/issues"},"dist":{"shasum":"d590e009e1925b4429a5aaa0d402a8b708b64cd0","tarball":"https://registry.npmjs.org/@basiclines/rampa-sdk/-/rampa-sdk-1.9.0.tgz","fileCount":14,"integrity":"sha512-IY71sdI4op+kKUdJpXgNJ+y9H0VQe1y5/GbxRvRrKXPiU+AfesMLHsLuk9dd5alWtPjJnDuNnGraS7uaEWJLyA==","signatures":[{"sig":"MEYCIQCQFZa1LiYP5Unz13adf6tadYFJqPabzv3bFciNfVZurAIhAPa0hab5SGwZwN94pR5cXahCFoBPX0I/+Fc1N2uDn/b7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@basiclines%2frampa-sdk@1.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":291038},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"d49346465b5f6af2802147ac5eb4d6d3edc6aa00","scripts":{"test":"bun test","build":"bun build ./src/index.ts --outfile=./dist/index.js --target=node && tsc -p tsconfig.declarations.json && cp dist/sdk/src/*.d.ts dist/ && cp -r dist/sdk/src/formatters dist/formatters 2>/dev/null; rm -rf dist/sdk dist/src"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:832d7622-3b04-49df-8e43-5fe122038d8f"}},"repository":{"url":"git+https://github.com/basiclines/rampa-studio.git","type":"git"},"_npmVersion":"11.10.1","description":"Programmatic JavaScript SDK for generating color palettes with rampa","directories":{},"_nodeVersion":"22.22.0","dependencies":{"culori":"^4.0.1","apca-w3":"^0.1.9","chroma-js":"^3.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.17","typescript":"^5.5.3","@types/chroma-js":"^3.1.1"},"_npmOperationalInternal":{"tmp":"tmp/rampa-sdk_1.9.0_1772037520380_0.026313402510887984","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@basiclines/rampa-sdk","version":"2.0.0","keywords":["color","palette","sdk","design","oklch","accessibility"],"author":{"name":"ismael.fyi"},"license":"MIT","_id":"@basiclines/rampa-sdk@2.0.0","maintainers":[{"name":"basiclines","email":"igonzaleznicolas@gmail.com"}],"homepage":"https://github.com/basiclines/rampa-studio#readme","bugs":{"url":"https://github.com/basiclines/rampa-studio/issues"},"dist":{"shasum":"c366e7be0c7827a7721d3bbd7a40585530ae79ae","tarball":"https://registry.npmjs.org/@basiclines/rampa-sdk/-/rampa-sdk-2.0.0.tgz","fileCount":14,"integrity":"sha512-jZnUNdQXU6KTCzpMP/poJYoGcxpnFcRqnNLDE6pA4Gton+EB4lF8unT2InG74YNxf3zMZmQX+gLk5t9tRm0Ffg==","signatures":[{"sig":"MEUCIG7q7GyQQyFKy049GsU9TkApr0VajVxrqigfeiSqyZt9AiEApCdw11twdiehUy+rhDWiuS8PmRlF8HkRL3krsjpQVE4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@basiclines%2frampa-sdk@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":290939},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"5c2cf702c44f6d44df07f47aacb70a426bb66b6e","scripts":{"test":"bun test","build":"bun build ./src/index.ts --outfile=./dist/index.js --target=node && tsc -p tsconfig.declarations.json && cp dist/sdk/src/*.d.ts dist/ && cp -r dist/sdk/src/formatters dist/formatters 2>/dev/null; rm -rf dist/sdk dist/src"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:832d7622-3b04-49df-8e43-5fe122038d8f"}},"repository":{"url":"git+https://github.com/basiclines/rampa-studio.git","type":"git"},"_npmVersion":"11.11.0","description":"Programmatic JavaScript SDK for generating color palettes with rampa","directories":{},"_nodeVersion":"22.22.0","dependencies":{"culori":"^4.0.1","apca-w3":"^0.1.9","chroma-js":"^3.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.17","typescript":"^5.5.3","@types/chroma-js":"^3.1.1"},"_npmOperationalInternal":{"tmp":"tmp/rampa-sdk_2.0.0_1772190743421_0.9260959172409526","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@basiclines/rampa-sdk","version":"2.1.0","keywords":["color","palette","sdk","design","oklch","accessibility"],"author":{"name":"ismael.fyi"},"license":"MIT","_id":"@basiclines/rampa-sdk@2.1.0","maintainers":[{"name":"basiclines","email":"igonzaleznicolas@gmail.com"}],"homepage":"https://github.com/basiclines/rampa-studio#readme","bugs":{"url":"https://github.com/basiclines/rampa-studio/issues"},"dist":{"shasum":"f8db75bdff61d8275d7362eb919740eb4f5088ed","tarball":"https://registry.npmjs.org/@basiclines/rampa-sdk/-/rampa-sdk-2.1.0.tgz","fileCount":14,"integrity":"sha512-0MXeRjQDp+NYMtNHX2q1ipitTVjKAJTfBnlOmL5cEcEDnqscwYvcvLIiRUA0SFXtFPp+C4LjRLKs12CRrSMqGg==","signatures":[{"sig":"MEUCIGxgfW0NizVYikNBXxQQ7MVJqVeETta4f/TJJTLjicXuAiEAgxq9itIwKOu8ArOz3d2KlBWdFc7NDPBF0n0MCMmb5NY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@basiclines%2frampa-sdk@2.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":291369},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"cd096f25d27cc2f92b58e073e04f152dfd4d321c","scripts":{"test":"bun test","build":"bun build ./src/index.ts --outfile=./dist/index.js --target=node --external apca-w3 && tsc -p tsconfig.declarations.json && cp dist/sdk/src/*.d.ts dist/ && cp -r dist/sdk/src/formatters dist/formatters 2>/dev/null; rm -rf dist/sdk dist/src"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:832d7622-3b04-49df-8e43-5fe122038d8f"}},"repository":{"url":"git+https://github.com/basiclines/rampa-studio.git","type":"git"},"_npmVersion":"11.11.0","description":"Programmatic JavaScript SDK for generating color palettes with rampa","directories":{},"_nodeVersion":"22.22.0","dependencies":{"culori":"^4.0.1","chroma-js":"^3.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"apca-w3":"^0.1.9","@types/bun":"^1.2.17","typescript":"^5.5.3","@types/chroma-js":"^3.1.1"},"peerDependencies":{"apca-w3":"^0.1.9"},"peerDependenciesMeta":{"apca-w3":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rampa-sdk_2.1.0_1772222448086_0.09392821902363946","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@basiclines/rampa-sdk","version":"3.0.0","keywords":["color","palette","sdk","design","oklch","accessibility"],"author":{"name":"ismael.fyi"},"license":"MIT","_id":"@basiclines/rampa-sdk@3.0.0","maintainers":[{"name":"basiclines","email":"igonzaleznicolas@gmail.com"}],"homepage":"https://github.com/basiclines/rampa-studio#readme","bugs":{"url":"https://github.com/basiclines/rampa-studio/issues"},"dist":{"shasum":"19b5d2dab19ae04de704684f4f6dbcb45683d3fe","tarball":"https://registry.npmjs.org/@basiclines/rampa-sdk/-/rampa-sdk-3.0.0.tgz","fileCount":14,"integrity":"sha512-jR0TUfRkD+XUoa8Wi5QYiLwmSgAxGsIF6Tba1TmNwrPAjBJo4r4P607FPu8wcVfFmyHAB2v2KU7UJp46VKa+ng==","signatures":[{"sig":"MEUCIQD65vquAtRV7JS5VED5R7yMf3HvsY27+OhWu9CR/VGEKgIgCKI8u3GRraaqBCqytYYMMYeKsK2bFdWeE/HBNx9qVwQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@basiclines%2frampa-sdk@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":262659},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"bf074955f5697e92d210ca9c338924ca53393720","scripts":{"test":"bun test","build":"bun build ./src/index.ts --outfile=./dist/index.js --target=node && tsc -p tsconfig.declarations.json && cp dist/sdk/src/*.d.ts dist/ && cp -r dist/sdk/src/formatters dist/formatters 2>/dev/null; rm -rf dist/sdk dist/src"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:832d7622-3b04-49df-8e43-5fe122038d8f"}},"repository":{"url":"git+https://github.com/basiclines/rampa-studio.git","type":"git"},"_npmVersion":"11.11.0","description":"Programmatic JavaScript SDK for generating color palettes with rampa","directories":{},"_nodeVersion":"22.22.0","dependencies":{"chroma-js":"^3.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.17","typescript":"^5.5.3","@types/chroma-js":"^3.1.1"},"_npmOperationalInternal":{"tmp":"tmp/rampa-sdk_3.0.0_1772567002544_0.36387399556007494","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@basiclines/rampa-sdk","version":"3.1.0","keywords":["color","palette","sdk","design","oklch","accessibility"],"author":{"name":"ismael.fyi"},"license":"MIT","_id":"@basiclines/rampa-sdk@3.1.0","maintainers":[{"name":"basiclines","email":"igonzaleznicolas@gmail.com"}],"homepage":"https://github.com/basiclines/rampa-studio#readme","bugs":{"url":"https://github.com/basiclines/rampa-studio/issues"},"dist":{"shasum":"a6fa6b71d82a8f4baba05fe4eb4daa7c666757ba","tarball":"https://registry.npmjs.org/@basiclines/rampa-sdk/-/rampa-sdk-3.1.0.tgz","fileCount":15,"integrity":"sha512-SgjHT3wA4QWbEjwZXJWlwZLpfw1wl1HYGZWsCuwdS29L61qMdkRuGUKmlVpbuT3nkN9EDe29BhwzSI1xO8U5UQ==","signatures":[{"sig":"MEUCIGUTi2rl5/N5RRnKNXiQCTG+5FZOQUagcsD6Q8H8ZivdAiEA8mY8eIR7ZG+o7p+d09j51cROIn3AM09uzDvSazKUVJ0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@basiclines%2frampa-sdk@3.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":263781},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"29dfe0af93c968f2eb2ea1909a222ec40388c7ba","scripts":{"test":"bun test","build":"bun build ./src/index.ts --outfile=./dist/index.js --target=node && tsc -p tsconfig.declarations.json && cp dist/sdk/src/*.d.ts dist/ && cp -r dist/sdk/src/formatters dist/formatters 2>/dev/null; rm -rf dist/sdk dist/src","build:vanilla":"bun build ./src/vanilla.ts --outfile=./dist/rampa-sdk.min.js --target=browser --minify --format=iife"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:832d7622-3b04-49df-8e43-5fe122038d8f"}},"repository":{"url":"git+https://github.com/basiclines/rampa-studio.git","type":"git"},"_npmVersion":"11.11.0","description":"Programmatic JavaScript SDK for generating color palettes with rampa","directories":{},"_nodeVersion":"22.22.0","dependencies":{"chroma-js":"^3.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.17","typescript":"^5.5.3","@types/chroma-js":"^3.1.1"},"_npmOperationalInternal":{"tmp":"tmp/rampa-sdk_3.1.0_1772662826039_0.2221039973487806","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@basiclines/rampa-sdk","version":"4.0.0","keywords":["color","palette","sdk","design","oklch","accessibility"],"author":{"name":"ismael.fyi"},"license":"MIT","_id":"@basiclines/rampa-sdk@4.0.0","maintainers":[{"name":"basiclines","email":"igonzaleznicolas@gmail.com"}],"homepage":"https://github.com/basiclines/rampa-studio#readme","bugs":{"url":"https://github.com/basiclines/rampa-studio/issues"},"dist":{"shasum":"b11f7e4695289bc93b101f49be43ec18f445211e","tarball":"https://registry.npmjs.org/@basiclines/rampa-sdk/-/rampa-sdk-4.0.0.tgz","fileCount":16,"integrity":"sha512-/VfTeYBVXEp7nPQPXlYiIsbFhuFhW/o5eRzarRRp/g7DL3zzsWUEyp74NEGVfFv+IG5EwvTIi3H1PCSTSKb/nQ==","signatures":[{"sig":"MEUCIQDJd+TuZx4sgM5l0xCyVX/Lq/lZ2yGasxmim1jE0+KJBQIgDcPq/ls4AjDKYJYS3UBWjzZfTlNKrXxJCPgQNLrO32U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@basiclines%2frampa-sdk@4.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":271783},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"e39c6ddea3fc6b4fe98997605024d60676f1260c","scripts":{"test":"bun test","build":"bun build ./src/index.ts --outfile=./dist/index.js --target=node && tsc -p tsconfig.declarations.json && cp dist/sdk/src/*.d.ts dist/ && cp -r dist/sdk/src/formatters dist/formatters 2>/dev/null; rm -rf dist/sdk dist/src","build:vanilla":"bun build ./src/vanilla.ts --outfile=./dist/rampa-sdk.min.js --target=browser --minify --format=iife"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:832d7622-3b04-49df-8e43-5fe122038d8f"}},"repository":{"url":"git+https://github.com/basiclines/rampa-studio.git","type":"git"},"_npmVersion":"11.11.0","description":"Programmatic JavaScript SDK for generating color palettes with rampa","directories":{},"_nodeVersion":"22.22.0","dependencies":{"chroma-js":"^3.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.17","typescript":"^5.5.3","@types/chroma-js":"^3.1.1"},"_npmOperationalInternal":{"tmp":"tmp/rampa-sdk_4.0.0_1773048975537_0.9590949119805223","host":"s3://npm-registry-packages-npm-production"}},"5.0.0":{"name":"@basiclines/rampa-sdk","version":"5.0.0","keywords":["color","palette","sdk","design","oklch","accessibility"],"author":{"name":"ismael.fyi"},"license":"MIT","_id":"@basiclines/rampa-sdk@5.0.0","maintainers":[{"name":"basiclines","email":"igonzaleznicolas@gmail.com"}],"homepage":"https://github.com/basiclines/rampa-studio#readme","bugs":{"url":"https://github.com/basiclines/rampa-studio/issues"},"dist":{"shasum":"541463b9c71164cf997f888af597f254128d0255","tarball":"https://registry.npmjs.org/@basiclines/rampa-sdk/-/rampa-sdk-5.0.0.tgz","fileCount":18,"integrity":"sha512-3v4iHugqektE/IjOBKItWSuuXWgspWWfJqsKk157E0iYbscOKUiopBCk3siZjw4LXRO1rE0oc/EC1xagrwVzVA==","signatures":[{"sig":"MEQCIDVXg+yeGuV9Sz8Qrr5h+YsvONKwuUpmR6UuUhAAJ5YMAiAhFPOe46inLczebhreL/mgh7Bbj0xgylkHqdzJamgp+g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@basiclines%2frampa-sdk@5.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":282767},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"86af2d17ee61997c6c71f8a3b9ec6948efd17bb1","scripts":{"test":"bun test","build":"bun build ./src/index.ts --outfile=./dist/index.js --target=node && tsc -p tsconfig.declarations.json && cp dist/sdk/src/*.d.ts dist/ && cp -r dist/sdk/src/formatters dist/formatters 2>/dev/null; rm -rf dist/sdk dist/src","build:vanilla":"bun build ./src/vanilla.ts --outfile=./dist/rampa-sdk.min.js --target=browser --minify --format=iife"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:832d7622-3b04-49df-8e43-5fe122038d8f"}},"repository":{"url":"git+https://github.com/basiclines/rampa-studio.git","type":"git"},"_npmVersion":"11.11.1","description":"Programmatic JavaScript SDK for generating color palettes with rampa","directories":{},"_nodeVersion":"22.22.0","dependencies":{"chroma-js":"^3.1.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.17","typescript":"^5.5.3","@types/chroma-js":"^3.1.1"},"_npmOperationalInternal":{"tmp":"tmp/rampa-sdk_5.0.0_1773398538211_0.08709019580435595","host":"s3://npm-registry-packages-npm-production"}},"6.0.0":{"name":"@basiclines/rampa-sdk","version":"6.0.0","description":"Programmatic JavaScript SDK for generating color palettes with rampa","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"build":"bun build ./src/index.ts --outfile=./dist/index.js --target=node && tsc -p tsconfig.declarations.json && cp dist/sdk/src/*.d.ts dist/ && cp -r dist/sdk/src/formatters dist/formatters 2>/dev/null; rm -rf dist/sdk dist/src","build:vanilla":"bun build ./src/vanilla.ts --outfile=./dist/rampa-sdk.min.js --target=browser --minify --format=iife","test":"bun test"},"repository":{"type":"git","url":"git+https://github.com/basiclines/rampa-studio.git"},"keywords":["color","palette","sdk","design","oklch","accessibility"],"author":{"name":"ismael.fyi"},"license":"MIT","publishConfig":{"access":"public","provenance":true},"dependencies":{"chroma-js":"^3.1.2","fast-png":"^8.0.0","jpeg-js":"^0.4.4"},"devDependencies":{"@types/bun":"^1.2.17","@types/chroma-js":"^3.1.1","typescript":"^5.5.3"},"gitHead":"0b7db904ce50e99e0a6b308d9392c5771ff19db9","_id":"@basiclines/rampa-sdk@6.0.0","bugs":{"url":"https://github.com/basiclines/rampa-studio/issues"},"homepage":"https://github.com/basiclines/rampa-studio#readme","_nodeVersion":"22.22.1","_npmVersion":"11.12.0","dist":{"integrity":"sha512-ss13I+cT2ngf5znqb1KceQFDgHNryn1bDwImofQxspR7xelRatDoqf/os7tfeGmfHXhPFFqeJanZBdSA4Ebmgw==","shasum":"0768c62b9ed4a66ce182c6c2d1d76c3c4f370eef","tarball":"https://registry.npmjs.org/@basiclines/rampa-sdk/-/rampa-sdk-6.0.0.tgz","fileCount":3,"unpackedSize":392034,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@basiclines%2frampa-sdk@6.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBzygAMiEtK/mMFmpdiShuwcNh3TIF7g0XdsNoVCX79TAiBC5H5fPZPJvCG1tX6LKcWeMZDCZpqXfQpatC3P34gxCw=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:832d7622-3b04-49df-8e43-5fe122038d8f"}},"directories":{},"maintainers":[{"name":"basiclines","email":"igonzaleznicolas@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rampa-sdk_6.0.0_1774039818237_0.5027711647285962"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-20T12:30:48.936Z","modified":"2026-03-20T20:50:18.722Z","1.4.0":"2026-02-20T12:30:49.288Z","1.5.1":"2026-02-23T10:14:28.079Z","1.5.2":"2026-02-23T16:00:44.241Z","1.6.0":"2026-02-23T17:00:07.562Z","1.7.0":"2026-02-24T13:01:02.949Z","1.7.1":"2026-02-24T15:33:39.397Z","1.8.0":"2026-02-25T16:04:57.309Z","1.9.0":"2026-02-25T16:38:40.559Z","2.0.0":"2026-02-27T11:12:23.564Z","2.1.0":"2026-02-27T20:00:48.248Z","3.0.0":"2026-03-03T19:43:22.692Z","3.1.0":"2026-03-04T22:20:26.195Z","4.0.0":"2026-03-09T09:36:15.682Z","5.0.0":"2026-03-13T10:42:18.394Z","6.0.0":"2026-03-20T20:50:18.391Z"},"bugs":{"url":"https://github.com/basiclines/rampa-studio/issues"},"author":{"name":"ismael.fyi"},"license":"MIT","homepage":"https://github.com/basiclines/rampa-studio#readme","keywords":["color","palette","sdk","design","oklch","accessibility"],"repository":{"type":"git","url":"git+https://github.com/basiclines/rampa-studio.git"},"description":"Programmatic JavaScript SDK for generating color palettes with rampa","maintainers":[{"name":"basiclines","email":"igonzaleznicolas@gmail.com"}],"readme":"# Rampa SDK\n\nProgrammatic JavaScript/TypeScript SDK for generating mathematically accurate, accessible color palettes. Same engine as the [Rampa CLI](../cli/README.md), designed for use in applications, build tools, and design systems.\n\n## Installation\n\n```bash\nnpm install @basiclines/rampa-sdk\n```\n\n### Vanilla JS (CDN / Script Tag)\n\nA pre-built browser bundle is available on every [GitHub Release](https://github.com/basiclines/rampa-studio/releases). No bundler or build step needed — just drop a `<script>` tag:\n\n```html\n<script src=\"https://github.com/basiclines/rampa-studio/releases/latest/download/rampa-sdk.min.js\"></script>\n<script>\n  // Everything is available under the global `Rampa` object\n  const palette = Rampa.rampa('#3b82f6').size(5);\n  console.log('' + palette(1));   // first color\n  console.log(palette.palette);   // all colors\n\n  const css = Rampa.rampa('#3b82f6').output('css');\n  const mixed = Rampa.rampa.mix('#ff0000', '#0000ff', 0.5);\n\n  const linear = new Rampa.LinearColorSpace('#ffffff', '#000000').size(10);\n  console.log('' + linear(5)); // midpoint gray\n\n  const c = Rampa.color('#3b82f6');\n  console.log(c.hex, c.rgb, c.luminance);\n</script>\n```\n\nPin a specific version by replacing `latest` with the tag name:\n\n```\nhttps://github.com/basiclines/rampa-studio/releases/download/v3.0.0/rampa-sdk.min.js\n```\n\n## Quick Start\n\n```typescript\nimport { rampa } from '@basiclines/rampa-sdk';\n\n// Generate a 10-color palette from blue\nconst palette = rampa('#3b82f6');\npalette(1)            // first color (ColorAccessor)\npalette(5).oklch()    // format conversion\n\n// Custom size with lightness range\nconst custom = rampa('#3b82f6').size(5).lightness(10, 90);\ncustom(3)             // third color\n\n// Add complementary harmony\nconst harmonies = rampa('#3b82f6').add('complementary');\nharmonies.ramps       // [base, complementary]\n\n// Output as CSS variables\nconst css = rampa('#3b82f6').output('css');\n```\n\n## API\n\n### `rampa(baseColor)`\n\nCreates a callable color palette. Accepts any valid CSS color (hex, hsl, rgb, oklch, named colors). All methods are chainable in any order, and the result is always callable with a 1-based index.\n\n```typescript\nconst palette = rampa('#3b82f6');\nconst palette = rampa('rgb(59, 130, 246)');\nconst palette = rampa('hsl(217, 91%, 60%)');\nconst palette = rampa('oklch(62.3% 0.214 259)');\n\npalette(1)           // first color\npalette(5).hsl()     // format conversion\npalette.palette      // string[] of all colors\n```\n\n### Builder Methods\n\nAll builder methods return the same callable for chaining in any order.\n\n#### `.size(steps)`\n\nNumber of colors in the palette (2-100, default: 10).\n\n```typescript\nrampa('#3b82f6').size(5);\n```\n\n#### `.format(type)`\n\nColor format for output values: `hex`, `hsl`, `rgb`, `oklch` (default: `hex`).\n\n```typescript\nrampa('#3b82f6').format('hsl');\n// palette(1) → 'hsl(0, 0%, 0%)', palette(2) → 'hsl(212, 69%, 25%)', ...\n```\n\n#### `.lightness(start, end)`\n\nLightness range 0-100 (default: 0, 100).\n\n```typescript\nrampa('#3b82f6').lightness(10, 90);\n```\n\n#### `.saturation(start, end)`\n\nSaturation range 0-100 (default: 100, 0).\n\n```typescript\nrampa('#3b82f6').saturation(80, 20);\n```\n\n#### `.hue(start, end)`\n\nHue shift in degrees (default: -10, 10).\n\n```typescript\nrampa('#3b82f6').hue(-30, 30);\n```\n\n#### `.lightnessDistribution(type)`, `.saturationDistribution(type)`, `.hueDistribution(type)`\n\nDistribution curve for each channel (default: `linear`).\n\nAvailable distributions: `linear`, `geometric`, `fibonacci`, `golden-ratio`, `logarithmic`, `powers-of-2`, `musical-ratio`, `cielab-uniform`, `ease-in`, `ease-out`, `ease-in-out`\n\n```typescript\nrampa('#3b82f6')\n  .lightnessDistribution('fibonacci')\n  .saturationDistribution('ease-out')\n  .hueDistribution('golden-ratio');\n```\n\n#### `.tint(color, opacity, blend?)`\n\nApply a tint color over the palette.\n\n- `color` — Any valid CSS color\n- `opacity` — Tint strength 0-100\n- `blend` — Blend mode (default: `normal`)\n\nAvailable blend modes: `normal`, `multiply`, `screen`, `overlay`, `darken`, `lighten`, `color-dodge`, `color-burn`, `hard-light`, `soft-light`, `difference`, `exclusion`, `hue`, `saturation`, `color`, `luminosity`, `plus-darker`, `plus-lighter`\n\n```typescript\nrampa('#3b82f6')\n  .tint('#FF0000', 15, 'overlay');\n```\n\n#### `.add(type)` / `.add('shift', degrees)`\n\nAdd a harmony ramp. Can be called multiple times.\n\nAvailable harmony types:\n- `complementary` — Opposite on color wheel (+180°)\n- `triadic` — 3 colors, 120° apart\n- `analogous` — Adjacent colors, 30° apart\n- `split-complementary` — 2 colors near opposite\n- `square` — 4 colors, 90° apart\n- `compound` — Complementary + split\n- `shift` — Custom hue rotation by N degrees\n\n```typescript\nrampa('#3b82f6')\n  .add('complementary')\n  .add('triadic')\n  .add('shift', 45);\n```\n\n### Accessing Colors\n\nCall the palette with a 1-based index to get a `ColorAccessor`:\n\n```typescript\nconst palette = rampa('#3b82f6').size(5).lightness(10, 90);\n\npalette(1)           // ColorAccessor — first color\npalette(3).hsl()     // format conversion\npalette(5).oklch()   // any format\n`${palette(1)}`      // works in template literals\n\npalette.palette      // string[] of all colors\npalette.ramps        // RampResult[] (base + harmonies)\n```\n\n### Output Methods\n\n#### `.output(format, prefix?)`\n\nExport the palette as `'css'`, `'json'`, or `'text'`. Optional `prefix` sets variable/ramp names (default: `'base'`).\n\n```typescript\n// CSS custom properties\nrampa('#3b82f6').size(5).output('css', 'primary');\n// :root {\n//   /* primary */\n//   --primary-0: #000000;\n//   --primary-1: #143d6b;\n//   --primary-2: #4572ba;\n//   --primary-3: #b1b9ce;\n//   --primary-4: #ffffff;\n// }\n\n// JSON\nrampa('#3b82f6').size(5).output('json', 'primary');\n// {\n//   \"ramps\": [\n//     {\n//       \"name\": \"primary\",\n//       \"baseColor\": \"#3b82f6\",\n//       \"colors\": [\"#000000\", \"#143d6b\", \"#4572ba\", \"#b1b9ce\", \"#ffffff\"]\n//     }\n//   ]\n// }\n\n// Plain text (one color per line)\nrampa('#3b82f6').size(5).output('text');\n// #000000\n// #143d6b\n// #4572ba\n// #b1b9ce\n// #ffffff\n```\n\n#### `.ramps` / `.palette`\n\nAccess the generated ramps and colors directly as properties:\n\n```typescript\nconst result = rampa('#3b82f6').size(5).add('complementary');\nresult.palette                // base ramp colors: ['#000000', '#143d6b', ...]\nresult.ramps                  // all ramps: [{ name: 'base', ... }, { name: 'complementary', ... }]\nresult.ramps[1].colors        // complementary ramp colors\n```\n\n### `color(input)`\n\nInspect, transform, mix, and export a single color. Equivalent to `rampa color` in the CLI.\n\nAll property values use **0-1 normalized ranges** to match CSS spec conventions:\n\n| Property | Range |\n|----------|-------|\n| `hsl.h` | 0–360 (degrees) |\n| `hsl.s`, `hsl.l` | 0–1 |\n| `oklch.l` | 0–1 |\n| `oklch.c` | 0–0.4 (native OKLCH scale) |\n| `oklch.h` | 0–360 (degrees) |\n\n```typescript\nimport { color } from '@basiclines/rampa-sdk';\n\nconst c = color('#fe0000');\nc.hex              // '#fe0000'\nc.rgb              // { r: 254, g: 0, b: 0 }\nc.hsl              // { h: 0, s: 1.0, l: 0.5 }\nc.oklch            // { l: 0.628, c: 0.258, h: 29 }\nc.luminance        // 0.628\n\n// Format conversion (string output uses CSS conventions: percentages)\nc.format('hsl')    // 'hsl(0, 100%, 50%)'\nc.format('rgb')    // 'rgb(254, 0, 0)'\nc.format('oklch')  // 'oklch(62.8% 0.258 29)'\n\n// Export\nc.output('json')           // JSON with all formats\nc.output('css', 'brand')   // CSS custom properties with prefix\nc.output('text')           // plain hex string\n\n// String coercion\n`${c}`             // '#fe0000'\n```\n\n#### Color Transforms\n\nAll transforms operate in **OKLCH space** and return a new immutable `Color`. Chain freely.\n\n```typescript\n// Absolute deltas — clamped to valid range\nc.lighten(0.1)           // L += 0.1 (OKLCH lightness, 0-1)\nc.darken(0.1)            // L -= 0.1\nc.saturate(0.05)         // C += 0.05 (OKLCH chroma)\nc.desaturate(0.05)       // C -= 0.05\nc.rotate(30)             // H += 30° (hue rotation)\n\n// All accept negative values: lighten(-0.1) === darken(0.1)\n\n// Set absolute OKLCH values\nc.set({ lightness: 0.48 })             // set L\nc.set({ chroma: 0.15, hue: 200 })     // batch set\n\n// Chain transforms\ncolor('#66b172').lighten(0.1).desaturate(0.05).hex\n// → bright desaturated green, no throwaway converters\n```\n\n#### Mix (color space interpolation)\n\nLike CSS `color-mix()` — interpolates between two colors in a chosen color space.\n\n```typescript\nc.mix('#0000ff', 0.5)            // 50% mix in oklch (default)\nc.mix('#0000ff', 0.18, 'lab')    // explicit color space\nc.mix('#0000ff', 0.18, 'srgb')   // sRGB interpolation\n```\n\n#### Blend (compositing modes)\n\nLike Photoshop/CSS blend modes — composites two colors with an opacity and a blend mode.\n\n```typescript\nc.blend('#0000ff', 0.15, 'multiply')\nc.blend('#0000ff', 0.15, 'screen')\nc.blend('#0000ff', 0.15, 'overlay')\n```\n\nAvailable blend modes: `normal`, `multiply`, `screen`, `overlay`, `darken`, `lighten`, `color-dodge`, `color-burn`, `hard-light`, `soft-light`, `difference`, `exclusion`, `hue`, `saturation`, `color`, `luminosity`, `plus-darker`, `plus-lighter`\n\n### `rampa.convert(color, format)`\n\nStandalone utility to convert a color to a different format.\n\n```typescript\nrampa.convert('#fe0000', 'hsl');    // 'hsl(0, 100%, 50%)'\nrampa.convert('#fe0000', 'rgb');    // 'rgb(254, 0, 0)'\nrampa.convert('#fe0000', 'oklch');  // 'oklch(62.8% 0.257 29)'\nrampa.convert('#fe0000', 'hex');    // '#fe0000'\n```\n\n### `rampa.mix(color1, color2, t)`\n\nMix two colors in OKLCH space at a given ratio. Produces perceptually uniform transitions — hues travel the color wheel naturally, lightness steps look even, and chroma stays vivid instead of dipping through gray.\n\n```js\nrampa.mix('#ff0000', '#0000ff', 0);    // '#ff0302' (start color)\nrampa.mix('#ff0000', '#0000ff', 0.5);  // midpoint — vivid purple, not muddy gray\nrampa.mix('#ff0000', '#0000ff', 1);    // '#0031e5' (end color)\nrampa.mix('#000000', '#ffffff', 0.5);  // perceptual mid-gray\n```\n\nGenerate a gradient with multiple steps:\n\n```js\nconst steps = 10;\nconst gradient = Array.from({ length: steps }, (_, i) =>\n  rampa.mix('#ff0000', '#0000ff', i / (steps - 1))\n);\n```\n\n### `lint(foreground, background)`\n\nEvaluate contrast between two colors. Returns score, pass/fail levels, and lint warnings. Default mode is `'apca'`.\n\n```js\nimport { lint } from '@basiclines/rampa-sdk';\n\n// APCA (default) — returns Lc value\nconst result = lint('#ffffff', '#1e1e2e');\nresult.score      // -104.3 (Lc value)\nresult.pass       // true (at least one level passes)\nresult.levels     // [{ name: 'Preferred body text', threshold: 90, pass: true }, ...]\nresult.warnings   // []\n\n// WCAG 2.x — chain .mode('wcag')\nconst wcag = lint('#777', '#ffffff').mode('wcag');\nwcag.score        // 4.48 (contrast ratio)\nwcag.levels       // [{ name: 'AAA Normal text', threshold: 7, pass: false }, ...]\n\n// Export\nresult.output('json')  // JSON with full result\nresult.output('text')  // readable text report\nresult.output('css')   // CSS custom properties\n```\n\n**Lint warnings** fire automatically:\n- Near-identical colors (deltaE < 3)\n- Contrast below minimum usable threshold\n- Pure `#000000` or `#ffffff` detected\n\n## Types\n\n```typescript\nimport type {\n  ColorFormat,         // 'hex' | 'hsl' | 'rgb' | 'oklch'\n  ScaleType,           // 'linear' | 'fibonacci' | 'golden-ratio' | ...\n  BlendMode,           // 'normal' | 'multiply' | 'screen' | ...\n  HarmonyType,         // 'complementary' | 'triadic' | 'analogous' | ...\n  RampResult,          // { name, baseColor, colors }\n  RampaResult,         // { ramps: RampResult[] }\n  RampaFn,             // callable palette returned by rampa()\n  Color,               // { hex, rgb, hsl, oklch, luminance, format(), output(), lighten(), ... }\n  ColorInfo,           // { hex, rgb, hsl, oklch }\n  OklchSetValues,      // { lightness?, chroma?, hue? } for color.set()\n  InterpolationMode,   // 'oklch' | 'lab' | 'rgb' | 'srgb'\n  LinearColorSpaceFn,  // callable function returned by LinearColorSpace.size()\n  CubeColorSpaceFn,    // callable function returned by CubeColorSpace.size()\n  LintResult,          // lint builder with score, pass, levels, warnings, output()\n  ContrastMode,        // 'wcag' | 'apca'\n  ContrastLevelResult, // { name, threshold, pass }\n  ContrastResult,      // { mode, score, pass, levels, warnings, foreground, background }\n} from '@basiclines/rampa-sdk';\n```\n\n## Examples\n\n### Design System Palette\n\n```typescript\nimport { rampa } from '@basiclines/rampa-sdk';\n\nconst primary = rampa('#3b82f6')\n  .size(10)\n  .lightness(5, 95)\n  .saturationDistribution('ease-out');\n\nconst neutral = rampa('#64748b')\n  .size(10)\n  .saturation(20, 0);\n\nconst danger = rampa('#ef4444')\n  .size(10)\n  .lightness(10, 90);\n\n// Access individual colors\nprimary(5)         // mid-tone blue\nneutral(1)         // darkest gray\ndanger(8).hsl()    // light red in HSL\n```\n\n### Full Palette with Harmonies\n\n```typescript\nconst palette = rampa('#3b82f6')\n  .size(10)\n  .lightness(5, 95)\n  .lightnessDistribution('ease-in-out')\n  .add('complementary')\n  .add('analogous');\n\npalette(1)          // first base color\npalette.ramps[1]    // complementary ramp\npalette.ramps[2]    // analogous ramp\n```\n\n### CSS Variables for a Theme\n\n```typescript\nconst theme = rampa('#3b82f6')\n  .size(10)\n  .add('complementary')\n  .tint('#FFD700', 5, 'overlay')\n  .output('css');\n\n// Inject into page\nconst style = document.createElement('style');\nstyle.textContent = theme;\ndocument.head.appendChild(style);\n```\n\n### Build Tool Integration\n\n```typescript\nimport { rampa } from '@basiclines/rampa-sdk';\nimport { writeFileSync } from 'fs';\n\nconst colors = rampa('#3b82f6')\n  .size(10)\n  .format('hsl');\n\n// Write to a tokens file\nwriteFileSync('tokens.json', JSON.stringify({ colors: colors.palette }, null, 2));\n```\n\n## CLI Parity\n\nThe SDK produces identical output to the CLI. These are equivalent:\n\n```bash\n# CLI\nrampa --color \"#3b82f6\" --size=5 --lightness 10:90 --add=complementary --output json\n```\n\n```typescript\n// SDK\nrampa('#3b82f6').size(5).lightness(10, 90).add('complementary').output('json');\n```\n\n## Color Spaces\n\nColor spaces let you create structured palettes from a set of anchor colors and query them semantically. Three geometric primitives are available:\n\n- **LinearColorSpace** — 1D interpolated ramp\n- **PlaneColorSpace** — 2D saturation×lightness plane\n- **CubeColorSpace** — 3D trilinear interpolation cube\n\n### `LinearColorSpace`\n\nInterpolates between two colors to produce an evenly-spaced ramp.\n\n```typescript\nimport { LinearColorSpace } from '@basiclines/rampa-sdk';\n\nconst neutral = new LinearColorSpace('#ffffff', '#000000').size(24);\nneutral(1)               // → '#ffffff' (lightest, returns string directly)\nneutral(12)              // → '#666666' (mid gray)\nneutral(12).hsl()        // → 'hsl(0, 0%, 40%)'\nneutral.palette          // → string[24]\n```\n\n#### Ramp introspection\n\nAccess individual steps as full `Color` objects with `.at()`, or get all steps with `.colors()`:\n\n```typescript\nconst ramp = new LinearColorSpace('#000', '#fff').size(12);\n\nramp.at(3)                       // → Color (0-based index)\nramp.at(3).oklch.c               // → chroma at step 3\nramp.at(3).lighten(0.1).hex      // → transform a ramp step\n\nramp.colors()                    // → Color[]\nramp.colors().map(c => c.oklch.c)  // → chroma curve across ramp\n```\n\n**`.at()` is 0-based** (like `Array.at()`), while the callable `ramp(n)` remains 1-based for backward compatibility.\n\n#### Lookup table mode\n\nSet `.interpolation(false)` for a plain lookup table — no interpolation, just indexed access to the exact colors you provide:\n\n```typescript\nconst base = new LinearColorSpace(\n  '#45475a', '#f38ba8', '#a6e3a1', '#f9e2af',\n  '#89b4fa', '#f5c2e7', '#94e2d5', '#a6adc8'\n).interpolation(false).size(8);\n\nbase(1)  // → '#45475a' (exact, no interpolation)\nbase(3)  // → '#a6e3a1'\n```\n\n### `PlaneColorSpace`\n\nCreates a 2D color plane for a single hue, anchored to shared dark/light values. Create one plane per hue.\n\n```\nY(lightness)\n1 │  light ─────────── hue\n  │    │                 │\n  │    │   interpolated  │\n  │    │                 │\n0 │  dark ─────────── dark\n  └──────────────────────── X(saturation)\n      0                  1\n```\n\nAt Y=0 the entire row converges to the dark anchor.\n\n```typescript\nimport { PlaneColorSpace } from '@basiclines/rampa-sdk';\n\n// One plane per hue, reuse dark/light anchors\nconst red  = new PlaneColorSpace('#1e1e2e', '#cdd6f4', '#f38ba8').size(6);\nconst blue = new PlaneColorSpace('#1e1e2e', '#cdd6f4', '#89b4fa').size(6);\n\nred(3, 5)          // → ColorAccessor (saturation=3, lightness=5)\nred(0, 3)          // → achromatic at lightness 3 (no hue influence)\nred(5, 5)          // → full hue color\nred(0, 0)          // → dark anchor\nred.palette        // → string[36] (6²)\n\n// Ramp introspection\nred.at(3, 5)              // → Color at (saturation=3, lightness=5)\nred.at(3, 5).oklch.c      // → chroma at that coordinate\nred.colors()              // → Color[] (flat, row-major)\n\n// Template literals and concatenation work directly\n`background: ${red(3, 5)};`  // → 'background: #ab34cd;'\n\n// Format conversion\nred(3, 5).hsl()    // → 'hsl(280, 60%, 50%)'\nred(3, 5).oklch()  // → 'oklch(52.3% 0.198 310)'\n```\n\n### `CubeColorSpace`\n\nCreates a 3D color cube from 8 corner colors via trilinear interpolation. The constructor keys become alias names for semantic lookups.\n\n```typescript\nimport { CubeColorSpace } from '@basiclines/rampa-sdk';\n\nconst { r, b, tint } = new CubeColorSpace({\n  k: '#1e1e2e',    // origin (0,0,0)\n  r: '#f38ba8',    // x axis\n  g: '#a6e3a1',    // y axis\n  b: '#89b4fa',    // z axis\n  y: '#f9e2af',    // x+y\n  m: '#cba6f7',    // x+z\n  c: '#94e2d5',    // y+z\n  w: '#cdd6f4',    // x+y+z\n}).size(6);\n\nr(4)                     // → strong red\ntint({ r: 4, b: 2 })     // → red-blue blend\ntint({ w: 3 })           // → mid-white (all axes at 3)\n\n// Ramp introspection\ncube.at(2, 3, 1)         // → Color at (x=2, y=3, z=1)\ncube.colors()            // → Color[]\n```\n\n#### Custom vocabulary\n\nThe alias names are whatever you put in the constructor — not limited to ANSI names:\n\n```typescript\nconst space = new CubeColorSpace({\n  dark:    '#1a1a2e',\n  warm:    '#e74c3c',\n  nature:  '#2ecc71',\n  ocean:   '#3498db',\n  sunset:  '#f39c12',\n  berry:   '#9b59b6',\n  mint:    '#1abc9c',\n  light:   '#ecf0f1',\n}).size(6);\n\nspace({ warm: 4, ocean: 2 })  // → warm-ocean blend\n```\n\n#### How aliases map to the cube\n\nThe 8 keys map to cube corners by insertion order:\n\n| Position | Key # | Cube coords | Axis mask |\n|----------|-------|-------------|-----------|\n| 1st | origin | (0,0,0) | — |\n| 2nd | x | (1,0,0) | x |\n| 3rd | y | (0,1,0) | y |\n| 4th | z | (0,0,1) | z |\n| 5th | xy | (1,1,0) | x+y |\n| 6th | xz | (1,0,1) | x+z |\n| 7th | yz | (0,1,1) | y+z |\n| 8th | xyz | (1,1,1) | x+y+z |\n\nWhen you call `tint({ r: 4, b: 2 })`, each alias's mask is multiplied by its intensity and merged with `Math.max` to produce cube coordinates.\n\n### Interpolation modes\n\n`LinearColorSpace`, `PlaneColorSpace`, and `CubeColorSpace` all support configurable interpolation:\n\n| Mode | Description |\n|------|-------------|\n| `'oklch'` (default) | Perceptually uniform — hues travel the color wheel, even lightness steps |\n| `'lab'` | CIE L\\*a\\*b\\* — perceptual but no hue rotation |\n| `'rgb'` | Linear RGB — fast but perceptually uneven |\n| `false` | No interpolation — plain lookup table (LinearColorSpace only) |\n\n```typescript\n// LinearColorSpace\nnew LinearColorSpace('#ff0000', '#0000ff').interpolation('oklch').size(10)\nnew LinearColorSpace('#ff0000', '#0000ff').interpolation('lab').size(10)\nnew LinearColorSpace('#f00', '#0f0', '#00f').interpolation(false).size(3)\n\n// PlaneColorSpace\nnew PlaneColorSpace('#000', '#fff', '#f00').interpolation('oklch').size(6)\nnew PlaneColorSpace('#000', '#fff', '#f00').interpolation('lab').size(6)\n\n// CubeColorSpace\nnew CubeColorSpace({ ... }).interpolation('lab').size(6)\n```\n\n### Distribution curves\n\nAll color space classes support `.distribution(scale)` to apply non-linear step spacing. When not set, steps are evenly spaced (zero overhead on the default path).\n\nAvailable scales: `ease-in`, `ease-out`, `ease-in-out`, `fibonacci`, `golden-ratio`, `geometric`, `logarithmic`, `powers-of-2`, `musical-ratio`, `cielab-uniform`\n\n```typescript\n// Ease-in: bunch colors toward the start, spread out toward the end\nconst ramp = new LinearColorSpace('#ffffff', '#000000')\n  .distribution('ease-in')\n  .size(10);\n\n// Fibonacci spacing on a 2D plane\nconst red = new PlaneColorSpace('#1e1e2e', '#cdd6f4', '#f38ba8')\n  .distribution('fibonacci')\n  .size(8);\n\n// Golden ratio on a cube\nconst space = new CubeColorSpace({ ... })\n  .distribution('golden-ratio')\n  .size(6);\n```\n\n### Color accessor\n\nAll color space lookups return a `ColorAccessor` — a string that works directly in template literals and concatenation, with conversion methods:\n\n```typescript\nconst c = red(3, 5);\n`${c}`             // → '#ab34cd' (string coercion)\n'bg: ' + c         // → 'bg: #ab34cd' (concatenation)\nc.hex()            // → '#ab34cd'\nc.hsl()            // → 'hsl(280, 60%, 50%)'\nc.rgb()            // → 'rgb(171, 52, 205)'\nc.oklch()          // → 'oklch(52.3% 0.198 310)'\nc.luminance        // → 0.52 (perceptual, 0–1)\n```\n\nUse `.format()` on the color space to change the default output format:\n\n```typescript\nconst rgbSpace = new PlaneColorSpace('#000', '#fff', '#f00').format('rgb').size(6);\n`${rgbSpace(3, 5)}`  // → 'rgb(255, 128, 128)'\nrgbSpace(3, 5).hex() // → '#ff8080' (still available)\n```\n\n## Image Palette Extraction\n\nExtract color palettes from images with three tiers of analysis: raw unique colors, dominant color clusters, and ANSI-classified palettes.\n\nRequires `fast-png` and `jpeg-js` (installed as dependencies). Supports PNG and JPEG files.\n\n### `palette(filePath)`\n\n```typescript\nimport { palette } from '@basiclines/rampa-sdk';\n\nconst p = await palette('photo.jpg');\n```\n\n### Dominant Colors\n\nTop N color groups via k-means clustering in OKLCH space:\n\n```typescript\np.dominant()                     // → PaletteEntry[] (top 10)\np.dominant({ count: 5 })        // top 5\np.dominant({ tolerance: 10 })   // wider clustering (default: 4)\n\n// Shortcut with .at() (0-based, like ramp.at())\np.at(0)                          // most dominant color\np.at(0).color.hex               // → '#2d2a18'\np.at(0).frequency               // → 0.278 (27.8% of pixels)\np.at(0).color.lighten(0.1).hex  // chain transforms\n```\n\n### Raw Palette\n\nAll unique colors with near-duplicates merged:\n\n```typescript\np.raw()                          // → PaletteEntry[]\np.raw({ tolerance: 3 })         // deltaE merge threshold (default: 2)\np.raw({ maxColors: 500 })       // cap output (default: 1000)\n```\n\n### ANSI Palette\n\nColors classified into terminal color categories:\n\n```typescript\np.ansi()\n// → { red: PaletteEntry[], green: [...], blue: [...], ... }\n\np.ansi({ count: 3 })            // max 3 per category (default: 5)\n```\n\nCategories: `black`, `red`, `green`, `yellow`, `blue`, `magenta`, `cyan`, `white`\n\n### Group by OKLCH Property\n\nGroup colors into buckets by lightness, chroma, or hue:\n\n```typescript\np.group({ by: 'L' })            // → { darkest, dark, mid, light, lightest }\np.group({ by: 'C' })            // → { gray, muted, saturated, vivid }\np.group({ by: 'H' })            // → { red, orange, yellow, green, cyan, blue, purple, pink }\n\np.group({ by: 'L', count: 3 })  // max 3 colors per bucket\np.group({ by: 'L', tolerance: 10 })  // wider dedup within buckets\n```\n\nCustom bucket boundaries:\n\n```typescript\np.group({\n  by: 'L',\n  buckets: [\n    { name: 'dark', min: 0, max: 0.3 },\n    { name: 'mid',  min: 0.3, max: 0.7 },\n    { name: 'light', min: 0.7, max: 1.0 },\n  ],\n})\n```\n\n### Sorting with `.sortBy()`\n\nAll array and grouped results support `.sortBy()` for reordering:\n\n```typescript\n// Sort dominant colors by lightness (dark → light)\np.dominant({ count: 5 }).sortBy('L')\n\n// Sort within each group bucket\np.group({ by: 'C' }).sortBy('L')    // chroma groups, each sorted dark→light\np.ansi().sortBy('L')                 // ANSI categories, each sorted dark→light\n\n// Sort fields: 'L' (lightness), 'C' (chroma), 'H' (hue), 'frequency'\np.raw().sortBy('H')                  // all colors sorted by hue angle\n\n// Chainable — returns a new sorted result\np.dominant().sortBy('L').sortBy('C')\n```\n\n### Extras\n\n```typescript\np.average()                      // → Color (weighted OKLCH average)\np.temperature()                  // → 'warm' | 'cool' | 'neutral'\n```\n\n### Output\n\n```typescript\np.output('json')                 // full analysis as JSON\np.output('css', 'photo')        // CSS custom properties\np.output('text')                 // readable text\n```\n\n### PaletteEntry Shape\n\n```typescript\ninterface PaletteEntry {\n  color: Color;       // full Color with transforms\n  frequency: number;  // 0-1, percentage of sampled pixels\n}\n```\n\n## Development\n\n```bash\ncd sdk\nbun install\n\n# Run tests\nbun test\n\n# Build\nbun run build\n```\n","readmeFilename":"README.md"}