From 8253e370b89fc6990f613c59704bfdeec3f3a04e Mon Sep 17 00:00:00 2001 From: Brendan Ryan Date: Wed, 15 Apr 2026 15:55:18 -0700 Subject: [PATCH 1/4] fix: emit shiki CSS for reused token colors --- src/shiki-style-to-class.test.ts | 19 +++++++++++++++ src/shiki-style-to-class.ts | 42 +++++++++++++------------------- 2 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/shiki-style-to-class.test.ts b/src/shiki-style-to-class.test.ts index bfda4300..a32f9556 100644 --- a/src/shiki-style-to-class.test.ts +++ b/src/shiki-style-to-class.test.ts @@ -70,6 +70,25 @@ describe("shikiStyleToClass", () => { expect(uniqueClasses.size).toBe(2); }); + it("emits CSS for reused colors on later code blocks", () => { + const transformer = shikiStyleToClass(); + + const style = + "color:light-dark(#D73A49, #F47067);--shiki-light:#D73A49;--shiki-dark:#F47067"; + + const firstRoot = makeRoot([{ style }]); + transformer.root.call({} as any, firstRoot as any); + + const firstSpan = firstRoot.children[0].children[0].children[0]; + const cls = firstSpan.properties.class; + + const secondRoot = makeRoot([{ style }]); + transformer.root.call({} as any, secondRoot as any); + + const secondPre = secondRoot.children[0]; + expect(secondPre.properties["data-shiki-css"]).toContain(`.${cls}{${style}}`); + }); + it("preserves non-color style properties", () => { const transformer = shikiStyleToClass(); diff --git a/src/shiki-style-to-class.ts b/src/shiki-style-to-class.ts index 4943acba..25744769 100644 --- a/src/shiki-style-to-class.ts +++ b/src/shiki-style-to-class.ts @@ -12,10 +12,11 @@ * * 1. BUILD TIME (Shiki transformer — `shikiStyleToClass`): * Runs during MDX compilation. Walks every token , extracts color - * styles into a global Map, replaces `style` with `class`, and stores - * the CSS rules as a `data-shiki-css` attribute on the
 element.
- *    Data attributes survive RSC serialization (raw