# Heatmap 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 Heatmap 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/heatmap (French: https://plumevisuals.com/fr/visuels/heatmap)
- Summary: A grid, a calendar or peak hours: the color of each cell shows where values concentrate.
- Power BI visual GUID (`visualType`): `plumeHeatmap1EF5C05AB0CA4FB0A57FFFF734DE95DF`
- 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

Heatmap Plume (identifier `heatmap`) is a Power BI custom visual (version 1.1.0.0, installed from its `.pbiviz` file; not yet on AppSource) that draws **heatmaps**: cells colored by a value. Power BI Desktop has no native heatmap (the usual workaround is a matrix with background-color conditional formatting).

**New in version 1.1.0.0 (30/10/2026):** Format pane reorganized (`heatmap.*` → `layout.*`, `compare` → `comparison`); free **class colors** (equal classes; quantiles and thresholds ★) and cell outline width.

- **Three heatmaps in one** (`layout.mode`, « Type », `auto` by default):
  - **Grid** (`grid`): `rows` ("Rows") × `columns` ("Columns"), one cell per combination;
  - **Calendar** (`calendar`): a single `date` field with days; one strip per year with weeks as columns (GitHub style) or one block per month; separated months; whole years or the data period;
  - **Day of week × hour** (`weekHour`): a single `date` field with date-times; the visual computes the weekday (first day of the week from the language or `calendar.weekStart`) and the hour itself (no DAX column needed).
  - Automatic rules: Rows or Columns → grid; a date alone → calendar (days), day × hour (date-times), year × month grid (dates on the 1st of each month, or a date hierarchy without the day); Rows + Date → one column per day, month or year (with a Play axis as well, monthly dates become the 12 months of the year).
- **Date hierarchy accepted**: Year / Quarter / Month / Day levels (French, English and other languages) are rebuilt into dates; no need to switch to the date column. Dates sent as ISO text are read as local dates.
- **Color scale** (`scale`): single hue from light to dark (default, base color `scale.color` or the style palette's key color), the style's gradient palette, or diverging ★ with a midpoint (`zero`, `mean`, `median`, `center`, fixed `value`); continuous or equal classes; square root ★; min / max; robust range ★ (2nd–98th percentile). A blank value is **never** shown as zero: hatched cells (grayed in the calendar), "Blank" in the legend and tooltip.
- **Values in the cells** with automatic white / dark text; value or day number, or % of row, % of column, % of total ★; **all or nothing** (if one label does not fit, none is written, unless `labels.fit` is off).
- Sorting rows by model order, name, total or the value in a named column; columns by model order, name or total; first N rows; margin totals as values or bars ★.
- Selection of a cell, a row name, a column name (in the calendar: a month, a weekday, a year) cross-filters the report; cross-highlighting from other visuals dims the other cells; Ctrl + click adds.
- Large grids scroll; only the visible cells are drawn (at most 40,000 at a time); 100,000 rows render in about 1.5 s.
- **Play axis ★** (`play`): the cells change color from one frame to the next with a transition; same scale for every frame by default.

## 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 (including Gradient: start / middle / end) are **free**; every other `style.preset`, the other gradient palettes (`style.palette`) and `style.themeJson` ("Theme JSON ★") are **premium**.
- Free in Heatmap Plume: grid, calendar, day × hour, year × month; single hue and palette scales; continuous and equal classes; linear scale; min / max; empty cell styles; labels with the value or the day number; cell shapes, spacing, square cells, min / max size; sorting (model, name, total, column value), first N rows; legend and class emphasis; weekdays, months, years, weekends; hour range and format.
- Rebalanced on 22/10/2026 (moved from free to premium): play axis, diverging gradient, square root scale, ignore extreme values, margin totals as values, labels in %.
- Premium features of Heatmap Plume (watermark only where they are actually applied):
  - the `play` role ("Play axis ★") with data;
  - `scale.kind` = `diverging` (outside a comparison); `scale.method` = `quantiles` or `thresholds` (with at least one threshold); `scale.transform` = `sqrt` or `log`; `scale.robust` (unless both min and max are set); `scale.scope` = `row` or `column` (grids);
  - `layout.shape` = `radial` (grids and day × hour);
  - `cells.sizeBy` = `value`, or `field` with the `size` role filled;
  - `sort.rowsBy` / `sort.colsBy` = `similarity` (hierarchical clustering, average linkage on standardized profiles, 400 items at most, dendrogram `sort.dendrogram`);
  - `margins.rows` / `margins.cols` = `values`, `bars` or `barsValues` (grids);
  - `labels.content` = `pctRow`, `pctCol` or `pctTotal`;
  - `calendar.holidays` (`fr`, `be`, `ch`, `ca`, `de`, `gb`, `us`; calendar only);
  - the `note` role ("Annotation ★") with at least one text; the `reference` role ("Reference ★"); the `multiples` role ("Small multiples ★").
- 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 `heatmap` or the whole catalog. Licenses last one year (one-time payment, no automatic renewal). Prices: 39 € personal, 99 € SME, 299 € enterprise per year, or the catalog pack.

## Expected data shape

| Rows (`rows`) | Columns (`columns`) | Value (`values`) |
|---|---|---|
| Drinks | Jan | 228,000 |
| Drinks | Feb | 205,000 |
| Dairy | Jan | 44,000 |

- **Rows** (`rows`, « Lignes », one column) and **Columns** (`columns`, « Colonnes », one column): model order (Power BI "Sort by column" respected); numbers and dates ascending.
- **Date (calendar, day × hour)** (`date`, « Date (calendrier, jour × heure) », one column or a date hierarchy).
- **Value (color)** (`values`, « Valeur (couleur) », one measure). Without it but with a Date, each cell counts its rows. Several rows in one cell are combined by `layout.aggregate` (`sum`, `average`, `min`, `max`, `count`).
- **Size ★** (`size`, one measure), **Reference ★** (`reference`, one measure: last year, target), **Annotation ★** (`note`, a text measure or column), **Play axis** (`play`), **Small multiples ★** (`multiples`), **Tooltips** (`tooltips`), **Dynamic format** (`format`).
- Volume: windows of 30,000 rows, more fetched with `fetchMoreData` up to 100,000 rows.

## DAX recipes

```dax
Total revenue = SUM ( Sales[Revenue] )
// Reference ★: last year (date table marked as date table)
Revenue LY = CALCULATE ( [Total revenue], SAMEPERIODLASTYEAR ( Dates[Date] ) )
// Annotation ★: the event of the day
Event of the day = SELECTEDVALUE ( Attendance[Event] )   // a measure cannot share a column name of its own table
// Dynamic title (renamed title.text in the Dynamic format well)
Title = "Revenue 2025 · total " & FORMAT ( CALCULATE ( [Total revenue], ALLSELECTED () ), "#,0" )
```

## Interactions with the report

- Click a cell: cross-filter on every row of the cell (all play-axis frames); Ctrl to add; click a row or column name (calendar: a month, weekday or year name) to select it all (`interaction.headers`). Click an empty area to clear. Context menu everywhere, including on names and on the landing page.
- Hover: outline of the cell, row and column names in the accent color (`interaction.crosshair`), Power BI tooltip (row, column or date and holiday, value, reference and difference, size, % if shown, annotation, Tooltips measures, count of rows); report-page tooltips are supported.
- Legend with classes: click a class to emphasize its cells (`legend.interactive`, no filter).
- Keyboard: Tab to the heatmap, arrows move in two dimensions (calendar: days and weeks), Home / End, Enter selects, Esc clears; announcements in French and English. High contrast: five density patterns instead of colors.
- The visual never saves anything itself (no `persistProperties`).

## Format pane: option IDs

- Card order: `license`, `style`, `scale`, `layout`, `cells`, `labels`, `legend`, `rowAxis`, `colAxis`, `sort`, `margins`, `calendar`, `comparison`, `annotations`, `play`, `smallMultiples`, `interaction`, then `title`, `source`, `container`, `texts`. Format pane in version 1.1.0.0 (30/10/2026), top to bottom: `license`, `style`, `layout`, `scale`, `cells`, `labels`, `rowAxis`, `colAxis`, `legend`, `sort`, `margins`, `calendar`, `comparison`, `annotations`, `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).
- `scale`: `kind` (`auto` | `mono` | `palette` | `diverging` ★), `color`, `mid` (`zero` | `mean` | `median` | `center` | `value`), `midValue`, `empty` (`auto` | `hatch` | `light` | `hide`), `method` (`continuous` | `classes` | `quantiles` ★ | `thresholds` ★), `classes` (2–12, 5), `thresholds` (text `10; 50; 100`), `transform` (`linear` | `sqrt` ★ | `log` ★), `scope` (`all` | `row` ★ | `column` ★), `min`, `max` (text), `robust` ★.
- `layout`: `mode` (`auto` | `grid` | `calendar` | `weekHour`), `shape` (`grid` | `radial` ★), `inner` (0–80 %, 28), `aggregate` (`sum` | `average` | `min` | `max` | `count`).
- `cells`: `shape` (`square` | `rounded` | `circle`), `radius` (0–20, 3), `gap` (0–20, 2), `square`, `minSize` (2–80, 14), `maxSize` (0–400, 0 = fill), `sizeBy` (`none` | `value` ★ | `field` ★), `border`, `borderColor`.
- `labels`: `show`, `content` (`value` | `pctRow` ★ | `pctCol` ★ | `pctTotal` ★ | `day`), `fontSize` (10), `color`, `bold`, `fit`, `units`, `decimals`, `prefix`, `suffix`.
- `legend`: `show`, `position` (`top` | `bottom` | `right` | `left`), `align`, `showTitle`, `titleText`, `fontSize` (9), `color`, `length` (60–600, 160), `interactive`.
- `rowAxis`: `show`, `fontSize`, `color`, `bold`, `maxSize`, `showTitle`, `titleText`. `colAxis`: same plus `position` (`top` | `bottom`) and `labelMode` (`auto` | `wrap` | `rotate45` | `rotate90` | `truncate`).
- `sort`: `rowsBy` (`model` | `name` | `total` | `column` | `similarity` ★), `rowsOrder` (`desc` | `asc`), `rowsColumn` (column name; empty = last), `rowsTop` (0 = all), `colsBy` (`model` | `name` | `total` | `similarity` ★), `colsOrder`, `dendrogram`, `treeSize` (16–160, 40).
- `margins` ★: `rows`, `cols` (`none` | `values` ★ | `bars` ★ | `barsValues` ★), `agg` (`sum` | `average` | `max` | `min`), `size` (5–40 %, 12), `color`, `fontSize`.
- `calendar`: `weekStart` (`auto` | `monday` | `sunday` | `saturday`), `dayLabels` (`alternate` | `all` | `none`), `weekends`, `layout` (`weeks` | `months`), `range` (`years` | `data`), `monthGaps`, `monthLabels`, `yearLabels`, `maxYears` (1–50, 10), `holidays` (`none` | `fr` ★ | `be` ★ | `ch` ★ | `ca` ★ | `de` ★ | `gb` ★ | `us` ★), `markColor`, `hourStart` (0), `hourEnd` (23), `hourFormat` (`auto` | `h24` | `h12`).
- `comparison`: `mode` (`difference` | `percent`), `lowerIsBetter`, `arrows`. `annotations`: `marker` (`corner` | `dot` | `outline`), `color`.
- `play` ★ (shared player): `start` (`last` | `first`), `speed` (ms, 1000), `loop`, `autoPlay`, `transition`, `controls`, `position`, `ticks`, `tickLabels`, `stepButtons`, `speedButton`, `showLabel`, `labelSize`, `labelPosition`, `sameScale`.
- `smallMultiples`: `columns`, `minWidth`, `gap`, `titleSize`, `border`. `interaction`: `hover`, `dim` (5–80, 25), `crosshair`, `headers`.

## Editing a PBIP report (visual.json)

`visualType` is the visual GUID `plumeHeatmap1EF5C05AB0CA4FB0A57FFFF734DE95DF`, `queryState` keys are the data role names (`rows`, `columns`, `date`, `values`, `size`, `reference`, `note`, `play`, `multiples`, `tooltips`, `format`), `objects` keys are the option IDs above. Booleans `true` / `false`, numbers suffixed with `D`, strings and enumeration values in single quotes.

```json
"objects": {
  "scale":   [ { "properties": { "kind": { "expr": { "Literal": { "Value": "'diverging'" } } }, "mid": { "expr": { "Literal": { "Value": "'zero'" } } } } } ],
  "margins": [ { "properties": { "rows": { "expr": { "Literal": { "Value": "'values'" } } } } } ]
}
```

## Common pitfalls

- A calendar appears instead of a grid: only a date is in the fields (add Rows / Columns or set `layout.mode` = `grid`).
- Months out of alphabetical order: sort the text month column by the month number in the model, or use a date.
- Hatched cells: no data for that combination (not a zero); `scale.empty` changes the look.
- No labels: one value does not fit (all or nothing); reduce `labels.fontSize`, use `labels.units`, or turn off `labels.fit`.
- The grid scrolls: `cells.minSize` keeps cells readable; lower it or use `sort.rowsTop`.
- Similarity sort falls back to total: more than 400 rows or columns.
- Watermark visible: one of the ★ settings listed above actually applied, a ★ style, palette or theme JSON, without a valid key.

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

Row hierarchies with expandable subtotals (use Matrix Plume), regional holidays (Alsace-Moselle, Swiss cantons, US states), fiscal-year calendars, dragging to select a date range, lines or reference bands, exporting the heatmap as an image, any network call (data and license key stay in the report).

## 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 |
|---|---|---|---|---|---|
| `rows` | Rows | Lignes | column | 1 | One row of cells per value (product, region, day of week…) |
| `columns` | Columns | Colonnes | column | 1 | One column of cells per value (month, hour, year…) |
| `date` | Date (calendar, day × hour) | Date (calendrier, jour × heure) | column | 4 | Alone: a calendar (dates), a day of week × hour grid (date-times) or a year × month grid. With Rows: the dates become the columns |
| `values` | Value (color) | Valeur (couleur) | measure | 1 | The measure that colors the cells; without a measure, each cell counts its rows |
| `size` | Size ★ | Taille ★ | measure | 1 | A second measure shown by the size of the cells (number of orders behind an average, for example) |
| `reference` | Reference ★ | Référence ★ | measure | 1 | Last year, target or average: the cells are colored by their gap to it |
| `note` | Annotation ★ | Annotation ★ | measure | 1 | A text per cell (event, comment): a marker in the cell and the text in the tooltip |
| `play` | Play axis ★ | Axe de lecture ★ | column | 1 | A date, a year or an ordered category: the cells change color from one value to the next (play button) ★ |
| `multiples` | Small multiples ★ | Petits multiples ★ | column | 1 | One small heatmap per value, with the same scale and the same order |
| `tooltips` | Tooltips | Infobulles | measure | several |  |
| `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 = `rows` + `columns` + `date` + `play` + `multiples` (one row per combination), 30,000 rows per data window (more fetched automatically); measures = `values`, `size`, `reference`, `note`, `tooltips`, `format`.
Capabilities: supportsHighlight, supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).

## Format pane options (189)

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)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `layout.mode` | Type | Type | dropdown | enumeration | `auto` | `auto` Automatic (from the fields); `grid` Grid: rows × columns; `calendar` Calendar (a Date field); `weekHour` Day of week × hour (date-time) | Automatic: Rows / Columns give a grid; a Date alone gives a calendar (days), a day × hour grid (date-times) or a year × month grid (months). |
| `layout.shape` | Shape | Forme | dropdown | enumeration | `grid` | `grid` Grid; `radial` Radial (columns around a circle) ★ | Radial: the columns (hours, months) go around the circle and the rows become rings. |
| `layout.inner` | Center hole (% of the radius) | Trou central (% du rayon) | number | integer | `28` | 0 to 80 | Visible when `layout.shape` = `radial` |
| `layout.aggregate` | Several values in a cell | Plusieurs valeurs dans une case | dropdown | enumeration | `sum` | `sum` Sum; `average` Average; `min` Minimum; `max` Maximum; `count` Count of rows | Day × hour and calendar: how the rows of the same cell are combined (sum of sales, average temperature…). |

### Color scale / Échelle de couleurs (`scale`, Format pane)

**Colors / Couleurs**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `scale.kind` | Gradient | Dégradé | dropdown | enumeration | `auto` | `auto` Automatic (single hue, or the style palette); `mono` Single hue: light to dark; `palette` Gradient palette (Style card); `diverging` Diverging: two hues and a midpoint ★ | The palettes (Viridis, Magma, Blues…) and the start / middle / end colors are chosen in Style › Custom colors. |
| `scale.color` | Hue (empty = style color) | Teinte (vide = couleur du style) | color | fill | (empty) | hex color | Visible when `scale.kind` = `auto` or `mono` |
| `scale.mid` | Scale midpoint | Milieu de l'échelle | dropdown | enumeration | `zero` | `zero` Zero; `mean` Average; `median` Median; `center` Center of the range; `value` Fixed value | Visible when `scale.kind` = `diverging` |
| `scale.midValue` | Midpoint value | Valeur du milieu | number | numeric | `0` |  | Visible when `scale.kind` = `diverging` |
| `scale.empty` | Empty cells | Cases vides | dropdown | enumeration | `auto` | `auto` Automatic (hatched; grayed in the calendar); `hatch` Hatched; `light` Grayed; `hide` Hidden | A blank value is never shown as zero: a zero takes the color of the scale. |

**Classes and range / Classes et domaine**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `scale.method` | Color distribution | Répartition des couleurs | dropdown | enumeration | `continuous` | `continuous` Continuous; `classes` Equal classes; `quantiles` Quantiles (same number of cells per class) ★; `thresholds` Custom thresholds ★ |  |
| `scale.classes` | Number of classes | Nombre de classes | number | integer | `5` | 2 to 12 | Visible when `scale.method` = `classes` or `quantiles` |
| `scale.thresholds` | Thresholds (separated by ;) | Seuils (séparés par ;) | text | text | (empty) |  | Visible when `scale.method` = `thresholds` |
| `scale.classColors` | Class colors (empty = gradient) | Couleurs des classes (vide = dégradé) | text | text | (empty) |  | Visible when `scale.method` = `classes` or `quantiles` or `thresholds`. Like the Rules of the native conditional formatting: one color per class, from the lowest to the highest, separated by ; (#RRGGBB or a color name). Missing colors come from the gradient. |
| `scale.transform` | Scale | Échelle | dropdown | enumeration | `linear` | `linear` Linear; `sqrt` Square root ★; `log` Logarithmic ★ | Square root and logarithmic scales spread out small values when a few cells are very large. |
| `scale.scope` | Scale computed over | Échelle calculée sur | dropdown | enumeration | `all` | `all` All cells; `row` Each row ★; `column` Each column ★ | Per row: each row has its own lightest and darkest cell (rows with different units or sizes). |
| `scale.min` | Minimum | Minimum | text | text | (empty) |  |  |
| `scale.max` | Maximum | Maximum | text | text | (empty) |  |  |
| `scale.robust` | Ignore extreme values (2% on each side) ★ | Ignorer les valeurs extrêmes (2 % de chaque côté) ★ | toggle | bool | `false` | true / false | The colors are spread between the 2nd and 98th percentiles: one huge cell no longer flattens all the others. |

### Cells / Cases (`cells`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `cells.shape` | Cell shape | Forme des cases | dropdown | enumeration | `rounded` | `square` Square; `rounded` Rounded corners; `circle` Circles |  |
| `cells.radius` | Corner radius (px) | Arrondi (px) | number | integer | `3` | 0 to 20 | Visible when `cells.shape` = `rounded` |
| `cells.gap` | Spacing (px) | Espacement (px) | number | numeric | `2` | 0 to 20 |  |
| `cells.square` | Square cells in the grid | Cases carrées dans la grille | toggle | bool | `false` | true / false | The calendar always uses square cells. |
| `cells.minSize` | Minimum size before scrolling (px) | Taille minimale avant défilement (px) | number | integer | `14` | 2 to 80 | Large grids scroll (only the visible cells are drawn) instead of shrinking below this size. |
| `cells.maxSize` | Maximum size (px, 0 = fill) | Taille maximale (px, 0 = remplir) | number | integer | `0` | 0 to 400 |  |
| `cells.sizeBy` | Cell size | Taille des cases | dropdown | enumeration | `none` | `none` All full; `value` By value ★; `field` By the "Size" field ★ | The color shows the value, the size shows how much data is behind it (or the value itself). |
| `cells.border` | Outline | Contour | toggle | bool | `false` | true / false |  |
| `cells.borderColor` | Outline color (empty = grid) | Couleur du contour (vide = grille) | color | fill | (empty) | hex color | Visible when `cells.border` = `true` |
| `cells.borderWidth` | Outline width (px) | Épaisseur du contour (px) | number | numeric | `1` | 0.5 to 6 | Visible when `cells.border` = `true` |

### 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 | Values are written in the cells that are large enough. |
| `labels.content` | Content | Contenu | dropdown | enumeration | `value` | `value` Value; `pctRow` % of row ★; `pctCol` % of column ★; `pctTotal` % of total ★; `day` Day number (calendar) |  |
| `labels.fontSize` | Text size | Taille du texte | number | formatting | `10` | 6 to 32 |  |
| `labels.color` | Color (empty = automatic) | Couleur (vide = automatique) | color | fill | (empty) | hex color | Automatic: white or dark text depending on each cell. |
| `labels.bold` | Bold | Gras | toggle | bool | `false` | true / false |  |
| `labels.fit` | Hide the labels when they do not all fit | Masquer les étiquettes quand elles ne tiennent pas toutes | toggle | bool | `true` | true / false | All or nothing: never a grid with labels in some cells only. Off: each label that fits is written. |

**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) |  |  |

### Row labels / Étiquettes des lignes (`rowAxis`, Format pane)

The card header toggle is `rowAxis.show`.

**Labels / Étiquettes**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `rowAxis.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `rowAxis.fontSize` | Text size | Taille du texte | number | formatting | `9` | 6 to 24 |  |
| `rowAxis.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |
| `rowAxis.bold` | Bold | Gras | toggle | bool | `false` | true / false |  |
| `rowAxis.maxSize` | Maximum room (% of the visual) | Place maximale (% du visuel) | number | integer | `30` | 5 to 60 |  |

**Title / Titre**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `rowAxis.showTitle` | Row title | Titre des lignes | toggle | bool | `false` | true / false |  |
| `rowAxis.titleText` | Title text | Texte du titre | text | text | (empty) |  | Visible when `rowAxis.showTitle` = `true` |

### Column labels / Étiquettes des colonnes (`colAxis`, Format pane)

The card header toggle is `colAxis.show`.

**Labels / Étiquettes**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `colAxis.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `colAxis.position` | Position | Position | dropdown | enumeration | `top` | `top` Top; `bottom` Bottom |  |
| `colAxis.fontSize` | Text size | Taille du texte | number | formatting | `9` | 6 to 24 |  |
| `colAxis.color` | Color (empty = secondary) | Couleur (vide = secondaire) | color | fill | (empty) | hex color |  |
| `colAxis.bold` | Bold | Gras | toggle | bool | `false` | true / false |  |
| `colAxis.labelMode` | Long labels | Étiquettes longues | dropdown | enumeration | `auto` | `auto` Automatic; `wrap` Two lines; `rotate45` Tilted (45°); `rotate90` Vertical; `truncate` Truncated (…) |  |
| `colAxis.maxSize` | Maximum room (% of the visual) | Place maximale (% du visuel) | number | integer | `30` | 5 to 60 |  |

**Title / Titre**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `colAxis.showTitle` | Column title | Titre des colonnes | toggle | bool | `false` | true / false |  |
| `colAxis.titleText` | Title text | Texte du titre | text | text | (empty) |  | Visible when `colAxis.showTitle` = `true` |

### 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 | `true` | true / false |  |
| `legend.position` | Position | Position | dropdown | enumeration | `top` | `top` Top; `bottom` Bottom; `right` Right; `left` Left |  |
| `legend.align` | Alignment | Alignement | dropdown | enumeration | `right` | `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` | Text size | Taille du texte | number | formatting | `9` | 6 to 24 |  |
| `legend.color` | Color (empty = secondary) | Couleur (vide = secondaire) | color | fill | (empty) | hex color |  |
| `legend.length` | Gradient length (px) | Longueur du dégradé (px) | number | integer | `160` | 60 to 600 |  |
| `legend.interactive` | Click a class = highlight its cells | Clic sur une classe = mettre ses cases en avant | toggle | bool | `true` | true / false |  |

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

**Rows / Lignes**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `sort.rowsBy` | Sort rows by | Trier les lignes par | dropdown | enumeration | `model` | `model` Model order (as in Power BI); `name` Name; `total` Row total; `column` Value in a column; `similarity` Similarity (clustering) ★ | Similarity: rows that look alike are placed side by side (hierarchical clustering, computed in the visual). |
| `sort.rowsOrder` | Order | Ordre | dropdown | enumeration | `desc` | `desc` Largest first (names A to Z); `asc` Smallest first (names Z to A) | Visible when `sort.rowsBy` = `name` or `total` or `column` |
| `sort.rowsColumn` | Column name | Nom de la colonne | text | text | (empty) |  | Visible when `sort.rowsBy` = `column`. Empty: the last column. |
| `sort.rowsTop` | Show the first N rows (0 = all) | Afficher les N premières lignes (0 = toutes) | number | integer | `0` | 0 to 5000 |  |

**Columns / Colonnes**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `sort.colsBy` | Sort columns by | Trier les colonnes par | dropdown | enumeration | `model` | `model` Model order (as in Power BI); `name` Name; `total` Column total; `similarity` Similarity (clustering) ★ |  |
| `sort.colsOrder` | Order | Ordre | dropdown | enumeration | `desc` | `desc` Largest first (names A to Z); `asc` Smallest first (names Z to A) | Visible when `sort.colsBy` = `name` or `total` |

**Dendrogram / Dendrogramme**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `sort.dendrogram` | Draw the clustering tree | Dessiner l'arbre du regroupement | toggle | bool | `true` | true / false | With a similarity sort: the tree shows which rows (columns) are closest. |
| `sort.treeSize` | Tree size (px) | Taille de l'arbre (px) | number | integer | `40` | 16 to 160 | Visible when `sort.dendrogram` = `true` |

### Margin totals ★ / Totaux en marge ★ (`margins`, 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 |
|---|---|---|---|---|---|---|---|
| `margins.rows` | Row totals (right) | Total des lignes (à droite) | dropdown | enumeration | `none` | `none` None; `values` Values ★; `bars` Bars ★; `barsValues` Bars and values ★ |  |
| `margins.cols` | Column totals | Total des colonnes | dropdown | enumeration | `none` | `none` None; `values` Values ★; `bars` Bars ★; `barsValues` Bars and values ★ | Drawn on the side opposite the column labels. |
| `margins.agg` | Calculation | Calcul | dropdown | enumeration | `sum` | `sum` Sum; `average` Average; `max` Maximum; `min` Minimum |  |
| `margins.size` | Bar room (% of the visual) | Place des barres (% du visuel) | number | integer | `12` | 5 to 40 |  |
| `margins.color` | Bar color (empty = scale color) | Couleur des barres (vide = couleur de l'échelle) | color | fill | (empty) | hex color |  |
| `margins.fontSize` | Text size | Taille du texte | number | formatting | `9` | 6 to 24 |  |

### Calendar and hours / Calendrier et heures (`calendar`, Format pane)

**Days / Jours**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `calendar.weekStart` | First day of the week | Premier jour de la semaine | dropdown | enumeration | `auto` | `auto` From the language (Sunday in US English); `monday` Monday; `sunday` Sunday; `saturday` Saturday |  |
| `calendar.dayLabels` | Day names | Noms des jours | dropdown | enumeration | `alternate` | `alternate` Every other day; `all` All; `none` None |  |
| `calendar.weekends` | Mark weekends | Souligner les week-ends | toggle | bool | `false` | true / false |  |

**Calendar / Calendrier**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `calendar.layout` | Layout | Disposition | dropdown | enumeration | `weeks` | `weeks` Weeks as columns (GitHub style); `months` One block per month |  |
| `calendar.range` | Period shown | Période affichée | dropdown | enumeration | `years` | `years` Whole years; `data` From the first to the last day of the data |  |
| `calendar.monthGaps` | Separate the months | Séparer les mois | toggle | bool | `true` | true / false |  |
| `calendar.monthLabels` | Month names | Noms des mois | toggle | bool | `true` | true / false |  |
| `calendar.yearLabels` | Years | Années | toggle | bool | `true` | true / false |  |
| `calendar.maxYears` | Maximum number of years (most recent) | Nombre d'années au plus (les plus récentes) | number | integer | `10` | 1 to 50 |  |

**Holidays and annotations / Jours fériés et annotations**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `calendar.holidays` | Public holidays | Jours fériés | dropdown | enumeration | `none` | `none` None; `fr` France ★; `be` Belgium ★; `ch` Switzerland (federal) ★; `ca` Canada (federal) ★; `de` Germany (national) ★; `gb` United Kingdom (England) ★; `us` United States (federal) ★ | Computed in the visual (Easter included), outlined in the calendar and named in the tooltip. |
| `calendar.markColor` | Marker color (empty = accent) | Couleur des repères (vide = accent) | color | fill | (empty) | hex color |  |

**Hours (day × hour) / Heures (jour × heure)**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `calendar.hourStart` | First hour | Première heure | number | integer | `0` | 0 to 23 |  |
| `calendar.hourEnd` | Last hour | Dernière heure | number | integer | `23` | 0 to 23 |  |
| `calendar.hourFormat` | Hour format | Format des heures | dropdown | enumeration | `auto` | `auto` From the language; `h24` 24-hour (0 to 23); `h12` 12-hour (AM / PM) |  |

### Comparison ★ / Comparaison ★ (`comparison`, 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 |
|---|---|---|---|---|---|---|---|
| `comparison.mode` | Color by | Couleur selon | dropdown | enumeration | `difference` | `difference` Difference (value − reference); `percent` Difference in % of the reference | With a measure in "Reference": each cell is colored by its gap to the reference (last year, target, average), on a diverging scale centered on zero. |
| `comparison.lowerIsBetter` | A decrease is favorable | Une baisse est favorable | toggle | bool | `false` | true / false |  |
| `comparison.arrows` | ▲▼ arrows in the labels | Flèches ▲▼ dans les étiquettes | toggle | bool | `true` | true / false |  |

### Annotations ★ (`annotations`, 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 |
|---|---|---|---|---|---|---|---|
| `annotations.marker` | Marker | Repère | dropdown | enumeration | `corner` | `corner` Cell corner; `dot` Dot; `outline` Outline | Cells with a text in the "Annotation" field get a marker; the text is in the tooltip. |
| `annotations.color` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |

### Small multiples ★ / Petits multiples ★ (`smallMultiples`, 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 |
|---|---|---|---|---|---|---|---|
| `smallMultiples.columns` | Columns (0 = automatic) | Colonnes (0 = automatique) | number | integer | `0` | 0 to 12 |  |
| `smallMultiples.minWidth` | Minimum chart width (px) | Largeur minimale d'un graphique (px) | number | integer | `220` | 80 to 800 |  |
| `smallMultiples.gap` | Spacing (px) | Espacement (px) | number | integer | `14` | 0 to 60 |  |
| `smallMultiples.titleSize` | Title size | Taille des titres | number | formatting | `10` | 6 to 24 |  |
| `smallMultiples.border` | Frame around each chart | Cadre autour de chaque graphique | toggle | bool | `false` | true / false |  |

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

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

**Playback / Lecture**

| 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 bar / Barre de lecture**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `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` |

**Large value / Valeur en grand**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `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` |

**More settings / Autres réglages**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `play.sameScale` | Same scale for every frame | Même échelle pour toutes les images | toggle | bool | `true` | true / false | The colors keep the same meaning from one frame to the next (recommended). Off: each frame uses its own lightest and darkest cell. |

### 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 |  |
| `interaction.crosshair` | Hover: emphasize the row and the column | Survol : souligner la ligne et la colonne | toggle | bool | `true` | true / false |  |
| `interaction.headers` | Click a name = select the row or the column | Clic sur un nom = sélectionner la ligne ou la colonne | toggle | bool | `true` | true / false | Also month, day and year names in the calendar. |

### 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)

- `heatmap`: `heatmap.mode` (enumeration), `heatmap.shape` (enumeration), `heatmap.inner` (integer), `heatmap.aggregate` (enumeration).
- `compare`: `compare.mode` (enumeration), `compare.lowerIsBetter` (bool), `compare.arrows` (bool).
