{"_id":"@dr-ishaan/rehype-perfect-code-blocks","_rev":"23-89687e7536123325353092d8028980ae","name":"@dr-ishaan/rehype-perfect-code-blocks","dist-tags":{"latest":"2.5.1"},"versions":{"1.1.0":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"1.1.0","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@1.1.0","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"b7c2aac4c300f20bb3eee3c937983cd8cfd494b2","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-1.1.0.tgz","fileCount":46,"integrity":"sha512-35l84XL8jvDcJuAgsHFfSgmJUq3Qt3XAGgn56wfrkLCbODJMLbVCiNcf67iWzg7VPbYeYtxgo/lAtP3mMUTMcA==","signatures":[{"sig":"MEUCIQDBont3F25hI2BSI3ooYM4SvzC2saHKKHH/QZ8FfDNofAIgDgQ5N4TaQ0PvrED6BgpE/LrHb80Dq12LnXsRWR6Rbf0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":299870},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css"},"gitHead":"5743147f6ff52ebee90aa7e05685497dee27486e","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_1.1.0_1781781168926_0.883396958740847","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"1.1.1","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@1.1.1","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"6bbc36a172eadbbde9ea43e6a9ccea14425d9402","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-1.1.1.tgz","fileCount":46,"integrity":"sha512-T/cjXh4vu0+7qoKGfbe1M9GvUt1nR4y+kg4Jy2C+GqHcGiY3ba4POFNFGgG6PoNF4E/cPm22lD3BRafEpeWdmg==","signatures":[{"sig":"MEUCIGx+RNqQbHI0XpZM8IQfmGmY+krlHzt2Ha8FPDBZQqs7AiEAxGuntdpB2+Oy2doZeY/DfRjHDdAvjGiBdsN7XCwtlXY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":301447},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css"},"gitHead":"5743147f6ff52ebee90aa7e05685497dee27486e","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_1.1.1_1781781947914_0.43426310391622414","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"1.1.3","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@1.1.3","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"8534bd7c13eeb2d757b0fdc12666020fe5c8db89","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-1.1.3.tgz","fileCount":46,"integrity":"sha512-b2paiH5IC0qRiQi/n9dlF2FThSQ0Yybsj0fJRB0+0OxUqAw9aIv5wKrJlV61a5pLDPp/zev/Rt70I1mfHdGzuw==","signatures":[{"sig":"MEYCIQCKxcwuAE4aw7GS39oRWEXYZStr11nwCN72Fy+Pf6CrHQIhANdsLdIfbyduv9NFrV0hDojPlN+ADeVOdRFQCAyL0JxL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":303015},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css"},"gitHead":"5743147f6ff52ebee90aa7e05685497dee27486e","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_1.1.3_1781782117426_0.48082245254692313","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"1.1.4","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@1.1.4","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"ea237434e373acaa8041b2fb34c56e8262061b47","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-1.1.4.tgz","fileCount":46,"integrity":"sha512-KIB9C9Wn3v9ORYl0n9G5kaJfL++yVXLwHkOQ453HIAF9Is6SrdEhS1RaYGWCGQXlRs19JbLZJYtxBWzLwUJ2wQ==","signatures":[{"sig":"MEUCIFjz2qz0EF1bR35qSAGHQ2hnIOPKYutJqZpK+DDTQ19KAiEAwtLQJrM2AeaQpp+Jp82GirlvAFcNpYmEO4ghW63yrJg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":303143},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css"},"gitHead":"5743147f6ff52ebee90aa7e05685497dee27486e","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_1.1.4_1781782226476_0.5702516110718108","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"1.1.5","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@1.1.5","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"0a36337f289a6ccc50971ab1211ee706b4fe3364","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-1.1.5.tgz","fileCount":46,"integrity":"sha512-UzhRqqg/B3fZ9Zof6MW8l4uia2n58l5420Mv1KYzJcNGS3IGzhTJnBVQkIEoprQWDUxfpTcHf3Fkpl+O455c5Q==","signatures":[{"sig":"MEQCIB0HiYgB0m2Ntylqu0qOMKjYm5Z7qGfzG6B88zHLbySEAiBVyNZCHIQ9kcWurVl5OK3LVsb6St/po02/cXLW+qRwPA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":304408},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css"},"gitHead":"5743147f6ff52ebee90aa7e05685497dee27486e","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_1.1.5_1781782310224_0.3612188327994441","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"1.1.6","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@1.1.6","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"49faf53bfed5fa55533a0ae17317b13d0f2c2af3","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-1.1.6.tgz","fileCount":46,"integrity":"sha512-+XA0ON1YCtRPx/X1Jzrq11VYLQFuv0kT96TYYYpPb3X7LjUL2/3tZ9GGzsKeWaOgr6X7TNxVwEdy7TCHUHcatA==","signatures":[{"sig":"MEQCIG7/g/qUg7nkKuhriiJdC5oRS2YwnDqrnJuMpik2pBm/AiBQ32fxF9HoevC10r0ME8bZvbUk5huJT29x/ByW6TtCKQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":307384},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css"},"gitHead":"5743147f6ff52ebee90aa7e05685497dee27486e","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","rehype-raw":"^7.0.0","remark-gfm":"^4.0.1","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_1.1.6_1781782482354_0.1008325086480717","host":"s3://npm-registry-packages-npm-production"}},"1.1.7":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"1.1.7","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@1.1.7","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"61d334f0ab7a2485d05ee176096d1fb6a44a8350","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-1.1.7.tgz","fileCount":47,"integrity":"sha512-z/7ka5lLst3pwB/sI3BHQ8pt2FlbV72L7qWkkBVqy+1VjzvZNxL/jVTmRl0bC5UXZCuETqBK0trN5khIDGBJEw==","signatures":[{"sig":"MEUCIQDsdC1NdbO0HBYmFVg01J1ibEkFtUHCp+KUYdC9bA1OaQIgKq5IioCNQhgzMwhc/2Icz+yFOQ8MBWfb4JFX8sbzSs0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":319773},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./meta":{"types":"./dist/meta.d.ts","import":"./dist/meta.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./shiki":{"types":"./dist/shiki.d.ts","import":"./dist/shiki.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css","./copy-script":{"types":"./dist/copy-script.d.ts","import":"./dist/copy-script.js"},"./transformer":{"types":"./dist/transformer.d.ts","import":"./dist/transformer.js"}},"gitHead":"eb4a694a7813db02839ac4b226bf17c351f16aea","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0 || ^6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_1.1.7_1781824918868_0.4256655044498976","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"1.2.0","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@1.2.0","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"9fc4405e0fb0d27163df782591874e03ae2f62e6","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-1.2.0.tgz","fileCount":47,"integrity":"sha512-7v09IslC8M9iF4KkPTvGFQRkEh4yDKabUMoChtAVW1DchRc35J62q4y5zyV7102qDWN/y4qu7z3v0TM3zcC0oA==","signatures":[{"sig":"MEYCIQDoukRCpJ6Sq8YpHxkhOhv2asiFrnlgxtw/lwG1veb+HQIhAKiViJt2iJnrLXwmn47/h9imI8xgOz5zv7Cverlu3iZN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":395991},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./meta":{"types":"./dist/meta.d.ts","import":"./dist/meta.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./shiki":{"types":"./dist/shiki.d.ts","import":"./dist/shiki.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css","./copy-script":{"types":"./dist/copy-script.d.ts","import":"./dist/copy-script.js"},"./transformer":{"types":"./dist/transformer.d.ts","import":"./dist/transformer.js"}},"gitHead":"295ffc27dbe121ed5b743b5e42a6b1f0e323fdf3","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0 || ^6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_1.2.0_1781827617503_0.6988955410747568","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"1.2.1","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@1.2.1","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"5e9c5fb3dc9a612e52a7775e388e072407ff3396","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-1.2.1.tgz","fileCount":47,"integrity":"sha512-ozFEaGNqqs8WTtQ9Fm4zrimR+MxxZfojUBn2GsD86+Ji6VhAK7h/5gELL5PhY/9C31EhceHmRujPEULJttzlww==","signatures":[{"sig":"MEYCIQCSTf8CEYHsYzy5mc3MrbznLVWheWV2nyUyAI6ticQJZwIhANudGinO6g1SrozAOSHCtcIfNhLTnXn2xkkqiG8RIvC0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":404814},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./meta":{"types":"./dist/meta.d.ts","import":"./dist/meta.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./shiki":{"types":"./dist/shiki.d.ts","import":"./dist/shiki.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css","./copy-script":{"types":"./dist/copy-script.d.ts","import":"./dist/copy-script.js"},"./transformer":{"types":"./dist/transformer.d.ts","import":"./dist/transformer.js"}},"gitHead":"4d2b32a65b7fdbc84a2259eb3013dd489b1f69e2","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs && node test-issue-12.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0 || ^6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_1.2.1_1781860724495_0.7140733928717051","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"1.2.2","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@1.2.2","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"12a05eaf106fa74aaacc20ada302d00201f728f7","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-1.2.2.tgz","fileCount":47,"integrity":"sha512-fusP3oDby7TvgyLiT+XlRZPM0o8AizlI9DDpZD8bhK0ZfyD/exh2UI8M6cOFTLml9KY5O9/teFjip7Ds6ytCgQ==","signatures":[{"sig":"MEYCIQDttmYVj1I5q3TsZm3nfyLlAlkTFwstTQEhuMhT1cQZkgIhAL5Z+p0uHXFoKtXPABIm40bsNAeaUFVypgH63aZFCdhZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":411443},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./meta":{"types":"./dist/meta.d.ts","import":"./dist/meta.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./shiki":{"types":"./dist/shiki.d.ts","import":"./dist/shiki.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css","./copy-script":{"types":"./dist/copy-script.d.ts","import":"./dist/copy-script.js"},"./transformer":{"types":"./dist/transformer.d.ts","import":"./dist/transformer.js"}},"gitHead":"eda1eefdde98ba0b6a3a56212f3fff86e87984fd","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs && node test-issue-12.mjs && node test-issue-11.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0 || ^6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_1.2.2_1781861905303_0.5939911945943666","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"1.3.0","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@1.3.0","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"0b8e4502eae2bfd40771c5867db39d0d30ce4036","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-1.3.0.tgz","fileCount":57,"integrity":"sha512-p6NUSrs4Y9XHN/xVxR0R0RVt4eABnPP+XOoMldD9r6/HP2P8i+iMGH4EVTWACw+AxQCUAUacXa0k30P1cEa2uA==","signatures":[{"sig":"MEUCICD0o83LG1+wICaqkgpb+3LlxzVljYQxwjLFRPWY6K/ZAiEA/UtStR5WBPjxPWYJOPJzNyQI0v871LKeaBU7pA2v/ek=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":497857},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./meta":{"types":"./dist/meta.d.ts","import":"./dist/meta.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./shiki":{"types":"./dist/shiki.d.ts","import":"./dist/shiki.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css","./copy-script":{"types":"./dist/copy-script.d.ts","import":"./dist/copy-script.js"},"./transformer":{"types":"./dist/transformer.d.ts","import":"./dist/transformer.js"}},"gitHead":"06caf98715b8c6ed68b669a8e949c6be872cf78c","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs && node test-issue-12.mjs && node test-issue-11.mjs && node test-architecture-patterns.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0 || ^6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_1.3.0_1781866435972_0.7135879096384405","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"1.3.2","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@1.3.2","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"dcb5548c7dea50cf8f178a03ac0ceb6e7a3c2933","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-1.3.2.tgz","fileCount":57,"integrity":"sha512-RxOO6efByBVAWOV676uVyWsRvkMZyk+4W4fsXMgSVsXElyn1wY3n93iG1LZTd+1rTB3vGPDNDTevIftRbIRwMA==","signatures":[{"sig":"MEUCIQCL5TH151F0l76tCY9xgCoZqRU8JazOOC8ilrvA3cFCfAIgYQxYqaeYIQ5z1qnbAfFQagF9EMWMGJ4oXKTbmdtguCo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":519322},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./meta":{"types":"./dist/meta.d.ts","import":"./dist/meta.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./shiki":{"types":"./dist/shiki.d.ts","import":"./dist/shiki.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css","./copy-script":{"types":"./dist/copy-script.d.ts","import":"./dist/copy-script.js"},"./transformer":{"types":"./dist/transformer.d.ts","import":"./dist/transformer.js"}},"gitHead":"de7b88209c540f90dedddd4a7e686a512430ad0a","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs && node test-issue-12.mjs && node test-issue-11.mjs && node test-architecture-patterns.mjs && node test-copy-button-fix.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0 || ^6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_1.3.2_1781927058715_0.9887203955268209","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"1.3.3","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@1.3.3","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"2ec9faf9d8d99dc647a7810711fe8f92f86e73a9","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-1.3.3.tgz","fileCount":57,"integrity":"sha512-j1DpmyWM6gMf6YBHz9Ep+K6QZb4DhvEpsMzplfFE51Nh6bYeUn61/+zzkaUhqzXQdsOOVJZZ5GesQIh9SpUX0w==","signatures":[{"sig":"MEQCH2EybKhghoA+mQHUoKOViIqnAMUq5ECDKQRizqsFe/ECIQClN3doaTueEYMsF5VsMLBlXD5ycbz3X7J+BtY86B1nxw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":527301},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./meta":{"types":"./dist/meta.d.ts","import":"./dist/meta.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./shiki":{"types":"./dist/shiki.d.ts","import":"./dist/shiki.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css","./copy-script":{"types":"./dist/copy-script.d.ts","import":"./dist/copy-script.js"},"./transformer":{"types":"./dist/transformer.d.ts","import":"./dist/transformer.js"}},"gitHead":"a90ed5b0fd32052a0fa7bb2d15df4057aba690c0","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs && node test-issue-12.mjs && node test-issue-11.mjs && node test-architecture-patterns.mjs && node test-copy-button-fix.mjs && node test-tailwind-compat.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0 || ^6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_1.3.3_1781927596685_0.7357587954931386","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"2.0.0","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@2.0.0","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"9d40daa76a02b51ecafba7ce2beec6a60cf2d64a","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-2.0.0.tgz","fileCount":62,"integrity":"sha512-lrj2dsbkY+u6KCYfeocuOgBYCwq3FMzfK0SZLagABWJMw7ZX/WjuWyIVO7+hfoqUa18rH5YHGCby80gtK3Vp+w==","signatures":[{"sig":"MEUCIQCOWQnhmqDgm/l32TPsrtw0IrwFyNS3mTZMEGFbTkp72gIgE8iaenL0VdGKLaRRELC0ki4I+l2ZVO4NtllgtCyHD+8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":573595},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./meta":{"types":"./dist/meta.d.ts","import":"./dist/meta.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./shiki":{"types":"./dist/shiki.d.ts","import":"./dist/shiki.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css","./copy-script":{"types":"./dist/copy-script.d.ts","import":"./dist/copy-script.js"},"./transformer":{"types":"./dist/transformer.d.ts","import":"./dist/transformer.js"}},"gitHead":"580b525eb6741bbdae44ba09ffb9dcff1a889bf5","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs && node test-issue-12.mjs && node test-issue-11.mjs && node test-architecture-patterns.mjs && node test-copy-button-fix.mjs && node test-tailwind-compat.mjs && node test-v2-css-architecture.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0 || ^6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_2.0.0_1782011775589_0.08125026751939224","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"2.1.0","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@2.1.0","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"8ba743ccb502cbac0ca3e27b7b653672c9484bea","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-2.1.0.tgz","fileCount":73,"integrity":"sha512-wPcluykT/AHOCxi7mhN5wu4Y91/qPxwMX3utLar4F+aL4Bo6AqHN9hG/V+o0YCJanxZ6qugZc2gdp306nfEGKw==","signatures":[{"sig":"MEYCIQCQFkF0VKffgpCqLpCGGfyO9ZaG76BUhf0aXKTrhtke3AIhAMX8lwvg1d/kEUPWceV41PNRc1GPhitarxLSLcV+F1le","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":633858},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./meta":{"types":"./dist/meta.d.ts","import":"./dist/meta.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./shiki":{"types":"./dist/shiki.d.ts","import":"./dist/shiki.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css","./copy-script":{"types":"./dist/copy-script.d.ts","import":"./dist/copy-script.js"},"./transformer":{"types":"./dist/transformer.d.ts","import":"./dist/transformer.js"}},"gitHead":"7f9e94e0011053bb53295c5c3335609f147164e5","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs && node test-issue-12.mjs && node test-issue-11.mjs && node test-architecture-patterns.mjs && node test-copy-button-fix.mjs && node test-tailwind-compat.mjs && node test-v2-css-architecture.mjs && node test-v2-phase2.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0 || ^6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_2.1.0_1782013257255_0.4193657078885473","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"2.2.0","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@2.2.0","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"7e965362b3ea95bf5cfede4e322e830fbf7b7b85","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-2.2.0.tgz","fileCount":73,"integrity":"sha512-z2N6XFe9pxPtWFwzBGkqpSxly54cH9D1zUUkKThkDZOwrpl1rTZS3kJTzeNdtxfvd8xwV0mhs0hn6G1X4VQ4+g==","signatures":[{"sig":"MEYCIQCJ5kds2LrH+bJ2+WBlU9KWngG9ijTj9domYXdydcOTQgIhAPxCEpLOZuz8y4ahuA0jRmjPd7SvgGvMfk15n5L578jN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":654775},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./meta":{"types":"./dist/meta.d.ts","import":"./dist/meta.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./shiki":{"types":"./dist/shiki.d.ts","import":"./dist/shiki.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css","./copy-script":{"types":"./dist/copy-script.d.ts","import":"./dist/copy-script.js"},"./transformer":{"types":"./dist/transformer.d.ts","import":"./dist/transformer.js"}},"gitHead":"5c02d51fd6b20fb8375a966b9a59173e4850090d","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs && node test-issue-12.mjs && node test-issue-11.mjs && node test-architecture-patterns.mjs && node test-copy-button-fix.mjs && node test-tailwind-compat.mjs && node test-v2-css-architecture.mjs && node test-v2-phase2.mjs && node test-v2-phase3.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0 || ^6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_2.2.0_1782014813545_0.23919020121247825","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"2.3.0","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@2.3.0","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"e819e46fd38d308b2ce387b60bbd54bfef26e9e2","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-2.3.0.tgz","fileCount":84,"integrity":"sha512-iOsMLTK2C8uqnumStKwYrP4w+vQb84ubMk/0P9kMKzCuwQ23rCk4s5fupniSkqvVZ7Ow7nxujSDwdx2LKuaBgg==","signatures":[{"sig":"MEUCICnYKXMlfzLHOJIlToCRm6VTlUwzR6csTqpinAypa1OUAiEAsPz1OG0+aJccD+wesHEPCbw8MShw8VGxkDlLn6Msl80=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":698615},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./meta":{"types":"./dist/meta.d.ts","import":"./dist/meta.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./shiki":{"types":"./dist/shiki.d.ts","import":"./dist/shiki.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css","./copy-script":{"types":"./dist/copy-script.d.ts","import":"./dist/copy-script.js"},"./transformer":{"types":"./dist/transformer.d.ts","import":"./dist/transformer.js"}},"gitHead":"d71e70f4312103450e854a90b1679373227ba4d0","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs && node test-issue-12.mjs && node test-issue-11.mjs && node test-architecture-patterns.mjs && node test-copy-button-fix.mjs && node test-tailwind-compat.mjs && node test-v2-css-architecture.mjs && node test-v2-phase2.mjs && node test-v2-phase3.mjs && node test-v2-p2.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0 || ^6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_2.3.0_1782015694531_0.8835699800053625","host":"s3://npm-registry-packages-npm-production"}},"2.3.1":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"2.3.1","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@2.3.1","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"19040f9b2b5879158a65903b969048979733c22b","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-2.3.1.tgz","fileCount":84,"integrity":"sha512-N3b12NECxldMajSNNTdgA9iz+YyyTmKPj6Uas4oXSPxetPqwex9WE6dxE7UebfXTfisDQw7cwIHxFrJYES+ulg==","signatures":[{"sig":"MEYCIQDbMoePOFnjZqTapCEtQm+cT2zrpwwrMP25fTRRj397jwIhAI3maU54Dap0s50iliTeQgI+9n3oLjAigu6yqQEjrwog","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":718392},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./meta":{"types":"./dist/meta.d.ts","import":"./dist/meta.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./shiki":{"types":"./dist/shiki.d.ts","import":"./dist/shiki.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css","./copy-script":{"types":"./dist/copy-script.d.ts","import":"./dist/copy-script.js"},"./transformer":{"types":"./dist/transformer.d.ts","import":"./dist/transformer.js"}},"gitHead":"e73d1cba49bdc102878e10aa4f691bed6bb65745","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs && node test-issue-12.mjs && node test-issue-11.mjs && node test-architecture-patterns.mjs && node test-copy-button-fix.mjs && node test-tailwind-compat.mjs && node test-v2-css-architecture.mjs && node test-v2-phase2.mjs && node test-v2-phase3.mjs && node test-v2-p2.mjs && node test-v2.3.1-stability.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0 || ^6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_2.3.1_1782018193467_0.24177568072156608","host":"s3://npm-registry-packages-npm-production"}},"2.4.0":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"2.4.0","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@2.4.0","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"6df56686561c38a4d7d1a5b5f204f69661eb9b7b","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-2.4.0.tgz","fileCount":84,"integrity":"sha512-WDTXfvGtjkA8xUvVFVua1rnuGkndIrkweIhPLFkiSmOViYjBload1nkAtEbvpfZaGnAx2eevTxxgyo+iWYrANQ==","signatures":[{"sig":"MEYCIQDQw2Zrzk2XHLShYq7GkBCw9uu5iuKwyfOtgCDx/2wGhwIhAJ3AwKLLaGwSuSbLZgEjqgOVxYh8U0hULY5NKuQ6VMNT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":745560},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./meta":{"types":"./dist/meta.d.ts","import":"./dist/meta.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./shiki":{"types":"./dist/shiki.d.ts","import":"./dist/shiki.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css","./copy-script":{"types":"./dist/copy-script.d.ts","import":"./dist/copy-script.js"},"./transformer":{"types":"./dist/transformer.d.ts","import":"./dist/transformer.js"}},"gitHead":"46c6d4add83234278b9d805f6f37dfed30a77d79","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs && node test-issue-12.mjs && node test-issue-11.mjs && node test-architecture-patterns.mjs && node test-copy-button-fix.mjs && node test-tailwind-compat.mjs && node test-v2-css-architecture.mjs && node test-v2-phase2.mjs && node test-v2-phase3.mjs && node test-v2-p2.mjs && node test-v2.3.1-stability.mjs && node test-v2.4.0-community.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0","@shikijs/colorized-brackets":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0 || ^6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_2.4.0_1782020232459_0.20674321418134012","host":"s3://npm-registry-packages-npm-production"}},"2.4.1":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"2.4.1","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@2.4.1","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"ddeca201b5042344246e73e6f433d943c8680037","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-2.4.1.tgz","fileCount":84,"integrity":"sha512-pr/uy/07L8eu5xuN5bnFHcqriQ132zmtAQZ6CRC4qAinrUFkWcrGIzJCs8/kQxqXObcR0hldRmn1ThHTfYU5Vw==","signatures":[{"sig":"MEUCIE8QwWFbEBbjVKBzLgQxYTVzDERR6mdHvhpWCzCnx2bDAiEAnQQhe3sPy9GFUVku4Ga8mTdlCAQnjt9Ycafk6B/nus4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":747052},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./meta":{"types":"./dist/meta.d.ts","import":"./dist/meta.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./shiki":{"types":"./dist/shiki.d.ts","import":"./dist/shiki.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css","./copy-script":{"types":"./dist/copy-script.d.ts","import":"./dist/copy-script.js"},"./transformer":{"types":"./dist/transformer.d.ts","import":"./dist/transformer.js"}},"gitHead":"f1aa7813bba55972d8b25eeca99d348aeb18a8c4","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs && node test-issue-12.mjs && node test-issue-11.mjs && node test-architecture-patterns.mjs && node test-copy-button-fix.mjs && node test-tailwind-compat.mjs && node test-v2-css-architecture.mjs && node test-v2-phase2.mjs && node test-v2-phase3.mjs && node test-v2-p2.mjs && node test-v2.3.1-stability.mjs && node test-v2.4.0-community.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0","@shikijs/colorized-brackets":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0 || ^6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_2.4.1_1782047020204_0.6305462636431314","host":"s3://npm-registry-packages-npm-production"}},"2.4.2":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"2.4.2","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@2.4.2","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"8367f70e9c6f22c62b92eb65b5b6c3446442026a","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-2.4.2.tgz","fileCount":84,"integrity":"sha512-+mNSg6sidnGKByMnpEdCBokfO+pOBdzsl6H1VbApOQ9NEKZ2aldT+yf0//eYx5GM4rS5gVtz5/hvFWvkAKcHWg==","signatures":[{"sig":"MEUCIB9N9MVGF2qKN0wfTk55ITpKvI9YblPMX9fglZJfdFAEAiEA4V7yeECLSNl39nYX4iFq2J5nEvkI8Jcl1+NUK2gn+3o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":747052},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./meta":{"types":"./dist/meta.d.ts","import":"./dist/meta.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./shiki":{"types":"./dist/shiki.d.ts","import":"./dist/shiki.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css","./copy-script":{"types":"./dist/copy-script.d.ts","import":"./dist/copy-script.js"},"./transformer":{"types":"./dist/transformer.d.ts","import":"./dist/transformer.js"}},"gitHead":"346146b9d2f3e73152dd5b4a5076190217792845","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs && node test-issue-12.mjs && node test-issue-11.mjs && node test-architecture-patterns.mjs && node test-copy-button-fix.mjs && node test-tailwind-compat.mjs && node test-v2-css-architecture.mjs && node test-v2-phase2.mjs && node test-v2-phase3.mjs && node test-v2-p2.mjs && node test-v2.3.1-stability.mjs && node test-v2.4.0-community.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0","@shikijs/colorized-brackets":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0 || ^6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_2.4.2_1782048058344_0.8025458861253509","host":"s3://npm-registry-packages-npm-production"}},"2.5.0":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"2.5.0","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","_id":"@dr-ishaan/rehype-perfect-code-blocks@2.5.0","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"dist":{"shasum":"7eac7844d28d6493d44dd4faf808b83dd83ae43f","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-2.5.0.tgz","fileCount":84,"integrity":"sha512-QXqGeBR1vUSfKzMPLeApYyOAVp4XsuiUnNXLgyld7k1kBjPNXnUo48qp4UN6nXITjHXhYL6J9938DP0y/saNVg==","signatures":[{"sig":"MEUCIQCrQ/aGkpDq58CyAzidqkJaNA/1o4jmYjs6gdpjY0IhtgIgMvVF4lgX7460MTE0ABDiRhDAF7DnkZsoJNLa0GiGO/s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":756048},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./meta":{"types":"./dist/meta.d.ts","import":"./dist/meta.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./shiki":{"types":"./dist/shiki.d.ts","import":"./dist/shiki.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./styles.css":"./dist/styles.css","./copy-script":{"types":"./dist/copy-script.d.ts","import":"./dist/copy-script.js"},"./transformer":{"types":"./dist/transformer.d.ts","import":"./dist/transformer.js"}},"gitHead":"375ec22cde9b697a60ac356ea4085cccffc9cf15","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs && node test-issue-12.mjs && node test-issue-11.mjs && node test-architecture-patterns.mjs && node test-copy-button-fix.mjs && node test-tailwind-compat.mjs && node test-v2-css-architecture.mjs && node test-v2-phase2.mjs && node test-v2-phase3.mjs && node test-v2-p2.mjs && node test-v2.3.1-stability.mjs && node test-v2.4.0-community.mjs","build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","prepack":"npm run build","prepublishOnly":"npm run build && npm test"},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"repository":{"url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git","type":"git"},"_npmVersion":"11.13.0","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"hast":"^1.0.0","unist-util-visit":"^5.0.0","hast-util-from-html":"^2.0.0","@shikijs/transformers":"^4.2.0","@shikijs/colorized-brackets":"^4.2.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","shiki":"^1.0.0","unified":"^11.0.5","typescript":"^5.4.0","@types/node":"^20.0.0","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","rehype-stringify":"^10.0.1"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0 || ^6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/rehype-perfect-code-blocks_2.5.0_1782049448443_0.33555754415951333","host":"s3://npm-registry-packages-npm-production"}},"2.5.1":{"name":"@dr-ishaan/rehype-perfect-code-blocks","version":"2.5.1","description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./astro":{"types":"./dist/astro.d.ts","import":"./dist/astro.js"},"./remark":{"types":"./dist/remark.d.ts","import":"./dist/remark.js"},"./meta":{"types":"./dist/meta.d.ts","import":"./dist/meta.js"},"./transformer":{"types":"./dist/transformer.d.ts","import":"./dist/transformer.js"},"./shiki":{"types":"./dist/shiki.d.ts","import":"./dist/shiki.js"},"./copy-script":{"types":"./dist/copy-script.d.ts","import":"./dist/copy-script.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.js"},"./styles.css":"./dist/styles.css"},"scripts":{"build":"tsc -p tsconfig.json && cp src/styles.css dist/styles.css","dev":"tsc -p tsconfig.json --watch","test":"node test-meta-parser.mjs && node test-dom-structure.mjs && node test-options.mjs && node test-notations.mjs && node test-security.mjs && node test-integration.mjs && node test-regression.mjs && node test-css.mjs && node test-edge-cases.mjs && node stress-tests.mjs && node new-feature-tests.mjs && node test-issue-12.mjs && node test-issue-11.mjs && node test-architecture-patterns.mjs && node test-copy-button-fix.mjs && node test-tailwind-compat.mjs && node test-v2-css-architecture.mjs && node test-v2-phase2.mjs && node test-v2-phase3.mjs && node test-v2-p2.mjs && node test-v2.3.1-stability.mjs && node test-v2.4.0-community.mjs","prepublishOnly":"npm run build && npm test","prepack":"npm run build"},"keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"license":"MIT","author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","repository":{"type":"git","url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git"},"bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"engines":{"node":">=18.0.0"},"peerDependencies":{"astro":"^4.0.0 || ^5.0.0 || ^6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true},"shiki":{"optional":true}},"dependencies":{"@shikijs/colorized-brackets":"^4.2.0","@shikijs/transformers":"^4.2.0","hast":"^1.0.0","hast-util-from-html":"^2.0.0","unist-util-visit":"^5.0.0"},"devDependencies":{"@types/node":"^20.0.0","astro":"^5.0.0","rehype-stringify":"^10.0.1","remark-parse":"^11.0.0","remark-rehype":"^11.1.2","shiki":"^1.0.0","typescript":"^5.4.0","unified":"^11.0.5"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"gitHead":"dc21b469248621872c14fa30576cee6206867e11","_id":"@dr-ishaan/rehype-perfect-code-blocks@2.5.1","_nodeVersion":"24.16.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-tUGGWOyTLkiEMaD/tBGPp3ndpoELo5dKfgRareLgDU83qLgPhLD7wzo0yY/6IrwdT+Qaw8HlMIN6vSJXlRQEuw==","shasum":"388a4a008a818265518a9cbf14c4ad19d04291d8","tarball":"https://registry.npmjs.org/@dr-ishaan/rehype-perfect-code-blocks/-/rehype-perfect-code-blocks-2.5.1.tgz","fileCount":84,"unpackedSize":776423,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDodJ1zcs+TGi0cnXkjqIbKbJ9ydikVnGOL6ZadiUhu/QIhAM0TndWUXz+bvWmwmSOGhSqKgwmpULkCfijrLAzQG6NQ"}]},"_npmUser":{"name":"dr-ishaan","email":"adi.ishaan@proton.me"},"directories":{},"maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rehype-perfect-code-blocks_2.5.1_1782052436204_0.45163130676485297"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-18T11:12:48.768Z","modified":"2026-06-21T14:33:56.486Z","1.1.0":"2026-06-18T11:12:49.061Z","1.1.1":"2026-06-18T11:25:48.068Z","1.1.3":"2026-06-18T11:28:37.608Z","1.1.4":"2026-06-18T11:30:26.634Z","1.1.5":"2026-06-18T11:31:50.356Z","1.1.6":"2026-06-18T11:34:42.511Z","1.1.7":"2026-06-18T23:21:59.005Z","1.2.0":"2026-06-19T00:06:57.663Z","1.2.1":"2026-06-19T09:18:44.669Z","1.2.2":"2026-06-19T09:38:25.445Z","1.3.0":"2026-06-19T10:53:56.144Z","1.3.2":"2026-06-20T03:44:18.903Z","1.3.3":"2026-06-20T03:53:16.839Z","2.0.0":"2026-06-21T03:16:15.735Z","2.1.0":"2026-06-21T03:40:57.442Z","2.2.0":"2026-06-21T04:06:53.690Z","2.3.0":"2026-06-21T04:21:34.689Z","2.3.1":"2026-06-21T05:03:13.675Z","2.4.0":"2026-06-21T05:37:12.633Z","2.4.1":"2026-06-21T13:03:40.414Z","2.4.2":"2026-06-21T13:20:58.506Z","2.5.0":"2026-06-21T13:44:08.603Z","2.5.1":"2026-06-21T14:33:56.393Z"},"bugs":{"url":"https://github.com/dr-ishaan/rehype-perfect-code-blocks/issues"},"author":{"name":"dr-ishaan","email":"dr-ishaan@users.noreply.github.com"},"license":"MIT","homepage":"https://github.com/dr-ishaan/rehype-perfect-code-blocks#readme","keywords":["rehype","astro","shiki","code-block","syntax-highlighting","mdx","markdown","rehype-pretty-code","vitepress","docusaurus","expressive-code","remark","highlight","copy-button","line-numbers"],"repository":{"type":"git","url":"git+https://github.com/dr-ishaan/rehype-perfect-code-blocks.git"},"description":"Beautiful, configurable code blocks for Astro / MDX / any rehype pipeline. Built on Shiki, inspired by rehype-pretty-code, VitePress, Docusaurus, and Expressive Code.","maintainers":[{"name":"dr-ishaan","email":"adi.ishaan@proton.me"}],"readme":"# rehype-perfect-code-blocks\n\nBeautiful, configurable code blocks for Astro, MDX, and any rehype pipeline. Built on Shiki, inspired by [rehype-pretty-code](https://github.com/rehype-pretty/rehype-pretty-code), [VitePress](https://vitepress.dev/), [Docusaurus](https://docusaurus.io/), and [Expressive Code](https://expressive-code.com/).\n\n## Why this exists\n\n- **One-line Astro setup** — `perfectCode()` integration does everything\n- **All VitePress notations work** — `// [!code highlight]`, `// [!code focus]`, `// [!code ++]`, `// [!code --]`, `// [!code error]`, `// [!code warning]`, `// [!code word:foo]`\n- **Docusaurus magic comments** — `// highlight-next-line`, `// highlight-start` / `// highlight-end`\n- **rehype-pretty-code meta syntax** — `title=\"...\"`, `{1,3-5}`, `/word/`, `/word/3-5#id`\n- **Auto terminal frame** for `sh`/`bash`/`zsh` etc., editor frame for everything else\n- **Dual themes** via Shiki's `themes: { light, dark }` — emits `--shiki-light` / `--shiki-dark` CSS vars\n- **Theme-aware color defaults** — `--pcb-*` variables auto-derived from the loaded Shiki theme with WCAG contrast enforcement (v1.3.0+)\n- **Word-level diff** — opt-in `wordDiff: true` wraps changed words in `<mark class=\"pcb__word-diff--{add,del}\">` within `+`/`-` diff lines (v1.3.0+)\n- **SPA-robust copy button** — event delegation + MutationObserver + `astro:page-load` for React/Vue/Astro view transitions (v1.3.0+)\n- **Highlighter lifecycle** — `disposeHighlighter()` for long-running dev servers (v1.3.0+)\n- **CSS variables everywhere** — every visual property is a `--pcb-*` var, scoped with `:where()` for zero-specificity\n- **Configurable copy button** — hover mode, custom icons, custom duration, custom labels\n- **1092 tests pass** — edge cases, stress tests, regression suites, and architecture-pattern tests\n\n## What's new in v1.3.0\n\nv1.3.0 adopts **5 architectural patterns** identified through a systematic source-code comparison of 6 community packages (rehype-pretty-code, expressive-code, @shikijs/transformers, VitePress, Docusaurus, astro-expressive-code):\n\n| # | Pattern | Source | New export / option |\n|---|---|---|---|\n| 1 | **Highlighter task queue** — serializes all highlighter operations globally, prevents race conditions in parallel builds | expressive-code | `runHighlighterTask<T>(taskFn)` |\n| 2 | **Color-contrast-aware theme defaults** — `--pcb-*` variables auto-derived from the loaded Shiki theme with WCAG contrast enforcement | expressive-code | (internal; `src/color-utils.ts`) |\n| 3 | **`disposeHighlighter()` lifecycle** — releases cached Shiki highlighters (WASM engine + grammars) for long-running dev servers | VitePress | `disposeHighlighter()` |\n| 4 | **Event-delegation copy button + MutationObserver** — SPA-robust for React/Vue/Astro view transitions | VitePress + expressive-code | (internal; copy-script.ts) |\n| 5 | **Word-level diff** — opt-in `wordDiff: true` wraps changed words in `<mark>` elements within diff lines | expressive-code | `wordDiff` option + `wordDiff()` / `hasChanges()` utilities |\n\nNo breaking API changes. All new behavior is opt-in or backward-compatible. See [CHANGELOG.md](./CHANGELOG.md) for full details.\n\n### Recent bug fixes (v1.2.1, v1.2.2)\n\n- **v1.2.2** — Fixed DoS bug where `{1-1000000}` line-highlight range caused `RangeError: Maximum call stack size exceeded` (issue #11).\n- **v1.2.1** — Fixed case-sensitive language loader that rejected `JS`/`TypeScript`/`Python` (issue #12).\n- **v1.2.0** — Adopted 23 features from community competitors (transformers, terminal frames, i18n, CSP nonces, etc.).\n\n## Install\n\n```bash\nnpm install rehype-perfect-code-blocks\n```\n\nOptional peers: `astro` (for the integration), `shiki` (only if you set `engine: 'shiki'`).\n\n**Recommended:** also install [`rehype-raw`](https://github.com/rehypejs/rehype-raw) if your markdown contains raw HTML (`<details>`, `<kbd>`, `<mark>`, etc.). See [⚠️ Required: `rehype-raw`](#-required-rehype-raw-for-code-blocks-inside-raw-html) below.\n\n## Quick start (Astro)\n\n```ts\n// astro.config.mjs\nimport { defineConfig } from 'astro/config';\nimport rehypeRaw from 'rehype-raw';\nimport perfectCode from 'rehype-perfect-code-blocks/astro';\n\nexport default defineConfig({\n  integrations: [\n    perfectCode({\n      // All options are optional — these are the defaults\n      decorations: true,\n      showLanguage: true,\n      copyButton: true,\n      shiki: { theme: { light: 'github-light', dark: 'github-dark' } },\n      // Add rehype-raw so code blocks inside raw HTML (<details>, <kbd>, etc.) render\n      rehypePlugins: [\n        rehypeRaw,  // ← must come BEFORE rehypePerfectCodeBlocks\n      ],\n    }),\n  ],\n});\n```\n\nThat's it. Every fenced code block in `.md` and `.mdx` is now styled.\n\n## Quick start (standalone rehype)\n\n```ts\nimport { unified } from 'unified';\nimport remarkParse from 'remark-parse';\nimport remarkRehype from 'remark-rehype';\nimport rehypeRaw from 'rehype-raw';\nimport rehypeStringify from 'rehype-stringify';\nimport {\n  rehypePerfectCodeBlocks,\n  remarkPreserveCodeMeta,\n} from 'rehype-perfect-code-blocks';\nimport 'rehype-perfect-code-blocks/styles.css';\n\nconst html = await unified()\n  .use(remarkParse)\n  .use(remarkPreserveCodeMeta)                     // ← required: preserves fence meta\n  .use(remarkRehype, { allowDangerousHtml: true })  // ← pass raw HTML through\n  .use(rehypeRaw)                                   // ← parse raw HTML into HAST\n  .use(rehypePerfectCodeBlocks, { copyButton: true })\n  .use(rehypeStringify)\n  .process(markdown);\n```\n\n## ⚠️ Required: `rehype-raw` for code blocks inside raw HTML\n\nIf your markdown contains **raw HTML elements** like `<details>`, `<kbd>`, `<mark>`, `<abbr>`, `<sub>`, `<sup>`, `<dl>`, `<figure>`, `<address>`, or `<cite>`, you **must** add [`rehype-raw`](https://github.com/rehypejs/rehype-raw) to your pipeline.\n\nWithout `rehype-raw`, `remark-rehype` silently drops all raw HTML — which means:\n- Code blocks inside `<details>` elements won't render\n- `<kbd>Ctrl</kbd>` becomes plain text \"Ctrl\"\n- `<mark>`, `<abbr>`, `<sub>`, `<sup>`, `<del>`, `<ins>` are all stripped\n\n### Install\n\n```bash\nnpm install rehype-raw\n```\n\n### Astro config\n\n```ts\n// astro.config.mjs\nimport rehypeRaw from 'rehype-raw';\nimport perfectCode from 'rehype-perfect-code-blocks/astro';\n\nexport default defineConfig({\n  integrations: [\n    perfectCode({\n      // rehype-raw MUST come before rehypePerfectCodeBlocks in the pipeline\n      rehypePlugins: [rehypeRaw],\n    }),\n  ],\n});\n```\n\n### Standalone rehype\n\n```ts\nunified()\n  .use(remarkParse)\n  .use(remarkPreserveCodeMeta)\n  .use(remarkRehype, { allowDangerousHtml: true })  // pass raw HTML through\n  .use(rehypeRaw)                                    // parse raw HTML into HAST\n  .use(rehypePerfectCodeBlocks, { ... })             // our plugin\n  .use(rehypeStringify)\n```\n\n### What works with `rehype-raw`\n\n| Element | Without `rehype-raw` | With `rehype-raw` |\n| --- | --- | --- |\n| Code blocks in `<details>` | ❌ Stripped | ✅ Rendered |\n| `<kbd>Ctrl</kbd>` | ❌ Plain text | ✅ Styled |\n| `<mark>highlight</mark>` | ❌ Stripped | ✅ Styled |\n| `<abbr title=\"...\">` | ❌ Stripped | ✅ Tooltip |\n| `<sub>` / `<sup>` | ❌ Stripped | ✅ Sub/superscript |\n| `<del>` / `<ins>` | ❌ Stripped | ✅ Strike/underline |\n| `<dl>` definition lists | ❌ Stripped | ✅ Rendered |\n| `<figure>` + `<figcaption>` | ❌ Stripped | ✅ Rendered |\n| `<address>` | ❌ Stripped | ✅ Rendered |\n| `<cite>` / `<q>` | ❌ Stripped | ✅ Rendered |\n\n> **Note:** Code blocks inside markdown blockquotes (`>`) and callouts (`> [!note]`) **always work** — they're parsed as markdown by `remark-parse`, not as raw HTML. `rehype-raw` is only needed for code blocks inside explicit HTML tags.\n\n## Per-block meta syntax\n\nFull reference for the meta string after the language identifier:\n\n````md\n```ts title=\"src/store.ts\" {1,3-5} ln{5} /foo/ /bar/2-4#v1 wrap showLineNumbers caption=\"Source: docs/x.ts\"\n//   ^^^         ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n//   lang        title                highlight  ln  word highlight           flag caption        caption text\n```\n````\n\n### Flags\n\n| Flag | Effect |\n| --- | --- |\n| `title=\"...\"` | Sets the filename in the header bar |\n| `caption=\"...\"` | Renders a `<figcaption>` below the block |\n| `{1,3-5}` | Highlights those lines |\n| `{1,2}#id` | Group highlighted lines by id for per-group styling |\n| `/word/` | Highlights all occurrences of `word` |\n| `/word/3-5` | Highlights occurrences 3 through 5 |\n| `/word/#id` | Assign id to word-highlight group |\n| `ln{N}` or `showLineNumbers{N}` | Show line numbers starting at N |\n| `wrap` / `noWrap` | Force wrap on/off |\n| `ln` / `noLn` | Force line numbers on/off |\n| `bar` / `noBar` | Force header bar on/off |\n| `decorations` / `noDecorations` | Toggle traffic-light dots |\n| `lang` / `noLang` | Toggle language badge |\n| `copy` / `noCopy` | Toggle copy button |\n| `collapse` | Force collapsible (`<details>`) |\n\n### Inline-comment notations (VitePress-style)\n\nWrite comments inside the code to mark lines. Syntax colors are preserved (unlike `+`/`-` prefix diffing):\n\n```ts\nconst a = 1 // [!code highlight]\nconst b = 2 // [!code focus]\nconst c = 3 // [!code focus:2]\nconst d = 4 // [!code ++]\nconst e = 5 // [!code --]\nconst f = 6 // [!code error]\nconst g = 7 // [!code warning]\n// [!code word:foo]\nconst foo = 'foo'\n```\n\n### Magic comments (Docusaurus-style)\n\n```ts\n// highlight-next-line\nconst a = 1\n// highlight-start\nconst b = 2\nconst c = 3\n// highlight-end\nconst d = 4\n```\n\nRegister your own magic comments via the `magicComments` option:\n\n```ts\nperfectCode({\n  magicComments: [\n    {\n      className: 'pcb__line--error',\n      line: 'error-next-line',\n      block: { start: 'error-start', end: 'error-end' },\n    },\n  ],\n})\n```\n\n## Options\n\nAll options are optional. Defaults match the demo.\n\n### Ornaments\n\n| Option | Type | Default |\n| --- | --- | --- |\n| `decorations` | `boolean` | `true` |\n| `showLanguage` | `boolean` | `true` |\n| `copyButton` | `boolean \\| CopyButtonOptions` | `true` |\n\n`CopyButtonOptions`:\n\n```ts\n{\n  visibility?: 'always' | 'hover'  // default 'always'\n  feedbackDuration?: number         // default 1600 (ms)\n  copyIcon?: string                 // default: built-in SVG\n  successIcon?: string              // default: built-in check SVG\n  label?: string | null             // default 'copy'; null = icon-only\n  doneLabel?: string                // default 'copied!'\n}\n```\n\n### Structure\n\n| Option | Type | Default |\n| --- | --- | --- |\n| `lineNumbers` | `'always' \\| 'never' \\| 'auto'` | `'auto'` (on when title present) |\n| `titleBar` | `'always' \\| 'never' \\| 'auto'` | `'auto'` |\n| `lineNumbersStart` | `number` | `1` |\n\n### Modes\n\n| Option | Type | Default | Description |\n| --- | --- | --- | --- |\n| `highlight` | `boolean` | `true` | Enable `{1,3-5}` meta + `// [!code highlight]` |\n| `diff` | `boolean` | `true` | Enable `+`/`-` prefix + `// [!code ++]` / `[!code --]` |\n| `wordDiff` | `boolean` | `false` | **(v1.3.0)** When `diff` is also true, wrap changed words in `<mark class=\"pcb__word-diff--{add,del}\">` within adjacent `+`/`-` diff line pairs. Uses LCS-based word diff. |\n| `focus` | `boolean` | `true` | Enable `// [!code focus]` |\n| `errorLevels` | `boolean` | `true` | Enable `// [!code error]` / `[!code warning]` |\n| `wrap` | `boolean` | `false` | Default wrap mode |\n| `collapseAfter` | `number \\| null` | `null` | Auto-collapse blocks > N lines |\n| `showWhitespace` | `false \\| 'all' \\| 'boundary' \\| 'trailing' \\| 'leading'` | `false` | Visible whitespace |\n| `indentGuides` | `boolean \\| number` | `false` | Render indent guides |\n| `caption` | `boolean` | `true` | Render `caption=\"...\"` meta as `<figcaption>` |\n\n#### Word-level diff example (v1.3.0+)\n\n```ts\nperfectCode({\n  diff: true,\n  wordDiff: true,  // opt-in\n})\n```\n\nWith this markdown:\n\n````md\n```js\n- const x = computeValue(1)\n+ const y = computeValue(2)\n```\n````\n\nThe output wraps `x`→`y` and `1`→`2` in `<mark>` elements so readers can see exactly what changed within each diff line, not just which lines changed:\n\n```html\n<span class=\"pcb__line pcb__line--del\">\n  <span class=\"pcb__code\">\n    <mark class=\"pcb__word-diff pcb__word-diff--del\">x</mark>\n    <!-- unchanged words render as plain text -->\n    <mark class=\"pcb__word-diff pcb__word-diff--del\">1</mark>\n  </span>\n</span>\n<span class=\"pcb__line pcb__line--add\">\n  <span class=\"pcb__code\">\n    <mark class=\"pcb__word-diff pcb__word-diff--add\">y</mark>\n    <mark class=\"pcb__word-diff pcb__word-diff--add\">2</mark>\n  </span>\n</span>\n```\n\n### Engine\n\n| Option | Type | Default |\n| --- | --- | --- |\n| `engine` | `'auto' \\| 'shiki' \\| 'passthrough'` | `'auto'` |\n| `keepBackground` | `boolean` | `false` (we own `--pcb-bg`) |\n| `shiki.theme` | `string \\| { light, dark }` | `{ light: 'github-light', dark: 'github-dark' }` |\n| `shiki.langs` | `string[]` | `[]` (sensible defaults pre-loaded) |\n| `shiki.transformers` | `ShikiTransformer[]` | `[]` |\n| `shiki.getHighlighter` | `(opts) => Promise<Highlighter>` | `undefined` (escape hatch) |\n\n### Customization\n\n| Option | Type | Default |\n| --- | --- | --- |\n| `customNotations` | `Record<string, string>` | `{}` |\n| `magicComments` | `MagicComment[]` | Docusaurus-style defaults |\n| `inlineCode` | `false \\| 'lang' \\| 'token'` | `false` |\n| `inlineDefaultLang` | `string` | `''` |\n| `tokensMap` | `Record<string, string>` | `{}` |\n| `terminalLangs` | `string[]` | `['sh','bash','zsh','shell','console','powershell','bat','cmd']` |\n| `extractFileNameFromCode` | `boolean` | `false` |\n\n### Hooks\n\n```ts\nperfectCode({\n  filterMetaString: (meta) => meta.replace(/#.*$/, ''),  // strip ids\n  onVisitLine: ({ element, lineNumber }) => { /* mutate hast */ },\n  onVisitHighlightedLine: ({ element, lineNumber, id }) => { /* ... */ },\n  onVisitHighlightedChars: ({ element, text, id }) => { /* ... */ },\n  onVisitTitle: (element) => { /* ... */ },\n  onVisitCaption: (element) => { /* ... */ },\n})\n```\n\n## Advanced APIs (v1.3.0+)\n\nThese exported functions are for advanced use cases — long-running dev servers, parallel build pipelines, custom diff tooling. Most users don't need them.\n\n### `runHighlighterTask<T>(taskFn: () => Promise<T>): Promise<T>`\n\n**Source:** Pattern 1, adopted from [expressive-code](https://github.com/expressive-code/expressive-code).\n\nA mutually exclusive FIFO queue that serializes all highlighter operations (createHighlighter, loadLanguage, codeToHast) globally. The plugin uses this internally to prevent race conditions in parallel static-site builds where multiple unified pipelines share the same module-level highlighter cache.\n\nYou can use it directly if you're calling Shiki outside the plugin and want to share the same serialization guarantee:\n\n```ts\nimport { runHighlighterTask } from '@dr-ishaan/rehype-perfect-code-blocks';\n\n// Ensure this runs in the same queue as plugin-internal highlighter calls\nconst result = await runHighlighterTask(async () => {\n  return highlighter.codeToHtml(code, { lang: 'ts' });\n});\n```\n\n### `disposeHighlighter(): void`\n\n**Source:** Pattern 3, adopted from [VitePress](https://vitepress.dev).\n\nReleases all cached Shiki highlighters (WASM engine + loaded grammars + theme cache) and clears the cache. Intended for long-running dev servers / watch mode where themes change over time, or during cleanup of a build pipeline.\n\nAfter calling, the next render creates a fresh highlighter.\n\n```ts\nimport { disposeHighlighter } from '@dr-ishaan/rehype-perfect-code-blocks';\n\n// In a Vite dev server shutdown hook:\nserver.http2.close(() => disposeHighlighter());\n\n// Or when the user changes their theme in a config-reload hook:\nconfigReloadEmitter.on('reload', () => {\n  disposeHighlighter();\n  // next render will create a fresh highlighter with the new theme\n});\n```\n\n### `wordDiff(oldStr: string, newStr: string): DiffToken[]`\n\n**Source:** Pattern 5, selective adoption from [expressive-code](https://github.com/expressive-code/expressive-code/blob/main/packages/%40expressive-code/plugin-text-markers/src/index.ts).\n\nA self-contained LCS-based word diff algorithm (~80 lines, no external deps). Computes a per-word diff between two strings and returns an array of `{ text, type }` tokens where `type` is `'add'`, `'del'`, or `'equal'`.\n\nYou can use it standalone for custom diff UIs outside the plugin:\n\n```ts\nimport { wordDiff, hasChanges } from '@dr-ishaan/rehype-perfect-code-blocks';\n\nconst tokens = wordDiff('const x = 1', 'const y = 2');\n// → [\n//   { text: 'const ', type: 'equal' },\n//   { text: 'x',       type: 'del'    },\n//   { text: 'y',       type: 'add'    },\n//   { text: ' = ',     type: 'equal' },\n//   { text: '1',       type: 'del'    },\n//   { text: '2',       type: 'add'    },\n// ]\n\nif (hasChanges(tokens)) {\n  // render the diff in your own UI\n}\n```\n\nThe plugin uses this internally when the `wordDiff: true` option is set — see the [Modes](#modes) table above.\n\n### `hasChanges(tokens: DiffToken[]): boolean`\n\nReturns `true` if the diff result contains at least one `add` or `del` token. Useful for skipping the rendering of unchanged diff pairs.\n\n### `DiffToken` type\n\n```ts\ninterface DiffToken {\n  text: string;\n  type: 'add' | 'del' | 'equal';\n}\n```\n\n### Styling\n\n| Option | Type | Default |\n| --- | --- | --- |\n| `preset` | `'default' \\| 'terminal' \\| 'minimal'` | `'default'` |\n| `injectStyles` | `boolean` | `true` |\n| `theme` | `'auto' \\| 'dark' \\| 'light'` | `'auto'` |\n\n## Theming\n\n### Theme-aware defaults (v1.3.0+)\n\nThe `<pre>` element receives inline `--pcb-*` CSS variable defaults **derived from the loaded Shiki theme** — automatically, with no configuration. This means code blocks look good with ANY Shiki theme out of the box, without you having to manually tune line-number colors, diff backgrounds, or focus highlights.\n\nThe defaults computed per theme:\n\n| Variable | How it's derived |\n| --- | --- |\n| `--pcb-bg` | Theme background color |\n| `--pcb-fg` | Theme foreground color |\n| `--pcb-ln-fg` | Line-number color, contrast-adjusted against `--pcb-bg` to meet WCAG AA (ratio ≥ 3.0) |\n| `--pcb-line-highlight-bg` | Subtle highlight tint: 12% mix of `--pcb-fg` over `--pcb-bg` |\n| `--pcb-line-add-bg` | Diff add background: 18% mix of green (`#22863a`) over `--pcb-bg` |\n| `--pcb-line-del-bg` | Diff del background: 18% mix of red (`#cb2431`) over `--pcb-bg` |\n| `--pcb-line-focus-bg` | Focus dim: 4% mix of `--pcb-fg` over `--pcb-bg` |\n\nThe static `dist/styles.css` continues to ship its own generic defaults; the runtime overrides them with theme-aware values via inline styles on `<pre>`. You can still override any `--pcb-*` variable in your own CSS — the cascade order is: `dist/styles.css` < inline `<pre style>` < your CSS.\n\n### Manual overrides\n\nEvery visual property is a `--pcb-*` CSS variable on `.pcb`. Override any subset:\n\n```css\n.pcb {\n  --pcb-bg: #1a1b26;\n  --pcb-accent: #7aa2f7;\n  --pcb-radius: 8px;\n  --pcb-font-mono: 'Cascadia Code', monospace;\n  --pcb-line-highlight: rgba(122, 162, 247, 0.18);\n  --pcb-line-error: rgba(247, 118, 142, 0.22);\n  --pcb-word-bg: rgba(224, 175, 104, 0.30);\n}\n```\n\nLight mode activates automatically via `prefers-color-scheme`, or manually via `<html data-theme=\"light\">`.\n\n### Dual themes (CSS variables)\n\nWhen `shiki.theme` is `{ light, dark }`, Shiki emits `--shiki-light` and `--shiki-dark` CSS vars on every token span. The bundled CSS auto-switches them based on `prefers-color-scheme`:\n\n```css\n@media (prefers-color-scheme: light) {\n  .pcb code span[style] { color: var(--shiki-light, inherit) !important; }\n}\n@media (prefers-color-scheme: dark) {\n  .pcb code span[style] { color: var(--shiki-dark, inherit) !important; }\n}\n```\n\n## Engine modes\n\n| Mode | Behavior |\n| --- | --- |\n| `auto` | Post-process Shiki output if present; otherwise call Shiki directly. **Default.** |\n| `shiki` | Always call Shiki directly (re-tokenizes raw blocks). |\n| `passthrough` | Never tokenize; just wrap existing `<pre><code>` as-is. |\n\n## Architecture\n\n```\nMarkdown fence\n    │\n    ▼\n┌──────────────────────────────┐\n│  remarkPreserveCodeMeta      │  ← copies fence meta to <code data-meta=\"...\">\n└──────────────────────────────┘\n    │\n    ▼\n┌──────────────────────────────┐\n│  Shiki (via Astro or direct) │  ← tokenizes to <pre><code>...tokens...</code></pre>\n│  + @shikijs/transformers     │  ← applies diff/focus/highlight/error/word\n│  + runHighlighterTask queue  │  ← (v1.3.0) serializes all Shiki calls\n└──────────────────────────────┘\n    │\n    ▼\n┌──────────────────────────────┐\n│  rehypePerfectCodeBlocks     │  ← wraps <pre> in <figure class=\"pcb\">\n│  - reads data-meta           │  - maps Shiki classes → pcb__line--* namespace\n│  - builds header bar         │  - adds gutter, copy button, caption\n│  - applies keepBackground    │  - calls visitor hooks\n│  - applies theme-aware       │  - (v1.3.0) applies wordDiff post-processing\n│    --pcb-* defaults (v1.3.0) │\n└──────────────────────────────┘\n    │\n    ▼\n  Final HTML (with inline --pcb-* theme-aware defaults on <pre>)\n```\n\nKey design decisions (learned from rehype-pretty-code + expressive-code + VitePress):\n\n1. **Let Shiki do the work** — we delegate line splitting, diff detection, and word highlighting to Shiki's official transformers; we just remap their classes (`diff add` → `pcb__line--add`, etc.)\n2. **Pass `meta: { __raw }` to Shiki** — this is the contract that lets all `@shikijs/transformers` work\n3. **Cache by full theme spec** — dual-theme setups get one cached highlighter with both themes loaded\n4. **Lazy-load languages** — any Shiki-bundled language just works, no preconfiguration needed\n5. **Graceful unknown-language fallback** — filter out unknowns before `createHighlighter` (which throws synchronously) and fall back to `plaintext`\n6. **`:where()` zero-specificity** — every default selector uses `:where(.pcb ...)` so user CSS always wins without `!important` arms races\n7. **(v1.3.0) Mutually exclusive task queue** — all highlighter operations run inside `runHighlighterTask()`, preventing race conditions in parallel builds (from expressive-code)\n8. **(v1.3.0) Theme-aware CSS variable defaults** — `--pcb-*` defaults are derived from the loaded Shiki theme with WCAG contrast enforcement, applied as inline styles on `<pre>` (from expressive-code)\n9. **(v1.3.0) Disposable highlighter** — `disposeHighlighter()` releases the WASM engine + grammars for long-running dev servers (from VitePress)\n10. **(v1.3.0) SPA-robust copy button** — event delegation + MutationObserver + `astro:page-load` for React/Vue/Astro view transitions (from VitePress + expressive-code)\n\n## Testing\n\nThe package ships with **1092 tests** across seven suites:\n\n```bash\nnpm test\n```\n\n| Suite | Tests | What it covers |\n| --- | ---: | --- |\n| `test-meta-parser.mjs` | 161 | Fence-meta parser: title, `{1,3-5}`, `/word/`, `ln{N}`, caption, flags, edge cases |\n| `test-dom-structure.mjs` | 113 | Output HTML structure: `<figure>`, `<pre>`, `<code>`, header bar, gutter, copy button |\n| `test-options.mjs` | 108 | All plugin options: ornaments, structure, modes, engine, customization, hooks, styling |\n| `test-notations.mjs` | 51 | VitePress-style `// [!code xxx]` inline notations + Docusaurus-style magic comments |\n| `test-security.mjs` | 49 | CSP nonce support, XSS prevention, `aria-*` accessibility attributes |\n| `test-integration.mjs` | 69 | End-to-end integration with remark/rehype/rehype-raw pipelines |\n| `test-regression.mjs` | 91 | Regression tests for historical bugs (issues #1–#10) |\n| `test-css.mjs` | 120 | CSS output: `--pcb-*` variables, `:where()` specificity, dual-theme switching |\n| `test-edge-cases.mjs` | 50 | Basic blocks, all meta flags, language detection, highlighting ranges, diff, presets, escape handling |\n| `stress-tests.mjs` | 17 | 100-line blocks, CRLF, tabs, unicode, concurrent overrides, all-options-at-once |\n| `new-feature-tests.mjs` | 43 | VitePress notations, magic comments, word highlights, dual themes, captions, visitor hooks, configurable copy button, terminal auto-detection, filename extraction |\n| `test-issue-12.mjs` | 28 | Regression: case-insensitive language loader (`JS`/`TypeScript`/`Python`) |\n| `test-issue-11.mjs` | 51 | Regression: line-range stack overflow (`{1-1000000}` DoS vector) |\n| `test-architecture-patterns.mjs` | 41 | v1.3.0 architecture patterns: task queue, theme-aware defaults, dispose, SPA copy button, word-diff |\n\n## Comparison with alternatives\n\n| Feature | rehype-perfect-code-blocks | rehype-pretty-code | VitePress | Docusaurus | Expressive Code |\n| --- | --- | --- | --- | --- | --- |\n| Header bar + filename | ✅ | ✅ | ✅ | ✅ | ✅ |\n| Line numbers | ✅ | ✅ | ✅ | ✅ | ✅ |\n| Copy button | ✅ (configurable) | ⚠️ (separate pkg) | ✅ | ✅ | ✅ |\n| `{1,3-5}` meta | ✅ | ✅ | ✅ | ✅ | ✅ |\n| `// [!code highlight]` | ✅ | ❌ | ✅ | ❌ | ✅ |\n| `// [!code focus]` | ✅ | ❌ | ✅ | ❌ | ✅ |\n| `// [!code ++]` / `[!code --]` | ✅ | ❌ | ✅ | ❌ | ✅ |\n| `// [!code error]` / `[!code warning]` | ✅ | ❌ | ✅ | ❌ | ❌ |\n| `// highlight-next-line` | ✅ | ❌ | ❌ | ✅ | ❌ |\n| Custom magic comments | ✅ | ❌ | ❌ | ✅ | ❌ |\n| `/word/` meta | ✅ | ✅ | ❌ | ❌ | ✅ |\n| **Word-level diff** (v1.3.0) | ✅ (`wordDiff: true`) | ❌ | ❌ | ❌ | ✅ (`plugin-text-markers`) |\n| `caption=\"...\"` | ✅ | ✅ | ❌ | ❌ | ❌ |\n| Dual themes via CSS vars | ✅ | ✅ | ✅ | ⚠️ | ✅ |\n| **Theme-aware color defaults** (v1.3.0) | ✅ (WCAG-enforced) | ❌ | ❌ | ❌ | ✅ |\n| Auto terminal frame | ✅ | ❌ | ❌ | ❌ | ✅ |\n| Filename from comment | ✅ | ❌ | ❌ | ❌ | ✅ |\n| Visible whitespace | ✅ | ❌ | ❌ | ❌ | ❌ |\n| Indent guides | ✅ | ❌ | ❌ | ❌ | ❌ |\n| Visitor hooks | ✅ | ✅ | ❌ | ❌ | ❌ |\n| `filterMetaString` | ✅ | ✅ | ❌ | ❌ | ❌ |\n| `getHighlighter` escape hatch | ✅ | ✅ | ❌ | ❌ | ❌ |\n| User-supplied Shiki transformers | ✅ | ✅ | ❌ | ❌ | ❌ |\n| **Highlighter task queue** (v1.3.0) | ✅ (`runHighlighterTask`) | ❌ | ❌ | ❌ | ✅ |\n| **`disposeHighlighter()` lifecycle** (v1.3.0) | ✅ | ❌ | ✅ | ❌ | ❌ |\n| **SPA-robust copy button** (v1.3.0) | ✅ (MutationObserver + `astro:page-load`) | ❌ (inline `onclick`) | ✅ (event delegation) | ✅ (React) | ✅ (MutationObserver) |\n| Zero-specificity CSS vars | ✅ | ❌ | ❌ | ❌ | ⚠️ |\n| Astro integration | ✅ | ⚠️ | ❌ | ❌ | ✅ |\n| Standalone rehype | ✅ | ✅ | ❌ | ❌ | ❌ |\n\n## File structure\n\n```\nrehype-perfect-code-blocks/\n├── package.json\n├── tsconfig.json\n├── README.md\n├── CHANGELOG.md\n├── LICENSE\n├── .gitignore\n├── .npmignore\n├── examples/\n│   └── astro.config.mjs\n├── src/\n│   ├── types.ts              ← full options + ParsedMeta + ResolvedBlock\n│   ├── meta.ts               ← fence-meta parser (title, {1,3-5}, /word/, ln{N}, caption, flags)\n│   ├── remark.ts             ← remarkPreserveCodeMeta (carries meta to hast)\n│   ├── shiki.ts              ← Shiki caller: transformers, dual themes, lazy lang loading, task queue (v1.3.0)\n│   ├── transformer.ts        ← hast walker: <pre> → <figure class=\"pcb\">, word-diff post-processing (v1.3.0)\n│   ├── copy-script.ts        ← ~1.2KB inline copy-button client script (event delegation + MutationObserver, v1.3.0)\n│   ├── color-utils.ts        ← (v1.3.0) color manipulation + WCAG contrast + theme-aware default computation\n│   ├── word-diff.ts          ← (v1.3.0) LCS-based word diff algorithm\n│   ├── styles.css            ← full stylesheet with --pcb-* variables\n│   ├── astro.ts              ← Astro integration (one-liner)\n│   ├── index.ts              ← standalone rehype plugin entry (exports runHighlighterTask, disposeHighlighter, wordDiff, hasChanges)\n│   └── vite-raw.d.ts         ← type shim for ?raw imports\n├── dist/                     ← built ESM + .d.ts + styles.css\n├── test-meta-parser.mjs             ← 161 tests\n├── test-dom-structure.mjs           ← 113 tests\n├── test-options.mjs                 ← 108 tests\n├── test-notations.mjs               ← 51 tests\n├── test-security.mjs                ← 49 tests\n├── test-integration.mjs             ← 69 tests\n├── test-regression.mjs              ← 91 tests\n├── test-css.mjs                     ← 120 tests\n├── test-edge-cases.mjs              ← 50 tests\n├── stress-tests.mjs                 ← 17 tests\n├── new-feature-tests.mjs            ← 43 tests\n├── test-issue-12.mjs                ← 28 tests (case-insensitive lang loader)\n├── test-issue-11.mjs                ← 51 tests (line-range stack overflow)\n└── test-architecture-patterns.mjs   ← 41 tests (v1.3.0 patterns)\n```\n\n## Changelog\n\nSee [CHANGELOG.md](./CHANGELOG.md) for version history. Highlights:\n\n- **v1.3.0** — Adopted 5 architectural patterns from community packages (highlighter task queue, theme-aware color defaults, `disposeHighlighter()` lifecycle, SPA-robust copy button, word-level diff).\n- **v1.2.2** — Fixed `{1-1000000}` line-range stack overflow DoS (issue #11).\n- **v1.2.1** — Fixed case-sensitive language loader rejecting `JS`/`TypeScript`/`Python` (issue #12).\n- **v1.2.0** — Adopted 23 features from community competitors (transformers, terminal frames, i18n, CSP nonces, etc.).\n- **v1.1.x** — Accessibility, performance, and security improvements.\n- **v1.0.0** — Initial release.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}