{"_id":"@cube-drone/marquee-markup","_rev":"12-30f34e6e109a027134c516af47f07f99","name":"@cube-drone/marquee-markup","dist-tags":{"latest":"0.8.0"},"versions":{"0.1.0":{"name":"@cube-drone/marquee-markup","version":"0.1.0","license":"MPL-2.0","_id":"@cube-drone/marquee-markup@0.1.0","maintainers":[{"name":"cube-drone","email":"cubedrone@gooble.email"}],"homepage":"https://github.com/cube-drone/marqueemarkup#readme","bugs":{"url":"https://github.com/cube-drone/marqueemarkup/issues"},"bin":{"marquee":"dist/bin/marquee.js"},"dist":{"shasum":"47a33596b608bcece78f052060f8092fe044f48b","tarball":"https://registry.npmjs.org/@cube-drone/marquee-markup/-/marquee-markup-0.1.0.tgz","fileCount":12,"integrity":"sha512-S2qAu5VWgOdfRC3TKYxI3a6RVCQ17c9nUKCfBV6KCgm/yalWWBB7lfw2nNBbhCnKXkCignL83BvVbKau4yO3/w==","signatures":[{"sig":"MEYCIQClllLo+pXBc9imf22slIk9qgl25wjSSwH4jesRK8X2EwIhAMAB9PcsFqDEdZhxc9Z78OHW2BHYl21C7iYrD688tHVd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79196},"type":"module","engines":{"node":">=22.6.0"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","marquee-src":"./src/index.ts"}},"gitHead":"0107b271b4ef46287448ceb12687c3d56f036c64","scripts":{"test":"node --conditions=marquee-src --test test/*.test.ts","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","prepack":"npm run build"},"_npmUser":{"name":"cube-drone","email":"cubedrone@gooble.email"},"repository":{"url":"git+https://github.com/cube-drone/marqueemarkup.git","type":"git","directory":"ts/marquee-markup"},"_npmVersion":"11.11.0","description":"Marquee, batteries included: parse + render to HTML in one motion, fonts and styles along for the ride, plus the `marquee` CLI","directories":{},"_nodeVersion":"24.14.1","dependencies":{"@cube-drone/marquee-css":"^0.1.0","@cube-drone/marquee-emoji":"^0.1.0","@cube-drone/marquee-fonts":"^0.1.0","@cube-drone/marquee-parser":"^0.1.0","@cube-drone/marquee-turbolink":"^0.1.0","@cube-drone/marquee-html-renderer":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/marquee-markup_0.1.0_1783821154635_0.8750407690143203","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@cube-drone/marquee-markup","version":"0.1.1","license":"MPL-2.0","_id":"@cube-drone/marquee-markup@0.1.1","maintainers":[{"name":"cube-drone","email":"cubedrone@gooble.email"}],"homepage":"https://github.com/cube-drone/marqueemarkup#readme","bugs":{"url":"https://github.com/cube-drone/marqueemarkup/issues"},"bin":{"marquee":"dist/bin/marquee.js"},"dist":{"shasum":"962bbaa3811a6fae3d63f601813f06b0e28bd2ab","tarball":"https://registry.npmjs.org/@cube-drone/marquee-markup/-/marquee-markup-0.1.1.tgz","fileCount":12,"integrity":"sha512-TA1gaTW+t1/atV+GireuMzE36tYBNrYZy58ViOFgdVvaBPle0grZ42EVTWVwFgGXZP/XzhRRVnTRfOr5nCnURg==","signatures":[{"sig":"MEUCICzdTGXRJvK4WD5qaQTiucHejB67y8zBmxeS0Ok2JSkYAiEAujP90ifVjiff5/YrPFbMieJCORJjWQ03Z9Vp5DEHoXc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cube-drone%2fmarquee-markup@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":79196},"type":"module","engines":{"node":">=22.6.0"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","marquee-src":"./src/index.ts"}},"gitHead":"fbba57eeb20088e23839c091d440c238d50d4154","scripts":{"test":"node --conditions=marquee-src --test test/*.test.ts","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","prepack":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2e8e3b1b-8b83-460d-b74e-72f0d2022ba8"}},"repository":{"url":"git+https://github.com/cube-drone/marqueemarkup.git","type":"git","directory":"ts/marquee-markup"},"_npmVersion":"11.16.0","description":"Marquee, batteries included: parse + render to HTML in one motion, fonts and styles along for the ride, plus the `marquee` CLI","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@cube-drone/marquee-css":"^0.1.1","@cube-drone/marquee-emoji":"^0.1.1","@cube-drone/marquee-fonts":"^0.1.1","@cube-drone/marquee-parser":"^0.1.1","@cube-drone/marquee-turbolink":"^0.1.1","@cube-drone/marquee-html-renderer":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/marquee-markup_0.1.1_1783823262132_0.4550983604854588","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@cube-drone/marquee-markup","version":"0.2.0","license":"MPL-2.0","_id":"@cube-drone/marquee-markup@0.2.0","maintainers":[{"name":"cube-drone","email":"cubedrone@gooble.email"}],"homepage":"https://github.com/cube-drone/marqueemarkup#readme","bugs":{"url":"https://github.com/cube-drone/marqueemarkup/issues"},"bin":{"marquee":"dist/bin/marquee.js"},"dist":{"shasum":"3f3184d208e3519dad1a551c85ade37f22b75c8d","tarball":"https://registry.npmjs.org/@cube-drone/marquee-markup/-/marquee-markup-0.2.0.tgz","fileCount":12,"integrity":"sha512-n9aE5rjCs3ax/GwBC0yktlvXxIq3o/FXEBQHVhzp1zwjF1lXsfXNOaCWoWzQAWWwuei7gvKMViKcm/HmmquHSQ==","signatures":[{"sig":"MEYCIQDNgkDTKDSZRAo1h5N4EIRxzwK1k0x/mMwtLU1Uplnm+wIhAKrDsdMDtX18klan3T+1nldrEXi1HRrY7vL5r09UzB8k","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cube-drone%2fmarquee-markup@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":79196},"type":"module","engines":{"node":">=22.6.0"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","marquee-src":"./src/index.ts"}},"gitHead":"4f8d76973e72dd1cef0bf97d04aa3875bf16b64b","scripts":{"test":"node --conditions=marquee-src --test test/*.test.ts","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","prepack":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2e8e3b1b-8b83-460d-b74e-72f0d2022ba8"}},"repository":{"url":"git+https://github.com/cube-drone/marqueemarkup.git","type":"git","directory":"ts/marquee-markup"},"_npmVersion":"11.16.0","description":"Marquee, batteries included: parse + render to HTML in one motion, fonts and styles along for the ride, plus the `marquee` CLI","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@cube-drone/marquee-css":"^0.2.0","@cube-drone/marquee-emoji":"^0.2.0","@cube-drone/marquee-fonts":"^0.2.0","@cube-drone/marquee-parser":"^0.2.0","@cube-drone/marquee-turbolink":"^0.2.0","@cube-drone/marquee-html-renderer":"^0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/marquee-markup_0.2.0_1783843988032_0.5458122975085813","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@cube-drone/marquee-markup","version":"0.3.0","license":"MPL-2.0","_id":"@cube-drone/marquee-markup@0.3.0","maintainers":[{"name":"cube-drone","email":"cubedrone@gooble.email"}],"homepage":"https://github.com/cube-drone/marqueemarkup#readme","bugs":{"url":"https://github.com/cube-drone/marqueemarkup/issues"},"bin":{"marquee":"dist/bin/marquee.js"},"dist":{"shasum":"c5521dacb1f90a1a4b61b2b89fc5569692111a09","tarball":"https://registry.npmjs.org/@cube-drone/marquee-markup/-/marquee-markup-0.3.0.tgz","fileCount":12,"integrity":"sha512-SfntDcHos9I88i7bZNsRzlfRwyxOgfkaBZCtudK2iFaaeCiN7g6kGfpckKBrw67RSzMLQJJ5sElvGQqMOkc7vA==","signatures":[{"sig":"MEYCIQDNa4XcUV1eCFKugNJxqG4RU7b4G/S5z/tX82XrW9BfHgIhALElhwuIIEIKKd6nYedAI+NTJP9ML5PunwxjTGV1RGmK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cube-drone%2fmarquee-markup@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":85108},"type":"module","engines":{"node":">=22.6.0"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","marquee-src":"./src/index.ts"}},"gitHead":"8858c23f490788db17717e2d7472bb75eb6c7ea1","scripts":{"test":"node --conditions=marquee-src --test test/*.test.ts","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","prepack":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2e8e3b1b-8b83-460d-b74e-72f0d2022ba8"}},"repository":{"url":"git+https://github.com/cube-drone/marqueemarkup.git","type":"git","directory":"ts/marquee-markup"},"_npmVersion":"11.16.0","description":"Marquee, batteries included: parse + render to HTML in one motion, fonts and styles along for the ride, plus the `marquee` CLI","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@cube-drone/marquee-css":"^0.3.0","@cube-drone/marquee-emoji":"^0.3.0","@cube-drone/marquee-fonts":"^0.3.0","@cube-drone/marquee-parser":"^0.3.0","@cube-drone/marquee-turbolink":"^0.3.0","@cube-drone/marquee-html-renderer":"^0.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/marquee-markup_0.3.0_1783902347406_0.7253511204020473","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@cube-drone/marquee-markup","version":"0.4.0","license":"MPL-2.0","_id":"@cube-drone/marquee-markup@0.4.0","maintainers":[{"name":"cube-drone","email":"cubedrone@gooble.email"}],"homepage":"https://github.com/cube-drone/marqueemarkup#readme","bugs":{"url":"https://github.com/cube-drone/marqueemarkup/issues"},"bin":{"marquee":"dist/bin/marquee.js"},"dist":{"shasum":"58a882891bd84109ac8408cef78ee80baccb4a8e","tarball":"https://registry.npmjs.org/@cube-drone/marquee-markup/-/marquee-markup-0.4.0.tgz","fileCount":12,"integrity":"sha512-nwshzB1Nb6VWmSXtb/uXJxl78wl3NHAAp6RTxprWo2tHnirGCrOdO+6dH65/Iiya8PVZNwsVkJSfCkBO/BSAEw==","signatures":[{"sig":"MEYCIQCGCJVr5X8N6AiUybqoptI3Lszhkkufrs90sGOfobL+HAIhANmoYuIMAUC0d4al1dSi9Q3fYoY6pBnl+SGFiujeePW8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85180},"type":"module","engines":{"node":">=22.6.0"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","marquee-src":"./src/index.ts"}},"gitHead":"e8be99c74fce4f6ca685dec9df4eab190a7720aa","scripts":{"test":"node --conditions=marquee-src --test test/*.test.ts","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","prepack":"npm run build"},"_npmUser":{"name":"cube-drone","email":"cubedrone@gooble.email"},"repository":{"url":"git+https://github.com/cube-drone/marqueemarkup.git","type":"git","directory":"ts/marquee-markup"},"_npmVersion":"11.11.0","description":"Marquee, batteries included: parse + render to HTML in one motion, fonts and styles along for the ride, plus the `marquee` CLI","directories":{},"_nodeVersion":"24.14.1","dependencies":{"@cube-drone/marquee-css":"^0.4.0","@cube-drone/marquee-emoji":"^0.4.0","@cube-drone/marquee-fonts":"^0.4.0","@cube-drone/marquee-parser":"^0.4.0","@cube-drone/marquee-turbolink":"^0.4.0","@cube-drone/marquee-html-renderer":"^0.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/marquee-markup_0.4.0_1784060139181_0.6893723513366121","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@cube-drone/marquee-markup","version":"0.6.0","license":"MPL-2.0","_id":"@cube-drone/marquee-markup@0.6.0","maintainers":[{"name":"cube-drone","email":"cubedrone@gooble.email"}],"homepage":"https://github.com/cube-drone/marqueemarkup#readme","bugs":{"url":"https://github.com/cube-drone/marqueemarkup/issues"},"bin":{"marquee":"dist/bin/marquee.js"},"dist":{"shasum":"771a8986e242fa8232295fca074eb6541d34bed0","tarball":"https://registry.npmjs.org/@cube-drone/marquee-markup/-/marquee-markup-0.6.0.tgz","fileCount":12,"integrity":"sha512-1HGw+NIuGUUGZltDFCsBLifSyKLMEFEjL6dxP68y9yc3L1XOQr41Kpl28FO7I/5DjWJhbXQ7o3a0NNBU8T6qJg==","signatures":[{"sig":"MEYCIQC0JzK2nQq3KzWah2X3UCoL7gcq1jSNGzjVWYJhdWVPjAIhAIleLpmnwe+DQX/beCO/6Zjklpihew+DBFa7RCfyYp5o","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cube-drone%2fmarquee-markup@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":85180},"type":"module","engines":{"node":">=22.6.0"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","marquee-src":"./src/index.ts"}},"gitHead":"61925c209106d7b5c92c30eba6caed560b69a28b","scripts":{"test":"node --conditions=marquee-src --test test/*.test.ts","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","prepack":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2e8e3b1b-8b83-460d-b74e-72f0d2022ba8"}},"repository":{"url":"git+https://github.com/cube-drone/marqueemarkup.git","type":"git","directory":"ts/marquee-markup"},"_npmVersion":"11.16.0","description":"Marquee, batteries included: parse + render to HTML in one motion, fonts and styles along for the ride, plus the `marquee` CLI","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@cube-drone/marquee-css":"^0.6.0","@cube-drone/marquee-emoji":"^0.6.0","@cube-drone/marquee-fonts":"^0.6.0","@cube-drone/marquee-parser":"^0.6.0","@cube-drone/marquee-turbolink":"^0.6.0","@cube-drone/marquee-html-renderer":"^0.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/marquee-markup_0.6.0_1784330754314_0.7219900883850221","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@cube-drone/marquee-markup","version":"0.6.1","license":"MPL-2.0","_id":"@cube-drone/marquee-markup@0.6.1","maintainers":[{"name":"cube-drone","email":"cubedrone@gooble.email"}],"homepage":"https://github.com/cube-drone/marqueemarkup#readme","bugs":{"url":"https://github.com/cube-drone/marqueemarkup/issues"},"bin":{"marquee":"dist/bin/marquee.js"},"dist":{"shasum":"58c39bde61a24150f56904542dd221fe63c40f30","tarball":"https://registry.npmjs.org/@cube-drone/marquee-markup/-/marquee-markup-0.6.1.tgz","fileCount":12,"integrity":"sha512-6lRaXSNVKAJ5eRUgMaBD7DZ/i4pE8Vy6Pqt1xuQTQo9by+lq39Tvda1HQOicadYQzHcONzVNCgk4LFgihpfsRQ==","signatures":[{"sig":"MEYCIQCA9+XW70i0cV5Wyb6KK98vik3+5VV+3VtTvZCclXHXtgIhAM1G3XGlQHwVaJye0tSnykmoaR9MTC9Pn6WaSR6C1jHC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cube-drone%2fmarquee-markup@0.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":89686},"type":"module","engines":{"node":">=22.6.0"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","marquee-src":"./src/index.ts"}},"gitHead":"a1a15d4978c628aeec2637cf535c35a68a63e2f5","scripts":{"test":"node --conditions=marquee-src --test test/*.test.ts","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","prepack":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2e8e3b1b-8b83-460d-b74e-72f0d2022ba8"}},"repository":{"url":"git+https://github.com/cube-drone/marqueemarkup.git","type":"git","directory":"ts/marquee-markup"},"_npmVersion":"11.16.0","description":"Marquee, batteries included: parse + render to HTML in one motion, fonts and styles along for the ride, plus the `marquee` CLI","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@cube-drone/marquee-css":"^0.6.1","@cube-drone/marquee-emoji":"^0.6.1","@cube-drone/marquee-fonts":"^0.6.1","@cube-drone/marquee-parser":"^0.6.1","@cube-drone/marquee-turbolink":"^0.6.1","@cube-drone/marquee-html-renderer":"^0.6.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/marquee-markup_0.6.1_1784591762534_0.7307000029829429","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"@cube-drone/marquee-markup","version":"0.6.2","license":"MPL-2.0","_id":"@cube-drone/marquee-markup@0.6.2","maintainers":[{"name":"cube-drone","email":"cubedrone@gooble.email"}],"homepage":"https://github.com/cube-drone/marqueemarkup#readme","bugs":{"url":"https://github.com/cube-drone/marqueemarkup/issues"},"bin":{"marquee":"dist/bin/marquee.js"},"dist":{"shasum":"21cf0b5180354de10331fdab6a141dd077f43238","tarball":"https://registry.npmjs.org/@cube-drone/marquee-markup/-/marquee-markup-0.6.2.tgz","fileCount":12,"integrity":"sha512-bi1T8AstBXwlCWVzcAsZn/QmMRtTeUqBrUP01SV6IYU5LYPFF3koFQnXIvdCpTs1wGlNl6/iDwDqpEF5aoryqA==","signatures":[{"sig":"MEQCIGgKTmC8K2kvMvB6p2bIDzB0FiTp59ClRCEv+yS4Hy7eAiA4/+4ylBiv7cUDJlBtUdtc/Gs14mX4FqPtfw8TXlqVtg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89686},"type":"module","engines":{"node":">=22.6.0"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","marquee-src":"./src/index.ts"}},"gitHead":"770e3d44726c4d3f391454348ba1f8919587b185","scripts":{"test":"node --conditions=marquee-src --test test/*.test.ts","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","prepack":"npm run build"},"_npmUser":{"name":"cube-drone","email":"cubedrone@gooble.email"},"repository":{"url":"git+https://github.com/cube-drone/marqueemarkup.git","type":"git","directory":"ts/marquee-markup"},"_npmVersion":"11.11.0","description":"Marquee, batteries included: parse + render to HTML in one motion, fonts and styles along for the ride, plus the `marquee` CLI","directories":{},"_nodeVersion":"24.14.1","dependencies":{"@cube-drone/marquee-css":"^0.6.2","@cube-drone/marquee-emoji":"^0.6.2","@cube-drone/marquee-fonts":"^0.6.2","@cube-drone/marquee-parser":"^0.6.2","@cube-drone/marquee-turbolink":"^0.6.2","@cube-drone/marquee-html-renderer":"^0.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/marquee-markup_0.6.2_1785363642530_0.8474670885850972","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@cube-drone/marquee-markup","version":"0.7.0","license":"MPL-2.0","_id":"@cube-drone/marquee-markup@0.7.0","maintainers":[{"name":"cube-drone","email":"cubedrone@gooble.email"}],"homepage":"https://github.com/cube-drone/marqueemarkup#readme","bugs":{"url":"https://github.com/cube-drone/marqueemarkup/issues"},"bin":{"marquee":"dist/bin/marquee.js"},"dist":{"shasum":"7929891d74a971a53400e1162e2f0f2c89905a80","tarball":"https://registry.npmjs.org/@cube-drone/marquee-markup/-/marquee-markup-0.7.0.tgz","fileCount":12,"integrity":"sha512-5rod/Z431GyPPAXGZVQx8N1Z61NtL8QgX6EawAEJ0B/wJY7zphPFo2U2d0xCdt+VEu0L4Js/ml3Ju4X9DyoQFw==","signatures":[{"sig":"MEUCICOpP1dPMGEFVs9GnsO8yKFPOMVMfmpGoboVcsSB6D21AiEAgexXQd2TSJSkn3p9XIC9DagK5djS+qhU25UrWEd4Is4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cube-drone%2fmarquee-markup@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":89686},"type":"module","engines":{"node":">=22.6.0"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","marquee-src":"./src/index.ts"}},"gitHead":"dd07438a1ebd6043de970f76e2c4c261194b55cf","scripts":{"test":"node --conditions=marquee-src --test test/*.test.ts","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","prepack":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2e8e3b1b-8b83-460d-b74e-72f0d2022ba8"}},"repository":{"url":"git+https://github.com/cube-drone/marqueemarkup.git","type":"git","directory":"ts/marquee-markup"},"_npmVersion":"11.17.0","description":"Marquee, batteries included: parse + render to HTML in one motion, fonts and styles along for the ride, plus the `marquee` CLI","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@cube-drone/marquee-css":"^0.7.0","@cube-drone/marquee-emoji":"^0.7.0","@cube-drone/marquee-fonts":"^0.7.0","@cube-drone/marquee-parser":"^0.7.0","@cube-drone/marquee-turbolink":"^0.7.0","@cube-drone/marquee-html-renderer":"^0.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/marquee-markup_0.7.0_1788336296543_0.7561122944140566","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@cube-drone/marquee-markup","version":"0.7.1","license":"MPL-2.0","_id":"@cube-drone/marquee-markup@0.7.1","maintainers":[{"name":"cube-drone","email":"cubedrone@gooble.email"}],"homepage":"https://github.com/cube-drone/marqueemarkup#readme","bugs":{"url":"https://github.com/cube-drone/marqueemarkup/issues"},"bin":{"marquee":"dist/bin/marquee.js"},"dist":{"shasum":"77b798b4fea22feeb6da49564b6433ff04392334","tarball":"https://registry.npmjs.org/@cube-drone/marquee-markup/-/marquee-markup-0.7.1.tgz","fileCount":12,"integrity":"sha512-Cs3O5W/6g8tlAdSDKdkkhANHAMqB1doUrR7oxp6ecrkqdffrGegOUNpUtdrF7OVjIZ+eKPI3hJZUE02H4MW6Ag==","signatures":[{"sig":"MEYCIQDJxpDm9mVNVevaXL6AlkROowpyOS8mVWd6MRunwkMvpwIhAN832TBCecqWKPRXnvFOH+8VHXpkBsj387wX54z2ZxKl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cube-drone%2fmarquee-markup@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":89686},"type":"module","engines":{"node":">=22.6.0"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","marquee-src":"./src/index.ts"}},"gitHead":"803737fc90b85c2c975eea7cd71ed568b447993e","scripts":{"test":"node --conditions=marquee-src --test test/*.test.ts","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","prepack":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2e8e3b1b-8b83-460d-b74e-72f0d2022ba8"}},"repository":{"url":"git+https://github.com/cube-drone/marqueemarkup.git","type":"git","directory":"ts/marquee-markup"},"_npmVersion":"11.17.0","description":"Marquee, batteries included: parse + render to HTML in one motion, fonts and styles along for the ride, plus the `marquee` CLI","directories":{},"_nodeVersion":"24.19.0","dependencies":{"@cube-drone/marquee-css":"^0.7.1","@cube-drone/marquee-emoji":"^0.7.1","@cube-drone/marquee-fonts":"^0.7.1","@cube-drone/marquee-parser":"^0.7.1","@cube-drone/marquee-turbolink":"^0.7.1","@cube-drone/marquee-html-renderer":"^0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/marquee-markup_0.7.1_1788429235625_0.260661852683276","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"@cube-drone/marquee-markup","version":"0.7.2","license":"MPL-2.0","_id":"@cube-drone/marquee-markup@0.7.2","maintainers":[{"name":"cube-drone","email":"cubedrone@gooble.email"}],"homepage":"https://github.com/cube-drone/marqueemarkup#readme","bugs":{"url":"https://github.com/cube-drone/marqueemarkup/issues"},"bin":{"marquee":"dist/bin/marquee.js"},"dist":{"shasum":"8139a009e43259fa7b7817a5e0140e0c2e7042ff","tarball":"https://registry.npmjs.org/@cube-drone/marquee-markup/-/marquee-markup-0.7.2.tgz","fileCount":12,"integrity":"sha512-BySty6ckU0DEPvMS3l/EuyB+j4lU9N7dqrrSgwQ6o+EnyO7ZNEfpDxRHgoELQOAmAlh8LGeua8yVhEflHAuTjw==","signatures":[{"sig":"MEQCICGETglWSdw4AwsuI1Ck8zgJ1wg3S6HPqReweM/Dhdo+AiBdfw/1W0XTO2oll9ejK8BgP8cnZFlYlPuMk9wJpbKUKA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cube-drone%2fmarquee-markup@0.7.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":89686},"type":"module","engines":{"node":">=22.6.0"},"exports":{".":{"types":"./dist/src/index.d.ts","default":"./dist/src/index.js","marquee-src":"./src/index.ts"}},"gitHead":"f05dcff51ae3d74ed16cd4419859fbd15c70fe67","scripts":{"test":"node --conditions=marquee-src --test test/*.test.ts","build":"tsc -p tsconfig.build.json","check":"tsc --noEmit","prepack":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2e8e3b1b-8b83-460d-b74e-72f0d2022ba8"}},"repository":{"url":"git+https://github.com/cube-drone/marqueemarkup.git","type":"git","directory":"ts/marquee-markup"},"_npmVersion":"11.19.0","description":"Marquee, batteries included: parse + render to HTML in one motion, fonts and styles along for the ride, plus the `marquee` CLI","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@cube-drone/marquee-css":"^0.7.2","@cube-drone/marquee-emoji":"^0.7.2","@cube-drone/marquee-fonts":"^0.7.2","@cube-drone/marquee-parser":"^0.7.2","@cube-drone/marquee-turbolink":"^0.7.2","@cube-drone/marquee-html-renderer":"^0.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.0","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/marquee-markup_0.7.2_1788466639641_0.7931819043563566","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@cube-drone/marquee-markup","version":"0.8.0","description":"Marquee, batteries included: parse + render to HTML in one motion, fonts and styles along for the ride, plus the `marquee` CLI","license":"MPL-2.0","repository":{"type":"git","url":"git+https://github.com/cube-drone/marqueemarkup.git","directory":"ts/marquee-markup"},"type":"module","engines":{"node":">=22.6.0"},"publishConfig":{"access":"public"},"exports":{".":{"marquee-src":"./src/index.ts","types":"./dist/src/index.d.ts","default":"./dist/src/index.js"}},"bin":{"marquee":"dist/bin/marquee.js"},"scripts":{"test":"node --conditions=marquee-src --test test/*.test.ts","check":"tsc --noEmit","build":"tsc -p tsconfig.build.json","prepack":"npm run build"},"dependencies":{"@cube-drone/marquee-css":"^0.8.0","@cube-drone/marquee-emoji":"^0.8.0","@cube-drone/marquee-fonts":"^0.8.0","@cube-drone/marquee-html-renderer":"^0.8.0","@cube-drone/marquee-parser":"^0.8.0","@cube-drone/marquee-turbolink":"^0.8.0"},"devDependencies":{"@types/node":"^24.0.0","typescript":"^5.9.0"},"gitHead":"010d8261d68ec7d4abafdcd0fdcd3a0267207f50","_id":"@cube-drone/marquee-markup@0.8.0","bugs":{"url":"https://github.com/cube-drone/marqueemarkup/issues"},"homepage":"https://github.com/cube-drone/marqueemarkup#readme","_nodeVersion":"24.20.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-I55792HSkyiCJ50V0qgb43X2LRVbtVT9iAlYUJAR+HuG/DdCMGxqSoXTQK8H+MRrVfDbWYdjCyiNFKdJ4UAMRg==","shasum":"4695ff228cb9c60e83d2dfabad7163524d4f56d9","tarball":"https://registry.npmjs.org/@cube-drone/marquee-markup/-/marquee-markup-0.8.0.tgz","fileCount":12,"unpackedSize":89686,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cube-drone%2fmarquee-markup@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIG/IF151T+fJdcSkFvOVVGtlfDcoFYRsR5K2Yc9J4vkiAiAH5mwpUAVDl/IjtbS2sXjVsrhSpbk+cF6OJ8lGO+sgng=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2e8e3b1b-8b83-460d-b74e-72f0d2022ba8"}},"directories":{},"maintainers":[{"name":"cube-drone","email":"cubedrone@gooble.email"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/marquee-markup_0.8.0_1788738995355_0.9532583966135679"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-12T01:52:34.516Z","modified":"2026-09-06T23:56:35.836Z","0.1.0":"2026-07-12T01:52:34.799Z","0.1.1":"2026-07-12T02:27:42.263Z","0.2.0":"2026-07-12T08:13:08.172Z","0.3.0":"2026-07-13T00:25:47.562Z","0.4.0":"2026-07-14T20:15:39.377Z","0.6.0":"2026-07-17T23:25:54.443Z","0.6.1":"2026-07-20T23:56:02.712Z","0.6.2":"2026-07-29T22:20:42.662Z","0.7.0":"2026-09-02T08:04:56.670Z","0.7.1":"2026-09-03T09:53:55.759Z","0.7.2":"2026-09-03T20:17:19.769Z","0.8.0":"2026-09-06T23:56:35.506Z"},"bugs":{"url":"https://github.com/cube-drone/marqueemarkup/issues"},"license":"MPL-2.0","homepage":"https://github.com/cube-drone/marqueemarkup#readme","repository":{"type":"git","url":"git+https://github.com/cube-drone/marqueemarkup.git","directory":"ts/marquee-markup"},"description":"Marquee, batteries included: parse + render to HTML in one motion, fonts and styles along for the ride, plus the `marquee` CLI","maintainers":[{"name":"cube-drone","email":"cubedrone@gooble.email"}],"readme":"<img src=\"https://raw.githubusercontent.com/cube-drone/marqueemarkup/main/marquee-logo.png\" alt=\"Marquee Markup\" width=\"96\" align=\"right\">\n\n# @cube-drone/marquee-markup\n\nThe [Marquee](https://github.com/cube-drone/marqueemarkup) Markup Language.\n\nMarquee source in, complete styled HTML out, with the stylesheet, fonts, and emoji table along for the ride.\n\nThis is the package you want unless you know why you want a smaller one.\n\n```\nnpm install @cube-drone/marquee-markup\n```\n\n```ts\nimport { marquee } from \"@cube-drone/marquee-markup\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\n\nwriteFileSync(\"hello.html\", marquee(readFileSync(\"hello.mq\", \"utf8\")));\n```\n\nTo learn the *language*, read [WRITING.md](https://github.com/cube-drone/marqueemarkup/blob/main/WRITING.md)\nor see it live at [marquee.cube-drone.com](https://marquee.cube-drone.com). This document is\nthe contract for the *tools*.\n\n## The CLI\n\n```\nnpx marquee <file.mq>                 render one page to stdout\nnpx marquee <file.mq> -o out.html    ...or to a file\nnpx marquee <site-dir> <out-dir>      build a whole site\n```\n\n| flag | effect |\n|---|---|\n| `--nofetch` | skip the network fetch-ahead pass. Default is ON: bare web links become real OpenGraph preview cards, fetched once at build time. With `--nofetch`, unrecognized links stay plain links and the build touches no network |\n| `--envelope` | wrap plain documents in a 650px centered column for readability. Documents whose top-level content is `:::page` directives are left alone (the author took layout control) |\n| `--darkmode` | force `color-scheme: dark`. Default: pages follow the reader's OS theme |\n| `--noreadable` | disable the color-readability rescue (see `readable` below). Default is ON for pages |\n\nEvery flag is a library option first; the CLI is sugar over the functions below.\n\n## Functions\n\n### What Happens if the Marquee is unparseable? \n\nI have good news for you: if you give it _text_ you are very likely to be in the clear:\nthis language is designed to _always_ be parseable. **any input renders: nothing throws**.\n\nThe only exception in the whole API is an unknown dialect version declaration\n(`#!marquee 99`), which throws `UnsupportedVersionError` — so that old versions of Marquee\ndon't try to parse documents it doesn't understand yet. \n\n### `marquee(source, options?) => string`\n\n* parse\n* render\n* inline the stylesheet \n* inline exactly the font faces the page actually uses (as base64, by default) \n* wrap in a complete `<!doctype html>` page shell. \n\nThe returned string is self-contained (thanks to all of the inlining): you should be able to deliver it as a complete .html file.\n\nTurbolinks (bare URLs alone in a paragraph) render through the _fetchless_ plugin chain:\nwhich is to say, we don't go chasing after OpenGraph data to expand them. \n\nYouTube/Spotify links become embeds (these won't work if you don't serve the file from _somewhere_), \n\nimage/audio/video links become the media, everything else degrades to a plain link.\n\n### `marqueeFetch(source, options?) => Promise<string>`\n\nIn the above function we didn't fetch OpenGraph data (how could we? we were running in sync mode).\n`marqueeFetch` does the same thing but it _does, in fact, go fetch that OpenGraph data!_.\n\n`marquee()` plus the network: before rendering, runs every composed turbolink plugin's async\n`resolve()` phase over the document's link targets — concurrently across targets, with the\nOpenGraph plugin joining the chain automatically (10-second timeout per fetch). Gathered\nsummaries render as preview cards; failed or timed-out fetches degrade to plain links.\n\n**Trust contract:** this function *executes plugin fetch code*. The default chain is safe;\nif you pass your own turbolink `plugins`, you are vouching for them. Rendering itself remains synchronous and\nfetchless — all network happens in the resolve phase, before render, never during.\n\n### `marqueeFragment(source, options?) => { body, css, title, fontTokens }`\n\nThe pieces, for embedding in your own page:\n\n- `body: string` — one `<div class=\"mq-doc\">…</div>` fragment\n- `css: string` — everything the body needs styled: the Marquee stylesheet, the composed\n  plugins' skins, and font faces per the `fonts` option\n- `title: string` — the `title` option, else the document's `:::meta title`, else `\"Marquee\"`\n- `fontTokens: string[]` — which font faces the body actually wears (feed to\n  `fontFilePath()` if you're hosting font files yourself)\n\n### `marqueeBody(source, options?) => string` / `marqueeHead(source, options?) => string`\n\nThe fragment, pre-split for template stitching: `marqueeBody` returns just the body\nfragment; `marqueeHead` returns `<title>…</title>\\n<style>…</style>`, paste-ready for a\n`<head>`.\n\n### `buildSite(siteDir, outDir, options?) => SiteReport`\n\nA folder of `.mq` files in, a static website out. The contract, precisely:\n\n- **Every `<id>.mq` becomes `<id>.html`**, except files named `_*.mq`, which are *partials*:\n  includable via `:::include doc=_nav:::` but not rendered as pages. Includes resolve beside\n  the including file; included documents may not themselves include (cycles are therefore\n  unrepresentable); a missing include renders a visible placeholder, never an error.\n- **Relative doc-id links resolve to built pages**: `[Menu](menu)` becomes `href=\"menu.html\"`.\n- **Relative media is copied** into `<out>/media/` (deduplicated, name-collision-safe) and\n  embeds re-point to the copies. Remote (`https:`) media is left as-is: readers fetch it.\n- **Fonts ship as real files**: only the faces the site's pages actually use are copied to\n  `<out>/fonts/`, with a generated `css/fonts.css` pointing at them — cacheable across pages,\n  never base64.\n- **Stylesheets are files**: `css/marquee.css` and `css/turbolink.css` (the composed plugin\n  chain's skins), linked from every page shell.\n- Page titles come from each document's `:::meta title`, falling back to the file's id.\n- Returns `{ pages: string[], mediaFiles: number, fontFaces: string[], outDir: string }`.\n\n### `buildSiteFetch(siteDir, outDir, options?) => Promise<SiteReport>`\n\n`buildSite()` with the fetch-ahead pass: gathers turbolink targets across *all* the site's\n`.mq` files (partials included), resolves them once, builds with the results. Same trust\ncontract as `marqueeFetch`.\n\n## Options\n\n`MarqueeOptions` — every field optional:\n\n| option | type | default | contract |\n|---|---|---|---|\n| `title` | `string` | document's `:::meta title`, else `\"Marquee\"` | the page `<title>` |\n| `fonts` | `\"inline\" \\| \"external\" \\| \"none\"` | `\"inline\"` | `inline`: used faces embedded as base64 (self-contained page). `external`: `@font-face` rules point at `<fontBase><token>.woff2` — you copy the files (`fontTokens` names them, `fontFilePath()` locates them). `none`: no faces; font names degrade to their fallback stacks |\n| `fontBase` | `string` | `\"fonts/\"` | URL prefix for `fonts: \"external\"` |\n| `emoji` | `Record<string, string \\| { image, alt? }>` | `{}` | your emoji table, layered over the defaults; yours win on collision. String values are replacement text; `{ image, alt? }` renders a character-sized inline `<img>` (the custom-emoji mechanism — the image URL is embedder-trusted, like every hook) |\n| `emojiDefaults` | `boolean` | `true` | the standard gemoji table (`:sparkles:` and ~1,900 friends) loads implicitly. `false`: unlisted shortcodes stay literal `:slug:` |\n| `colorScheme` | `\"light\" \\| \"dark\"` | follow the reader's OS | forces the page shell's `color-scheme`. Applies to whole pages only; fragments follow their host |\n| `envelope` | `boolean` | `false` | wrap the document in a 650px centered readability column. Defers to documents that *are* a `:::page` |\n| `readable` | `boolean` | `true` for pages, `false` for fragments | the color-readability rescue: author colors keep their hue but their lightness is clamped toward the canvas's opposite (via CSS relative color syntax), so dark-red text survives dark mode. Containers that paint their own background are left alone; browsers without support see raw colors. Fragments default off because a host theming by class rather than OS preference would get the clamp backwards |\n| `plugins` | `TurbolinkPlugin[]` | the fetchless default set | the turbolink chain, in priority order. In fetch mode, `opengraphPlugin` is appended unless already present |\n| `profile` | `Partial<Profile>` | — | override any embedder policy hook (allowed URL schemes, media resolution, emoji, directives). Wins over everything above |\n\n`SiteOptions` (for `buildSite`/`buildSiteFetch`) accepts `emoji`, `emojiDefaults`,\n`colorScheme`, `envelope`, `readable`, `plugins`, and `profile` with identical meanings,\napplied per-page. It also takes **`confineMedia`** (`boolean`, default `false`): with it on,\na relative media target that resolves *outside* the site tree — a `../` escape like\n`![x](../../photos/private.jpg)` — is refused rather than copied into the output. Leave it off\nfor trusted content (shared-asset dirs a level up are useful); turn it on when building from\ndocuments you don't fully trust (see \"Rendering untrusted content\").\n\n## Safety, stated plainly\n\n- Author bytes never reach output except through escaping; targets only through the profile's\n  scheme allowlist; the AST is the contract — nothing `innerHTML`-shaped exists.\n- Unknown vocabulary degrades visibly (placeholders, literal text) and **never eats content**.\n- The rendered page contains **zero JavaScript**. Effects are CSS, honor\n  `prefers-reduced-motion`, and reveal effects cannot hide text where animations don't run.\n- The only code execution surface is plugin `resolve()` in the fetch functions, and only for\n  plugins you composed.\n\n### Rendering untrusted content\n\nThis package is built for **trusted** content — Hugo/mdBook-style blog and book generators,\nwhere the author is you. Rendering itself is always safe (pure, fetchless, zero-JS output). But\ntwo boundaries reach the outside world, and both matter the moment the *author* is a stranger:\n\n- **Never run the `*Fetch` functions on untrusted input.** Their resolve phase fetches the\n  document's link targets, so a hostile document is a request generator: it can aim fetches at\n  your internal network (`localhost`, cloud-metadata addresses — SSRF), or list thousands of\n  links to turn your server into a reflected-DDoS cannon against a third party. The concurrency\n  cap bounds *your* load, not the victim's. Use the synchronous functions (`marquee`,\n  `buildSite`), which never fetch — known-provider embeds (YouTube, Spotify, media-by-extension)\n  still render from the URL alone; stranger-page cards degrade to plain links.\n- **Set `confineMedia` on untrusted `buildSite` runs.** It copies referenced media from disk, so\n  without confinement a `../` target could pull a media file from outside the site tree.\n- **Want link previews on untrusted content anyway?** Resolve them out-of-band, in a service you\n  control: cache by URL (so resubmitting a document can't re-attack), cap the count per document,\n  deny private/link-local addresses, and rate-limit per host — then pass the results in via the\n  resolve map, keeping render fetchless. `resolveTargets` is that seam.\n\n## Reaching deeper\n\nEverything underneath is re-exported, so outgrowing the convenience never means switching\npackages: `parse` and the AST types (`Node`, `Attrs`, `Reason`), `render` / `renderMarquee` /\n`bareWebProfile` / `Profile` and the escapes, `marqueeCss`, `standardEmoji`, the font helpers\n(`FONT_MANIFEST`, `fontFilePath`, `inlineFontFaces`, `externalFontFaces`), and the whole\nturbolink toolkit (`TurbolinkPlugin`, `composeTurbolinks`, `resolveTargets`,\n`turbolinkTargets`, `turbolinkStyles`, `renderCard`, `defaultPlugins`, `opengraphPlugin`).\nThe leaner-diet packages behind them: `@cube-drone/marquee-parser`, `-html-renderer`,\n`-css`, `-fonts`, `-emoji`, `-turbolink` — same code, à la carte. This package deliberately\nincludes the ~1.3MB font grab bag; that's what batteries-included means.\n\nSame version number across every package and the Rust crates = passed the same published\nconformance corpus, by definition. License: MPL-2.0.\n","readmeFilename":"README.md"}