Skip to content

Commit e9d0c4a

Browse files
authored
Merge pull request #147 from jongalloway/copilot/fix-tablist-invisibility-prism
Fix tablist variants invisible under Prism (monochrome palette)
2 parents c360676 + 272b1f6 commit e9d0c4a

7 files changed

Lines changed: 265 additions & 14 deletions

src/DiagramForge/Layout/DefaultLayoutEngine.TabList.cs

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
Lines changed: 82 additions & 0 deletions
Loading
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
---
2+
theme: prism
3+
---
4+
diagram: tablist
5+
title: Cloud Architecture Layers
6+
categories:
7+
- title: Presentation
8+
items:
9+
- Web frontend (React)
10+
- Mobile clients (iOS, Android)
11+
- CDN-cached static assets
12+
- title: API Gateway
13+
items:
14+
- Rate limiting & auth
15+
- Request routing
16+
- Response caching
17+
- title: Services
18+
items:
19+
- User service
20+
- Order service
21+
- Notification service
22+
- title: Data
23+
items:
24+
- Relational DB (Postgres)
25+
- Cache layer (Redis)
26+
- Object storage (S3)
Lines changed: 42 additions & 0 deletions
Loading
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
---
2+
theme: prism
3+
---
4+
diagram: tablist
5+
layout: flat
6+
title: Project Phases
7+
categories:
8+
- title: Discovery
9+
items:
10+
- Stakeholder interviews
11+
- Requirements gathering
12+
- Competitive analysis
13+
- title: Design
14+
items:
15+
- Wireframes & prototypes
16+
- Design system setup
17+
- Accessibility review
18+
- title: Development
19+
items:
20+
- Sprint planning
21+
- Feature implementation
22+
- Code review process

0 commit comments

Comments
 (0)