@@ -110,15 +110,24 @@ private static void LayoutTabListCards(
110110 theme . NodePadding * 2.5 + maxItemCount * descLineHeight + theme . NodePadding ) ;
111111 double rowGap = Math . Max ( theme . NodePadding * 1.6 , 16 ) ;
112112
113- string [ ] palette = theme . NodePalette is { Count : > 0 }
114- ? [ .. theme . NodePalette ]
115- : [ theme . NodeFillColor ] ;
113+ IReadOnlyList < string > effectivePalette ;
114+ bool useFallbackPalette ;
115+ if ( theme . NodePalette is { Count : > 0 } )
116+ {
117+ effectivePalette = ThemePaletteResolver . ResolveEffectivePalette ( theme ) ;
118+ useFallbackPalette = ! ReferenceEquals ( effectivePalette , theme . NodePalette ) ;
119+ }
120+ else
121+ {
122+ effectivePalette = [ theme . NodeFillColor ] ;
123+ useFallbackPalette = false ;
124+ }
116125
117126 for ( int i = 0 ; i < titleNodes . Count ; i ++ )
118127 {
119128 var titleNode = titleNodes [ i ] ;
120129 double rowY = pad + titleOffset + i * ( cardHeight + rowGap ) ;
121- string catFill = palette [ i % palette . Length ] ;
130+ string catFill = effectivePalette [ i % effectivePalette . Count ] ;
122131
123132 // Accent block: vibrant saturated color
124133 string accentFill = ColorUtils . Vibrant ( catFill , 2.5 ) ;
@@ -137,7 +146,8 @@ private static void LayoutTabListCards(
137146 titleNode . Label . FontSize = titleFontSize ;
138147 titleNode . Label . FontWeight = "bold" ;
139148 titleNode . Label . Color = accentTextColor ;
140- titleNode . Metadata [ "render:noGradient" ] = true ;
149+ if ( ! useFallbackPalette )
150+ titleNode . Metadata [ "render:noGradient" ] = true ;
141151 titleNode . Metadata [ "tablist:band" ] = true ;
142152 titleNode . Metadata [ "tablist:layout" ] = "cards" ;
143153 titleNode . Metadata [ "tablist:accentWidth" ] = accentWidth ;
@@ -214,15 +224,17 @@ private static void LayoutTabListStacked(
214224 theme . NodePadding * 2 + titleFontSize * 1.3 + maxItemCount * descLineHeight + theme . NodePadding ) ;
215225 double rowGap = 6 ; // Narrow gap for stacked infographic feel
216226
217- string [ ] palette = theme . NodePalette is { Count : > 0 }
218- ? [ .. theme . NodePalette ]
219- : [ theme . NodeFillColor ] ;
227+ IReadOnlyList < string > effectivePalette ;
228+ if ( theme . NodePalette is { Count : > 0 } )
229+ effectivePalette = ThemePaletteResolver . ResolveEffectivePalette ( theme ) ;
230+ else
231+ effectivePalette = [ theme . NodeFillColor ] ;
220232
221233 for ( int i = 0 ; i < titleNodes . Count ; i ++ )
222234 {
223235 var titleNode = titleNodes [ i ] ;
224236 double rowY = pad + titleOffset + i * ( bandHeight + rowGap ) ;
225- string catFill = palette [ i % palette . Length ] ;
237+ string catFill = effectivePalette [ i % effectivePalette . Count ] ;
226238
227239 // Number tab: vivid saturated color
228240 string tabFill = ColorUtils . Vibrant ( catFill , 2.5 ) ;
@@ -245,6 +257,8 @@ private static void LayoutTabListStacked(
245257 titleNode . Label . FontSize = numberFontSize ;
246258 titleNode . Label . FontWeight = "bold" ;
247259 titleNode . Label . Color = tabTextColor ;
260+ // Stacked renderer uses tablist:tabStroke/contentStroke directly; node-level
261+ // gradient stroke is not consumed, so always suppress gradient generation.
248262 titleNode . Metadata [ "render:noGradient" ] = true ;
249263 titleNode . Metadata [ "tablist:band" ] = true ;
250264 titleNode . Metadata [ "tablist:layout" ] = "stacked" ;
@@ -324,9 +338,11 @@ private static void LayoutTabListFlat(
324338 double totalWidth = accentLineWidth + accentLineGap + barWidth ;
325339 double categoryGap = theme . NodePadding * 1.2 ;
326340
327- string [ ] palette = theme . NodePalette is { Count : > 0 }
328- ? [ .. theme . NodePalette ]
329- : [ theme . NodeFillColor ] ;
341+ IReadOnlyList < string > effectivePalette ;
342+ if ( theme . NodePalette is { Count : > 0 } )
343+ effectivePalette = ThemePaletteResolver . ResolveEffectivePalette ( theme ) ;
344+ else
345+ effectivePalette = [ theme . NodeFillColor ] ;
330346
331347 double curY = pad + titleOffset ;
332348
@@ -337,7 +353,7 @@ private static void LayoutTabListFlat(
337353 var items = itemsByCategory . TryGetValue ( catIdx , out var list ) ? list : [ ] ;
338354 int itemCount = items . Count ;
339355
340- string catFill = palette [ i % palette . Length ] ;
356+ string catFill = effectivePalette [ i % effectivePalette . Count ] ;
341357 string titleBarFill = ColorUtils . Vibrant ( catFill , 2.0 ) ;
342358 string titleBarTextColor = ColorUtils . ChooseTextColor ( titleBarFill ) ;
343359
@@ -354,12 +370,14 @@ private static void LayoutTabListFlat(
354370 titleNode . Label . FontSize = titleFontSize ;
355371 titleNode . Label . FontWeight = "bold" ;
356372 titleNode . Label . Color = titleBarTextColor ;
373+ // Flat renderer uses tablist:accentColor and StrokeColor="none" directly;
374+ // node-level gradient stroke is not consumed, so always suppress gradient generation.
357375 titleNode . Metadata [ "render:noGradient" ] = true ;
358376 titleNode . Metadata [ "tablist:band" ] = true ;
359377 titleNode . Metadata [ "tablist:layout" ] = "flat" ;
360378 titleNode . Metadata [ "tablist:accentLineWidth" ] = accentLineWidth ;
361379 titleNode . Metadata [ "tablist:accentLineGap" ] = accentLineGap ;
362- titleNode . Metadata [ "tablist:accentColor" ] = ColorUtils . Vibrant ( palette [ 0 ] , 2.5 ) ;
380+ titleNode . Metadata [ "tablist:accentColor" ] = ColorUtils . Vibrant ( effectivePalette [ 0 ] , 2.5 ) ;
363381 titleNode . Metadata [ "tablist:barWidth" ] = barWidth ;
364382 titleNode . Metadata [ "tablist:titleBarHeight" ] = titleBarHeight ;
365383 titleNode . Metadata [ "tablist:descFontSize" ] = descFontSize ;
0 commit comments