# Pie Plume: technical reference for AI assistants

> Power BI custom visual by Plume Studio (Plume Visuals). Visual version **1.1.0.0**. This page is generated from the visual's source code at each site build: field names, option names and defaults are exact for this version.

Use it to help someone build a report with Pie Plume: which fields to drag, how to shape the data, which Format pane option to change, or how to write the visual's settings in a PBIP `visual.json` file.

- Product page: https://plumevisuals.com/en/visuals/pie-chart (French: https://plumevisuals.com/fr/visuels/pie-chart)
- Summary: The donut Power BI is missing: a figure in the center, labels that stay readable, Others, half donut, rose and slice breakdown.
- Power BI visual GUID (`visualType`): `plumePieChartA98296CC7934459199F53486CD90BFCD`
- Power BI visuals API: 5.11.1
- Support: https://plumevisuals.com/support · contact@plumevisuals.com
- Index of everything on the site for AI assistants: https://plumevisuals.com/llms.txt

## What the visual does

Pie Plume (identifier `pie-chart`) is a Power BI custom visual (version 1.1.0.0, installed from its `.pbiviz` file; not yet on AppSource) that draws **pie charts, donut charts and Nightingale roses** with the Plume Studio look. It covers the native pie and donut charts (Legend with drill-down, Values, Details, tooltips, detail labels, rotation, inner radius, colors per category, cross-filtering, highlighting, small multiples) and fixes their known gaps.

**New in version 1.1.0.0 (30/10/2026):** Format pane reorganized (`shape.*` split into **Layout** and **Parts**); free **label background** (color, transparency).

- **Text in the center of the donut** (free): the total of the slices, the "Center value" measure, free text with `{total}`, `{count}`, `{measure}`, the number of slices; caption under the value; ★ with `center.hover` (off by default), the hovered or selected slice (name, value, share) replaces it while hovering.
- **Labels that never overlap** (free): outside labels are arranged in two columns (left and right) with leader lines, spread vertically; when room is short, the smallest slices lose their label first, never the large ones. Long names wrap on two lines; "< 1 %" instead of "0 %". Labels can also be inside, automatic (inside when the whole text fits) or around the slices.
- **Sort** by value, name, data order (Sort by column), ★ a custom list; **Top N or threshold + "Others"** ★.
- **Details field**: every slice is cut into sub-parts in shades of its color (free), or ★ one color per sub-category (the same in every slice), a gradient, or concentric layers whose area follows the share.
- **Slice breakdown** ★: the sub-categories of a slice (or the members of "Others") as an outer ring, a pie of pie or a bar of pie, linked to the slice, on click or always shown (largest, "Others", a named slice, all for the ring).
- **Previous period** ★: a thin ring with the former shares, the change of the total (▲ / ▼, %) in the center, change per slice in share points or % in the tooltip.
- **Shapes**: donut (hole 5–92 %), full pie, ★ Nightingale rose (area or radius proportional, equal angles or by value, or angle by Values and radius by the "Radius" measure), rotation, clockwise or not, ★ opening under 360° (half donut, arcs), gaps of constant width, rounded corners, outline; the selected slice pops out (free), ★ the largest or named slices, ★ patterns.
- **Small multiples** (shared legend, panel titles with totals, scrolling grid; ★ pies sized by their total) and a **play axis** ★ (shared Plume player: slices glide from one value to the next, the center total counts).
- Values: only positive values are drawn; negative, zero or empty ones are counted and reported in edit mode. Above 240 slices, the smallest are gathered into "Others" with no watermark (readability limit).

## Free vs premium (★)

- Every feature works without a key and nothing is ever blocked. Free features never show a watermark.
- Shared Style card (the same in every Plume visual): the styles `none`, `minimal` and `blackWhite`, the two Plume gradient palettes (`crest`, `crestDiverging`), "Follow report theme" and all custom colors are **free**; every other `style.preset`, the other gradient palettes (`style.palette`) and `style.themeJson` ("Theme JSON ★") are **premium**. The `blackWhite` style brings its own free patterns.
- Free in Pie Plume: donut, full pie, rotation, direction, gaps, corners, outline, selected slice popping out; total, measure, text or count in the center, caption, sizes and colors; every label option; sort (value, name, data order); Details split in shades; small multiples with the same size; palette (one color per slice); legend; drill-down, tooltips, selection, highlighting, keyboard, high contrast.
- Premium features of Pie Plume (the watermark only shows when the feature really applies):
  - `layout.kind` = `rose` (and the `radius` role); `layout.arc` below 360; `parts.explode` = `largest` or `name`; `parts.patterns`;
  - `sort.others` = `topN` or `threshold` when at least two slices are grouped;
  - with a Details field: `split.colors` = `category` or `gradient`, `split.layout` = `radial`;
  - `breakdown.mode` = `ring`, `pieOfPie` or `barOfPie` (with Details or "Others");
  - the `previous` role while `comparison.show` is on;
  - `smallMultiples.sizeBy` = `total` with small multiples;
  - `dataColors.mode` = `gradient`, `highlight` or `mono` (shades of one color);
  - since the free / ★ rebalance of 22/10/2026: the play axis (`play` role) as soon as it contains data; `sort.by` = `custom` with a non-empty `sort.customOrder`; `center.hover` on (donut with the center shown).
- Without a valid key, a premium feature in use shows, in edit mode, a "Premium preview" note in the footer; in reading view, **"Plume Visuals · Premium preview"** (French « Plume Visuals · Aperçu premium ») is repeated lightly across the whole visual, without catching the mouse. It disappears once a key is pasted in **Format › Plume Studio License › License key** (`license.key`), the **first card** of the Format pane. Premium options and list values have " ★" appended to their label.
- Accepted keys: only keys starting with `PLUM1.` shown in the buyer's account on plumevisuals.com, checked offline (Ed25519 signature), covering `pie-chart` or the whole catalog. In edit mode, a wrong key shows "Invalid license key", "License expired (date)" or "This key does not cover this visual".
- Licenses last one year (one-time payment, no automatic renewal, key accepted for 30 more days, reminders 30 and 7 days before the end). Prices: 39 € personal, 99 € SME, 299 € enterprise per year, or the catalog pack (199 € / 399 € / 1,199 € per year; tiers by number of users: personal 1–10, SME 11–200, enterprise more than 200).

## Expected data shape

One row per sale (or per category); the visual adds up the measure per slice.

| Legend (`category`) | Details (`detail`) | Values (`values`) |
|---|---|---|
| North West | Lighting | 41,200 |
| North West | Furniture | 38,600 |
| East Midlands | Home linen | 12,400 |

- **Legend (categories)** (`category`, « Légende (catégories) », 1 to 6 columns): one slice per value; several fields make a hierarchy (Power BI drill-down; "Expand all" joins the levels in the label). Without a Legend, up to 12 measures in Values become one slice each (selection by measure).
- **Details (sub-category)** (`detail`, « Détails (sous-catégorie) », 1 column): splits every slice, or feeds the breakdown ★.
- **Values** (`values`, « Valeurs »): 1 measure with a Legend, up to 12 without.
- **Radius (rose) ★** (`radius`, « Rayon (rose) ★ »): with `layout.kind` = `rose`, the angle follows Values and the radius this measure ("Others" uses the value-weighted average).
- **Center value** (`center`, « Valeur au centre »): written in the center with `center.value` = `measure`; write it with `CALCULATE ( …, ALLSELECTED () )`; if values differ per slice, they are added up.
- **Previous period ★** (`previous`, « Période précédente ★ »): same measure for the period before.
- **Small multiples** (`multiples`), **Play axis ★** (`play`, « Axe de lecture ★ »), **Tooltips** (`tooltips`, up to 5 measures), **Dynamic format** (`format`, see below).
- Volume: 30,000-row windows then `fetchMoreData` up to 100,000 rows; 100,004 rows render in well under a second in the test bench.

## DAX recipes

```dax
Total revenue = SUM ( Sales[Revenue] )
// Same value for every slice (center)
Customers (all) = CALCULATE ( DISTINCTCOUNT ( Sales[Customer] ), ALLSELECTED () )
// Current and previous year (Values and Previous period ★)
Revenue 2025 = CALCULATE ( [Total revenue], Sales[Year] = 2025 )
Revenue 2024 = CALCULATE ( [Total revenue], Sales[Year] = 2024 )
// Rose radius ★
Margin rate = DIVIDE ( SUM ( Sales[Margin] ), SUM ( Sales[Revenue] ) )
```

## Interactions with the report

- Click a slice: cross-filter on its category (Details sub-part: category + sub-category; "Others": every grouped category; measures mode: the measure); Ctrl for several; click an empty area to clear. The selected slice pops out (`parts.explode` = `selected`) and, with `center.hover` ★, shows in the center. Cross-highlighting from other visuals fills each slice in proportion (rest dimmed); "Highlighted value" in the tooltip.
- Hover: Power BI tooltip (category, value, share of total, previous value and change, Tooltips measures); report-page tooltips are supported. Context menu everywhere, including the empty area and the landing page.
- Breakdown "on click": selecting one slice opens its detail; clearing the selection closes it. Nothing is saved with `persistProperties` (play frame, hover and breakdown are per session).
- Keyboard: Tab to the chart, ← → slice by slice, Enter selects, Esc clears; with a play axis, Space plays / pauses and Page Up / Page Down step. High contrast (host colors, a pattern per slice), ARIA labels, French and English. "Reduce motion" is respected.

## Dynamic formats

- **fx button** (Power BI conditional formatting) on colors and texts of the Format pane, and per category on the slice colors.
- **"Dynamic format" well** (`format`): measures renamed `card.setting` (e.g. `title.text`, `title.color`, `center.text`, `layout.kind`) drive any setting and win over the fixed value. Driving a ★ setting by DAX still shows the watermark without a key.

```dax
// renamed title.text
Dynamic title = "Revenue 2025: " & FORMAT ( CALCULATE ( [Total revenue], ALLSELECTED (), Sales[Year] = 2025 ), "$#,0" )
// renamed title.color
Title color = IF ( [Revenue 2025] >= [Revenue 2024], "#2E7D4F", "#C0392B" )
```

## Format pane: option IDs

- Card order: `license`, `style`, `dataColors`, `shape`, `center`, `labels`, `sort`, `split`, `breakdown`, `comparison`, `legend`, `smallMultiples`, `play`, `interaction`, then `title`, `source`, `container`, `texts`. Format pane in version 1.1.0.0 (30/10/2026), top to bottom: `license`, `style`, `dataColors`, `layout`, `parts`, `center`, `labels`, `sort`, `split`, `breakdown`, `comparison`, `legend`, `smallMultiples`, `play`, `interaction`, `tooltip`, `title`, `source`, `container`, `texts`. Settings moved or renamed in this version keep working in older reports (the old names are still read).
- `dataColors`: `mode` (`category` | `mono` ★ | `gradient` ★ | `highlight` ★), `single`, `fill`, `highlightWhat` (`max` | `min` | `name`), `highlightName`, `highlightColor`, `othersColor`.
- `parts`: `layout.kind` (`donut` | `pie` | `rose` ★), `layout.innerRadius` (5–92, 58), `layout.roseScale` (`area` | `radius`), `layout.roseAngles` (`equal` | `value`), `layout.roseGrid`, `layout.startAngle` (-360–360, 0), `layout.arc` (60–360, 360), `layout.clockwise`, `padAngle` (0–10, 0.8), `cornerRadius` (0–30, 2), `stroke`, `strokeWidth` (0.5–6, 1), `strokeColor`, `patterns` ★, `explode` (`none` | `selected` | `largest` ★ | `name` ★), `explodeName`, `explodeOffset` (0–40, 8).
- `center`: `show`, `value` (`total` | `measure` | `text` | `count` | `none`), `text`, `label`, `hover` ★ (off), `fontSize` (0–96, 0), `color`, `labelSize` (6–30, 11), `labelColor`, `showChange`.
- `labels`: `show`, `content` (`catPct` | `cat` | `value` | `pct` | `catValue` | `valuePct` | `all`), `position` (`outside` | `auto` | `inside`), `leader`, `layout` (`columns` | `around`), `minPct` (0–20, 0), `pctDecimals` (0–3, 0), `wrap`, `fontSize` (6–24, 10), `color`, `bold`, `halo`, `declutter`, `units` (`auto` | `none` | `k` | `m` | `b`), `decimals` (-1–6, -1), `prefix`, `suffix`.
- `sort`: `by` (`valueDesc` | `valueAsc` | `labelAsc` | `labelDesc` | `data` | `custom` ★), `customOrder`, `others` (`none` | `topN` ★ | `threshold` ★), `n` (1–50, 6), `threshold` (0.1–30, 3), `othersLabel`.
- `split`: `colors` (`tints` | `category` ★ | `gradient` ★), `layout` (`angular` | `radial` ★), `separators`, `legend` (`auto` | `categories` | `details`).
- `breakdown`: `mode` (`none` | `ring` ★ | `pieOfPie` ★ | `barOfPie` ★), `trigger` (`click` | `always`), `target` (`largest` | `others` | `name` | `all`), `targetName`, `size` (20–80, 42), `links`.
- `comparison`: `show`, `position` (`outside` | `inside`), `width` (2–20, 5), `change` (`points` | `percent`).
- `legend`: `show`, `position` (`top` | `bottom` | `right` | `left`), `align` (`left` | `center` | `right`), `showTitle`, `titleText`, `fontSize` (6–24, 9), `color`, `interactive`.
- `smallMultiples`: `columns` (0–12, 0), `minHeight` (50–600, 110), `gap` (0–60, 14), `sizeBy` (`same` | `total` ★), `border`, `titleShow`, `titleSize` (6–24, 10), `titleColor`, `titleTotal`.
- `play`: the shared player card (★: the play axis itself is premium) (`start`, `speed`, `loop`, `autoPlay`, `transition`, `controls`, `position`, `ticks`, `tickLabels`, `stepButtons`, `speedButton`, `showLabel`, `labelSize`, `labelPosition`). `interaction`: `hover`, `dim` (5–80, 25).

## Editing a PBIP report (visual.json)

`visualType` is the visual GUID, `queryState` keys are the data role names, `objects` keys are the option IDs. Booleans `true` / `false`, numbers suffixed with `D`, strings and enumeration values in single quotes.

```json
{
  "visualType": "plumePieChartA98296CC7934459199F53486CD90BFCD",
  "query": {
    "queryState": {
      "category": { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Region" } }, "queryRef": "Sales.Region", "nativeQueryRef": "Region" } ] },
      "values":   { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Total revenue" } }, "queryRef": "Sales.Total revenue", "nativeQueryRef": "Total revenue" } ] }
    }
  },
  "objects": {
    "center": [ { "properties": { "label": { "expr": { "Literal": { "Value": "'2025 revenue'" } } } } } ],
    "sort":   [ { "properties": { "others": { "expr": { "Literal": { "Value": "'topN'" } } }, "n": { "expr": { "Literal": { "Value": "5D" } } } } } ]
  }
}
```

The custom visual package must also be embedded in the report (Power BI does this when the visual is imported from the `.pbiviz` file).

## Styles and theme JSON

- `style.preset` takes one of the 20 style IDs shared by every Plume visual: `none`, `minimal`, `blackWhite`, `press`, `vintage`, `earth`, `nordic`, `executive`, `accessible`, `pastel`, `bauhaus`, `climate`, `blueprint`, `unknownPleasures`, `dark`, `neon`, `terminal`, `infographic`, `cockpit`, `hologram`. Slice colors follow the categorical palette of the style; colors set per category in Data colors win over the style.
- `style.themeJson` (Theme JSON ★): a JSON theme as plain text (format v2 with optional `extends` and groups `colors`, `palettes`, `typography`, `shape`, `table`, `marks`, `effects`). Full reference: https://plumevisuals.com/ai/tutorials/en/themes-json.md.

## Common pitfalls

- "No positive value to draw": every value is empty, zero or negative.
- "n negative or zero value(s) not drawn" (edit mode): those categories have no place in a circle; use Waterfall Plume for balances.
- A small slice has no label: the label column is full; enlarge the visual, reduce the text size or group small slices into "Others" ★.
- The center is empty: `layout.kind` = `pie` (no hole), `center.show` off, or the comparison ring placed in the hole.
- The center measure looks too big: it is evaluated per slice and added up; write it with `ALLSELECTED`.
- The legend does not show: hidden by default (`legend.show`); it shows by itself with small multiples and with `split.colors` = `category`.
- Watermark visible: rose, opening below 360°, patterns, exploded largest / named slice, "Others" grouping two slices or more, sub-category colors / gradient / layers, breakdown, previous period ring, sized small multiples, shades / gradient / highlight colors, custom order, hovered slice in the center, play axis with data, a ★ style or a theme JSON, without a valid key.
- The visual makes no network request: data and license key stay in the report; no R or Python.

## Features that do NOT exist (do not suggest them)

3D pies, images inside slices, drill-down inside the visual (use Power BI's drill-down on the Legend hierarchy), a summary table, exporting the chart as an image, saving the play frame or the opened breakdown with the report, negative slices.

## Data fields (wells)

Internal name = data role name (PBIP `queryState` key). Labels as shown in Power BI (English / French). ★ = premium.

| Internal name | Label (EN) | Label (FR) | Kind | Max fields | Description |
|---|---|---|---|---|---|
| `category` | Legend (categories) | Légende (catégories) | column | 6 | One slice per value. Several fields make a hierarchy you can drill into. |
| `detail` | Details (sub-category) | Détails (sous-catégorie) | column | 1 | Splits every slice into sub-parts (shades, colors or a gradient), or feeds the breakdown of a slice (outer ring, pie of pie, bar of pie). |
| `values` | Values | Valeurs | measure | 12 | Size of the slices. Without a Legend, several measures give one slice each. |
| `radius` | Radius (rose) ★ | Rayon (rose) ★ | measure | 1 | Nightingale rose: the angle follows Values and the radius follows this measure. |
| `center` | Center value | Valeur au centre | measure | 1 | Measure written in the center of the donut (Format › Center › Value: Center value field). |
| `previous` | Previous period ★ | Période précédente ★ | measure | 1 | Same measure for the previous period: a thin ring shows the former shares, the center shows the change. |
| `multiples` | Small multiples | Petits multiples | column | 1 |  |
| `play` | Play axis ★ | Axe de lecture ★ | column | 1 | A date, a year or an ordered category: the visual moves from one value to the next (play button) |
| `tooltips` | Tooltips | Infobulles | measure | 5 |  |
| `format` | Dynamic format | Format dynamique | measure | several | Measures named card.setting (e.g. title.fontSize): drive any Format option with DAX |

Data view: categorical, categories = `multiples` + `category` + `detail` + `play` (one row per combination), 30,000 rows per data window (more fetched automatically); measures = `values`, `radius`, `center`, `previous`, `tooltips`, `format`.
Capabilities: supportsHighlight, supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).

## Format pane options (176)

Columns: option ID (`object.property`), labels EN / FR as shown in Power BI, control type, PBIP literal type, default value, allowed values, notes.

### Plume Studio License / Licence Plume Studio (`license`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `license.buy` | Get a license | Obtenir une licence | info | text | `plumevisuals.com` |  |  |
| `license.key` | License key | Clé de licence | text | text | (empty) |  | Paste the key received after purchase on plumevisuals.com (starts with PLUM1.). Checked offline. |
| `license.showOwner` | Show license holder (edit mode) | Afficher le titulaire (mode édition) | toggle | bool | `true` | true / false |  |

### Style (`style`, Format pane)

**Style**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `style.preset` | Style | Style | dropdown | enumeration | `none` | `none` None; `minimal` Minimal; `blackWhite` Black & White; `press` Newspaper ★; `vintage` Vintage (antique plate) ★; `earth` Earth ★; `nordic` Nordic ★; `executive` Executive ★; `accessible` Accessible (high legibility) ★; `pastel` Pastel ★; `bauhaus` Bauhaus (pop) ★; `climate` Climate ★; `blueprint` Blueprint ★; `unknownPleasures` Unknown Pleasures ★; `dark` Graphite (dark) ★; `neon` Neon ★; `terminal` Terminal (Matrix) ★; `infographic` Infographic ★; `cockpit` Cockpit (HUD) ★; `hologram` Hologram ★ | Complete look shared by all Plume visuals: colors, three palettes, fonts, frame, table header, marks and effects. Customize colors below. |
| `style.themeJson` | Theme JSON ★ | Thème JSON ★ | textarea | text | (empty) |  | Paste a JSON theme: see the 'JSON themes' tutorial on plumevisuals.com |
| `style.followTheme` | Follow report theme | Suivre le thème du rapport | toggle | bool | `false` | true / false | Text, background, accent and data colors come from the Power BI report theme. |
| `style.reverse` | Reverse gradients | Inverser les dégradés | toggle | bool | `false` | true / false |  |

**Custom colors / Couleurs personnalisées**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `style.customColors` | Customize colors | Personnaliser les couleurs | toggle | bool | `false` | true / false | Start from the style and pick your own colors. A color left empty keeps the style's color. |
| `style.colorBackground` | Background | Fond | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorText` | Text | Texte | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorMuted` | Secondary text | Texte secondaire | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorGrid` | Lines and grid | Traits et grille | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorAccent` | Accent | Accent | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorPositive` | Favorable | Favorable | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorNegative` | Unfavorable | Défavorable | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series1` | Series 1 | Série 1 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series2` | Series 2 | Série 2 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series3` | Series 3 | Série 3 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series4` | Series 4 | Série 4 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series5` | Series 5 | Série 5 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series6` | Series 6 | Série 6 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series7` | Series 7 | Série 7 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series8` | Series 8 | Série 8 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.palette` | Gradient palette | Palette du dégradé | dropdown | enumeration | `auto` | `auto` Style or theme palette; `crest` Plume (sequential); `crestDiverging` Plume (diverging); `viridis` Viridis ★; `magma` Magma ★; `inferno` Inferno ★; `cividis` Cividis (colorblind-safe) ★; `warmingStripes` Warming stripes ★; `rdYlBu` Red–Yellow–Blue ★; `brBG` Brown–Teal (drought) ★; `spectral` Spectral ★; `blues` Blues ★; `reds` Reds ★; `grays` Grays ★; `press` Press (ink and paper) ★; `nordic` Nordic ★; `earth` Earth (ochre to umber) ★; `pastel` Pastel ★; `okabeIto` Okabe-Ito (colorblind-safe) ★ | Visible when `style.customColors` = `true`. Gradient from the catalog (Viridis, Magma…). The start, middle and end colors below replace it. |
| `style.scaleLow` | Gradient: start | Dégradé : début | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.scaleMid` | Gradient: middle (diverging) | Dégradé : milieu (écarts) | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.scaleHigh` | Gradient: end | Dégradé : fin | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |

**Text / Texte**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `style.fontFamily` | Font | Police | font | formatting | `Segoe UI, wf_segoe-ui_normal, helvetica, arial, sans-serif` |  | Used by every text of the visual (title, axes, labels, cells). |

**Animations**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `style.animate` | Animations | Animations | toggle | bool | `true` | true / false | Smooth transitions when data changes. Automatically disabled when the system asks to reduce motion. |

### Layout / Disposition (`layout`, Format pane)

**Type**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `layout.kind` | Shape | Forme | dropdown | enumeration | `donut` | `donut` Donut (ring); `pie` Full pie; `rose` Nightingale rose ★ | Rose: every slice gets the same angle (or the angle of its value) and its radius shows the value. With a “Radius” field, the angle follows Values and the radius follows Radius. |
| `layout.innerRadius` | Inner radius (% of radius) | Rayon intérieur (% du rayon) | number | integer | `58` | 5 to 92 | Visible when `layout.kind` = `donut` or `rose`. Size of the hole of the donut (the « Spacing › Inner radius » of the native donut chart). |
| `layout.roseScale` | Rose radius | Rayon de la rose | dropdown | enumeration | `area` | `area` Area proportional (Nightingale); `radius` Radius proportional | Visible when `layout.kind` = `rose`. Area proportional: a value twice as large covers twice the surface (the honest choice). |
| `layout.roseAngles` | Rose slice angles | Angle des parts de la rose | dropdown | enumeration | `equal` | `equal` Equal (one slice per category); `value` By value | Visible when `layout.kind` = `rose` |
| `layout.roseGrid` | Rose guide circles | Cercles de repère de la rose | toggle | bool | `true` | true / false | Visible when `layout.kind` = `rose` |

**Rotation and opening / Rotation et ouverture**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `layout.startAngle` | Rotation (start angle, °) | Rotation (angle de départ, °) | number | integer | `0` | -360 to 360 | 0 = the first slice starts at 12 o'clock; 90 = at 3 o'clock. |
| `layout.arc` | Opening (°, 180 = half circle) | Ouverture (°, 180 = demi-cercle) | number | integer | `360` | 60 to 360 | Less than 360°: half donut, gauge-like arc (premium). With 180° and a rotation of -90°, the half circle stands on its base. |
| `layout.clockwise` | Clockwise | Sens des aiguilles d'une montre | toggle | bool | `true` | true / false |  |

### Data colors / Couleurs des données (`dataColors`, Format pane)

Per-item card: Power BI shows it once per series, category, column or KPI (an "Apply settings to" list where relevant). In PBIP `visual.json`, each entry of `objects.dataColors` carries a `selector` (`metadata` = the field's queryRef, or `data` for a category value); an entry without a selector applies to all items.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `dataColors.mode` | Coloring | Coloration | dropdown | enumeration | `category` | `category` Palette (one color per slice); `mono` Shades of a single color ★; `gradient` Gradient by value ★; `highlight` Highlight one slice ★ |  |
| `dataColors.single` | Color | Couleur | color | fill | (empty) | hex color |  |
| `dataColors.fill` | Color | Couleur | color | fill | (empty) | hex color |  |
| `dataColors.highlightWhat` | Highlighted slice | Part mise en avant | dropdown | enumeration | `max` | `max` The largest; `min` The smallest; `name` By its name |  |
| `dataColors.highlightName` | Slice name | Nom de la part | text | text | (empty) |  |  |
| `dataColors.highlightColor` | Highlighted slice color (empty = accent) | Couleur de la part mise en avant (vide = accent) | color | fill | (empty) | hex color |  |
| `dataColors.othersColor` | Other slices color (empty = gray) | Couleur des autres parts (vide = gris) | color | fill | (empty) | hex color |  |

### Slices / Parts (`parts`, Format pane)

**Slices / Parts**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `parts.padAngle` | Gap between slices (°) | Espace entre les parts (°) | number | numeric | `0.8` | 0 to 10 |  |
| `parts.cornerRadius` | Corner radius (px) | Arrondi des angles (px) | number | integer | `2` | 0 to 30 |  |
| `parts.stroke` | Outline | Contour | toggle | bool | `true` | true / false |  |
| `parts.strokeWidth` | Outline width | Épaisseur du contour | number | numeric | `1` | 0.5 to 6 | Visible when `parts.stroke` = `true` |
| `parts.strokeColor` | Outline color (empty = background) | Couleur du contour (vide = fond) | color | fill | (empty) | hex color | Visible when `parts.stroke` = `true` |
| `parts.patterns` | Patterns (hatching, dots) ★ | Motifs (hachures, points) ★ | toggle | bool | `false` | true / false | A different pattern on each slice: readable in black and white prints and without colors. |

**Exploded slices / Parts détachées**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `parts.explode` | Explode | Détacher | dropdown | enumeration | `selected` | `none` No slice; `selected` The selected slice; `largest` The largest slice ★; `name` A slice chosen by name ★ |  |
| `parts.explodeName` | Slice name (separated by ;) | Nom de la part (séparés par ;) | text | text | (empty) |  | Visible when `parts.explode` = `name` |
| `parts.explodeOffset` | Distance (px) | Distance (px) | number | integer | `8` | 0 to 40 | Visible when `parts.explode` = `selected` or `largest` or `name` |

### Donut center / Centre de l'anneau (`center`, Format pane)

The card header toggle is `center.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `center.show` | Show | Afficher | toggle | bool | `true` | true / false | Text in the hole of the donut (and of the rose when it has a hole). |
| `center.value` | Value | Valeur | dropdown | enumeration | `total` | `total` Total of the slices; `measure` “Center value” field; `text` Free text; `count` Number of slices; `none` None (caption only) | Center value field: write the measure with CALCULATE ( [Measure], ALLSELECTED () ) so it is the same for every slice. |
| `center.text` | Free text | Texte libre | text | text | (empty) |  | Visible when `center.value` = `text`. Placeholders: {total}, {count}, {measure}. Also driven by DAX with the fx button. |
| `center.label` | Caption under the value | Légende sous la valeur | text | text | (empty) |  |  |
| `center.hover` | Show the hovered or selected slice ★ | Afficher la part survolée ou sélectionnée ★ | toggle | bool | `false` | true / false | Hovering or selecting a slice writes its name, value and share in the center. |
| `center.fontSize` | Value size (0 = automatic) | Taille de la valeur (0 = automatique) | number | integer | `0` | 0 to 96 |  |
| `center.color` | Value color (empty = text) | Couleur de la valeur (vide = texte) | color | fill | (empty) | hex color |  |
| `center.labelSize` | Caption size | Taille de la légende | number | formatting | `11` | 6 to 30 |  |
| `center.labelColor` | Caption color (empty = secondary) | Couleur de la légende (vide = secondaire) | color | fill | (empty) | hex color |  |
| `center.showChange` | Change from the previous period | Évolution par rapport à la période précédente | toggle | bool | `true` | true / false | With a “Previous period” field: ▲ / ▼ and the change of the total under the value. |

### Data labels / Étiquettes de données (`labels`, Format pane)

The card header toggle is `labels.show`.

**Labels / Étiquettes**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `labels.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `labels.content` | Content | Contenu | dropdown | enumeration | `catPct` | `catPct` Category and %; `cat` Category; `value` Value; `pct` % of total; `catValue` Category and value; `valuePct` Value and %; `all` Category, value and % |  |
| `labels.position` | Position | Position | dropdown | enumeration | `outside` | `outside` Outside; `auto` Automatic (inside when all fits); `inside` Inside |  |
| `labels.leader` | Leader lines | Traits de rappel | toggle | bool | `true` | true / false |  |
| `labels.layout` | Outside labels | Étiquettes extérieures | dropdown | enumeration | `columns` | `columns` Aligned in columns left and right; `around` Around the slices | Columns: labels are spread vertically so they never overlap, with a leader line to their slice. |
| `labels.minPct` | Hide below (% of total) | Masquer sous (% du total) | number | numeric | `0` | 0 to 20 |  |
| `labels.pctDecimals` | Decimals of % | Décimales des % | number | integer | `0` | 0 to 3 |  |
| `labels.wrap` | Long names on two lines | Noms longs sur deux lignes | toggle | bool | `true` | true / false |  |
| `labels.bg` | Background | Arrière-plan | toggle | bool | `false` | true / false | A box behind each label (like the background of the native detail labels). |
| `labels.bgColor` | Background color (empty = background) | Couleur de l'arrière-plan (vide = fond) | color | fill | (empty) | hex color | Visible when `labels.bg` = `true` |
| `labels.bgTransparency` | Background transparency (%) | Transparence de l'arrière-plan (%) | slider | numeric | `10` | 0 to 100 | Visible when `labels.bg` = `true` |
| `labels.fontSize` | Size | Taille | number | formatting | `10` | 6 to 24 |  |
| `labels.color` | Color (empty = automatic) | Couleur (vide = automatique) | color | fill | (empty) | hex color | Automatic: readable color depending on the background (inside bars: white or dark). |
| `labels.bold` | Bold | Gras | toggle | bool | `false` | true / false |  |
| `labels.halo` | Text halo | Halo autour du texte | toggle | bool | `true` | true / false |  |
| `labels.declutter` | Hide overlapping labels | Masquer les étiquettes qui se chevauchent | toggle | bool | `true` | true / false |  |

**Numbers / Nombres**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `labels.units` | Display units | Unités d'affichage | dropdown | enumeration | `auto` | `auto` Auto; `none` None; `k` Thousands; `m` Millions; `b` Billions |  |
| `labels.decimals` | Decimals (-1 = auto) | Décimales (-1 = auto) | number | integer | `-1` | -1 to 6 |  |
| `labels.prefix` | Prefix | Préfixe | text | text | (empty) |  |  |
| `labels.suffix` | Suffix (e.g. €) | Suffixe (ex. €) | text | text | (empty) |  |  |

### Legend / Légende (`legend`, Format pane)

The card header toggle is `legend.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `legend.show` | Show | Afficher | toggle | bool | `false` | true / false | Shown when the chart has several series. |
| `legend.position` | Position | Position | dropdown | enumeration | `right` | `top` Top; `bottom` Bottom; `right` Right; `left` Left |  |
| `legend.align` | Alignment | Alignement | dropdown | enumeration | `left` | `left` Start; `center` Center; `right` End | Visible when `legend.position` = `top` or `bottom` |
| `legend.showTitle` | Legend title | Titre de la légende | toggle | bool | `false` | true / false |  |
| `legend.titleText` | Title text | Texte du titre | text | text | (empty) |  | Visible when `legend.showTitle` = `true` |
| `legend.fontSize` | Size | Taille | number | formatting | `9` | 6 to 24 |  |
| `legend.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `legend.interactive` | Click = select the series | Clic = sélectionner la série | toggle | bool | `true` | true / false |  |

### Sort / Tri (`sort`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `sort.by` | Slice order | Ordre des parts | dropdown | enumeration | `valueDesc` | `valueDesc` Value descending; `valueAsc` Value ascending; `labelAsc` Name (A → Z); `labelDesc` Name (Z → A); `data` Data order (Sort by column); `custom` Custom ★ |  |
| `sort.customOrder` | Custom order (separated by ;) | Ordre personnalisé (séparé par ;) | text | text | (empty) |  | Visible when `sort.by` = `custom` |
| `sort.others` | Group small slices into “Others” | Regrouper les petites parts dans « Autres » | dropdown | enumeration | `none` | `none` No; `topN` Keep the N largest ★; `threshold` Slices under a threshold (%) ★ |  |
| `sort.n` | N | N | number | integer | `6` | 1 to 50 | Visible when `sort.others` = `topN` |
| `sort.threshold` | Threshold (% of total) | Seuil (% du total) | number | numeric | `3` | 0.1 to 30 | Visible when `sort.others` = `threshold` |
| `sort.othersLabel` | “Others” label | Libellé de « Autres » | text | text | (empty) |  | Visible when `sort.others` = `topN` or `threshold` |

### Sub-categories (Details) / Sous-catégories (Détails) (`split`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `split.colors` | Sub-part colors | Couleurs des sous-parts | dropdown | enumeration | `tints` | `tints` Shades of the slice color; `category` One color per sub-category (same in every slice) ★; `gradient` Continuous gradient in the slice ★ | With a field in “Details”, every slice is cut into sub-parts. One color per sub-category: compare the same product across regions at a glance. |
| `split.layout` | Cut | Découpe | dropdown | enumeration | `angular` | `angular` Side by side within the slice angle; `radial` In layers, from the center outward ★ |  |
| `split.separators` | Lines between sub-parts | Traits entre les sous-parts | toggle | bool | `true` | true / false |  |
| `split.legend` | The legend shows | La légende montre | dropdown | enumeration | `auto` | `auto` Automatic; `categories` The slices; `details` The sub-categories | Automatic: the sub-categories with one color per sub-category, the slices otherwise. |

### Slice breakdown / Sous-répartition d'une part (`breakdown`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `breakdown.mode` | Show | Afficher | dropdown | enumeration | `none` | `none` No (slices split in place); `ring` Outer ring ★; `pieOfPie` Pie of pie ★; `barOfPie` Bar of pie ★ | Shows the detail of one slice (its “Details” sub-categories, or the members of “Others”): around the slice, or in a second pie or a bar linked to it. |
| `breakdown.trigger` | When | Quand | dropdown | enumeration | `click` | `click` On click on a slice; `always` Always shown | Visible when `breakdown.mode` = `ring` or `pieOfPie` or `barOfPie` |
| `breakdown.target` | Detailed slice (always shown) | Part détaillée (toujours affichée) | dropdown | enumeration | `largest` | `largest` The largest; `others` “Others”; `name` By its name; `all` All (outer ring only) | Visible when `breakdown.mode` = `ring` or `pieOfPie` or `barOfPie` |
| `breakdown.targetName` | Slice name | Nom de la part | text | text | (empty) |  | Visible when `breakdown.mode` = `ring` or `pieOfPie` or `barOfPie` |
| `breakdown.size` | Detail size (% of width) | Taille du détail (% de la largeur) | number | integer | `42` | 20 to 80 | Visible when `breakdown.mode` = `ring` or `pieOfPie` or `barOfPie` |
| `breakdown.links` | Connector lines | Traits de liaison | toggle | bool | `true` | true / false | Visible when `breakdown.mode` = `ring` or `pieOfPie` or `barOfPie` |

### Comparison / Comparaison (`comparison`, Format pane)

The card header toggle is `comparison.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `comparison.show` | Previous period ring | Anneau de la période précédente | toggle | bool | `true` | true / false |  |
| `comparison.position` | Position | Position | dropdown | enumeration | `outside` | `outside` Around the chart; `inside` In the hole |  |
| `comparison.width` | Width (px) | Épaisseur (px) | number | integer | `5` | 2 to 20 |  |
| `comparison.change` | Change in the tooltip | Évolution dans l'infobulle | dropdown | enumeration | `points` | `points` In share points; `percent` In % of the value |  |

### Small multiples / Petits multiples (`smallMultiples`, Format pane)

**Grid / Grille**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `smallMultiples.columns` | Columns (0 = automatic) | Colonnes (0 = automatique) | number | integer | `0` | 0 to 12 |  |
| `smallMultiples.minHeight` | Minimum panel height (px) | Hauteur minimale d'un panneau (px) | number | integer | `110` | 50 to 600 | Below that, the grid scrolls vertically. |
| `smallMultiples.gap` | Spacing (px) | Espacement (px) | number | integer | `14` | 0 to 60 |  |
| `smallMultiples.sizeBy` | Chart size | Taille des graphiques | dropdown | enumeration | `same` | `same` Same size; `total` Proportional to the panel total ★ | Proportional: the surface of each pie follows its total, so panels compare in size as well as in shares. |
| `smallMultiples.border` | Panel border | Cadre des panneaux | toggle | bool | `false` | true / false |  |

**Titles / Titres**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `smallMultiples.titleShow` | Title of each panel | Titre de chaque panneau | toggle | bool | `true` | true / false |  |
| `smallMultiples.titleSize` | Text size | Taille du texte | number | formatting | `10` | 6 to 24 | Visible when `smallMultiples.titleShow` = `true` |
| `smallMultiples.titleColor` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color | Visible when `smallMultiples.titleShow` = `true` |
| `smallMultiples.titleTotal` | Total in the title | Total dans le titre | toggle | bool | `true` | true / false | Visible when `smallMultiples.titleShow` = `true` |

### Playback ★ / Lecture ★ (`play`, Format pane)

This card controls premium features (★): they work without a license key but show the watermark while in use.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `play.start` | Frame shown on opening | Image affichée à l'ouverture | dropdown | enumeration | `last` | `last` The last one (most recent); `first` The first one |  |
| `play.speed` | Duration of a frame (ms) | Durée d'une image (ms) | number | integer | `1000` | 100 to 10000 | At speed ×1; the speed button of the play bar multiplies it (×0.5 to ×4) for the session. |
| `play.loop` | Loop | Lecture en boucle | toggle | bool | `false` | true / false |  |
| `play.autoPlay` | Play automatically on opening | Lecture automatique à l'ouverture | toggle | bool | `false` | true / false | Once, from the first frame. Not when animations are reduced (Style › Animations or the system) nor on a dashboard tile. |
| `play.transition` | Animated transitions | Transitions animées | toggle | bool | `true` | true / false | Values, positions and colors move smoothly from one frame to the next. |
| `play.controls` | Play bar | Barre de lecture | toggle | bool | `true` | true / false |  |
| `play.position` | Bar position | Position de la barre | dropdown | enumeration | `bottom` | `bottom` Bottom; `top` Top | Visible when `play.controls` = `true` |
| `play.ticks` | Tick marks | Graduations | dropdown | enumeration | `auto` | `auto` Automatic; `all` Every frame; `none` None | Visible when `play.controls` = `true` |
| `play.tickLabels` | Tick labels | Étiquettes des graduations | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |
| `play.stepButtons` | Start and end buttons | Boutons début et fin | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |
| `play.speedButton` | Speed button | Bouton de vitesse | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |
| `play.showLabel` | Current value in large type | Valeur en cours en grand | toggle | bool | `true` | true / false |  |
| `play.labelSize` | Large value size | Taille de la valeur en grand | number | formatting | `44` | 12 to 160 | Visible when `play.showLabel` = `true` |
| `play.labelPosition` | Large value position | Position de la valeur en grand | dropdown | enumeration | `bottomRight` | `bottomRight` Bottom right; `topRight` Top right; `topLeft` Top left; `bottomLeft` Bottom left; `center` Center | Visible when `play.showLabel` = `true` |

### Interactions (`interaction`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `interaction.hover` | Highlight on hover | Mettre en avant au survol | toggle | bool | `true` | true / false |  |
| `interaction.dim` | Dimmed items opacity (%) | Opacité des éléments estompés (%) | number | integer | `25` | 5 to 80 |  |

### Tooltips / Infobulles (`tooltip`, Format pane)

The card header toggle is `tooltip.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `tooltip.show` | Show | Afficher | toggle | bool | `true` | true / false | Tooltip on hover (with the fields of the "Tooltips" well and report page tooltips). |

### Title / Titre (`title`, Format pane)

The card header toggle is `title.show`.

**Title / Titre**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `title.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `title.text` | Text | Texte | text | text | (empty) |  | Leave empty for an automatic title built from the fields. |
| `title.fontSize` | Size | Taille | number | formatting | `14` | 7 to 40 |  |
| `title.bold` | Bold | Gras | toggle | bool | `true` | true / false |  |
| `title.italic` | Italic | Italique | toggle | bool | `false` | true / false |  |
| `title.underline` | Underline | Souligné | toggle | bool | `false` | true / false |  |
| `title.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |
| `title.bgColor` | Background color | Couleur d'arrière-plan | color | fill | (empty) | hex color |  |
| `title.align` | Horizontal alignment | Alignement horizontal | dropdown | enumeration | `left` | `left` Left; `center` Center; `right` Right |  |
| `title.wrap` | Text wrap | Retour automatique à la ligne | toggle | bool | `true` | true / false |  |

**Subtitle / Sous-titre**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `title.subtitle` | Subtitle | Sous-titre | text | text | (empty) |  | Several lines allowed: type \n to go to the next line. |
| `title.subFontSize` | Size | Taille | number | formatting | `11` | 7 to 30 | Visible when `title.subtitle` =  |
| `title.subColor` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color | Visible when `title.subtitle` =  |
| `title.subItalic` | Italic | Italique | toggle | bool | `false` | true / false | Visible when `title.subtitle` =  |

**Divider / Séparateur**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `title.divider` | Show divider | Afficher le séparateur | toggle | bool | `false` | true / false |  |
| `title.dividerColor` | Color (empty = lines) | Couleur (vide = traits) | color | fill | (empty) | hex color | Visible when `title.divider` = `true` |
| `title.dividerStyle` | Line style | Style de trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted | Visible when `title.divider` = `true` |
| `title.dividerWidth` | Width | Épaisseur | number | integer | `1` | 1 to 6 | Visible when `title.divider` = `true` |

**Spacing / Espacement**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `title.spaceBelow` | Space below the title (px) | Espace sous le titre (px) | number | integer | `4` | 0 to 40 |  |

### Source note / Note de source (`source`, Format pane)

The card header toggle is `source.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `source.show` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `source.text` | Text | Texte | text | text | (empty) |  |  |
| `source.fontSize` | Size | Taille | number | formatting | `9` | 6 to 20 |  |
| `source.italic` | Italic | Italique | toggle | bool | `false` | true / false |  |
| `source.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `source.align` | Alignment | Alignement | dropdown | enumeration | `left` | `left` Left; `center` Center; `right` Right |  |

### Frame / Cadre (`container`, Format pane)

**Background / Arrière-plan**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `container.bgShow` | Background | Arrière-plan | toggle | bool | `false` | true / false |  |
| `container.bgColor` | Color | Couleur | color | fill | `#FFFFFF` | hex color | Visible when `container.bgShow` = `true` |
| `container.bgColor2` | Gradient end (optional) | Fin du dégradé (optionnel) | color | fill | (empty) | hex color | Visible when `container.bgShow` = `true` |
| `container.bgTransparency` | Transparency (%) | Transparence (%) | slider | numeric | `0` | 0 to 100 | Visible when `container.bgShow` = `true` |

**Border / Bordure**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `container.border` | Border | Bordure | toggle | bool | `false` | true / false |  |
| `container.borderColor` | Color (empty = lines) | Couleur (vide = traits) | color | fill | (empty) | hex color | Visible when `container.border` = `true` |
| `container.borderWidth` | Width | Épaisseur | number | integer | `1` | 0 to 6 | Visible when `container.border` = `true` |
| `container.radius` | Rounded corners | Coins arrondis | number | integer | `8` | 0 to 24 |  |

**Shadow / Ombre**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `container.shadow` | Shadow | Ombre | toggle | bool | `false` | true / false |  |
| `container.shadowColor` | Color (empty = soft) | Couleur (vide = douce) | color | fill | (empty) | hex color | Visible when `container.shadow` = `true` |
| `container.shadowSize` | Blur (px) | Flou (px) | number | integer | `12` | 0 to 40 | Visible when `container.shadow` = `true` |

**Spacing / Marges**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `container.padding` | Inner padding | Marge intérieure | number | integer | `8` | 0 to 40 |  |

### Language and numbers / Langue et nombres (`texts`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `texts.language` | Interface language | Langue de l'interface | dropdown | enumeration | `auto` | `auto` Same as Power BI; `fr` French; `en` English |  |
| `texts.numberLocale` | Number format locale (e.g. en-GB) | Format des nombres (ex. fr-FR) | text | text | (empty) |  | Thousands and decimal separators. Empty: same as Power BI. |

### Other objects (not in the Format pane cards above)

- `shape`: `shape.kind` (enumeration), `shape.innerRadius` (integer), `shape.roseScale` (enumeration), `shape.roseAngles` (enumeration), `shape.roseGrid` (bool), `shape.startAngle` (integer), `shape.arc` (integer), `shape.clockwise` (bool), `shape.padAngle` (numeric), `shape.cornerRadius` (integer), `shape.stroke` (bool), `shape.strokeWidth` (numeric), `shape.strokeColor` (fill), `shape.patterns` (bool), `shape.explode` (enumeration), `shape.explodeName` (text), `shape.explodeOffset` (integer).
