Power BI Report Design
Use pbir for every report mutation. The pbir-format skill is read-only schema context.
If the CLI is unavailable or lacks an operation, stop and report the gap.
Best practices and guidelines for Power BI report design. Follow these guidelines strictly to avoid generic, poorly formatted reports ("Power BI Slop").
Be innovative, pushing boundaries while adhering to data visualization rules and guidelines. Work within Power BI's constraints, aiming for simplicity and effectiveness over aesthetics and decoration. Focus reports, pages, and visuals on answering specific questions and minimizing cognitive load -- not on looking "pretty and impressive".
When a user request contradicts these guidelines, push back and explain better alternatives. The goal is to inform the user of options that lead to improved outcomes.
Design identity (commit before layout)
Before any layout work, lock the report's identity so every later choice has something to cite:
- Pick one tone ... a committed ink budget (
restrained, corporate, editorial, or technical) that fixes accent count, saturation, gridline weight, and how forward annotation gets
- Pick one signature (two at most) ... a single recurring element (header band, single-accent-hue rule, fixed nav rail, KPI silhouette, callout style, target-line convention) repeated identically on every page, so the report reads as one artifact
- Route each page to one shape by the question it answers (
summary, monitoring, exploration, comparison, narrative)
Recording tone and signature once is what turns "use muted colors" into a propagating decision. See references/design-identity.md for the tone budgets and signature catalog, and references/page-shapes.md for routing each page to a shape. Serialize the identity into the theme via the modifying-theme-json skill, not into per-visual overrides.
Core rules
- 3-30-300 Rule: The most important and least detailed information should be in the top-left (KPIs, cards, etc.) while the least important and most detailed information should be in the bottom-right
- Titles: All report pages should have a title using a
textBox visualType or a title in a background image added to the report page canvas
- Visual positioning, alignment, and spacing: All visuals must have equal spacing between them and equal spacing between the edge of the page (the margin). If visuals are unaligned or this spacing is unequal, fix it to ensure alignment and equal spacing
- Themes: Reports should use a theme that differs from the default Power BI themes; a suggested theme is the
sqlbi theme (see the modifying-theme-json skill for applying templates). Themes are preferred because they provide a set of default styles for all charts that can adhere to good design practices and brand or style guidelines
- Semantic Models: Reports in Power BI are complex. They are dependant on an underlying semantic model (either in the .SemanticModel folder, called a "thick report" or a published model in Power BI/Fabric, called a "thin report"). Much of the functionality from a Power BI report comes from its semantic model design or DAX code
- Report extensions, or thin report measures: It is possible to create calculation logic in Power BI report, called "thin report measures" or "visual calculations". These should be used sparingly and only for "report-specific" scenarios
- Visual fields: All data visuals should have field bindings, and all field bindings should be for fields that actually exist in the model; there is no reason for visuals to exist that have no fields bound
- Chart selection: Make smart choices about what visuals to use for each scenario. Visual vocabulary is essential for this skill.
- Use of color: Color and formatting decisions must cite the locked identity (the chosen tone and signature), not be picked per visual. Colors come from the theme (themedataColor) rather than inline hex, so the identity propagates and re-themes cleanly. Colors should be muted and soft; colors that implicitly encode meaning (like red=bad, green=good) should be avoided unless using them for that encoding. Consider colorblindness and use accessible palettes (blues instead of greens with reds, for instance).
- Pre-attentive attributes: Styles and colors should be used to steer and direct attention, and not to decorate charts. Formatting of visuals should be intentional and not purely aesthetic. Styles should where possible be stored in the theme and not in bespoke visual configuration.
- Fonts: Prefer Segoe UI and Segoe UI Semibold. Do not use custom fonts, since they aren't guaranteed to render on user computers. Evaluate whether fonts are sufficiently large to be readable given the visual and page size.
- Page intent: Route each page to exactly one shape by the question it answers (see
references/page-shapes.md). A page trying to answer two questions is two pages.
Page Layout Guidelines
Check Page Size Before Modifying
Always query the actual page dimensions before adding or repositioning visuals. Do not assume a page is 1280x720 or 1920x1080 -- templates and existing reports vary. The object model validates that visuals fit within page bounds, so setting position or size without knowing the page dimensions will cause errors. Check the page's page.json file for width and height properties, or use the object model (page.width, page.height) to confirm dimensions first. When resizing visuals via the object model, set width/height before x/y to avoid intermediate states that exceed bounds.
Standard Page Size
- Width: 1280px (default)
- Height: 720px (16:9 aspect ratio)
- Alternative: 1920x1080 for high-resolution displays
Visual Spacing
- Minimum gap between visuals: 16px
- Edge margins: 24-32px from page edges
- Consistent alignment: Use grid-based positioning
- Equal spacing is mandatory: Every gap between adjacent visuals (horizontal and vertical) must be the same value. Every margin from the page edge must be the same value. Calculate positions arithmetically from (margin, gap, page_width, page_height) to guarantee alignment. If visuals are misaligned or gaps are unequal, fix immediately -- this is one of the most visible quality signals in a report.
Detail Gradient
Arrange content following the "detail gradient":
+------------------+------------------+
| KPIs/Cards | KPIs/Cards | <- Top: High-level, important
| (Summary) | (Summary) |
+------------------+------------------+
| |
| Charts/Trends | <- Middle: Context, trends
| (Analysis) |
| |
+------------------+------------------+
| |
| Tables/Details | <- Bottom: Detailed data
| (Drill-down) |
| |
+------------------+------------------+
Visual Count Guidelines
- Maximum visuals per page: 12-15 (performance impact)
- Maximum KPIs/Cards: 4-6 at top
- Maximum slicers: 3 per page (use filter pane instead)
Page Titles
Every page should have a title. Create it through pbir:
pbir add title "Report.Report/Page.Page" "Page Title" --width 500
Title positioning:
- Top-left corner, inside the page margin
- Enough height for the chosen font without clipping
- Width: 400-600px (or page width minus margins)
Theme Guidelines
Always Check Theme First
Before modifying visual formatting:
- Check theme wildcards:
visualStyles["*"]["*"]
- Check visual-type overrides:
visualStyles.lineChart["*"]
- Only override in visual.json if truly one-off
When to Modify Theme vs Visual
- All visuals of a type need change -> theme
- Establishing design standards -> theme
- Single visual exception to a theme rule -> visual
- Content-specific highlight (one callout, one reference line) -> visual
Theme Color Usage
Prefer theme colors over hex codes:
// Good - uses theme color
"expr": {"ThemeDataColor": {"ColorId": 1, "Percent": 0}}
// Avoid in visuals - use only in extension measures
"expr": {"Literal": {"Value": "'#118DFF'"}}
Semantic colors (return from extension measures):
"good" - Positive values (green)
"bad" - Negative values (red)
"neutral" - Neutral/unchanged (gray/yellow)
"minColor" - Gradient minimum
"maxColor" - Gradient maximum
Accessibility (WCAG 2.1)
Alt Text
All visuals should include descriptive alt text:
"visualContainerObjects": {
"general": [{
"properties": {
"altText": {
"expr": {"Literal": {"Value": "'Line chart showing monthly sales trend from January to December 2024'"}}
}
}
}]
}
Color Contrast
- Text on background: minimum 4.5:1 contrast ratio
- Large text (18pt+): minimum 3:1 contrast ratio
- Don't rely solely on color to convey meaning
Font Sizes
- Minimum readable: 12pt
- Recommended for charts: 14pt
- Titles: 16-24pt
- KPI values: 24-48pt
Shadows and Motion
- Minimize drop shadows (vestibular issues)
- Avoid animations where possible
- Use
dropShadow.show: false in theme wildcards
Visual Best Practices
Cards and KPIs
A bare number lacks meaning. Every KPI must answer "Is this good or bad?" (target + gap) and "Is it getting better or worse?" (trend). Key rules:
- Position at top or left of page, maximum 5 per page
- Prefer
kpi visual type over card when a target exists -- it has built-in indicator, goal, and trend line data roles
- Always include a target and gap (absolute + percentage). If no target measure exists, discuss with the user: propose adding a prior-year measure to the semantic model (use Tabular Editor CLI or the
tmdl skill), or creating an extension measure as a fallback. Common targets: prior year (CALCULATE([Measure], DATEADD('Date'[Date], -1, YEAR))), budget, or rolling average
- If no clear target exists, ask the user -- do not leave KPIs bare. Discuss whether prior period, budget, or a custom threshold makes sense
- Apply conditional formatting to the gap, not the primary value
- Pair color with a secondary cue (arrow/icon) for accessibility
- Round aggressively at summary level ("518M" not "517,893,412")
- Choose actionable metrics that drive decisions over vanity metrics (apply the "20% change test": if this number changed 20%, should someone act differently?)
- Hide redundant auto-generated subtitles
- Use SVG extension measures for inline icons (see the
svg-visuals skill in the custom-visuals plugin)
For complete guidance on KPI design, targets, trends, formatting hierarchy, icon implementation, accessible palettes, and anti-patterns, consult references/cards-and-kpis.md.
Charts
- Sort by value descending (unless time-based)
- Minimize gridlines and axes clutter
- Use muted colors for non-essential elements
- Highlight key data points sparingly
For chart-type selection (encoding hierarchy, Cleveland-McGill ranking), data-label discipline, and small-multiples guidance, consult references/chart-selection.md.
Refuse common LLM defaults. Gauge-as-KPI, monochrome categorical bars, missing sort, card walls, raw field names as titles, inline hex, off-grid drift, dual y-axis, 3D, and oversized pies are plausible-looking attractors that defeat the reader. When a request reaches for one, push back with the better option; see references/anti-patterns.md.
Tables and Matrices
Tables require deliberate design -- "easy to create" differs from "easy to read." Key rules:
- Position at bottom for detail drill-down (3-30-300 rule)
- Decision-making first: define the question, audience, and action before building
- Use
matrix over tableEx when 2+ categorical columns form a hierarchy (Key Account > Account > Product)
- Subtract, don't add: remove gridlines and heavy banding; let whitespace separate rows
- Sort by the most important measure (often variance), not alphabetically
- Apply data bars to the primary measure column for magnitude scanning
- Apply color scales to variance columns only -- formatting everything means formatting nothing
- Add sparklines where temporal context ("improving or declining?") matters
- Show full precision (no display units) -- tables are where readers go for detail
For complete guidance on table vs matrix selection, formatting philosophy, conditional formatting techniques, sparklines, hierarchy design, and anti-patterns, consult references/tables-and-matrices.md.
Slicers
- Maximum 3 per page
- Position consistently (top or left)
- Use filter pane for additional filters
- Consider sync slicers across pages
Filter Pane
The filter pane has its own information architecture beyond color and chrome. Key decisions: lock vs hide per filter card, how to name cards without renaming model fields, and report-level settings (Apply button, search, allow-change-filter-type). See references/filter-pane.md.
Mobile
Power BI does not reflow a desktop page for portrait; the phone layout is a hand-picked subset re-placed on a narrow grid. Nothing renders on a phone until explicitly opted in with a mobile.json. See references/mobile.md for the subset-selection model and file mechanics.
Report Evaluation Criteria
When asked to evaluate or audit a report, focus on objective criteria. Subjective evaluation is difficult for AI -- the report cannot be "seen" directly, and there is no intuitive sense of aesthetics, cognitive load, or effectiveness. Emphasize this limitation to users.
Objective Checklist
- Page count: More than 5-8 pages is typically excessive
- Visuals per page: Count is a proxy; query cost per visual is the driver (see
references/layout-guidelines.md performance section). Textboxes, images, shapes, and buttons do not emit queries.
- Theme usage: Reports should use a custom theme for consistent formatting
- Layout consistency:
- Equal spacing between visuals?
- Page has a title?
- Follows detail gradient (important top-left, detailed bottom-right)?
- Cards/KPIs at top or left, fewer than 4-6?
- Fewer than 3 slicers (use filter pane instead)?
- Helpful elements (refresh date, links, context)?
- Color effectiveness:
- Conditional formatting used sparingly (not causing overload)?
- Colors muted and passive (not loud and bright)?
- Negative-sentiment colors (red, orange) only for negative values?
- Information:ink ratio: Non-essential elements reduced (lighter gridlines, disabled unnecessary axes/labels)?
- Readability: Font sizes sufficient for all elements?
- Accessibility: Minimal shadows to avoid vestibular issues?
- Font consistency: Limited font sizes, simple readable fonts that work on all devices?
- Sorting: Visuals sorted descending unless there's a reason otherwise (time-based, etc.)?
Evaluation Output
When evaluating, provide:
- Issues found with specific locations
- Severity (critical, warning, suggestion)
- Recommended fixes with commands or patterns
The design gate
Before declaring a design done, run the closing gate in references/quality-gate.md. It is not the planning-stage checklist that runs before the build; it runs against the finished artifact and decides whether it ships. It verifies the identity propagated, every page has one intent, spacing and margins are equal and on-grid, callouts are backed by model evidence, and accessibility is met. Because an agent cannot see the canvas, pair the gate with the screenshot-review loop in the pbir-cli skill: render the pages, look, and confirm what the JSON inferred.
Common Design Issues
Issue: Cognitive Overload
Symptoms: Too many colors, visuals, or data points
Fix:
- Reduce visual count
- Use muted color palette
- Apply detail gradient
- Hide non-essential elements
Issue: Inconsistent Spacing
Symptoms: Uneven gaps, misaligned visuals
Fix:
- Use grid-based positioning
- Standardize visual sizes
- Apply consistent margins
Issue: Poor Readability
Symptoms: Small fonts, low contrast
Fix:
- Increase font sizes (minimum 12pt)
- Check color contrast ratios
- Use appropriate font weights
References
references/design-identity.md -- Commit-first identity: tone budgets (restrained/corporate/editorial/technical), the signature catalog, and serializing identity into the theme
references/page-shapes.md -- Routing each page to one shape by intent (summary/monitoring/exploration/comparison/narrative): what belongs, what stays off, layout lean
references/anti-patterns.md -- Cross-cutting defaults to refuse (gauge-as-KPI, monochrome bars, missing sort, card walls, raw titles, inline hex, off-grid, dual-axis, 3D, oversized pie) with the repair
references/quality-gate.md -- The design gate: closing checks (identity propagated, one intent per page, equal spacing, evidence-backed callouts, accessibility) in issue/location/severity/fix form
references/cards-and-kpis.md -- KPI card design: targets, gaps, trends, formatting hierarchy, icons, accessible palettes, anti-patterns, review checklist
references/tables-and-matrices.md -- Table and matrix design: decision-making framework, subtract-don't-add philosophy, conditional formatting, sorting, sparklines, matrix hierarchies, anti-patterns
references/layout-guidelines.md -- Canvas dimensions, spacing tiers (intra-group/inter-group/margin), alignment rules, performance cost model
references/visual-colors.md -- Color principles, CF basis decision (gradient vs rules vs field-value vs icons), semantic tokens, accessibility
references/page-titles.md -- Title implementation, accessible title wording, hidden-title/alt-text rule
references/chart-selection.md -- Encoding hierarchy (Cleveland-McGill ranking), chart type routing, data-label discipline, small multiples
references/tooltips-and-annotations.md -- Report-page tooltip design, when not to use one, annotation primitives for guided analytics
references/filter-pane.md -- Lock vs hide, card naming, card order, Applied/Available styling, report-level settings
references/mobile.md -- Phone layout as a curated subset, mobile.json mechanics, what to include/exclude
references/custom-visuals.md -- Build-vs-buy ranking, AppSource/org-store tradeoffs, licensing gaps
Related Skills
Report Structure and Format
pbir-format (pbip plugin) -- PBIR JSON format reference for visual.json, page.json, report.json structure
pbip (pbip plugin) -- PBIP project structure, table/measure renames, project forking
Custom Visuals
Reports often need visuals beyond what Power BI provides natively. Always consider in-repo code paths before reaching for a packaged third-party visual. See references/custom-visuals.md for the build-vs-buy decision and AppSource/org-store tradeoffs.
Skill routing for in-repo code visuals (all in the custom-visuals plugin; add with claude plugin install custom-visuals@power-bi-agentic-development):
deneb-visuals -- Vega/Vega-Lite declarative visuals; preferred for advanced custom interactive charts (cross-filtering, tooltips, hover)
svg-visuals -- SVG via DAX measures; preferred for inline table/matrix/card graphics with no row cap issues
python-visuals -- matplotlib/seaborn scripts (static PNG); for statistical visualizations that must compute at render time
r-visuals -- ggplot2 scripts (static PNG); where R's statistical ecosystem has no Python peer (forecast, pheatmap, corrplot)
Semantic Model
Reports are highly dependent on the underlying semantic model for their functionality. Most report capabilities -- measures, calculated columns, relationships, hierarchies, row-level security -- are defined in the semantic model, not the report. When designing or modifying reports, you will frequently need to understand or modify the model. Key skills:
tmdl (pbip plugin) -- Direct TMDL file editing for measures, columns, relationships
te-docs (tabular-editor plugin) -- Tabular Editor CLI for model operations
c-sharp-scripting (tabular-editor plugin) -- C# scripts for bulk model changes
bpa-rules (tabular-editor plugin) -- Best Practice Analyzer rules for model quality
connect-pbid (pbi-desktop plugin) -- Connect to Power BI Desktop's local Analysis Services instance for live model queries and modifications
Source: data-goblin/power-bi-agentic-development → plugins/reports/skills/pbi-report-design/SKILL.md
1---2name: pbi-report-design3description: The Power BI report design canon covering design identity, visual hierarchy and the 3-30-300 rule, layout/spacing/alignment, color discipline, chart selection, KPI and card design, tables and matrices, accessibility, and the closing design gate. The shared reference home for report design judgment, routed to by the create-pbi-report, pbir-cli, review-report, modifying-theme-json, and custom-visual skills. Load when committing a design identity or making a design, layout, color, chart-selection, or accessibility decision for a report.4---5# Power BI Report Design67> **Use `pbir` for every report mutation.** The `pbir-format` skill is read-only schema context.8> If the CLI is unavailable or lacks an operation, stop and report the gap.910Best practices and guidelines for Power BI report design. Follow these guidelines strictly to avoid generic, poorly formatted reports ("Power BI Slop").1112Be innovative, pushing boundaries while adhering to data visualization rules and guidelines. Work within Power BI's constraints, aiming for simplicity and effectiveness over aesthetics and decoration. Focus reports, pages, and visuals on answering specific questions and minimizing cognitive load -- not on looking "pretty and impressive".1314When a user request contradicts these guidelines, push back and explain better alternatives. The goal is to inform the user of options that lead to improved outcomes.1516## Design identity (commit before layout)1718Before any layout work, lock the report's identity so every later choice has something to cite:19201. **Pick one tone** ... a committed ink budget (`restrained`, `corporate`, `editorial`, or `technical`) that fixes accent count, saturation, gridline weight, and how forward annotation gets212. **Pick one signature** (two at most) ... a single recurring element (header band, single-accent-hue rule, fixed nav rail, KPI silhouette, callout style, target-line convention) repeated identically on every page, so the report reads as one artifact223. **Route each page to one shape** by the question it answers (`summary`, `monitoring`, `exploration`, `comparison`, `narrative`)2324Recording tone and signature once is what turns "use muted colors" into a propagating decision. See `references/design-identity.md` for the tone budgets and signature catalog, and `references/page-shapes.md` for routing each page to a shape. Serialize the identity into the theme via the `modifying-theme-json` skill, not into per-visual overrides.2526## Core rules27281. **3-30-300 Rule:** The most important and least detailed information should be in the top-left (KPIs, cards, etc.) while the least important and most detailed information should be in the bottom-right292. **Titles:** All report pages should have a title using a `textBox` visualType or a title in a background image added to the report page canvas303. **Visual positioning, alignment, and spacing:** All visuals must have equal spacing between them and equal spacing between the edge of the page (the margin). If visuals are unaligned or this spacing is unequal, fix it to ensure alignment and equal spacing314. **Themes:** Reports should use a theme that differs from the default Power BI themes; a suggested theme is the `sqlbi` theme (see the `modifying-theme-json` skill for applying templates). Themes are preferred because they provide a set of default styles for all charts that can adhere to good design practices and brand or style guidelines325. **Semantic Models:** Reports in Power BI are complex. They are dependant on an underlying semantic model (either in the .SemanticModel folder, called a "thick report" or a published model in Power BI/Fabric, called a "thin report"). Much of the functionality from a Power BI report comes from its semantic model design or DAX code336. **Report extensions, or thin report measures:** It is possible to create calculation logic in Power BI report, called "thin report measures" or "visual calculations". These should be used sparingly and only for "report-specific" scenarios347. **Visual fields:** All data visuals should have field bindings, and all field bindings should be for fields that actually exist in the model; there is no reason for visuals to exist that have no fields bound358. **Chart selection:** Make smart choices about what visuals to use for each scenario. Visual vocabulary is essential for this skill.369. **Use of color:** Color and formatting decisions must cite the locked identity (the chosen tone and signature), not be picked per visual. Colors come from the theme (themedataColor) rather than inline hex, so the identity propagates and re-themes cleanly. Colors should be muted and soft; colors that implicitly encode meaning (like red=bad, green=good) should be avoided unless using them for that encoding. Consider colorblindness and use accessible palettes (blues instead of greens with reds, for instance).3710. **Pre-attentive attributes:** Styles and colors should be used to steer and direct attention, and not to decorate charts. Formatting of visuals should be intentional and not purely aesthetic. Styles should where possible be stored in the theme and not in bespoke visual configuration.3811. **Fonts:** Prefer *Segoe UI* and *Segoe UI Semibold*. Do not use custom fonts, since they aren't guaranteed to render on user computers. Evaluate whether fonts are sufficiently large to be readable given the visual and page size.3912. **Page intent:** Route each page to exactly one shape by the question it answers (see `references/page-shapes.md`). A page trying to answer two questions is two pages.4041## Page Layout Guidelines4243### Check Page Size Before Modifying4445**Always query the actual page dimensions before adding or repositioning visuals.** Do not assume a page is 1280x720 or 1920x1080 -- templates and existing reports vary. The object model validates that visuals fit within page bounds, so setting position or size without knowing the page dimensions will cause errors. Check the page's `page.json` file for `width` and `height` properties, or use the object model (`page.width`, `page.height`) to confirm dimensions first. When resizing visuals via the object model, set `width`/`height` before `x`/`y` to avoid intermediate states that exceed bounds.4647### Standard Page Size4849- **Width:** 1280px (default)50- **Height:** 720px (16:9 aspect ratio)51- Alternative: 1920x1080 for high-resolution displays5253### Visual Spacing5455- **Minimum gap between visuals:** 16px56- **Edge margins:** 24-32px from page edges57- **Consistent alignment:** Use grid-based positioning58- **Equal spacing is mandatory:** Every gap between adjacent visuals (horizontal and vertical) must be the same value. Every margin from the page edge must be the same value. Calculate positions arithmetically from (margin, gap, page_width, page_height) to guarantee alignment. If visuals are misaligned or gaps are unequal, fix immediately -- this is one of the most visible quality signals in a report.5960### Detail Gradient6162Arrange content following the "detail gradient":6364```65+------------------+------------------+66| KPIs/Cards | KPIs/Cards | <- Top: High-level, important67| (Summary) | (Summary) |68+------------------+------------------+69| |70| Charts/Trends | <- Middle: Context, trends71| (Analysis) |72| |73+------------------+------------------+74| |75| Tables/Details | <- Bottom: Detailed data76| (Drill-down) |77| |78+------------------+------------------+79```8081### Visual Count Guidelines8283- **Maximum visuals per page:** 12-15 (performance impact)84- **Maximum KPIs/Cards:** 4-6 at top85- **Maximum slicers:** 3 per page (use filter pane instead)8687## Page Titles8889Every page should have a title. Create it through `pbir`:9091```bash92pbir add title "Report.Report/Page.Page" "Page Title" --width 50093```9495**Title positioning:**9697- Top-left corner, inside the page margin98- Enough height for the chosen font without clipping99- Width: 400-600px (or page width minus margins)100101## Theme Guidelines102103### Always Check Theme First104105Before modifying visual formatting:1061071. Check theme wildcards: `visualStyles["*"]["*"]`1082. Check visual-type overrides: `visualStyles.lineChart["*"]`1093. Only override in visual.json if truly one-off110111### When to Modify Theme vs Visual112113- All visuals of a type need change -> theme114- Establishing design standards -> theme115- Single visual exception to a theme rule -> visual116- Content-specific highlight (one callout, one reference line) -> visual117118### Theme Color Usage119120**Prefer theme colors over hex codes:**121122```json123// Good - uses theme color124"expr": {"ThemeDataColor": {"ColorId": 1, "Percent": 0}}125126// Avoid in visuals - use only in extension measures127"expr": {"Literal": {"Value": "'#118DFF'"}}128```129130**Semantic colors (return from extension measures):**131132- `"good"` - Positive values (green)133- `"bad"` - Negative values (red)134- `"neutral"` - Neutral/unchanged (gray/yellow)135- `"minColor"` - Gradient minimum136- `"maxColor"` - Gradient maximum137138## Accessibility (WCAG 2.1)139140### Alt Text141142All visuals should include descriptive alt text:143144```json145"visualContainerObjects": {146 "general": [{147 "properties": {148 "altText": {149 "expr": {"Literal": {"Value": "'Line chart showing monthly sales trend from January to December 2024'"}}150 }151 }152 }]153}154```155156### Color Contrast157158- Text on background: minimum 4.5:1 contrast ratio159- Large text (18pt+): minimum 3:1 contrast ratio160- Don't rely solely on color to convey meaning161162### Font Sizes163164- **Minimum readable:** 12pt165- **Recommended for charts:** 14pt166- **Titles:** 16-24pt167- **KPI values:** 24-48pt168169### Shadows and Motion170171- Minimize drop shadows (vestibular issues)172- Avoid animations where possible173- Use `dropShadow.show: false` in theme wildcards174175## Visual Best Practices176177### Cards and KPIs178179A bare number lacks meaning. Every KPI must answer "Is this good or bad?" (target + gap) and "Is it getting better or worse?" (trend). Key rules:180181- Position at top or left of page, maximum 5 per page182- **Prefer `kpi` visual type over `card`** when a target exists -- it has built-in indicator, goal, and trend line data roles183- Always include a **target** and **gap** (absolute + percentage). If no target measure exists, discuss with the user: propose adding a prior-year measure to the semantic model (use Tabular Editor CLI or the `tmdl` skill), or creating an extension measure as a fallback. Common targets: prior year (`CALCULATE([Measure], DATEADD('Date'[Date], -1, YEAR))`), budget, or rolling average184- **If no clear target exists, ask the user** -- do not leave KPIs bare. Discuss whether prior period, budget, or a custom threshold makes sense185- Apply conditional formatting to the **gap**, not the primary value186- Pair color with a secondary cue (arrow/icon) for accessibility187- Round aggressively at summary level ("518M" not "517,893,412")188- Choose **actionable metrics** that drive decisions over vanity metrics (apply the "20% change test": if this number changed 20%, should someone act differently?)189- Hide redundant auto-generated subtitles190- Use SVG extension measures for inline icons (see the `svg-visuals` skill in the **custom-visuals** plugin)191192For complete guidance on KPI design, targets, trends, formatting hierarchy, icon implementation, accessible palettes, and anti-patterns, consult **`references/cards-and-kpis.md`**.193194### Charts195196- Sort by value descending (unless time-based)197- Minimize gridlines and axes clutter198- Use muted colors for non-essential elements199- Highlight key data points sparingly200201For chart-type selection (encoding hierarchy, Cleveland-McGill ranking), data-label discipline, and small-multiples guidance, consult **`references/chart-selection.md`**.202203**Refuse common LLM defaults.** Gauge-as-KPI, monochrome categorical bars, missing sort, card walls, raw field names as titles, inline hex, off-grid drift, dual y-axis, 3D, and oversized pies are plausible-looking attractors that defeat the reader. When a request reaches for one, push back with the better option; see **`references/anti-patterns.md`**.204205### Tables and Matrices206207Tables require deliberate design -- "easy to create" differs from "easy to read." Key rules:208209- Position at bottom for detail drill-down (3-30-300 rule)210- **Decision-making first**: define the question, audience, and action before building211- Use `matrix` over `tableEx` when 2+ categorical columns form a hierarchy (Key Account > Account > Product)212- **Subtract, don't add**: remove gridlines and heavy banding; let whitespace separate rows213- Sort by the most important measure (often variance), not alphabetically214- Apply **data bars** to the primary measure column for magnitude scanning215- Apply **color scales** to variance columns only -- formatting everything means formatting nothing216- Add sparklines where temporal context ("improving or declining?") matters217- Show full precision (no display units) -- tables are where readers go for detail218219For complete guidance on table vs matrix selection, formatting philosophy, conditional formatting techniques, sparklines, hierarchy design, and anti-patterns, consult **`references/tables-and-matrices.md`**.220221### Slicers222223- Maximum 3 per page224- Position consistently (top or left)225- Use filter pane for additional filters226- Consider sync slicers across pages227228### Filter Pane229230The filter pane has its own information architecture beyond color and chrome. Key decisions: lock vs hide per filter card, how to name cards without renaming model fields, and report-level settings (Apply button, search, allow-change-filter-type). See **`references/filter-pane.md`**.231232### Mobile233234Power BI does not reflow a desktop page for portrait; the phone layout is a hand-picked subset re-placed on a narrow grid. Nothing renders on a phone until explicitly opted in with a `mobile.json`. See **`references/mobile.md`** for the subset-selection model and file mechanics.235236## Report Evaluation Criteria237238When asked to evaluate or audit a report, focus on objective criteria. Subjective evaluation is difficult for AI -- the report cannot be "seen" directly, and there is no intuitive sense of aesthetics, cognitive load, or effectiveness. Emphasize this limitation to users.239240### Objective Checklist2412421. **Page count:** More than 5-8 pages is typically excessive2432. **Visuals per page:** Count is a proxy; query cost per visual is the driver (see `references/layout-guidelines.md` performance section). Textboxes, images, shapes, and buttons do not emit queries.2443. **Theme usage:** Reports should use a custom theme for consistent formatting2454. **Layout consistency:**246 - Equal spacing between visuals?247 - Page has a title?248 - Follows detail gradient (important top-left, detailed bottom-right)?249 - Cards/KPIs at top or left, fewer than 4-6?250 - Fewer than 3 slicers (use filter pane instead)?251 - Helpful elements (refresh date, links, context)?2525. **Color effectiveness:**253 - Conditional formatting used sparingly (not causing overload)?254 - Colors muted and passive (not loud and bright)?255 - Negative-sentiment colors (red, orange) only for negative values?2566. **Information:ink ratio:** Non-essential elements reduced (lighter gridlines, disabled unnecessary axes/labels)?2577. **Readability:** Font sizes sufficient for all elements?2588. **Accessibility:** Minimal shadows to avoid vestibular issues?2599. **Font consistency:** Limited font sizes, simple readable fonts that work on all devices?26010. **Sorting:** Visuals sorted descending unless there's a reason otherwise (time-based, etc.)?261262### Evaluation Output263264When evaluating, provide:265266- Issues found with specific locations267- Severity (critical, warning, suggestion)268- Recommended fixes with commands or patterns269270### The design gate271272Before declaring a design done, run the closing gate in **`references/quality-gate.md`**. It is not the planning-stage checklist that runs before the build; it runs against the finished artifact and decides whether it ships. It verifies the identity propagated, every page has one intent, spacing and margins are equal and on-grid, callouts are backed by model evidence, and accessibility is met. Because an agent cannot see the canvas, pair the gate with the screenshot-review loop in the **`pbir-cli`** skill: render the pages, look, and confirm what the JSON inferred.273274## Common Design Issues275276### Issue: Cognitive Overload277278**Symptoms:** Too many colors, visuals, or data points279280**Fix:**281282- Reduce visual count283- Use muted color palette284- Apply detail gradient285- Hide non-essential elements286287### Issue: Inconsistent Spacing288289**Symptoms:** Uneven gaps, misaligned visuals290291**Fix:**292293- Use grid-based positioning294- Standardize visual sizes295- Apply consistent margins296297### Issue: Poor Readability298299**Symptoms:** Small fonts, low contrast300301**Fix:**302303- Increase font sizes (minimum 12pt)304- Check color contrast ratios305- Use appropriate font weights306307## References308309- **`references/design-identity.md`** -- Commit-first identity: tone budgets (restrained/corporate/editorial/technical), the signature catalog, and serializing identity into the theme310- **`references/page-shapes.md`** -- Routing each page to one shape by intent (summary/monitoring/exploration/comparison/narrative): what belongs, what stays off, layout lean311- **`references/anti-patterns.md`** -- Cross-cutting defaults to refuse (gauge-as-KPI, monochrome bars, missing sort, card walls, raw titles, inline hex, off-grid, dual-axis, 3D, oversized pie) with the repair312- **`references/quality-gate.md`** -- The design gate: closing checks (identity propagated, one intent per page, equal spacing, evidence-backed callouts, accessibility) in issue/location/severity/fix form313- **`references/cards-and-kpis.md`** -- KPI card design: targets, gaps, trends, formatting hierarchy, icons, accessible palettes, anti-patterns, review checklist314- **`references/tables-and-matrices.md`** -- Table and matrix design: decision-making framework, subtract-don't-add philosophy, conditional formatting, sorting, sparklines, matrix hierarchies, anti-patterns315- **`references/layout-guidelines.md`** -- Canvas dimensions, spacing tiers (intra-group/inter-group/margin), alignment rules, performance cost model316- **`references/visual-colors.md`** -- Color principles, CF basis decision (gradient vs rules vs field-value vs icons), semantic tokens, accessibility317- **`references/page-titles.md`** -- Title implementation, accessible title wording, hidden-title/alt-text rule318- **`references/chart-selection.md`** -- Encoding hierarchy (Cleveland-McGill ranking), chart type routing, data-label discipline, small multiples319- **`references/tooltips-and-annotations.md`** -- Report-page tooltip design, when not to use one, annotation primitives for guided analytics320- **`references/filter-pane.md`** -- Lock vs hide, card naming, card order, Applied/Available styling, report-level settings321- **`references/mobile.md`** -- Phone layout as a curated subset, `mobile.json` mechanics, what to include/exclude322- **`references/custom-visuals.md`** -- Build-vs-buy ranking, AppSource/org-store tradeoffs, licensing gaps323324## Related Skills325326### Report Structure and Format327328- **`pbir-format`** (pbip plugin) -- PBIR JSON format reference for visual.json, page.json, report.json structure329- **`pbip`** (pbip plugin) -- PBIP project structure, table/measure renames, project forking330331### Custom Visuals332333Reports often need visuals beyond what Power BI provides natively. Always consider in-repo code paths before reaching for a packaged third-party visual. See **`references/custom-visuals.md`** for the build-vs-buy decision and AppSource/org-store tradeoffs.334335Skill routing for in-repo code visuals (all in the **custom-visuals** plugin; add with `claude plugin install custom-visuals@power-bi-agentic-development`):336- **`deneb-visuals`** -- Vega/Vega-Lite declarative visuals; preferred for advanced custom interactive charts (cross-filtering, tooltips, hover)337- **`svg-visuals`** -- SVG via DAX measures; preferred for inline table/matrix/card graphics with no row cap issues338- **`python-visuals`** -- matplotlib/seaborn scripts (static PNG); for statistical visualizations that must compute at render time339- **`r-visuals`** -- ggplot2 scripts (static PNG); where R's statistical ecosystem has no Python peer (forecast, pheatmap, corrplot)340341### Semantic Model342343Reports are highly dependent on the underlying semantic model for their functionality. Most report capabilities -- measures, calculated columns, relationships, hierarchies, row-level security -- are defined in the semantic model, not the report. When designing or modifying reports, you will frequently need to understand or modify the model. Key skills:344345- **`tmdl`** (pbip plugin) -- Direct TMDL file editing for measures, columns, relationships346- **`te-docs`** (tabular-editor plugin) -- Tabular Editor CLI for model operations347- **`c-sharp-scripting`** (tabular-editor plugin) -- C# scripts for bulk model changes348- **`bpa-rules`** (tabular-editor plugin) -- Best Practice Analyzer rules for model quality349- **`connect-pbid`** (pbi-desktop plugin) -- Connect to Power BI Desktop's local Analysis Services instance for live model queries and modifications350351---352353**Source:** [`data-goblin/power-bi-agentic-development`](https://github.com/data-goblin/power-bi-agentic-development) → `plugins/reports/skills/pbi-report-design/SKILL.md`