@@ -84,6 +84,36 @@ test('replacing CSS variables with their fallbacks (when they have them)', () =>
84
84
expect ( replaceCssVarsWithFallbacks ( state , 'var(--circular-3)' ) ) . toBe ( 'var(--circular-2)' )
85
85
} )
86
86
87
+ test ( 'recursive theme replacements' , ( ) => {
88
+ let map = new Map < string , string > ( [
89
+ [ '--color-a' , 'var(--color-a)' ] ,
90
+ [ '--color-b' , 'rgb(var(--color-b))' ] ,
91
+ [ '--color-c' , 'rgb(var(--channel) var(--channel) var(--channel))' ] ,
92
+ [ '--channel' , '255' ] ,
93
+
94
+ [ '--color-c' , 'rgb(var(--indirect) var(--indirect) var(--indirect))' ] ,
95
+ [ '--indirect' , 'var(--channel)' ] ,
96
+ [ '--channel' , '255' ] ,
97
+ ] )
98
+
99
+ let state : State = {
100
+ enabled : true ,
101
+ designSystem : {
102
+ theme : { prefix : null } as any ,
103
+ resolveThemeValue : ( name ) => map . get ( name ) ?? null ,
104
+ } as DesignSystem ,
105
+ }
106
+
107
+ expect ( replaceCssVarsWithFallbacks ( state , 'var(--color-a)' ) ) . toBe ( 'var(--color-a)' )
108
+ expect ( replaceCssVarsWithFallbacks ( state , 'var(--color-b)' ) ) . toBe ( 'rgb(var(--color-b))' )
109
+ expect ( replaceCssVarsWithFallbacks ( state , 'var(--color-c)' ) ) . toBe ( 'rgb(255 255 255)' )
110
+
111
+ // This one is wrong but fixing it without breaking the infinite recursion guard is complex
112
+ expect ( replaceCssVarsWithFallbacks ( state , 'var(--color-d)' ) ) . toBe (
113
+ 'rgb(255 var(--indirect) var(--indirect))' ,
114
+ )
115
+ } )
116
+
87
117
test ( 'Evaluating CSS calc expressions' , ( ) => {
88
118
expect ( replaceCssCalc ( 'calc(1px + 1px)' , ( node ) => evaluateExpression ( node . value ) ) ) . toBe ( '2px' )
89
119
expect ( replaceCssCalc ( 'calc(1px * 4)' , ( node ) => evaluateExpression ( node . value ) ) ) . toBe ( '4px' )
0 commit comments