
Modifying Theme Json
- 48 installs
- 836 repo stars
- Updated July 29, 2026
- data-goblin/power-bi-agentic-development
Design, audit, and enforce Power BI report themes, pushing formatting into theme.json and clearing per-visual overrides for consistency.
About
Guidance to design, validate, audit, and enforce Power BI report themes so formatting lives in the theme rather than scattered visual-level overrides. A developer uses it to create or standardize a theme, enforce compliance, and clear formatting debt across a report.
- Pushes formatting into theme.json and clears visual overrides
- Audits and enforces theme compliance across visuals
Modifying Theme Json by the numbers
- 48 all-time installs (skills.sh)
- Ranked #1,246 of 1,880 Design & UI/UX skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/data-goblin/power-bi-agentic-development --skill modifying-theme-jsonAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 48 |
|---|---|
| repo stars | ★ 836 |
| Last updated | July 29, 2026 |
| Repository | data-goblin/power-bi-agentic-development ↗ |
What it does
Design, audit, and enforce Power BI report themes, pushing formatting into theme.json and clearing per-visual overrides for consistency.
Files
Power BI Report Themes
Why Themes Matter
A report without a well-designed theme accumulates formatting debt. Every visual ends up with its own bespoke title size, shadow toggle, border style, and hardcoded colors in visual.json. This creates three problems:
1. Inconsistency. Visuals drift apart as authors format each one individually. One card has 14pt titles, another has 12pt; one chart has shadows, another doesn't. The report looks unfinished. 2. Fragility. Rebranding or updating the visual style means touching every visual.json individually. A report with 40 visuals across 8 pages means 40 files to edit. With a theme, it's one file. 3. Bloated visual JSON. Each bespoke override adds lines to visual.json, making reports harder to diff, review, and maintain. A clean visual.json should contain field bindings, position, and conditional formatting; everything else should come from the theme.
Reports using the default Power BI theme or a minimal custom theme (just dataColors and a name) are leaving most formatting to Power BI's built-in defaults, which change between Desktop releases. A well-designed theme locks in the intended appearance.
Signs a theme needs attention:
- Many visuals have
objectsorvisualContainerObjectswith redundant formatting - Visuals of the same type look inconsistent (different title fonts, shadows on some but not others)
- The theme JSON has few or no
visualStylesentries - The report uses a built-in theme like "Default" or "Classic" without customization
Tooling preference: UsepbirCLI when available (pbir theme colors,pbir visuals clear-formatting). Fall back to directjqmodification when unavailable. Always validate after every write.
Tip: Theme JSON files can be 75KB+ and 2000+ lines. Do not read the full monolithic file. Usepbir theme serializeto split into small editable files (see Author/Modify workflow below), or usejqto extract only specific keys. Serialized fragments from the serialize/build workflow are small and safe to read directly.
For PBIR JSON mechanics (property names, filter pane selectors, ThemeDataColor syntax, jq patterns), see the `pbir-format` skill (pbip plugin) -> references/theme.md.
The Formatting Hierarchy
Power BI applies visual formatting through a four-level cascade. Each level overrides the level above it:
Level 1 Power BI built-in defaults
|
Level 2 Theme wildcard visualStyles["*"]["*"] applies to ALL visuals
|
Level 3 Theme visual-type visualStyles["lineChart"]["*"] overrides wildcard for that type
|
Level 4 Visual instance visual.json objects + overrides everything
visualContainerObjectsCore Principle
Push as much formatting as possible into levels 2 and 3. A well-designed theme means:
- Visual JSON files stay lean — no bespoke formatting noise cluttering visual.json
- Global style changes require editing one file
- New visuals automatically inherit correct defaults without manual intervention
Visual-level overrides (level 4) should exist only for true one-offs: content-specific formatting, exceptions to the visual-type default, or conditional formatting expressions.
Diagnosing Why a Visual Looks the Way It Does
When a visual renders unexpectedly, walk up the cascade:
1. Check visual.json → objects and visualContainerObjects (level 4 always wins) 2. Check theme visualStyles["<type>"]["*"] for that visual type (level 3) 3. Check theme visualStyles["*"]["*"] wildcard (level 2) 4. If absent everywhere, Power BI is applying a built-in default
Workflow: Audit Theme Compliance
Use when assessing whether a report's visuals are inheriting from the theme or have accumulated stale overrides.
Step 1 — Locate the custom theme:
THEME_NAME=$(jq -r '.themeCollection.customTheme.name' Report.Report/definition/report.json)
THEME="Report.Report/StaticResources/RegisteredResources/$THEME_NAME"Step 2 — Review what the theme sets at wildcard level:
# Preferred
pbir theme colors "Report.Report"
pbir theme text-classes "Report.Report"
# Fallback
jq '.visualStyles["*"]["*"] | keys' "$THEME"Step 3 — Continue with full audit process — see `references/theme-compliance.md` for the complete workflow: scanning all visuals for bespoke overrides, classifying stale vs intentional vs CF, severity levels, and fix decision tree.
Workflow: Enforce Theme (Clear Overrides)
After applying a new theme or making significant theme changes, stale visual-level overrides prevent the new theme from rendering correctly.
With `pbir` CLI (preferred):
# Clears bespoke formatting while preserving conditional formatting expressions
pbir visuals clear-formatting "Report.Report/**/*.Visual" --keep-cf -fWith `jq` (manual, per-visual):
# Safe: clear container chrome only (title, border, background, shadow, padding)
# Does NOT touch chart-specific objects or conditional formatting
jq 'del(.visual.visualContainerObjects)' visual.json > tmp && mv tmp visual.json
# Aggressive: clear everything including chart-specific overrides
# WARNING: also removes conditional formatting — only use if CF is confirmed absent
jq 'del(.visual.objects) | del(.visual.visualContainerObjects)' visual.json > tmp && mv tmp visual.json
# Always validate after
jq empty visual.jsonWhen in doubt, clearvisualContainerObjectsonly. Leaveobjectsunless you have confirmed no conditional formatting exists in that visual.
Switching to a Different Theme (Re-Theming)
Swapping a report from one theme to another is a migration, and editing only the theme JSON leaves theme residue: surviving level-4 overrides that still win at the cascade, plus colors that were correct under the old polarity and break (often invisible text) under the new one. Re-theming sits between apply and enforce: build an old-to-new color map first, then apply the theme, sweep overrides, remap surviving literals, and run the polarity gate so foreground text survives the new background. See `references/re-theming.md`.
Workflow: Author or Modify a Theme
When building or substantially revising a theme, use the serialize/build workflow via pbir CLI. This splits the monolithic theme JSON into small, focused files that are easy to read and edit without loading 2000+ lines of JSON into context.
Serialize/Build Workflow (Recommended)
IMPORTANT: Serialize to a temporary folder outside the.Report/directory. The PBIR validation hooks monitor.Report/for JSON changes and will flag the serialized fragments as invalid PBIR files. Use/tmp/, a sibling folder, or the-oflag to place the.Themefolder elsewhere.
Step 1 — Serialize the theme into editable files:
# From a report (outputs to a .Theme folder)
pbir theme serialize "Report.Report" -o /tmp/MyTheme.Theme
# From a standalone theme JSON file
pbir theme serialize theme.json -o /tmp/MyTheme.ThemeThis produces small, focused files: _config.json (colors, text classes, named colors), _wildcards.json (wildcard visual styles), and one file per visual-type override (e.g., slicer.json, page.json).
Step 2 — Edit the serialized files. Each file is small enough to read and edit directly. Focus on: 1. _config.json — dataColors, semantic colors, textClasses, background/foreground variants 2. _wildcards.json — container defaults (title, border, shadow, padding) 3. Visual-type files — overrides for specific types (textbox, image, card, etc.)
Step 3 — Build and apply back to the report:
# Build only (produces a merged theme.json)
pbir theme build /tmp/MyTheme.Theme
# Build and apply directly to the report
pbir theme build /tmp/MyTheme.Theme -o "Report.Report" -f --cleanThe --clean flag removes the .Theme folder after building.
Quick Modifications (No Serialize Needed)
For small, targeted changes, use the CLI directly without serializing:
pbir theme set-colors "Report.Report" --good "#00B050" --bad "#FF0000"
pbir theme set-text-classes "Report.Report" title --font-size 14 --font-face "Segoe UI Semibold"
pbir theme set-formatting "Report.Report" "*.*.dropShadow.show" --value falseSee the `pbir-cli` skill → references/modifying-theme.md for full CLI command reference.
Design Sequence
Whether using serialize/build or direct CLI commands, follow this order:
1. Start from a valid base. Use a template (pbir theme apply-template), the SQLBI/Data Goblins theme, or a community template. Do not author from an empty {}. 2. Design the color system first (dataColors, semantic colors, background/foreground variants). Color decisions cascade everywhere. 3. Set typography (textClasses) — font face and size for title, header, label, callout, dataTitle. Stick to Segoe UI / Segoe UI Semibold; custom fonts will not render on other users' machines. 4. Set wildcard container defaults (visualStyles["*"]["*"]): title visibility/font/size, dropShadow.show: false, padding, border, filter pane. 5. Add visual-type overrides for types that differ from the wildcard — at minimum, textbox and image to suppress title/border/background/shadow. 6. Validate with pbir theme validate "Report.Report", deploy, and visually verify.
For detailed design guidance, see `references/theme-authoring.md`. For visual-type override patterns, see `references/visual-type-overrides.md`.
Workflow: Promote Bespoke Formatting to Theme
When a visual.json has formatting that should become a theme default — either for that visual type or for all visuals — promote it.
With `pbir` CLI (preferred):
# Preview what would be pushed from a well-formatted visual into the theme
pbir theme push-visual "Report.Report/Page.Page/Card.Visual" --dry-run
# Push formatting to theme as the default for that visual type
pbir theme push-visual "Report.Report/Page.Page/Card.Visual"
# Push only specific components (title, background, border, etc.)
pbir theme push-visual "Report.Report/Page.Page/Card.Visual" --components title,background,borderManual process (when CLI is unavailable):
1. Identify what's in visual.objects (chart-specific) and visual.visualContainerObjects (container chrome) 2. Decide whether it belongs in the wildcard (["*"]["*"]) or a visual-type section (["lineChart"]["*"]) 3. Write the value into the theme, then validate 4. Remove the override from the visual, then validate 5. Verify the visual still renders correctly
Both objects and visualContainerObjects properties map to the same visualStyles[type][state] section in the theme. The distinction in visual.json doesn't exist in the theme.
For complete property mapping tables, wildcard vs visual-type decision guide, color handling, and batch promotion across many visuals, see `references/promoting-formatting.md`.
Workflow: Validate a Theme
With `pbir` CLI (preferred):
# Validate a report's theme (checks JSON syntax, structure, and completeness)
pbir theme validate "Report.Report"
# Validate a standalone theme file
pbir theme validate "theme.json"
# Validate a serialized .Theme folder before building
pbir theme validate "MyTheme.Theme"Manual validation (when CLI is unavailable):
# 1. JSON syntax
jq empty "$THEME" && echo "JSON valid"
# 2. Required top-level keys
jq '{dataColors: (.dataColors | type), visualStyles: (.visualStyles | type), textClasses: (.textClasses | type)}' "$THEME"
# 3. Wildcard section
jq 'if .visualStyles["*"]["*"] then "wildcard exists" else "MISSING wildcard" end' "$THEME"
# 4. Valid hex colors
jq '[.dataColors[] | select(test("^#[0-9A-Fa-f]{6}$") | not)]' "$THEME"
# 5. No null visual-type sections
jq '[.visualStyles | to_entries[] | select(.value == null) | .key]' "$THEME"After validation, deploy and visually verify:
- Wildcard container chrome (titles, borders, shadows) applies to all visuals
- Filter pane and filter cards render correctly on all pages
- Visual-type overrides correctly suppress the wildcard for exempt types (e.g., textboxes have no title)
- Data colors cycle correctly on multi-series charts
Schema and Documentation
| Resource | URL |
|---|---|
| Official report theme JSON schema (versioned, Draft 7) | microsoft/powerbi-desktop-samples — Report Theme JSON Schema |
| Latest schema (resolve the newest version at author time, see below) | Report Theme JSON Schema folder |
Raw schema URL (for $schema IDE integration) — update version to match consumers' Desktop | https://raw.githubusercontent.com/microsoft/powerbi-desktop-samples/main/Report%20Theme%20JSON%20Schema/reportThemeSchema-2.154.json |
| Microsoft Learn — Use report themes in Power BI Desktop | https://learn.microsoft.com/en-us/power-bi/create-reports/desktop-report-themes |
| Microsoft Learn — Report theme JSON file format | https://learn.microsoft.com/en-us/power-bi/create-reports/desktop-report-themes#report-theme-json-file-format |
| Community theme templates | deldersveld/PowerBI-ThemeTemplates |
| PBIR item schemas | microsoft/powerbi-desktop-samples — item-schemas |
Resolve the current schema version at author time rather than hardcoding a number:
gh api repos/microsoft/powerbi-desktop-samples/contents/"Report Theme JSON Schema" \
--jq '.[].name' | sort | tail -1IDE Integration ($schema)
Add a $schema property to the theme JSON to enable autocomplete and validation in VS Code. Use the versioned raw GitHub URL, not the generic powerbi.com marker:
{
"$schema": "https://raw.githubusercontent.com/microsoft/powerbi-desktop-samples/main/Report%20Theme%20JSON%20Schema/reportThemeSchema-2.154.json",
"name": "MyTheme",
"dataColors": ["#1971c2", "..."]
}Power BI validates an imported theme against the schema baked into the Desktop build. Validation is reject-unknown-fields: one misspelled key refuses the entire theme. A theme passing jq validation can still fail Desktop import on a typo. See references/theme-authoring.md for the full schema version guidance.
Theme Top-Level Keys
name: string # display name shown in Power BI UI
dataColors: string[] # ordered hex palette for data series
# Semantic CF colors (flat hex keys; CF measures return these names as strings)
good / bad / neutral: string
# Gradient CF colors (flat hex keys; "null" is the key name, not JSON null)
maximum / center / minimum / null: string
# Structural colors (non-data chrome: gridlines, axis labels, filter-card bg, etc.)
# Use level-N names for new themes; CLI alias equivalents shown in parentheses
firstLevelElements: string # (foreground)
secondLevelElements: string # (foregroundNeutralSecondary)
thirdLevelElements: string # (backgroundLight)
fourthLevelElements: string # (foregroundNeutralTertiary)
background: string
secondaryBackground: string # (backgroundNeutral)
tableAccent: string
# Extended surface/foreground palette
foregroundLight / foregroundDark: string
backgroundLight / backgroundNeutral / backgroundDark: string
textClasses: object # typography per semantic role (title, label, callout, header, boldLabel, etc.)
visualStyles: object # [visualType][state] formatting cascadeFor textClasses: 4 primary classes you set; 8 secondary classes that derive automatically. See references/theme-authoring.md.
For visualStyles: named style presets are a second key alongside "*" inside a visual-type section; they surface in the Format pane Style dropdown. See references/advanced-theme-features.md.
References
- `references/theme-authoring.md` — Color system design (data colors, semantic, structural, null gradient), text class inheritance,
$idfilter-card states, wildcard minimum set, schema version guidance - `references/advanced-theme-features.md` — Named style presets (Format-pane dropdown), base theme layering model, organizational theme distribution, mobile-only formatting overrides
- `references/serialize-build.md` — Serialize/build workflow: splitting themes into editable files, editing, rebuilding, validation, temporary folder guidance
- `references/applying-themes.md` — Applying templates, post-apply enforcement, clearing visual overrides, normalizing hardcoded colors
- `references/re-theming.md` — Switching a report to a new theme without leaving residue: old-to-new color map, inline-override sweep on shapes/textboxes/buttons, the polarity-flip foreground-text sweep, dark-mode checklist, slicer header role-preserving remap
- `references/copying-themes.md` — Copying themes between reports, extracting/downloading themes, comparing themes, consolidating across a portfolio
- `references/promoting-formatting.md` — Promoting bespoke visual.json formatting to theme: push-visual CLI, objects vs visualContainerObjects, wildcard vs visual-type, property mapping tables
- `references/theme-compliance.md` — Systematic audit workflow, stale override classification, severity levels, fix decision tree
- `references/visual-type-overrides.md` — Override patterns for textbox, image, shape, card, kpi, slicer, lineChart, barChart, tableEx, and matrix
Related Skills
- `pbir-cli` →
references/modifying-theme.md— Full CLI command reference for theme operations (serialize/build, set-colors, set-text-classes, set-formatting, push-visual, fonts, background, icons, diff) - `pbir-cli` →
references/apply-theme.md— Applying templates, copying themes between reports, clearing visual overrides - `pbir-format` (pbip plugin) — Full theme mechanics: ThemeDataColor syntax, filter pane selectors, jq modification patterns, clearing overrides
- `pbi-report-design` — Report design principles: 3-30-300 rule, layout, spacing, color usage, accessibility
{
"name": "Data-Goblins",
"dataColors": [
"#C1B595",
"#9F574A",
"#735E64",
"#E6DFCF",
"#8F9265",
"#3B4244",
"#B73A3A",
"#026645",
"#3599B8",
"#DFBFBF",
"#4AC5BB",
"#5F6B6D",
"#FB8281",
"#F4D25A",
"#7F898A",
"#A4DDEE",
"#FDAB89",
"#B687AC",
"#28738A",
"#A78F8F",
"#168980",
"#293537",
"#BB4A4A",
"#B59525",
"#475052",
"#6A9FB0",
"#BD7150",
"#7B4F71",
"#1B4D5C",
"#706060",
"#0F5C55",
"#1C2325",
"#7D3231",
"#796419",
"#303637",
"#476A75",
"#7E4B36",
"#52354C",
"#0D262E",
"#544848",
"#016AB8",
"#373D49",
"#FDB15D",
"#AAF20F",
"#5F646D",
"#8AA3EB",
"#FEE266",
"#A6687A",
"#3557B8",
"#DFCFBF",
"#4A91C5",
"#5F646D",
"#FBBF81",
"#C9F459",
"#7F838A",
"#A4B8EE",
"#FDE489",
"#B68794",
"#28428A",
"#A79B8F",
"#165889",
"#292E37",
"#BB824A",
"#8DB525",
"#474A52",
"#6A7CB0",
"#BDA750",
"#7B4F5A",
"#1B2C5C",
"#706860",
"#0F3C5C",
"#1C1E25",
"#7D5731",
"#5D7918",
"#303237",
"#475375",
"#7E6F36",
"#52343D",
"#0D152E",
"#544E48",
"#010EB8",
"#393749",
"#F9FD5D",
"#38F20F",
"#615F6D",
"#A08AEB",
"#CEFE66",
"#A67668",
"#5435B8",
"#DFDFBF",
"#4A53C5",
"#615F6D",
"#FAFB81",
"#7CF459",
"#807F8A",
"#B5A4EE",
"#DBFD89",
"#B69087",
"#3F288A",
"#A7A78F",
"#161F89",
"#2A2937",
"#BBBB4A",
"#45B525",
"#494752",
"#7A6AB0",
"#9CBD50",
"#7B594F",
"#291B5C",
"#707060",
"#0F155C",
"#1E1C25",
"#7C7D31",
"#2D7918",
"#303037",
"#514775",
"#697E36",
"#523B34",
"#140D2E",
"#545448",
"#4E01B8",
"#423749",
"#A9FD5D",
"#0FF256",
"#675F6D",
"#D18AEB",
"#82FE66",
"#A69468",
"#9535B8",
"#CFDFBF",
"#7D4AC5",
"#675F6D",
"#BCFB81",
"#59F484",
"#857F8A",
"#DAA4EE",
"#A1FD89",
"#B6A887",
"#6F288A",
"#9BA78F",
"#461689",
"#322937",
"#82BB4A",
"#25B54C",
"#4E4752",
"#9E6AB0",
"#65BD50",
"#7B6E4F",
"#4A1B5C",
"#687060",
"#2E0F5C",
"#221C25",
"#567D31",
"#187934",
"#343037",
"#684775",
"#457E36",
"#524934",
"#250D2E",
"#4E5448",
"#AA01B8",
"#493746",
"#5DFD62",
"#0FF2C7",
"#6D5F6B",
"#EB8AD3",
"#66FE96",
"#99A668",
"#B83598",
"#BFDFBF",
"#BA4AC5",
"#6D5F6B",
"#81FB82",
"#59F4D1",
"#8A7F89",
"#EEA4DD",
"#89FDAA",
"#ACB687",
"#8A2873",
"#8FA78F",
"#801689",
"#372934",
"#4ABB4A",
"#25B594",
"#524750",
"#B06A9F",
"#50BD70",
"#717B4F",
"#5C1B4D",
"#607060",
"#540F5C",
"#251C22",
"#317D32",
"#187964",
"#373036",
"#75476A",
"#367E4A",
"#4C5234",
"#2E0D26",
"#485448",
"#B8016A",
"#49373D",
"#5DFDB1",
"#0FAAF2",
"#6D5F64",
"#EB8AA3",
"#66FEE2",
"#7AA668",
"#B83557",
"#BFDFCF",
"#C54A91",
"#6D5F64",
"#81FBBF",
"#59C9F4",
"#8A7F83",
"#EEA4B8",
"#89FDE5",
"#94B687",
"#8A2842",
"#8FA79B",
"#891658",
"#37292E",
"#4ABB82",
"#258DB5",
"#52474A",
"#B06A7C",
"#50BDA7",
"#5B7B4F",
"#5C1B2C",
"#607068",
"#5C0F3C",
"#251C1E",
"#317D58",
"#185D79",
"#373032",
"#754752",
"#367E6F",
"#3D5234",
"#2E0D15",
"#48544E",
"#B8010E",
"#493937",
"#5DF9FD",
"#0F38F2",
"#6D615F",
"#EBA08A",
"#66CEFE",
"#68A676",
"#B85435",
"#BFDFDF",
"#C54A53",
"#6D615F",
"#81FAFB",
"#597CF4",
"#8A807F",
"#EEB5A4",
"#89DBFD",
"#87B691",
"#8A3F28",
"#8FA7A7",
"#89161E",
"#372A29",
"#4ABBBB",
"#2545B5",
"#524947",
"#B07A6A",
"#509CBD",
"#4F7B58",
"#5C291B",
"#607070",
"#5C0F15",
"#251E1C",
"#317C7D",
"#182D79",
"#373030",
"#755147",
"#36687E",
"#34523B",
"#2E140D",
"#485454",
"#B84E01",
"#494337",
"#5DA9FD",
"#560FF2",
"#6D685F",
"#EBD18A",
"#6681FE",
"#68A694",
"#B89535",
"#BFCFDF",
"#C57D4A",
"#6D685F",
"#81BCFB",
"#8459F4",
"#8A857F",
"#EEDAA4",
"#89A1FD",
"#87B6A8",
"#8A7028",
"#8F9BA7",
"#894616",
"#373229",
"#4A82BB",
"#4D25B5",
"#524E47",
"#B09E6A",
"#5065BD",
"#4F7B6F",
"#5C4A1B",
"#606870",
"#5C2E0F",
"#25221C",
"#31567D",
"#341879",
"#373430",
"#756947",
"#36447E",
"#345249",
"#2E250D",
"#484E54",
"#B8A901",
"#464937",
"#615DFD",
"#C70FF2",
"#6B6D5F",
"#D4EB8A",
"#9666FE",
"#6898A6",
"#99B835",
"#BFBFDF",
"#C5BA4A",
"#6B6D5F",
"#8181FB",
"#D159F4",
"#898A7F",
"#DDEEA4",
"#AA89FD",
"#87ACB6",
"#738A28",
"#8F8FA7",
"#897F16",
"#353729",
"#4A4ABB",
"#9425B5",
"#505247",
"#9FB06A",
"#7050BD",
"#4F717B",
"#4D5C1B",
"#606070",
"#5C540F",
"#23251C",
"#31317D",
"#641879",
"#363730",
"#6A7547",
"#4B367E",
"#344C52",
"#262E0D",
"#484854",
"#6AB801",
"#3D4937",
"#B15DFD",
"#F20FAA",
"#646D5F",
"#A3EB8A",
"#E266FE",
"#687AA6",
"#57B835",
"#CFBFDF",
"#91C54A",
"#646D5F",
"#BF81FB",
"#F459C9",
"#838A7F",
"#B7EEA4",
"#E589FD",
"#8794B6",
"#428A28",
"#9B8FA7",
"#588916",
"#2E3729",
"#824ABB",
"#B5258D",
"#4A5247",
"#7CB06A",
"#A750BD",
"#4F5B7B",
"#2C5C1B",
"#686070",
"#3C5C0F",
"#1E251C",
"#57317D",
"#79185D",
"#323730",
"#537547",
"#6F367E",
"#343D52",
"#152E0D",
"#4E4854",
"#0FB801",
"#37493A",
"#FD5DF9",
"#F20F39",
"#5F6D61",
"#8AEBA1",
"#FE66CE",
"#7568A6",
"#35B854",
"#DFBFDF",
"#54C54A",
"#5F6D61",
"#FB81FA",
"#F4597C",
"#7F8A80",
"#A4EEB5",
"#FD89DB",
"#9187B6",
"#288A3F",
"#A78FA7",
"#1F8916",
"#29372B",
"#BB4ABB",
"#B52544",
"#475249",
"#6AB07B",
"#BD509B",
"#594F7B",
"#1B5C2A",
"#706070",
"#155C0F",
"#1C251E",
"#7D317B",
"#79182D",
"#303731",
"#477552",
"#7E3668",
"#3B3452",
"#0D2E14",
"#544854",
"#01B84E",
"#374942",
"#FD5DA9",
"#F2560F",
"#5F6D67",
"#8AEBD1",
"#FE6682",
"#9468A6",
"#35B895",
"#DFBFCF",
"#4AC57D",
"#5F6D67",
"#FB81BD",
"#F48459",
"#7F8A85",
"#A4EEDA",
"#FD89A1",
"#A887B6",
"#288A6F",
"#A78F9B",
"#168946",
"#293732",
"#BB4A82",
"#B54C25",
"#47524E",
"#6AB09D",
"#BD5065",
"#6E4F7B",
"#1B5C4A",
"#706068",
"#0F5C2E",
"#1C2522",
"#7D3156",
"#793418",
"#303734",
"#477568",
"#7E3644",
"#493452",
"#0D2E25",
"#54484E"
],
"foreground": "#3B4244",
"background": "#E6DFCF",
"tableAccent": "#B73A3A",
"maximum": "#026645",
"center": "#D0D0D0",
"minimum": "#B73A3A",
"textClasses": {
"title": {
"fontFace": "Segoe UI",
"color": "#3B4244",
"fontSize": 14
},
"callout": {
"fontFace": "Segoe UI",
"color": "#3B4244",
"fontSize": 28
},
"label": {
"fontFace": "Segoe UI",
"color": "#3B4244",
"fontSize": 10
},
"header": {
"fontFace": "Segoe UI",
"color": "#3B4244",
"fontSize": 14
}
},
"visualStyles": {
"*": {
"*": {
"visualHeader": [
{
"border": {
"solid": {
"color": "#F4F4F4"
}
},
"background": {
"solid": {
"color": "#F4F4F4"
}
}
}
],
"background": [
{
"color": {
"solid": {
"color": "#E6DFCF"
}
},
"transparency": 100
}
],
"outspacePane": [
{
"backgroundColor": {
"solid": {
"color": "#F4F4F4"
}
},
"foregroundColor": {
"solid": {
"color": "#3B4244"
}
},
"headerSize": 10,
"checkboxAndApplyColor": {
"solid": {
"color": "#9F574A"
}
}
}
],
"filterCard": [
{
"$id": "Applied",
"backgroundColor": {
"solid": {
"color": "#E6DFCF"
}
},
"foregroundColor": {
"solid": {
"color": "#3B4244"
}
},
"textSize": 10,
"transparency": 0
},
{
"$id": "Available",
"transparency": 100,
"foregroundColor": {
"solid": {
"color": "#3B4244"
}
},
"textSize": 10
}
],
"visualTooltip": [
{
"titleFontColor": {
"solid": {
"color": "#E6DFCF"
}
},
"valueFontColor": {
"solid": {
"color": "#FFFFFF"
}
},
"background": {
"solid": {
"color": "#3B4244"
}
}
}
]
}
},
"slicer": {
"*": {
"items": [
{
"background": {
"solid": {
"color": "#F4F4F4"
}
}
}
]
}
},
"page": {
"*": {
"outspace": [
{
"color": {
"solid": {
"color": "#E6DFCF"
}
},
"transparency": 75
}
],
"background": [
{
"color": {
"solid": {
"color": "#E6DFCF"
}
},
"transparency": 0
}
]
}
}
},
"foregroundNeutralSecondary": "#C1B595",
"good": "#C1B595",
"backgroundNeutral": "#E6DFCF"
}actionButton (Action Button)
An interactive button visual that supports bookmark navigation, page navigation, Q&A, drill-through, and web URL actions.
Containers
| Container | Key Properties |
|---|---|
fill | show, fillColor, transparency |
text | show, text, fontColor, fontFamily, fontSize, bold, horizontalAlignment |
outline | show, lineColor, weight |
shape | tileShape, rectangleRoundedCurve |
icon | show |
title | show |
background | show, color, transparency |
border | show |
dropShadow | show |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"actionButton": {
"*": {
"fill": [{ "show": true, "transparency": 0 }],
"text": [{
"show": true,
"fontFamily": "Segoe UI Semibold",
"fontSize": 11,
"horizontalAlignment": "center"
}],
"outline": [{ "show": false }],
"title": [{ "show": false }],
"background": [{ "show": false }],
"border": [{ "show": false }],
"dropShadow": [{ "show": false }]
},
"hover": {
"fill": [{ "transparency": 20 }]
},
"press": {
"fill": [{ "transparency": 40 }]
},
"selected": {
"outline": [{ "show": true }]
},
"disabled": {
"fill": [{ "transparency": 60 }],
"text": [{ "show": false }]
}
}
}
}Notes
- State keys are
*(default),hover,press,selected, anddisabled— only*is required; omitted states inherit from*. fill.$idandtext.$idare internal identifiers returned bypbir schema describebut should not be included in theme JSON.text.fontColoris a color object ({"solid": {"color": "#FFFFFF"}}), not a plain string;fill.fillColorfollows the same pattern.
advancedSlicerVisual (Advanced Slicer)
Card-style slicer that displays items as styled cards with a separate label and value; structurally distinct from the classic slicer visual.
Containers
| Container | Key Properties |
|---|---|
label | show, fontSize, fontFamily, fontColor, bold, italic, horizontalAlignment, position, textWrap |
value | show, fontSize, fontFamily, fontColor, bold, italic, horizontalAlignment, labelDisplayUnits, labelPrecision |
layout | Card layout controls (54 properties) |
selection | singleSelect, selectAllCheckboxEnabled, behavior |
selectionIcon | Icon shown for selected state (11 properties) |
accentBar | Accent bar styling (6 properties) |
outline | Card outline (5 properties) |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"advancedSlicerVisual": {
"*": {
"label": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI Semibold",
"fontColor": { "solid": { "color": "#252423" } },
"bold": false,
"horizontalAlignment": "left"
}
],
"value": [
{
"show": true,
"fontSize": 13,
"fontFamily": "Segoe UI",
"fontColor": { "solid": { "color": "#252423" } },
"horizontalAlignment": "left",
"labelDisplayUnits": 0
}
]
}
}
}
}Notes
- Has no
itemsorheadercontainers — those belong to the classicslicertype; applying them here has no effect. - Uses
fontSize(nottextSize) in bothlabelandvalue. labelsupports apositionproperty (belowValue/aboveValue) that controls whether the label renders above or below the value within each card.
aiNarratives (AI Narratives)
AI-generated natural language summary visual that produces text descriptions of data from connected visuals or manual prompts.
Containers
| Container | Key Properties |
|---|---|
text | fontColor, fontFamily, fontSize, textAlignment |
summary | autoRefresh |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"aiNarratives": {
"*": {
"text": [
{
"fontColor": { "solid": { "color": "#252423" } },
"fontFamily": "Segoe UI",
"fontSize": 11,
"textAlignment": "Left"
}
],
"summary": [
{
"autoRefresh": false
}
]
}
}
}
}Notes
textis the only container with visual styling properties;fontColor,fontFamily,fontSize, andtextAlignmentcover all available text formatting.summary.autoRefreshis a behaviour toggle (re-run AI generation on data refresh), not a style property — consider whether setting this at theme level is appropriate for your report.- Background, border, and title styling use the shared
background,border, andtitlecontainers common to all visuals, notaiNarratives-specific containers.
areaChart (Area Chart)
Area chart that shades the region below each line series; supports the same containers as the line chart.
Containers
| Container | Key Properties |
|---|---|
categoryAxis | show, fontSize, fontFamily, labelColor, gridlineColor, gridlineThickness, gridlineShow |
valueAxis | show, fontSize, fontFamily, labelColor, gridlineColor, gridlineThickness, gridlineShow |
legend | show, position, fontSize, fontFamily, labelColor |
labels | show, fontSize, fontFamily, color, labelPosition |
lineStyles | strokeWidth, strokeColor, areaShow, areaColor, areaMatchStrokeColor, showMarker |
markers | borderShow, borderColor, transparency |
legend.position enum: Top, TopCenter, TopRight, Left, Right, LeftCenter, RightCenter, Bottom, BottomCenter, BottomRight
Theme Example
{
"name": "My Theme",
"visualStyles": {
"areaChart": {
"*": {
"categoryAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"gridlineShow": false
}
],
"valueAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"gridlineColor": { "solid": { "color": "#E0E0E0" } },
"gridlineThickness": 1
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } }
}
],
"lineStyles": [
{
"strokeWidth": 2,
"areaShow": true,
"showMarker": false
}
]
}
}
}
}Notes
- Container list is identical to
lineChart— see lineChart.md for axis and legend property details. lineStyles.areaShowcontrols whether the fill area is rendered;areaMatchStrokeColorties the fill to the line colour.areaColoraccepts{ "solid": { "color": "#hex" } }and is only applied whenareaMatchStrokeColorisfalse.
azureMap (Azure Map)
Azure Maps visual supporting multiple layer types: bubbles, heat maps, filled regions, route paths, tile overlays, and 3D bar charts.
Containers
| Container | Key Properties |
|---|---|
bubbleLayer | show, fillColor, bubbleRadius, mapTransparency, clusteringEnabled, markerRangeType |
heatMapLayer | show, heatMapColorLow, heatMapColorCenter, heatMapColorHigh, heatMapRadius, heatMapIntensity, mapTransparency |
filledMap | show, defaultColor, strokeColor, strokeWidth, mapTransparency |
pathLayer | show, color, strokeWidth, strokeTransparency |
tileLayer | show, tileLayerUrl, mapTransparency, layerPosition |
barChart | show, defaultColor, barHeight, thickness, mapTransparency |
legend | show, position, labelColor, fontSize, fontFamily |
dataPoint | fill, showAllDataPoints |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"azureMap": {
"*": {
"bubbleLayer": [
{
"show": true,
"fillColor": { "solid": { "color": "#0078D4" } },
"bubbleRadius": 8,
"mapTransparency": 20,
"clusteringEnabled": false
}
],
"filledMap": [
{
"show": false,
"defaultColor": { "solid": { "color": "#0078D4" } },
"strokeColor": { "solid": { "color": "#FFFFFF" } },
"strokeWidth": 1,
"mapTransparency": 20
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"labelColor": { "solid": { "color": "#252423" } },
"fontSize": 10,
"fontFamily": "Segoe UI"
}
]
}
}
}
}Notes
- Only one layer type is typically active at a time; set
show: falseon inactive layers to avoid conflicts. bubbleLayerhas 42 properties covering clustering, marker images, zoom-range visibility, and bezier easing — theme is appropriate only for baseline defaults, not per-series customisation.- Map tile style, zoom defaults, and traffic overlays are controlled at the visual level (
mapControls,traffic), not meaningfully overridden by theme for most use cases.
barChart (Bar Chart)
Horizontal bar chart; base type for the bar/column family. Most containers (axes, legend, labels, dataPoint, ribbonBands, totals) are shared across all chart types in this family.
Containers
| Container | Key Properties |
|---|---|
categoryAxis | show, fontSize, fontFamily, labelColor, bold, italic, showAxisTitle, titleText, titleFontSize, titleFontFamily, titleColor, gridlineShow, gridlineColor, invertAxis |
valueAxis | show, fontSize, fontFamily, labelColor, bold, italic, showAxisTitle, titleText, titleFontSize, titleFontFamily, titleColor, gridlineShow, gridlineColor, start, end |
legend | show, position, fontSize, fontFamily, labelColor, bold, italic, showTitle, titleText |
labels | show, fontSize, fontFamily, color, bold, italic, labelPosition, labelDisplayUnits, labelPrecision, backgroundColor, enableBackground |
dataPoint | defaultColor, fill, fillTransparency, borderShow, borderColor, borderSize |
ribbonBands | show, fillColor, fillMatchColor, fillTransparency, borderShow, borderColor, borderColorMatchFill |
totals | show, fontSize, fontFamily, color, bold, italic, labelDisplayUnits, labelPrecision, backgroundColor, enableBackground |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"barChart": {
"*": {
"categoryAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } },
"gridlineShow": true,
"gridlineColor": { "solid": { "color": "#E0E0E0" } }
}
],
"valueAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } },
"gridlineShow": true,
"gridlineColor": { "solid": { "color": "#E0E0E0" } }
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } }
}
],
"labels": [
{
"show": false,
"fontSize": 10,
"fontFamily": "Segoe UI",
"color": { "solid": { "color": "#252423" } },
"labelPosition": "OutsideEnd"
}
],
"dataPoint": [
{
"fillTransparency": 0
}
]
}
}
}
}Notes
- In a bar chart (horizontal),
categoryAxisis the Y-axis (categories) andvalueAxisis the X-axis (values) — the opposite of a column chart. - Axis label color is
labelColor, notfontColor; the property name differs from most other visual containers. ribbonBandsandtotalsare present onbarChartand control stacked/ribbon overlay appearance; for non-stacked series they have no visible effect unless enabled.
bookmarkNavigator (Bookmark Navigator)
A navigation bar that renders a set of bookmarks as clickable tiles, allowing readers to switch report states.
Containers
| Container | Key properties |
|---|---|
title | show, text, fontFamily, fontSize, fontColor, bold |
background | show, color, transparency |
border | show, color, width, radius |
dropShadow | show, preset, color, shadowBlur, transparency |
padding | top, right, bottom, left |
text | show, fontFamily, fontSize, fontColor, bold, italic, underline, horizontalAlignment, verticalAlignment |
fill | show, fillColor, transparency |
outline | show, lineColor, weight, transparency |
shape | tileShape, roundEdge, rectangleRoundedCurve, chevronAngle |
layout | orientation, columnCount, rowCount, cellPadding |
bookmarks | bookmarkGroup, selectedBookmark, allowDeselectionBookmark, deselectionBookmark, hideDeselectedBookmark |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"bookmarkNavigator": {
"*": {
"title": [{ "show": false }],
"background": [{ "show": false }],
"text": [{
"fontFamily": "Segoe UI",
"fontSize": 11,
"fontColor": { "solid": { "color": "#252423" } },
"bold": false,
"horizontalAlignment": "center",
"verticalAlignment": "middle"
}],
"fill": [{
"show": true,
"fillColor": { "solid": { "color": "#F3F2F1" } },
"transparency": 0
}],
"outline": [{
"show": true,
"lineColor": { "solid": { "color": "#C8C6C4" } },
"weight": 1,
"transparency": 0
}],
"shape": [{ "tileShape": "rectangle", "roundEdge": 4 }],
"layout": [{ "orientation": 2, "cellPadding": 4 }]
}
}
}
}Notes
textstyles the label on each bookmark tile;fillandoutlinecontrol the tile background and border respectively — these are the three primary styling containers.layout.orientationaccepts0,1, or2;shape.tileShapeaccepts values including"rectangle","arrow","arrowChevron","arrowPentagon", and others — seepbir schema describe bookmarkNavigator.shapefor the full set.- The
bookmarkscontainer controls behaviour (which bookmark group to show, deselection handling) rather than appearance, so it is typically set per-visual rather than via theme.
card (Card)
The legacy single-value card visual that displays one measure value with an optional category label below it.
Containers
| Container | Key Properties |
|---|---|
labels | color, fontFamily, fontSize, bold, labelDisplayUnits, labelPrecision |
categoryLabels | show, color, fontFamily, fontSize, bold |
title | show, text, fontColor, fontFamily, fontSize |
background | show, color, transparency |
border | show, color, width, radius |
dropShadow | show |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"card": {
"*": {
"labels": [{
"fontFamily": "Segoe UI Semibold",
"fontSize": 28,
"labelDisplayUnits": 0
}],
"categoryLabels": [{
"show": true,
"fontFamily": "Segoe UI",
"fontSize": 11
}],
"title": [{ "show": false }],
"background": [{ "show": false }],
"border": [{ "show": false }],
"dropShadow": [{ "show": false }]
}
}
}
}Notes
- Both
labels.colorandcategoryLabels.colorare namedcolor, notfontColor— this differs from most other visual containers. labels.labelDisplayUnitsaccepts integer values:0= Auto,1= None,1000= Thousands,1000000= Millions, etc.cardis the legacy visual; the modern replacement iscardVisual. They do not share container names or property conventions.
cardVisual (Multi-row Card — New Card Visual)
The modern card visual (introduced in 2023) that replaces the legacy card. Supports multiple fields, reference labels, images, and rich layout options.
Containers
| Container | Key Properties |
|---|---|
value | fontColor, fontFamily, fontSize, show, bold, horizontalAlignment, labelDisplayUnits, labelPrecision |
label | fontColor, fontFamily, fontSize, show, bold, horizontalAlignment, position |
cardCalloutArea | show, backgroundFillColor, backgroundTransparency, rectangleRoundedCurve, paddingUniform |
title | show, text, fontColor, fontFamily, fontSize |
background | show, color, transparency |
border | show |
dropShadow | show |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"cardVisual": {
"*": {
"value": [{
"fontFamily": "Segoe UI Semibold",
"fontSize": 28,
"horizontalAlignment": "center",
"labelDisplayUnits": 0
}],
"label": [{
"show": true,
"fontFamily": "Segoe UI",
"fontSize": 11,
"position": "belowValue"
}],
"cardCalloutArea": [{ "show": true, "rectangleRoundedCurve": 4 }],
"title": [{ "show": false }],
"background": [{ "show": false }],
"border": [{ "show": false }],
"dropShadow": [{ "show": false }]
}
}
}
}Notes
value.fontColorandlabel.fontColorusefontColor(notcolor) — the opposite convention from the legacycardvisual.label.positionaccepts"belowValue"or"aboveValue", controlling where the field label appears relative to the number.cardVisualis the type name used in Power BI's theme JSON even though the visual is marketed as the "New Card"; do not confuse it withmultiRowCard, which is a separate legacy visual.
clusteredBarChart (Clustered Bar Chart)
Horizontal clustered bar chart; groups multiple series side-by-side on the same axis.
Containers
Same container structure as barChart with one difference: clusteredBarChart does not have ribbonBands or totals containers. All other containers (categoryAxis, valueAxis, legend, labels, dataPoint, etc.) are identical in property count and names.
| Container | Key Properties |
|---|---|
categoryAxis | show, fontSize, fontFamily, labelColor, bold, italic, showAxisTitle, titleText, titleFontSize, titleFontFamily, titleColor, gridlineShow, gridlineColor, invertAxis |
valueAxis | show, fontSize, fontFamily, labelColor, bold, italic, showAxisTitle, titleText, titleFontSize, titleFontFamily, titleColor, gridlineShow, gridlineColor, start, end |
legend | show, position, fontSize, fontFamily, labelColor, bold, italic, showTitle, titleText |
labels | show, fontSize, fontFamily, color, bold, italic, labelPosition, labelDisplayUnits, labelPrecision, backgroundColor, enableBackground |
dataPoint | defaultColor, fill, fillTransparency, borderShow, borderColor, borderSize |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"clusteredBarChart": {
"*": {
"categoryAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } }
}
],
"valueAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } },
"gridlineShow": true,
"gridlineColor": { "solid": { "color": "#E0E0E0" } }
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"fontSize": 11,
"fontFamily": "Segoe UI"
}
],
"labels": [
{
"show": false,
"fontSize": 10,
"fontFamily": "Segoe UI"
}
]
}
}
}
}Notes
- No
ribbonBandsortotalscontainers — those are only available on stacked variants andbarChart. - See barChart.md for full container property reference; all shared containers are identical.
dataPointhas 9 properties here vs 10 onbarChart—fillRule(gradient fill rule) is absent on clustered variants.
clusteredColumnChart (Clustered Column Chart)
Vertical clustered column chart; groups multiple series side-by-side. The vertical counterpart to clusteredBarChart.
Containers
Same container structure as clusteredBarChart — no ribbonBands or totals. All axis, legend, labels, and dataPoint containers are identical in properties to barChart.
| Container | Key Properties |
|---|---|
categoryAxis | show, fontSize, fontFamily, labelColor, bold, italic, showAxisTitle, titleText, titleFontSize, titleFontFamily, titleColor, gridlineShow, gridlineColor, invertAxis |
valueAxis | show, fontSize, fontFamily, labelColor, bold, italic, showAxisTitle, titleText, titleFontSize, titleFontFamily, titleColor, gridlineShow, gridlineColor, start, end |
legend | show, position, fontSize, fontFamily, labelColor, bold, italic, showTitle, titleText |
labels | show, fontSize, fontFamily, color, bold, italic, labelPosition, labelDisplayUnits, labelPrecision, backgroundColor, enableBackground |
dataPoint | defaultColor, fill, fillTransparency, borderShow, borderColor, borderSize |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"clusteredColumnChart": {
"*": {
"categoryAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } }
}
],
"valueAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } },
"gridlineShow": true,
"gridlineColor": { "solid": { "color": "#E0E0E0" } }
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"fontSize": 11,
"fontFamily": "Segoe UI"
}
],
"labels": [
{
"show": false,
"fontSize": 10,
"fontFamily": "Segoe UI"
}
]
}
}
}
}Notes
- In a column chart (vertical),
categoryAxisis the X-axis andvalueAxisis the Y-axis — the opposite ofbarChart. - No
ribbonBandsortotalscontainers — see columnChart.md if you need those. - See barChart.md for full property reference on all shared containers.
columnChart (Column Chart)
Vertical column chart (single or stacked); adds totals and ribbonBands containers on top of the standard bar/column container set.
Containers
| Container | Key Properties |
|---|---|
categoryAxis | show, fontSize, fontFamily, labelColor, bold, italic, showAxisTitle, titleText, titleFontSize, titleFontFamily, titleColor, gridlineShow, gridlineColor, invertAxis |
valueAxis | show, fontSize, fontFamily, labelColor, bold, italic, showAxisTitle, titleText, titleFontSize, titleFontFamily, titleColor, gridlineShow, gridlineColor, start, end |
legend | show, position, fontSize, fontFamily, labelColor, bold, italic, showTitle, titleText |
labels | show, fontSize, fontFamily, color, bold, italic, labelPosition, labelDisplayUnits, labelPrecision, backgroundColor, enableBackground |
dataPoint | defaultColor, fill, fillTransparency, fillRule, borderShow, borderColor, borderSize |
totals | show, fontSize, fontFamily, color, bold, italic, labelDisplayUnits, labelPrecision, backgroundColor, enableBackground, showPositiveAndNegativeValues |
ribbonBands | show, fillColor, fillMatchColor, fillTransparency, borderShow, borderColor, borderColorMatchFill |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"columnChart": {
"*": {
"categoryAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } }
}
],
"valueAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } },
"gridlineShow": true,
"gridlineColor": { "solid": { "color": "#E0E0E0" } }
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"fontSize": 11,
"fontFamily": "Segoe UI"
}
],
"labels": [
{
"show": false,
"fontSize": 10,
"fontFamily": "Segoe UI"
}
],
"totals": [
{
"show": true,
"fontSize": 10,
"fontFamily": "Segoe UI Semibold",
"color": { "solid": { "color": "#252423" } }
}
]
}
}
}
}Notes
totalslabels appear at the top of stacked columns showing the sum;showmust betrueand the visual must have a legend/series field in the stack.ribbonBandscontrols the connecting bands between stacked segments across categories; most useful whenfillMatchColorisfalseto set a custom ribbon color.dataPointgains afillRuleproperty (gradient fill rule) compared to clustered variants, enabling gradient fills on individual columns.
decompositionTreeVisual (Decomposition Tree)
AI-assisted hierarchical breakdown visual for exploring root causes and contributions across multiple dimensions.
Containers
| Container | Key Properties |
|---|---|
levelHeader | levelTitleFontFamily, levelTitleFontSize, levelTitleFontColor, levelTitleBold, levelSubtitleFontFamily, levelSubtitleFontSize, levelSubtitleFontColor, levelHeaderBackgroundColor |
dataLabels | dataLabelFontFamily, dataLabelFontSize, dataLabelFontColor, dataLabelBold, dataLabelDisplayUnits |
dataBars | dataBarColor, positiveBarColor, negativeBarColor, dataBarBackgroundColor, dataBarWidthPercentage |
categoryLabels | categoryLabelFontFamily, categoryLabelFontSize, categoryLabelFontColor, categoryLabelBold |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"decompositionTreeVisual": {
"*": {
"levelHeader": [
{
"levelTitleFontFamily": "Segoe UI Semibold",
"levelTitleFontSize": 11,
"levelTitleFontColor": { "solid": { "color": "#252423" } },
"levelTitleBold": false,
"levelSubtitleFontFamily": "Segoe UI",
"levelSubtitleFontSize": 9,
"levelSubtitleFontColor": { "solid": { "color": "#605E5C" } },
"levelHeaderBackgroundColor": { "solid": { "color": "#F3F2F1" } },
"showSubtitles": true
}
],
"dataLabels": [
{
"dataLabelFontFamily": "Segoe UI",
"dataLabelFontSize": 10,
"dataLabelFontColor": { "solid": { "color": "#252423" } },
"dataLabelBold": false
}
],
"dataBars": [
{
"positiveBarColor": { "solid": { "color": "#0078D4" } },
"negativeBarColor": { "solid": { "color": "#D13438" } },
"dataBarWidthPercentage": 80
}
],
"categoryLabels": [
{
"categoryLabelFontFamily": "Segoe UI",
"categoryLabelFontSize": 10,
"categoryLabelFontColor": { "solid": { "color": "#252423" } },
"categoryLabelBold": false
}
]
}
}
}
}Notes
- Property names in
levelHeaderare prefixed (levelTitleFontFamily,levelSubtitleFontFamily) — there is no barefontFamilyorfontSizeat this level. dataBarssupportspositiveBarColorandnegativeBarColorseparately;dataBarColorsets the colour when there is no positive/negative distinction.dataBars.dataBarScalingTypecontrols relative vs. absolute bar scaling:topNode,parentNode, orlevelMaximum.
donutChart (Donut Chart)
Donut chart — a pie chart with a hollow centre; container set is identical to pieChart. The centre hole size is governed by slices.innerRadiusRatio.
Containers
| Container | Key Properties |
|---|---|
labels | show, fontSize, fontFamily, color, position, labelStyle, labelDisplayUnits, labelPrecision |
legend | show, position, fontSize, fontFamily, labelColor |
dataPoint | fill, defaultColor, fillTransparency, borderShow, borderColor |
slices | innerRadiusRatio, startAngle |
labels.position values: Outside, Inside, BestFit (PascalCase — lowercase values are silently ignored by Power BI)
legend.position enum: Top, TopCenter, TopRight, Left, Right, LeftCenter, RightCenter, Bottom, BottomCenter, BottomRight
Theme Example
{
"name": "My Theme",
"visualStyles": {
"donutChart": {
"*": {
"labels": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"color": { "solid": { "color": "#252423" } },
"position": "Outside",
"labelStyle": "Percent of total"
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } }
}
],
"slices": [
{
"innerRadiusRatio": 60
}
]
}
}
}
}Notes
donutCharthas no dedicated centre-label container in the schema — the hole is purely visual, sized byslices.innerRadiusRatio(integer, represents a percentage of the outer radius).- All properties are identical to
pieChart— see pieChart.md for full property details. - Setting
slices.innerRadiusRatioto0on a donut effectively renders it as a pie.
filledMap (Filled Map)
Choropleth map visual that shades geographic regions by data value using Bing Maps boundary data.
Containers
| Container | Key Properties |
|---|---|
dataPoint | defaultColor, fill, fillRule, showAllDataPoints, transparency |
legend | show, position, labelColor, fontSize, fontFamily |
categoryLabels | show |
stroke | show, strokeColor, strokeWidth |
mapControls | autoZoom, showZoomButtons, showLassoButton, zoomLevel |
mapStyles | mapTheme, showLabels |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"filledMap": {
"*": {
"dataPoint": [
{
"defaultColor": { "solid": { "color": "#0078D4" } },
"transparency": 20,
"showAllDataPoints": false
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"labelColor": { "solid": { "color": "#252423" } },
"fontSize": 10,
"fontFamily": "Segoe UI"
}
],
"stroke": [
{
"show": true,
"strokeColor": { "solid": { "color": "#FFFFFF" } },
"strokeWidth": 1
}
],
"mapStyles": [
{
"mapTheme": "canvasLight",
"showLabels": true
}
],
"mapControls": [
{
"autoZoom": true,
"showZoomButtons": false
}
]
}
}
}
}Notes
dataPoint.defaultColorsets the single-series fill; for multi-series, usedataPoint.fillwith afillRulegradient object.strokecontrols the boundary outline between regions — settingshow: falseremoves region borders entirely.categoryLabelsinfilledMaphas only ashowproperty (1 property); label styling is not exposed here.
filter (Filter Entity)
A filter entity attached to a visual, page, or report — not a standalone visual and not the filter pane chrome.
Containers
| Container | Key properties |
|---|---|
general | isInvertedSelectionMode, requireSingleSelect |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"filter": {
"*": {
"general": [{ "requireSingleSelect": false, "isInvertedSelectionMode": false }]
}
}
}
}Notes
filterhas only one container (general) with two behavioural boolean properties — there is no visual styling (color, font, border) available here.- This is not the filter pane. Filter pane styling (
outspacePane,filterCard) is applied via report-level theme properties, not viavisualStyles. Seepbir-formatskill references:references/filter-pane.mdandreferences/theme.md. - Use this container sparingly — forcing
requireSingleSelectorisInvertedSelectionModevia theme applies the setting globally to all filter entities across the report.
funnel (Funnel)
Funnel chart that displays values as proportionally sized horizontal bars in descending order; supports data labels and a percentage-bar overlay.
Containers
| Container | Key Properties |
|---|---|
labels | show, fontSize, fontFamily, color, funnelLabelStyle, labelPosition |
categoryAxis | show, fontSize, fontFamily, color |
percentBarLabel | show, fontSize, fontFamily, color |
dataPoint | fill, defaultColor, fillTransparency, borderShow |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"funnel": {
"*": {
"labels": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"color": { "solid": { "color": "#ffffff" } },
"funnelLabelStyle": "Data"
}
],
"categoryAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI"
}
],
"percentBarLabel": [
{
"show": true,
"fontSize": 10,
"fontFamily": "Segoe UI"
}
]
}
}
}
}Notes
labels.funnelLabelStylecontrols what is shown:Data,Percent of first,Percent of previous, and combined variants.percentBarLabelstyles the small percentage annotation shown next to the funnel bar; it hasshow,fontSize,fontFamily,color,bold,italic,underline.categoryAxisin a funnel is a simple text label list; it supportsshow,fontSize,fontFamily, andcoloronly (no gridline properties).
gauge (Gauge)
Dial/gauge chart that plots a single value against a min/max arc; the large central value display is styled via calloutValue.
Containers
| Container | Key Properties |
|---|---|
calloutValue | show, fontFamily, color, bold, italic, labelDisplayUnits, labelPrecision (no fontSize property) |
labels | show, fontSize, fontFamily, color, labelDisplayUnits, labelPrecision |
dataPoint | fill, target |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"gauge": {
"*": {
"calloutValue": [
{
"show": true,
"fontFamily": "Segoe UI Semibold",
"color": { "solid": { "color": "#252423" } },
"bold": false,
"labelDisplayUnits": 0
}
],
"labels": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"color": { "solid": { "color": "#252423" } }
}
],
"dataPoint": [
{
"fill": { "solid": { "color": "#0078D4" } }
}
]
}
}
}
}Notes
calloutValuedoes not have afontSizeproperty — font size for the central callout is not directly theme-controllable; usefontFamilyandboldto adjust its appearance.labelscontrols the min/max/target tick labels around the arc rim, not the centre value.dataPoint.fillsets the arc bar colour;dataPoint.targetsets the target indicator colour.
group (Group)
A visual group container that wraps multiple visuals so they can be moved, sized, and layered together as a single unit.
Containers
| Container | Key Properties |
|---|---|
background | show, color, transparency |
general | altText, x, y, width, height |
lockAspect | show |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"group": {
"*": {
"background": [{ "show": false }],
"lockAspect": [{ "show": false }]
}
}
}
}Notes
grouphas only three containers; it has notitle,border,dropShadow, orvisualHeader.generalproperties (x,y,width,height) are positional and stored per-visual — they are not meaningful at theme level.- Group background is transparent by default; enabling it is useful to give a panel of visuals a shared fill color.
hundredPercentStackedAreaChart (100% Stacked Area Chart)
Stacked area chart normalised to 100% at every category point; each series shows its proportional share rather than absolute values.
Containers
| Container | Key Properties |
|---|---|
categoryAxis | show, fontSize, fontFamily, labelColor, gridlineColor, gridlineThickness, gridlineShow |
valueAxis | show, fontSize, fontFamily, labelColor, gridlineColor, gridlineThickness, gridlineShow |
legend | show, position, fontSize, fontFamily, labelColor |
labels | show, fontSize, fontFamily, color, labelPosition |
lineStyles | strokeWidth, strokeColor, areaShow, areaColor, areaMatchStrokeColor, showMarker |
markers | borderShow, borderColor, transparency |
seriesLabels | show, showByDefault, textSize, seriesFontFamily, seriesPosition |
totals | show, fontSize, fontFamily, color |
legend.position enum: Top, TopCenter, TopRight, Left, Right, LeftCenter, RightCenter, Bottom, BottomCenter, BottomRight
Theme Example
{
"name": "My Theme",
"visualStyles": {
"hundredPercentStackedAreaChart": {
"*": {
"categoryAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI"
}
],
"valueAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"gridlineColor": { "solid": { "color": "#E0E0E0" } },
"gridlineThickness": 1
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } }
}
],
"labels": [
{
"show": false
}
]
}
}
}
}Notes
- Container set is identical to
stackedAreaChart— see lineChart.md for shared axis and legend details. - The value axis always displays percentages (0–100%); setting
start/endonvalueAxisis not meaningful here. totalslabels show 100% for every category point and are typically hidden.
hundredPercentStackedBarChart (100% Stacked Bar Chart)
Horizontal 100% stacked bar chart; each bar always fills 100% of the axis width, showing relative proportions rather than absolute values.
Containers
Same container structure as barChart plus ribbonBands and totals. All containers are identical in properties to columnChart.
| Container | Key Properties |
|---|---|
categoryAxis | show, fontSize, fontFamily, labelColor, bold, italic, showAxisTitle, titleText, titleFontSize, titleFontFamily, titleColor, gridlineShow, gridlineColor, invertAxis |
valueAxis | show, fontSize, fontFamily, labelColor, bold, italic, showAxisTitle, titleText, titleFontSize, titleFontFamily, titleColor, gridlineShow, gridlineColor, start, end |
legend | show, position, fontSize, fontFamily, labelColor, bold, italic, showTitle, titleText |
labels | show, fontSize, fontFamily, color, bold, italic, labelPosition, labelDisplayUnits, labelPrecision, backgroundColor, enableBackground |
dataPoint | defaultColor, fill, fillTransparency, fillRule, borderShow, borderColor, borderSize |
totals | show, fontSize, fontFamily, color, bold, italic, labelDisplayUnits, labelPrecision, backgroundColor, enableBackground, showPositiveAndNegativeValues |
ribbonBands | show, fillColor, fillMatchColor, fillTransparency, borderShow, borderColor, borderColorMatchFill |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"hundredPercentStackedBarChart": {
"*": {
"categoryAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } }
}
],
"valueAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } },
"gridlineShow": true,
"gridlineColor": { "solid": { "color": "#E0E0E0" } }
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"fontSize": 11,
"fontFamily": "Segoe UI"
}
],
"labels": [
{
"show": true,
"fontSize": 10,
"fontFamily": "Segoe UI",
"color": { "solid": { "color": "#FFFFFF" } },
"labelPosition": "InsideCenter"
}
]
}
}
}
}Notes
- Value axis will always render as 0–100% regardless of
start/endsettings onvalueAxis; those properties are effectively inert here. labelsare commonly positionedInsideCenterorInsideEndsince bars always span the full width.- See barChart.md for full property reference; this type is a horizontal stacked variant with the same complete container set.
hundredPercentStackedColumnChart (100% Stacked Column Chart)
Vertical 100% stacked column chart; each column fills 100% of the axis height, showing relative proportions. The vertical counterpart to hundredPercentStackedBarChart.
Containers
Same container structure as columnChart — includes ribbonBands and totals. All containers are identical in properties.
| Container | Key Properties |
|---|---|
categoryAxis | show, fontSize, fontFamily, labelColor, bold, italic, showAxisTitle, titleText, titleFontSize, titleFontFamily, titleColor, gridlineShow, gridlineColor, invertAxis |
valueAxis | show, fontSize, fontFamily, labelColor, bold, italic, showAxisTitle, titleText, titleFontSize, titleFontFamily, titleColor, gridlineShow, gridlineColor, start, end |
legend | show, position, fontSize, fontFamily, labelColor, bold, italic, showTitle, titleText |
labels | show, fontSize, fontFamily, color, bold, italic, labelPosition, labelDisplayUnits, labelPrecision, backgroundColor, enableBackground |
dataPoint | defaultColor, fill, fillTransparency, fillRule, borderShow, borderColor, borderSize |
totals | show, fontSize, fontFamily, color, bold, italic, labelDisplayUnits, labelPrecision, backgroundColor, enableBackground, showPositiveAndNegativeValues |
ribbonBands | show, fillColor, fillMatchColor, fillTransparency, borderShow, borderColor, borderColorMatchFill |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"hundredPercentStackedColumnChart": {
"*": {
"categoryAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } }
}
],
"valueAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } },
"gridlineShow": true,
"gridlineColor": { "solid": { "color": "#E0E0E0" } }
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"fontSize": 11,
"fontFamily": "Segoe UI"
}
],
"labels": [
{
"show": true,
"fontSize": 10,
"fontFamily": "Segoe UI",
"color": { "solid": { "color": "#FFFFFF" } },
"labelPosition": "InsideCenter"
}
]
}
}
}
}Notes
- Value axis renders as 0–100% regardless of
start/endvalues; those properties are inert on this type. - In column orientation,
categoryAxisis the X-axis andvalueAxisis the Y-axis. - See barChart.md for full property reference and hundredPercentStackedBarChart.md for the horizontal equivalent.
image (Image)
A static image container that displays a URL, embedded binary, or data-bound image field on the report canvas.
Containers
| Container | Key Properties |
|---|---|
image | fit, transparency, cornerRadius, sourceType, sourceUrl |
lockAspect | show |
title | show |
border | show, color, width, radius |
dropShadow | show |
background | show, color, transparency |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"image": {
"*": {
"image": [{ "fit": "Fit", "transparency": 0 }],
"lockAspect": [{ "show": true }],
"title": [{ "show": false }],
"border": [{ "show": false }],
"dropShadow": [{ "show": false }]
}
}
}
}Notes
fitaccepts"Fit","Stretch","Fill", or"Normal"—"Fit"is the safest default for logos and icons.lockAspect.showlocks the width/height ratio during resize; enable it in the theme to prevent accidental distortion.- The image source (
sourceType,sourceUrl,sourceFile,sourceField) is stored per-visual in the report definition, not in the theme; only presentational properties likefitandtransparencyare meaningful at theme level.
keyDriversVisual (Key Influencers)
AI visual that analyses a metric to surface the factors (influencers) that drive it up or down.
Containers
| Container | Key Properties |
|---|---|
keyDrivers | selectedAnalysis, allowKeyDrivers, allowProfiles, selectedSort, countType, targetValue |
keyInfluencersVisual | canvasColor, primaryColor, secondaryColor, fontColor, primaryFontColor, secondaryFontColor |
keyDriversDrillVisual | defaultColor, referenceLineColor |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"keyDriversVisual": {
"*": {
"keyInfluencersVisual": [
{
"canvasColor": { "solid": { "color": "#FFFFFF" } },
"primaryColor": { "solid": { "color": "#0078D4" } },
"secondaryColor": { "solid": { "color": "#E1DFDD" } },
"fontColor": { "solid": { "color": "#252423" } },
"primaryFontColor": { "solid": { "color": "#FFFFFF" } },
"secondaryFontColor": { "solid": { "color": "#252423" } }
}
],
"keyDriversDrillVisual": [
{
"defaultColor": { "solid": { "color": "#0078D4" } },
"referenceLineColor": { "solid": { "color": "#D13438" } }
}
]
}
}
}
}Notes
keyDriverscontainer controls analysis configuration (analysis type, sort order, target value), not visual styling — leave this out of theme unless setting report-wide analysis defaults.keyInfluencersVisualdoes not expose font family or size — typography for this visual is not theme-controllable.- The AI analysis itself is not influenced by theme settings; only the colour palette of the rendered output changes.
kpi (KPI)
A KPI visual that shows a primary indicator value against a goal, with an optional trend sparkline and status colouring.
Containers
| Container | Key Properties |
|---|---|
indicator | fontColor, fontFamily, fontSize, bold, horizontalAlignment, showIcon, iconSize |
trendline | show, transparency |
goals | showGoal, showDistance, direction, goalFontFamily, distanceFontFamily, fontSize |
status | direction, goodColor, neutralColor, badColor |
title | show, text, fontColor, fontFamily, fontSize |
background | show, color, transparency |
border | show, color, width, radius |
dropShadow | show |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"kpi": {
"*": {
"indicator": [{
"fontFamily": "Segoe UI Semibold",
"fontSize": 28,
"horizontalAlignment": "center",
"showIcon": true
}],
"trendline": [{ "show": true, "transparency": 0 }],
"goals": [{ "showGoal": true, "showDistance": true, "direction": "High is good" }],
"status": [{ "direction": "Positive" }],
"title": [{ "show": true }],
"background": [{ "show": false }],
"border": [{ "show": false }],
"dropShadow": [{ "show": false }]
}
}
}
}Notes
- The container is
trendline(lowercase L) — a common typo istrendLine; the wrong casing will silently be ignored. status.directioncontrols whether positive variance is good ("Positive") or bad ("Negative"); it defaults to"Positive"but must be set explicitly in the theme if your KPIs measure costs.goals.directionandstatus.directionare independent settings:goals.directionlabels the distance metric,status.directiondetermines the colour logic.
lineChart (Line Chart)
Standard line chart for plotting continuous data series over a category or time axis.
Containers
| Container | Key Properties |
|---|---|
categoryAxis | show, fontSize, fontFamily, labelColor, gridlineColor, gridlineThickness, gridlineShow |
valueAxis | show, fontSize, fontFamily, labelColor, gridlineColor, gridlineThickness, gridlineShow |
legend | show, position, fontSize, fontFamily, labelColor |
labels | show, fontSize, fontFamily, color, labelPosition |
lineStyles | strokeWidth, strokeColor, lineChartType, lineStyle, showMarker, areaShow |
markers | borderShow, borderColor, transparency |
legend.position enum: Top, TopCenter, TopRight, Left, Right, LeftCenter, RightCenter, Bottom, BottomCenter, BottomRight
Theme Example
{
"name": "My Theme",
"visualStyles": {
"lineChart": {
"*": {
"categoryAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"gridlineShow": false
}
],
"valueAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"gridlineColor": { "solid": { "color": "#E0E0E0" } },
"gridlineThickness": 1
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } }
}
],
"labels": [
{
"show": false
}
],
"lineStyles": [
{
"strokeWidth": 2,
"lineChartType": "linear",
"showMarker": false
}
]
}
}
}
}Notes
gridlineColorandlabelColorare objects:{ "solid": { "color": "#hex" } }, not plain strings.lineChartTypecontrols interpolation:linear,smooth, orstep;lineStylecontrols stroke pattern:solid,dashed,dotted,custom.labels.labelPositionacceptsAuto,InsideEnd,OutsideEnd, and others — check schema for the full enum.
lineClusteredColumnComboChart (Line and Clustered Column Chart)
Combo chart that overlays a line series on clustered columns; the primary (left) Y-axis scales the columns and the secondary (right) Y-axis scales the line — both live inside the single valueAxis container.
Containers
| Container | Key Properties |
|---|---|
categoryAxis | show, fontSize, fontFamily, labelColor, gridlineShow |
valueAxis | Primary: show, fontSize, fontFamily, gridlineColor, gridlineThickness — Secondary: secShow, secFontSize, secFontFamily, secLabelColor |
legend | show, position, fontSize, fontFamily, labelColor |
labels | show, fontSize, fontFamily, color, labelPosition |
lineStyles | strokeWidth, strokeColor, lineChartType, lineStyle, showMarker |
markers | borderShow, borderColor, transparency |
legend.position enum: Top, TopCenter, TopRight, Left, Right, LeftCenter, RightCenter, Bottom, BottomCenter, BottomRight
Theme Example
{
"name": "My Theme",
"visualStyles": {
"lineClusteredColumnComboChart": {
"*": {
"categoryAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI"
}
],
"valueAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"gridlineColor": { "solid": { "color": "#E0E0E0" } },
"gridlineThickness": 1,
"secShow": true,
"secFontSize": 11,
"secFontFamily": "Segoe UI"
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } }
}
],
"lineStyles": [
{
"strokeWidth": 2,
"lineChartType": "linear",
"showMarker": false
}
]
}
}
}
}Notes
- Primary and secondary Y-axes share one
valueAxiscontainer: primary properties use no prefix (show,fontSize,gridlineColor), secondary properties use thesecprefix (secShow,secFontSize,secLabelColor). valueAxis.alignZeros(boolean) aligns the zero tick marks of both axes — useful when one axis goes negative.lineStylesapplies only to the line series; column styling is controlled viadataPoint.
lineStackedColumnComboChart (Line and Stacked Column Chart)
Combo chart that overlays a line series on stacked columns; adds a totals container for stacked column sum labels compared to the clustered-column variant.
Containers
| Container | Key Properties |
|---|---|
categoryAxis | show, fontSize, fontFamily, labelColor, gridlineShow |
valueAxis | Primary: show, fontSize, fontFamily, gridlineColor, gridlineThickness — Secondary: secShow, secFontSize, secFontFamily, secLabelColor |
legend | show, position, fontSize, fontFamily, labelColor |
labels | show, fontSize, fontFamily, color, labelPosition |
lineStyles | strokeWidth, strokeColor, lineChartType, lineStyle, showMarker |
markers | borderShow, borderColor, transparency |
totals | show, fontSize, fontFamily, color |
legend.position enum: Top, TopCenter, TopRight, Left, Right, LeftCenter, RightCenter, Bottom, BottomCenter, BottomRight
Theme Example
{
"name": "My Theme",
"visualStyles": {
"lineStackedColumnComboChart": {
"*": {
"categoryAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI"
}
],
"valueAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"gridlineColor": { "solid": { "color": "#E0E0E0" } },
"gridlineThickness": 1,
"secShow": true,
"secFontSize": 11,
"secFontFamily": "Segoe UI"
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } }
}
],
"totals": [
{
"show": false,
"fontSize": 11,
"fontFamily": "Segoe UI",
"color": { "solid": { "color": "#252423" } }
}
]
}
}
}
}Notes
- Identical to lineClusteredColumnComboChart.md except for the addition of the
totalscontainer which labels the sum of each stacked column. - The dual-axis pattern (
sec*prefix onvalueAxis) is the same as the clustered-column combo — see that file for details. totals.coloraccepts{ "solid": { "color": "#hex" } }.
listSlicer (List Slicer)
New-generation list slicer visual with card-style item rendering; shares the same container structure as advancedSlicerVisual, not the classic slicer.
Containers
| Container | Key Properties |
|---|---|
label | show, fontSize, fontFamily, fontColor, bold, italic, horizontalAlignment, position, textWrap |
value | show, fontSize, fontFamily, fontColor, bold, italic, horizontalAlignment, labelDisplayUnits, labelPrecision |
layout | Card layout controls (57 properties) |
selection | singleSelect, selectAllCheckboxEnabled |
selectionIcon | Icon shown for selected state (11 properties) |
expansionIcon | Expand/collapse icon for hierarchies (7 properties) |
accentBar | Accent bar styling (6 properties) |
outline | Card outline (5 properties) |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"listSlicer": {
"*": {
"label": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI Semibold",
"fontColor": { "solid": { "color": "#252423" } },
"horizontalAlignment": "left"
}
],
"value": [
{
"show": true,
"fontSize": 13,
"fontFamily": "Segoe UI",
"fontColor": { "solid": { "color": "#252423" } },
"horizontalAlignment": "left",
"labelDisplayUnits": 0
}
]
}
}
}
}Notes
- Despite the name,
listSliceris NOT the same as the classicslicer— it has noitemsorheadercontainers. - Uses
fontSize(nottextSize) inlabelandvalue, same asadvancedSlicerVisual. - Adds an
expansionIconcontainer (absent inadvancedSlicerVisual) for hierarchical list expansion control.
map (Map)
Bing Maps bubble/heat map visual for geographic data visualisation using latitude/longitude or address geocoding.
Containers
| Container | Key Properties |
|---|---|
legend | show, position, labelColor, fontSize, fontFamily |
dataPoint | defaultColor, fill, fillRule, showAllDataPoints, transparency |
categoryLabels | show, color, fontSize, fontFamily, backgroundColor, enableBackground |
bubbles | bubbleSize, markerRangeType |
heatMap | show, color0, color50, color100, filterRadius, transparency |
mapControls | autoZoom, showZoomButtons, showLassoButton, zoomLevel |
mapStyles | mapTheme, showLabels |
Theme Example
{
"map": {
"legend": {
"show": true,
"position": "Bottom",
"labelColor": { "solid": { "color": "#252423" } },
"fontSize": 10,
"fontFamily": "Segoe UI"
},
"dataPoint": {
"defaultColor": { "solid": { "color": "#0078D4" } },
"transparency": 20
},
"categoryLabels": {
"show": true,
"color": { "solid": { "color": "#252423" } },
"fontSize": 9,
"fontFamily": "Segoe UI"
},
"mapStyles": {
"mapTheme": "canvasLight",
"showLabels": true
},
"mapControls": {
"autoZoom": true,
"showZoomButtons": true
}
}
}Notes
mapStyles.mapThemeaccepts:aerial,canvasDark,canvasLight,road,grayscale.heatMap.showmust betruefor heat map layer properties to take effect; heat map and bubble layers are mutually exclusive display modes.- Practical theme impact is limited — map tile style, geocoding culture, and zoom defaults are the main levers; per-data-point colours require field-level conditional formatting.
multiRowCard (Multi-Row Card)
A legacy multi-row card visual that displays multiple fields per record in a repeating card layout with an optional left accent bar.
Containers
| Container | Key Properties |
|---|---|
cardTitle | color, fontFamily, fontSize, bold, italic, underline |
dataLabels | color, fontFamily, fontSize, bold, italic, underline |
card | barShow, barColor, barWeight, cardBackground, outlineColor, outlineWeight |
categoryLabels | show |
title | show, text, fontColor, fontFamily, fontSize |
background | show, color, transparency |
border | show, color, width, radius |
dropShadow | show |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"multiRowCard": {
"*": {
"cardTitle": [{
"fontFamily": "Segoe UI Semibold",
"fontSize": 12
}],
"dataLabels": [{
"fontFamily": "Segoe UI",
"fontSize": 11
}],
"card": [{ "barShow": false }],
"title": [{ "show": false }],
"background": [{ "show": false }],
"border": [{ "show": false }],
"dropShadow": [{ "show": false }]
}
}
}
}Notes
cardTitle.coloranddataLabels.colorare namedcolor, notfontColor— consistent with the legacycardvisual and inconsistent withcardVisual.- To hide the left accent bar, set
card.barShowtofalse— there is no separatebarcontainer;barShowlives inside thecardcontainer. multiRowCardis a distinct legacy visual type; the modern equivalent iscardVisual(the New Card), which has a completely different container structure.
pieChart (Pie Chart)
Circular chart that divides a whole into proportional slices; supports outside, inside, and adaptive label placement.
Containers
| Container | Key Properties |
|---|---|
labels | show, fontSize, fontFamily, color, position, labelStyle, labelDisplayUnits, labelPrecision |
legend | show, position, fontSize, fontFamily, labelColor |
dataPoint | fill, defaultColor, fillTransparency, borderShow, borderColor |
slices | innerRadiusRatio, startAngle |
labels.position values: outside, inside, preferOutside, preferInside
legend.position enum: Top, TopCenter, TopRight, Left, Right, LeftCenter, RightCenter, Bottom, BottomCenter, BottomRight
Theme Example
{
"name": "My Theme",
"visualStyles": {
"pieChart": {
"*": {
"labels": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"color": { "solid": { "color": "#252423" } },
"position": "outside",
"labelStyle": "Percent of total"
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } }
}
],
"dataPoint": [
{
"fillTransparency": 0
}
]
}
}
}
}Notes
labels.colorandlegend.labelColoraccept{ "solid": { "color": "#hex" } }, not plain strings.slices.innerRadiusRatioconverts a pie into a donut when set > 0; usedonutChartif you want a donut with a centre label.labels.labelStylecontrols what is shown on each slice:Category,Data,Percent of total, and combinations thereof.
pivotTable (Matrix)
Matrix visual with row/column hierarchies, stepped layout, and independent row/column total styling.
Containers
| Container | Key Properties |
|---|---|
columnHeaders | backColor, fontColor, fontSize, fontFamily, outlineColor, outlineStyle, outlineWeight |
rowHeaders | backColor, fontColor, fontSize, fontFamily, stepped, steppedLayoutIndentation, outlineColor, outlineStyle, outlineWeight |
values | backColorPrimary, backColorSecondary, fontColorPrimary, fontColorSecondary, fontSize, fontFamily |
total | backColor, fontColor, fontSize, fontFamily, applyToHeaders |
grid | gridHorizontal, gridHorizontalColor, gridHorizontalWeight, gridVertical, gridVerticalColor, gridVerticalWeight |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"pivotTable": {
"*": {
"columnHeaders": [
{
"backColor": { "solid": { "color": "#252423" } },
"fontColor": { "solid": { "color": "#FFFFFF" } },
"fontSize": 11,
"fontFamily": "Segoe UI Semibold",
"outlineColor": { "solid": { "color": "#3B3A39" } },
"outlineStyle": 2,
"outlineWeight": 1
}
],
"rowHeaders": [
{
"backColor": { "solid": { "color": "#F3F2F1" } },
"fontColor": { "solid": { "color": "#252423" } },
"fontSize": 11,
"fontFamily": "Segoe UI",
"stepped": true,
"steppedLayoutIndentation": 10
}
],
"values": [
{
"backColorPrimary": { "solid": { "color": "#FFFFFF" } },
"backColorSecondary": { "solid": { "color": "#F3F2F1" } },
"fontColorPrimary": { "solid": { "color": "#252423" } },
"fontColorSecondary": { "solid": { "color": "#252423" } },
"fontSize": 11,
"fontFamily": "Segoe UI"
}
],
"total": [
{
"backColor": { "solid": { "color": "#E1DFDD" } },
"fontColor": { "solid": { "color": "#252423" } },
"fontSize": 11,
"fontFamily": "Segoe UI Semibold",
"applyToHeaders": true
}
],
"grid": [
{
"gridHorizontal": true,
"gridHorizontalColor": { "solid": { "color": "#E1DFDD" } },
"gridHorizontalWeight": 1,
"gridVertical": false
}
]
}
}
}
}Notes
- The theme key is `pivotTable`, not `matrix`. Using
matrixhas no effect — this is a common gotcha. steppedandsteppedLayoutIndentation(pixels) inrowHeaderscontrol the cascading indent for hierarchy levels.pivotTablehas separatecolumnTotalandrowTotalcontainers (8 properties each) for independent grand total styling beyond whattotalcovers.
pythonVisual (Python Visual)
Renders output from a Python script (e.g. matplotlib, seaborn) as a static image inside a Power BI visual container.
Containers
| Container | Key properties |
|---|---|
title | show, text, fontFamily, fontSize, fontColor, bold |
background | show, color, transparency |
border | show, color, width, radius |
dropShadow | show, preset, color, shadowBlur, transparency |
padding | top, right, bottom, left |
script | provider, source |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"pythonVisual": {
"*": {
"title": [{ "fontFamily": "Segoe UI", "fontSize": 12, "bold": false }],
"background": [{ "show": true, "color": { "solid": { "color": "#F5F5F5" } }, "transparency": 0 }],
"border": [{ "show": false }],
"padding": [{ "top": 8, "right": 8, "bottom": 8, "left": 8 }]
}
}
}
}Notes
- The
scriptcontainer holdsprovider(e.g."PBI_CV_...") andsource(the Python code string); neither is meaningful to theme — they are set per-visual. - The rendered plot image fills the visual container; no data-layer formatting (axes, colors, fonts inside the plot) is controlled by Power BI themes — style those inside the Python script itself.
- Use the
python-visualsskill (custom-visuals plugin) when authoring or editing the Python script.
qnaVisual (Q&A Visual)
Provides a natural language question-and-answer interface that generates visuals from typed queries.
Containers
| Container | Key properties |
|---|---|
title | show, text, fontFamily, fontSize, fontColor, bold |
background | show, color, transparency |
border | show, color, width, radius |
dropShadow | show, preset, color, shadowBlur, transparency |
padding | top, right, bottom, left |
inputBox | questionFontFamily, questionFontSize, questionFontColor, questionBold, questionItalic, questionUnderline, background, restatementFontFamily, restatementFontSize, restatementFontColor, hoverColor, acceptedColor, errorColor, warningColor, commitButtonBackgroundColor |
suggestions | show, headerFontFamily, headerFontSize, headerFontColor, headerBold, cardFontFamily, cardFontSize, cardFontColor, cardBold, cardBackground |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"qnaVisual": {
"*": {
"title": [{ "fontFamily": "Segoe UI", "fontSize": 12, "bold": false }],
"background": [{ "show": true, "color": { "solid": { "color": "#FFFFFF" } }, "transparency": 0 }],
"inputBox": [{
"questionFontFamily": "Segoe UI",
"questionFontSize": 14,
"questionFontColor": { "solid": { "color": "#252423" } },
"background": { "solid": { "color": "#F3F2F1" } },
"acceptedColor": { "solid": { "color": "#107C10" } },
"errorColor": { "solid": { "color": "#D13438" } }
}],
"suggestions": [{
"show": true,
"headerFontFamily": "Segoe UI Semibold",
"headerFontSize": 11,
"headerFontColor": { "solid": { "color": "#252423" } },
"cardFontFamily": "Segoe UI",
"cardFontSize": 11,
"cardFontColor": { "solid": { "color": "#605E5C" } }
}]
}
}
}
}Notes
inputBoxhas separate font properties for the question text (questionFontFamily,questionFontSize,questionFontColor) and the restatement line (restatementFontFamily,restatementFontSize,restatementFontColor) — these are distinct fields, not a singlefontFamily/fontColor.suggestionssimilarly splits header and card typography;showcontrols whether the suggestions panel appears at all.- State colors (
acceptedColor,errorColor,warningColor) provide semantic feedback and should maintain sufficient contrast against thebackgroundobject color.
rdlVisual (Paginated Report Visual)
Embeds a Power BI paginated report (SSRS/RDL) inside a Power BI report page as a visual.
Containers
| Container | Key properties |
|---|---|
title | show, text, fontFamily, fontSize, fontColor, bold |
background | show, color, transparency |
border | show, color, width, radius |
dropShadow | show, preset, color, shadowBlur, transparency |
padding | top, right, bottom, left |
toolbar | show, position, pageNavigation, paramButton, openReportButton, useFloatingToolbar |
reportInfo | reportId, workspaceId, reference |
export | show, exportPDF, exportExcel, exportWord, exportPPTX, exportCSV, exportXML, exportMHTML, exportAccessiblePDF |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"rdlVisual": {
"*": {
"title": [{ "fontFamily": "Segoe UI", "fontSize": 12, "bold": false }],
"background": [{ "show": true, "color": { "solid": { "color": "#FFFFFF" } }, "transparency": 0 }],
"border": [{ "show": true, "color": { "solid": { "color": "#E0E0E0" } }, "width": 1 }],
"toolbar": [{ "show": true, "position": 0, "pageNavigation": true, "paramButton": true }],
"export": [{ "show": true, "exportPDF": true, "exportExcel": true }]
}
}
}
}Notes
- The
reportInfocontainer (reportId,workspaceId,reference) identifies which paginated report to embed and is set per-visual, not via theme. - The content of the paginated report itself (fonts, colors, layout defined in the RDL) is not controlled by Power BI report themes — style it in the paginated report directly (Power BI Report Builder or Fabric).
toolbar.positionaccepts0(top) or1(bottom);useFloatingToolbarmakes the toolbar appear only on hover.
ribbonChart (Ribbon Chart)
Column chart that shows rank changes over time using ribbon connectors between bars; the ribbonBands container controls the connector appearance.
Containers
Same container structure as columnChart — includes ribbonBands and totals.
| Container | Key Properties |
|---|---|
categoryAxis | show, fontSize, fontFamily, labelColor, bold, italic, showAxisTitle, titleText, titleFontSize, titleFontFamily, titleColor, gridlineShow, gridlineColor, invertAxis |
valueAxis | show, fontSize, fontFamily, labelColor, bold, italic, showAxisTitle, titleText, titleFontSize, titleFontFamily, titleColor, gridlineShow, gridlineColor, start, end |
legend | show, position, fontSize, fontFamily, labelColor, bold, italic, showTitle, titleText |
labels | show, fontSize, fontFamily, color, bold, italic, labelPosition, labelDisplayUnits, labelPrecision, backgroundColor, enableBackground |
dataPoint | defaultColor, fill, fillTransparency, fillRule, borderShow, borderColor, borderSize |
ribbonBands | show, fillColor, fillMatchColor, fillTransparency, borderShow, borderColor, borderColorMatchFill, borderSize, borderTransparency |
totals | show, fontSize, fontFamily, color, bold, italic, labelDisplayUnits, labelPrecision, backgroundColor, enableBackground, showPositiveAndNegativeValues |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"ribbonChart": {
"*": {
"categoryAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } }
}
],
"valueAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } },
"gridlineShow": true,
"gridlineColor": { "solid": { "color": "#E0E0E0" } }
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"fontSize": 11,
"fontFamily": "Segoe UI"
}
],
"ribbonBands": [
{
"show": true,
"fillMatchColor": true,
"fillTransparency": 30,
"borderShow": false
}
]
}
}
}
}Notes
ribbonBands.fillMatchColor: truetints ribbons to match their corresponding bar color; set tofalseand usefillColorto override with a custom color.ribbonBands.show: falseremoves the connecting ribbons entirely, leaving a plain column chart appearance.borderColorMatchFillcontrols whether the ribbon border inherits the fill color; set tofalseto useborderColorindependently.
scatterChart (Scatter Chart)
Scatter and bubble chart for plotting two (or three) numeric measures against each other; supports play-axis animation.
Containers
| Container | Key Properties |
|---|---|
categoryAxis | show, fontSize, fontFamily, labelColor, gridlineColor, gridlineThickness, gridlineShow |
valueAxis | show, fontSize, fontFamily, labelColor, gridlineColor, gridlineThickness, gridlineShow |
legend | show, position, fontSize, fontFamily, labelColor |
categoryLabels | show, fontSize, fontFamily, color |
markers | borderShow, borderColor, borderWidth, transparency |
dataPoint | fill, defaultColor, fillTransparency, borderShow, borderColor |
legend.position enum: Top, TopCenter, TopRight, Left, Right, LeftCenter, RightCenter, Bottom, BottomCenter, BottomRight
Theme Example
{
"name": "My Theme",
"visualStyles": {
"scatterChart": {
"*": {
"categoryAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"gridlineShow": true,
"gridlineColor": { "solid": { "color": "#E0E0E0" } }
}
],
"valueAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"gridlineShow": true,
"gridlineColor": { "solid": { "color": "#E0E0E0" } }
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } }
}
],
"categoryLabels": [
{
"show": false,
"fontSize": 9,
"fontFamily": "Segoe UI"
}
]
}
}
}
}Notes
scatterCharthas no `labels` container — attempting to set one is silently ignored. Per-point labels usecategoryLabelsinstead.categoryAxisin scatter context controls the X-axis (horizontal numeric axis), not discrete categories.dataPoint.fillsupports conditional formatting rules, making it the right place to drive colour-by-category or colour-by-measure logic.
scorecard (Scorecard)
Power BI goals/metrics tracker visual that connects to a Fabric scorecard to display progress against targets.
Containers
| Container | Key Properties |
|---|---|
header | backgroundColor, foregroundColor, show, showCards, showTitle, showToolbar |
columnHeaders | foregroundColor, show |
scorecard | backgroundColor, foregroundColor, tableBackgroundColor, fontFamily, displayMode, showCommandBar |
goals | backgroundColor, foregroundColor |
Theme Example
{
"scorecard": {
"header": {
"show": true,
"showTitle": true,
"showToolbar": false,
"backgroundColor": { "solid": { "color": "#252423" } },
"foregroundColor": { "solid": { "color": "#FFFFFF" } }
},
"columnHeaders": {
"show": true,
"foregroundColor": { "solid": { "color": "#605E5C" } }
},
"scorecard": {
"backgroundColor": { "solid": { "color": "#FFFFFF" } },
"foregroundColor": { "solid": { "color": "#252423" } },
"tableBackgroundColor": { "solid": { "color": "#F3F2F1" } },
"fontFamily": "Segoe UI",
"displayMode": "list",
"showCommandBar": false
},
"goals": {
"backgroundColor": { "solid": { "color": "#FFFFFF" } },
"foregroundColor": { "solid": { "color": "#252423" } }
}
}
}Notes
- The
scorecardcontainer usesforegroundColor/backgroundColor(notfontColor/backColor) — naming differs from table-family visuals. scorecard.scorecardIdandscorecard.scorecardReferenceare connection properties set at report level, not in theme.- Theme control is intentionally limited; most scorecard appearance (status colours, KPI icons) is governed by the connected Fabric scorecard definition.
scriptVisual (R Script Visual)
Renders output from an R script (e.g. ggplot2, base R graphics) as a static image inside a Power BI visual container.
Containers
| Container | Key properties |
|---|---|
title | show, text, fontFamily, fontSize, fontColor, bold |
background | show, color, transparency |
border | show, color, width, radius |
dropShadow | show, preset, color, shadowBlur, transparency |
padding | top, right, bottom, left |
script | provider, source |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"scriptVisual": {
"*": {
"title": [{ "fontFamily": "Segoe UI", "fontSize": 12, "bold": false }],
"background": [{ "show": true, "color": { "solid": { "color": "#F5F5F5" } }, "transparency": 0 }],
"border": [{ "show": false }],
"padding": [{ "top": 8, "right": 8, "bottom": 8, "left": 8 }]
}
}
}
}Notes
- The
scriptcontainer holdsproviderandsource(the R code string); neither property is meaningful to theme — they are set per-visual. - The rendered plot image fills the container; axis colors, fonts, and chart styling inside the R plot are not controlled by Power BI themes — apply those via ggplot2 themes or base R
par()in the script itself. - Use the
r-visualsskill (custom-visuals plugin) when authoring or editing the R script.
shape (Shape)
A decorative geometric shape (rectangle, circle, line, arrow, etc.) used for visual layout and framing on the report canvas.
Containers
| Container | Key Properties |
|---|---|
shape | tileShape, rectangleRoundedCurve, roundEdge |
fill | show, fillColor, transparency |
outline | show, lineColor, weight, transparency |
rotation | (angle, not typically themed) |
title | show |
background | show, color, transparency |
border | show |
dropShadow | show |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"shape": {
"*": {
"fill": [{ "show": true, "transparency": 0 }],
"outline": [{ "show": false }],
"title": [{ "show": false }],
"background": [{ "show": false }],
"border": [{ "show": false }],
"dropShadow": [{ "show": false }]
}
}
}
}Notes
fill.fillColorandoutline.lineColorare color objects — not plain strings. Use{"solid": {"color": "#DDDDDD"}}.shape.tileShapecontrols the geometry (e.g."rectangle","oval","line","arrow"); this is typically set per-visual, not in the theme.- The
shapetype has novisualHeadercontainer — there is no hover action bar for decorative shapes.
shapeMap (Shape Map)
Custom shape map visual that renders user-supplied TopoJSON/GeoJSON shape files, coloured by data values.
Containers
| Container | Key Properties |
|---|---|
dataPoint | defaultColor, fill, fillRule, showAllDataPoints |
legend | show, position, labelColor, fontSize, fontFamily |
defaultColors | defaultColor, borderColor, borderThickness, defaultShow |
Theme Example
{
"shapeMap": {
"dataPoint": {
"defaultColor": { "solid": { "color": "#0078D4" } },
"showAllDataPoints": true
},
"legend": {
"show": true,
"position": "Bottom",
"labelColor": { "solid": { "color": "#252423" } },
"fontSize": 10,
"fontFamily": "Segoe UI"
},
"defaultColors": {
"defaultColor": { "solid": { "color": "#E1DFDD" } },
"borderColor": { "solid": { "color": "#FFFFFF" } },
"borderThickness": 1,
"defaultShow": true
}
}
}Notes
- Requires a custom shape file (TopoJSON format) — the visual renders no map without one.
defaultColors.defaultColorfills shapes that have no matching data;defaultColors.defaultShowcontrols whether those unmatched shapes are visible at all.dataPointinshapeMaphas notransparencyproperty (unlikefilledMap) — opacity is not adjustable via theme.
slicer (Slicer)
List-style slicer for filtering by discrete field values; supports list, dropdown, and tile display modes.
Containers
| Container | Key Properties |
|---|---|
items | textSize (NOT fontSize), fontFamily, fontColor, bold, italic, underline, background, padding |
header | show, textSize (NOT fontSize), fontFamily, fontColor, bold, italic, showRestatement, text |
searchBox | background, borderColor, outlineStyle |
selection | singleSelect, selectAllCheckboxEnabled, strictSingleSelect |
data | Numeric/date range controls (10 properties) |
slider | Range slider styling (5 properties) |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"slicer": {
"*": {
"items": [
{
"textSize": 11,
"fontFamily": "Segoe UI",
"fontColor": { "solid": { "color": "#252423" } },
"bold": false,
"padding": 4
}
],
"header": [
{
"show": true,
"textSize": 11,
"fontFamily": "Segoe UI Semibold",
"fontColor": { "solid": { "color": "#252423" } },
"showRestatement": true
}
],
"searchBox": [
{
"borderColor": { "solid": { "color": "#D1D1D1" } }
}
]
}
}
}
}Notes
- Both
itemsandheaderusetextSize, notfontSize— usingfontSizeis silently ignored. fontColoris an object{ "solid": { "color": "#hex" } }, not a plain string.- The
searchBoxcontainer styles the hover/focus search input that appears when search is enabled on the slicer; it has no font controls.
stackedAreaChart (Stacked Area Chart)
Stacked area chart that accumulates series values so the filled areas do not overlap; adds seriesLabels and totals on top of the standard area chart containers.
Containers
| Container | Key Properties |
|---|---|
categoryAxis | show, fontSize, fontFamily, labelColor, gridlineColor, gridlineThickness, gridlineShow |
valueAxis | show, fontSize, fontFamily, labelColor, gridlineColor, gridlineThickness, gridlineShow |
legend | show, position, fontSize, fontFamily, labelColor |
labels | show, fontSize, fontFamily, color, labelPosition |
lineStyles | strokeWidth, strokeColor, areaShow, areaColor, areaMatchStrokeColor, showMarker |
markers | borderShow, borderColor, transparency |
seriesLabels | show, showByDefault, textSize, seriesFontFamily, seriesPosition |
totals | show, fontSize, fontFamily, color |
legend.position enum: Top, TopCenter, TopRight, Left, Right, LeftCenter, RightCenter, Bottom, BottomCenter, BottomRight
Theme Example
{
"name": "My Theme",
"visualStyles": {
"stackedAreaChart": {
"*": {
"categoryAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI"
}
],
"valueAxis": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"gridlineColor": { "solid": { "color": "#E0E0E0" } },
"gridlineThickness": 1
}
],
"legend": [
{
"show": true,
"position": "Bottom",
"fontSize": 11,
"fontFamily": "Segoe UI",
"labelColor": { "solid": { "color": "#252423" } }
}
],
"totals": [
{
"show": true,
"fontSize": 11,
"fontFamily": "Segoe UI",
"color": { "solid": { "color": "#252423" } }
}
]
}
}
}
}Notes
- All axis, legend,
lineStyles, andmarkerscontainers are identical tolineChart— see lineChart.md. seriesLabels.textSize(notfontSize) controls the end-of-series label font size;seriesPositionisLeftorRight.totalsrenders a data label at the top of each stacked column showing the sum across all series.
tableEx (Table)
Standard tabular data visual with alternating row support and configurable grid lines.
Containers
| Container | Key Properties |
|---|---|
columnHeaders | backColor, fontColor, fontSize, fontFamily, outlineColor, outlineStyle, outlineWeight |
values | backColorPrimary, backColorSecondary, fontColorPrimary, fontColorSecondary, fontSize, fontFamily |
total | backColor, fontColor, fontSize, fontFamily, totals |
grid | gridHorizontal, gridHorizontalColor, gridHorizontalWeight, gridVertical, gridVerticalColor, gridVerticalWeight |
Theme Example
{
"name": "My Theme",
"visualStyles": {
"tableEx": {
"*": {
"columnHeaders": [
{
"backColor": { "solid": { "color": "#252423" } },
"fontColor": { "solid": { "color": "#FFFFFF" } },
"fontSize": 11,
"fontFamily": "Segoe UI Semibold",
"outlineColor": { "solid": { "color": "#3B3A39" } },
"outlineStyle": 2,
"outlineWeight": 1
}
],
"values": [
{
"backColorPrimary": { "solid": { "color": "#FFFFFF" } },
"backColorSecondary": { "solid": { "color": "#F3F2F1" } },
"fontColorPrimary": { "solid": { "color": "#252423" } },
"fontColorSecondary": { "solid": { "color": "#252423" } },
"fontSize": 11,
"fontFamily": "Segoe UI"
}
],
"total": [
{
"backColor": { "solid": { "color": "#E1DFDD" } },
"fontColor": { "solid": { "color": "#252423" } },
"fontSize": 11,
"fontFamily": "Segoe UI Semibold",
"totals": true
}
],
"grid": [
{
"gridHorizontal": true,
"gridHorizontalColor": { "solid": { "color": "#E1DFDD" } },
"gridHorizontalWeight": 1,
"gridVertical": false
}
]
}
}
}
}Notes
- Use
backColor(notbackgroundColor) for column headers and totals row background. backColorPrimary/backColorSecondarycontrol alternating row banding invalues;backColorinvaluessets a flat (non-banded) background.outlineStyleis an integer — common values:0(none),1(bottom only),2(all sides).