Aller au contenu
Plume Visuals
← Retour

Matrix Plume

Une matrice qui se développe sur place, en escalier ou tabulaire, avec les vrais sous-totaux de Power BI et une carte de chaleur.

Certifié par MicrosoftCERTIFIÉ MICROSOFT • POWER BI •
Tutoriels ↓
Installer depuis Microsoft MarketplacePage officielle du visuel chez Microsoft · installation gratuite

Démo interactive

Le vrai visuel Power BI, exécuté dans votre navigateur avec les données fictives du rapport d'exemple. Changez de scénario, de style ou d'année : le visuel se met à jour comme dans Power BI. Fonctions premium ★ montrées ici sans filigrane ; dans Power BI, sans licence, elles affichent « Plume Visuals · Aperçu premium ».

Matrix Plume affiche vos lignes sur plusieurs niveaux (région › ville, catégorie › produit) et vos colonnes (années, mois) avec les sous-totaux calculés par Power BI, justes même pour les moyennes et les ratios. On développe un groupe d'un clic sur + / −, on trie chaque niveau par une colonne de valeurs, on cherche une ligne : ses parents restent visibles. Comme dans la matrice native, les éléments de cellule colorent le fond ou le texte et ajoutent icônes et liens selon une mesure. En premium, chaque mesure devient une carte de chaleur, des barres de données, des icônes ou des pastilles.

Cas d'usage

  • CA par région et par ville, année par année
  • Budget par service et par nature de dépense
  • Marge par catégorie, produit et canal
  • Carte de chaleur des ventes par mois

GratuitInclus gratuitement

  • Développer et réduire sur place (+ / −, double-clic, ← →), tout développer, niveaux ouverts au départ
  • Disposition en escalier ou tabulaire, groupes en gras, lignes de groupe teintées
  • Sous-totaux de Power BI sur la ligne du groupe ou en ligne « Total », total général toujours visible
  • En-têtes de colonnes sur plusieurs niveaux, figés ; tri de chaque niveau par une colonne de valeurs
  • Recherche dans les lignes (les parents restent visibles), mise en forme par mesure, largeurs à la souris
  • Clic sur une ligne, une cellule ou un en-tête : filtre croisé ; clavier, lecteurs d'écran
  • Éléments de cellule comme la matrice native : fond et police (dégradé, règles, valeur du champ), icônes, URL web
  • Images en base64 dans les valeurs et les en-têtes, infobulles par cellule et pages d'info-bulle du rapport
  • Formats dynamiques : n'importe quel réglage du volet Format piloté par une mesure DAX
  • Styles Minimal et Noir et blanc, couleurs personnalisées

PremiumFonctions premium

  • Carte de chaleur (fond en dégradé) et texte en dégradé
  • Barres de données, icônes et pastilles par mesure
  • En-têtes inclinés de -90° à 90° sur le dernier niveau, avec retour à la ligne propre
  • Groupes de colonnes repliables : un groupe réduit garde ses sous-totaux Power BI
  • Colonne de total général à gauche, figée au défilement horizontal
  • Mini-graphiques : la tendance de chaque ligne le long des colonnes (36 mois même avec les années réduites), en courbe ou en histogramme
  • Défilement automatique des lignes (vitesse, boucle, pauses) : idéal dans une info-bulle de page de rapport
  • Échelle logarithmique ou par quantiles des dégradés, icônes personnalisées et taille des icônes
  • Styles communs au catalogue (Néon, Journal, Graphite…), palettes et thème JSON

Utilisables sans clé pour les essayer, avec un filigrane.

Tutoriels

Commencez par la prise en main, puis piochez dans les cas pratiques. La page « Champs et réglages » décrit chaque option du volet Format.

  1. Prise en mainIntermédiaire9 min de lectureUne matrice avec des sous-totaux justesPrise en main de Matrix Plume : lignes, colonnes et valeurs, développement sur place et sous-totaux calculés par Power BI, justes pour les ratios.
  2. Cas pratiquesIntermédiaire6 min de lectureMatrix Plume : 10 cas pratiques (carte de chaleur, part, tabulaire…)Sous-totaux en bas de groupe, disposition tabulaire, carte de chaleur, part dans le groupe, total figé, années repliables, mini-graphiques : pas à pas.
  3. Champs et réglagesIntermédiaire28 min de lectureMatrix Plume : tous les champs et réglages expliquésChaque zone de champ et chaque réglage du volet Format de Matrix Plume, y compris les réglages par mesure : rôle, valeurs possibles, valeur par défaut.
  4. Bases communesBien démarrer avec les visuels PlumeInstallation, licence, styles et réglages communs à tous les visuels.

Champs à glisser dans le visuel

ChampContenu
LignesUn ou plusieurs niveaux : région, ville…Obligatoire
ColonnesFacultatif : année, mois…Facultatif
ValeursUne ou plusieurs mesuresObligatoire
Champs des éléments de celluleMesures lues par les éléments de cellule (couleur, icône, lien), jamais affichéesFacultatif
Info-bullesMesures ajoutées à l'infobulle de chaque celluleFacultatif
Format dynamiqueMesures renommées carte.réglage (ex. title.text) : le volet Format piloté en DAXFacultatif

Il vous manque une fonction ? Nous adaptons nos visuels ou en créons sur mesure. Demander un visuel sur mesure

Un bug dans Matrix Plume, ou une idée pour l'améliorer ? Signaler un bug · Proposer une idée

Référence technique pour assistants IA

Section destinée aux assistants IA (ChatGPT, Claude, Copilot…) : tous les champs, toutes les options du volet Format avec leurs noms internes, le format des données et des exemples DAX. Générée depuis le code du visuel, version 1.7.0.0. Vous pouvez la copier dans votre assistant pour qu'il vous guide.

Version Markdown brute (/ai/visuals/matrix.md)
# Matrix Plume: technical reference for AI assistants

> Power BI custom visual by Plume Studio (Plume Visuals). Visual version **1.7.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 Matrix 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/matrix (French: https://plumevisuals.com/fr/visuels/matrix)
- Summary: A matrix that expands in place, stepped or tabular, with Power BI's real subtotals and a heatmap.
- Power BI visual GUID (`visualType`): `plumeMatrix2D6A9F3C8B1E4D7A9E5C04B8F2A6D3E1`
- 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

Matrix Plume is a Power BI custom visual that replaces the native matrix: rows on one or more levels (region › city, category › product), optional columns (years, months) and one or more measures. Groups expand and collapse in place (+ / − buttons, double-click on a row, ← → on the keyboard, "Expand all / Collapse all"), in a **stepped** layout (one indented column) or a **tabular** one (one column per level). Subtotals and grand totals are the ones **computed by Power BI**, so they are correct for averages and ratios; they sit on the group row or in a "Total" row below the group. Column headers stack on several merged, frozen levels (year, then measures). Clicking a value column header sorts every level by that column. A search box finds rows while keeping their parents. Each measure has its own formatting, with premium heatmap (background color scale), text color scale, data bars, icons and pills. Since version 1.2.0.0, two more premium features: **angled column headers** on the last header level (-90° to 90°) and **collapsible column groups** (+ / − on the groups of the Columns field, which keep their Power BI subtotals when collapsed, and on named groups of measures). Since version 1.3.0.0, two more premium options: the **grand total column on the left** (right after the row headers, frozen while scrolling horizontally) and **auto-scroll** (rows that do not fit scroll by themselves). Since version 1.5.0.0, column groups are separated by vertical lines (`colGroups.separators`, on by default) and the fit-to-width layout leaves room for the vertical scrollbar. Since version 1.6.0.0, premium **sparklines**: one "Trend" column per measure showing how each row evolves across the matrix columns (line or columns). Since version 1.6.1.0, angled headers never cross the line of a column group. The visual makes no network request.

**New in version 1.7.0.0 (30/10/2026):** Free native-parity additions: new **Cell elements** card, **base64 images** in values and in row / column headers (Images card), log ★ or quantile ★ color scales, color scale per level on group rows and subtotals, Power BI tooltips and report page tooltips; column header settings moved to **Column headers** (`header.*` → `columnHeaders.*`).

## 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 (`style.customColors` and the colors under it) are **free**; every other `style.preset`, the other gradient palettes (`style.palette`) and `style.themeJson` ("Theme JSON ★") are **premium** (watermark without a key). See "Styles and theme JSON" below.
- Using a premium feature without a valid key shows **"Plume Visuals · Premium preview"** (French: « Plume Visuals · Aperçu premium ») in the footer of the visual, with an "Unlock →" link to the pricing page. It disappears once a key is pasted in **Format › Plume Studio License › License key** (`license.key`; French: « Licence Plume Studio › Clé de licence »), the **first card** of the Format pane.
- Premium features of Matrix Plume:
  - `columnFormat.cf` = `colorScale` ("Background color scale ★", the heatmap), `textScale` ("Text color scale ★"), `dataBar` ("Data bars ★"), `icons` ("Icons (▲ ● ▼) ★") or `pill` ("Colored pill ★"), for all measures or one measure. `none` and `negative` ("Colored negatives") are free;
  - `columnHeaders.rotation` other than 0 ("Text angle (°) ★", angled headers), `colGroups.show` ("Collapsible groups ★"), `subTotals.grandColPos` = `left` ("Left (after the row headers, frozen) ★"), `autoScroll.show` ("Auto-scroll ★") and `sparklines.show` (card "Sparklines ★"), all off by default;
- Premium options and list values have " ★" appended to their label and the description "Premium feature: usable for free with a « Premium preview » watermark…".
- Accepted keys: only keys starting with `PLUM1.` shown in the buyer's account on plumevisuals.com, checked offline (Ed25519 signature), covering `matrix` 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". `license.showOwner` displays "Licensed to <holder>".
- Licenses last one year (one-time payment, no automatic renewal, key accepted for 30 more days, reminders 30 and 7 days before the end), for this visual: 39 € personal, 99 € SME, 299 € enterprise per year, or the catalog packs (199 € / 399 € / 1,199 € per year; tiers by number of users, designers and viewers included: personal 1–10, SME 11–200, enterprise more than 200).
- Status: Available, version 1.6.1.0, installed from the `.pbiviz` file or from AppSource (published, Microsoft certification passed, live since 18/10/2026). The License card starts with a read-only line "Get a license: plumevisuals.com" (`license.buy`, never read by the visual).

## Expected data shape

A **matrix** data view, like the native matrix: a row hierarchy, an optional column hierarchy, and measures evaluated at every intersection, including subtotals and totals returned by Power BI.

| Rows (`rows`) | Columns (`columns`): 2024 · Revenue | 2024 · Margin rate | 2025 · Revenue | 2025 · Margin rate |
|---|---|---|---|---|
| North West (group) | 512 000 | 44.1% | 548 300 | 43.2% |
| · Manchester | 301 200 | 45.0% | 322 900 | 43.9% |

- **Rows** (`rows`, label "Rows" / « Lignes », columns, one or more levels): the row hierarchy. Required for groups (measures alone give a single row).
- **Columns** (`columns`, « Colonnes », columns, optional): the column hierarchy; headers are merged per level, then one header per measure.
- **Values** (`values`, « Valeurs », measures, one or more).
- **Dynamic format** (`format`, « Format dynamique », measures, optional): formatting measures named `card.setting`; they never become value columns.
- Volume: 30,000 rows per data window (more fetched automatically).
- Subtotals: `subTotals.rowSubtotals`, `subTotals.rowSubtotalsType` (`Top` = on the group row, `Bottom` = "Total" row below the group) and `subTotals.columnSubtotals` are Power BI's own subtotal properties: Power BI computes those cells. `subTotals.grandRow` / `subTotals.grandCol` only show when row / column subtotals are on.

## DAX recipes

```dax
Revenue = SUM ( Sales[Amount] )
Gross margin = SUM ( Sales[Margin] )
Margin rate = DIVIDE ( [Gross margin], [Revenue] )        // correct on group rows and totals

// Share of the parent level (here: city within its region)
Share of region =
DIVIDE ( [Revenue], CALCULATE ( [Revenue], ALLSELECTED ( Sales[City] ) ) )
```

Ratios must be measures: a calculated column would be summed in subtotals.

## Column groups and angled headers ★ (since 1.2.0.0)

- **Collapsible column groups** (`colGroups.show`): a + / − button on every group header. Two kinds of groups: the levels of the **Columns** field (Year › Quarter, or a year above several measures), and **named groups of measures** typed in Column formatting › Group (`columnFormat.group`, "›" for a subgroup), inserted above the measure name under each column.
- A collapsed group of the Columns field is replaced by its **Power BI subtotals** (the "Total 2024" level disappears: the column is simply named "2024"), so column subtotals must be on (`subTotals.columnSubtotals`). A collapsed named group keeps its measures marked `columnFormat.groupKeep`. Otherwise the group becomes one narrow collapsed column named after it (tinted, empty cells, tooltip "n hidden columns"). The outermost collapsed group wins; you can sort by the column of a collapsed group.
- `colGroups.startCollapsed` collapses every group at start; `colGroups.remember` saves the state in the report in edit mode (hidden `state.colGroups`), kept in memory in reading mode. Clicking a year header cross-filters on that node.
- **Angled headers** (`columnHeaders.rotation`, -90 to 90, 0 = unchanged) apply to the headers of the last level (above the values); upper levels (years) and the corner stay horizontal. `columnHeaders.wrap` breaks long headers into balanced lines at `columnHeaders.rotLength` px (4 lines at most), otherwise one line cut by "…". Headers stay frozen while scrolling.

## Grand total column on the left ★ and auto-scroll ★ (since 1.3.0.0)

- **Subtotals › Grand total column position** (`subTotals.grandColPos`): `right` (default, after all columns, like the native matrix) or `left` (premium): the grand total column(s), one per measure under the "Total" header, move right after the row headers and stay **frozen while scrolling horizontally**, with a separator line. They are frozen as long as row headers plus total take at most 75 % of the visual width; otherwise they are simply placed on the left. The option only shows (and only has an effect) when a field is in Columns, `subTotals.columnSubtotals` and `subTotals.grandCol` are on.
- Card **Auto-scroll** (`autoScroll`): `show` (premium, off by default), `speed` (rows per second, 0.1 to 20), `loop`, `pause` (seconds at the top and bottom), `hoverPause`. Rows that do not fit scroll by themselves; nothing moves when everything fits; any user action pauses it for about 4 seconds. Typical use: a matrix on a report page tooltip or a wall display.

## Sparklines ★ (since 1.6.0.0)

- Card **Sparklines ★** (`sparklines`): `show` (premium, off by default), `kind` (`line` or `bar`), `position` (`end`: after the columns, or `start`: right after the row headers), `title` (header text, default "Trend"), `width` (minimum width in px), `color` (empty = style accent), `lineWidth`, `area` (area under the line), `last` (highlight the last value), `minMax` (minimum and maximum points in the unfavorable / favorable colors), `negColor` (negative bars), `sameScale` (one scale for all rows), `zero` (line axis from zero).
- One Trend column per measure; each row (and the grand total row) gets a small chart drawn from the values of the **Columns** field, at its deepest level, even when the column groups are collapsed (years collapsed: the line still follows every month). Without a Columns field (or with only measures in columns), nothing is drawn and no watermark appears.
- Hovering a sparkline shows a tooltip with the column labels and values; clicking it selects the row (cross-filter), like clicking the row header.

## Interactions with the report

- Click a row header = select that node (cross-filters other visuals); click a cell = select the row × column intersection (the cell is highlighted); click a column group header = select that column member. Ctrl + click adds to the selection. Context menu.
- Keyboard: ↑ ↓ to move, ← → to collapse or expand, Enter to select. ARIA `treegrid` role, levels and expanded state announced; high contrast supported.
- Expanding, sorting and searching (`toolbar.search`) only change the display, never the report filters.
- With `expand.remember` on, the expanded groups are saved in the report in edit mode (hidden `state.expanded`, together with `state.widths`). Changing `expand.startLevel` resets that saved state.
- Other visuals cross-filter Matrix Plume (it does not support highlighting).

## Dynamic formats

- **No fx button**: Power BI does not offer conditional formatting of Format pane options to table / matrix visuals (Table Plume, Matrix Plume, KPI Plume). Everything goes through the **Dynamic format** well (role `format`).
- Drop a measure in it and rename it for this visual `card.setting`, e.g. `expand.startLevel`, `rowHeaders.layout`, `title.text`, `style.preset`. Case, accents and the separator are ignored. It wins over the fixed setting, the style and the JSON theme.
- Matrix Plume reads the value of the **grand total** (root of the rows). Examples: `IF ( HASONEVALUE ( Sales[Region] ), 1, 0 )` renamed `expand.startLevel` (open cities when a slicer keeps one region); `IF ( ISFILTERED ( Sales[Category] ), "tabular", "stepped" )` renamed `rowHeaders.layout`.
- For the dynamic card **Column formatting**, only the "All columns" level is driven (`columnFormat.cf`, `columnFormat.units`…); a value set in the pane for one specific measure stays first.
- Not drivable: `subTotals.rowSubtotals`, `subTotals.rowSubtotalsType`, `subTotals.columnSubtotals` (read by Power BI itself) and the hidden `state` object.
- Driving a setting with DAX is free; a ★ value set by DAX still shows the watermark without a key.

## Format pane: how to read the tables below

- Each option has an ID `card.option` (for example `rowHeaders.layout`). The card is the capabilities.json **object name**, the option is the **property name**.
- Card order: `license` (always first), `style` (shared Style card), `columnFormat` (dynamic card "Column formatting": a list at the top, "Apply settings to", picks "All columns" or one measure; no per-measure total here), then `grid`, `rowHeaders`, `columnHeaders` (column headers), `cells` (values), `expand`, `subTotals`, `toolbar`, then `title`, `source`, `container` and `texts`. Format pane in version 1.7.0.0 (30/10/2026), top to bottom: `license`, `style`, `columnFormat`, `cellElements`, `grid`, `cells`, `columnHeaders`, `rowHeaders`, `subTotals`, `expand`, `colGroups`, `sparklines`, `images`, `toolbar`, `autoScroll`, `tooltip`, `title`, `source`, `container`, `texts`. Settings moved or renamed in this version keep working in older reports (the old names are still read).
- Per-measure options appear only when relevant: `barColor` / `barOnly` for data bars, `scale` for color scales and pills (`lowColor` / `highColor` when `scale` = `custom`), `iconMode` / `posColor` for icons.
- Labels follow the language of Power BI Desktop; `texts.language` can force French or English inside the visual.
- "Visible when" means the option only appears when another option has one of the listed values (e.g. `rowHeaders.indent` only for `stepped`).

## Editing a PBIP report (visual.json)

`visualType` is the visual GUID, `queryState` keys are the data role names, `objects` keys are the option IDs. Literal syntax: booleans `true` / `false`, numbers suffixed with `D`, strings and enumeration values in single quotes, colors wrapped in `solid.color`. Per-measure settings are entries of `columnFormat` with a `selector` on the measure's `queryRef`.

```json
{
  "visualType": "plumeMatrix2D6A9F3C8B1E4D7A9E5C04B8F2A6D3E1",
  "query": {
    "queryState": {
      "rows": { "projections": [
        { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Region" } }, "queryRef": "Sales.Region", "nativeQueryRef": "Region" },
        { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "City" } }, "queryRef": "Sales.City", "nativeQueryRef": "City" } ] },
      "columns": { "projections": [
        { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Year" } }, "queryRef": "Sales.Year", "nativeQueryRef": "Year" } ] },
      "values": { "projections": [
        { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Revenue" } }, "queryRef": "Sales.Revenue", "nativeQueryRef": "Revenue" },
        { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Margin rate" } }, "queryRef": "Sales.Margin rate", "nativeQueryRef": "Margin rate" } ] }
    }
  },
  "objects": {
    "rowHeaders": [ { "properties": { "layout": { "expr": { "Literal": { "Value": "'stepped'" } } },
                                      "indent": { "expr": { "Literal": { "Value": "20D" } } } } } ],
    "expand":     [ { "properties": { "startLevel": { "expr": { "Literal": { "Value": "1D" } } } } } ],
    "subTotals":  [ { "properties": { "rowSubtotalsType": { "expr": { "Literal": { "Value": "'Bottom'" } } } } } ],
    "toolbar":    [ { "properties": { "search": { "expr": { "Literal": { "Value": "true" } } } } } ],
    "columnFormat": [
      { "properties": { "cf": { "expr": { "Literal": { "Value": "'colorScale'" } } },
                        "scale": { "expr": { "Literal": { "Value": "'custom'" } } },
                        "lowColor": { "solid": { "color": { "expr": { "Literal": { "Value": "'#f7f4ef'" } } } } },
                        "highColor": { "solid": { "color": { "expr": { "Literal": { "Value": "'#b8462a'" } } } } } },
        "selector": { "metadata": "Sales.Revenue" } } ],
    "license": [ { "properties": { "key": { "expr": { "Literal": { "Value": "'PLUM1.…'" } } } } } ]
  }
}
```

The custom visual package must also be embedded in the report (Power BI does this when the visual is imported from the `.pbiviz` file). Do not write the hidden `state` properties by hand.

## 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`.
- `style.themeJson` (Format › Style › Theme JSON ★) takes a JSON theme as plain text. Format v2: an object with an optional `extends` (a style ID above) and optional groups `colors`, `palettes`, `typography`, `shape`, `table`, `marks`, `effects`; the v1 flat format (`style`, `palette`, `accent`, `background`…) is still read. Every field is optional. Colors are `#RRGGBB` (`#RGB` and `#RRGGBBAA` accepted, opacity ignored). Unknown fields and values outside the allowed lists are ignored, out-of-range numbers are clamped. Invalid JSON shows "Invalid theme JSON: ignored" in edit mode and the visual keeps its look.
- Full field list with allowed values, examples and troubleshooting: tutorial https://plumevisuals.com/ai/tutorials/en/themes-json.md (French: https://plumevisuals.com/ai/tutorials/fr/themes-json.md). The same JSON can be pasted in every Plume visual of a page.
- Priority (the last one wins): visual defaults → `style.preset` → `style.themeJson` → `style.palette` (if not "Style or theme palette") → `style.followTheme` → custom colors → options set by hand in the other cards → DAX formats (fx button, "Dynamic format" field) → Windows high contrast.

## Common pitfalls

- The matrix ignores `expand.startLevel`: `expand.remember` kept a state saved in edit mode with the same start level. Change the level or turn `expand.remember` off.
- No grand total row: `subTotals.grandRow` is only used when `subTotals.rowSubtotals` is on.
- A ratio summed in subtotals: it is a calculated column; use a measure.
- Heatmap on the wrong measure: the `columnFormat` entry has no selector (applies to all measures) or the wrong `queryRef`.
- Watermark visible: a ★ conditional formatting, angled headers, column groups, the total column on the left, auto-scroll, a ★ style or palette, or a Theme JSON is set without a valid key.
- "Grand total column position" missing from the pane: there is no field in Columns, or column subtotals / the grand total column are off.
- Total on the left scrolls away instead of staying frozen: row headers plus total take more than 75 % of the visual width (narrow the row headers with `rowHeaders.maxWidth` or widen the visual).
- A collapsed year shows an empty narrow column instead of its total: column subtotals are off (`subTotals.columnSubtotals`).
- Search finds nothing: `toolbar.search` is off by default (`toolbar.show` is on).

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

An fx button on any option, conditional formatting driven by another field or a separate rules measure, per-level custom subtotal formulas (Power BI computes them), values shown on rows instead of columns, drill-down / drill-through buttons of the native matrix, images in cells, sparklines driven by a separate axis field (they always follow the Columns field), editing or write-back, export from the visual itself, Power BI tooltips per cell, highlighting from other visuals.

## 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 | several |  |
| `columns` | Columns | Colonnes | column | several |  |
| `values` | Values | Valeurs | measure | several |  |
| `cellFields` | Cell elements fields | Champs des éléments de cellule | measure | several | Not displayed: measures or columns that drive the cell elements (color, icon, link) of the displayed columns |
| `tooltips` | Tooltips | Info-bulles | measure | several | Not displayed: shown in the tooltip of each row or cell |
| `format` | Dynamic format | Format dynamique | measure | several | Measures named card.setting (e.g. title.fontSize): drive any Format option with DAX |

Data view: matrix (like the native matrix visual, subtotals computed by Power BI), rows = `rows`, columns = `columns`, 30,000 rows per data window (more fetched automatically); values = `values`, `cellFields`, `tooltips`, `format`.
Capabilities: supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).

## Format pane options (217)

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. |

### Column formatting / Mise en forme des colonnes (`columnFormat`, 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.columnFormat` 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 |
|---|---|---|---|---|---|---|---|
| `columnFormat.align` | Alignment | Alignement | dropdown | enumeration | `auto` | `auto` Automatic (numbers right); `left` Left; `center` Center; `right` Right |  |
| `columnFormat.units` | Display units | Unités d'affichage | dropdown | enumeration | `none` | `auto` Auto; `none` None; `k` Thousands; `m` Millions; `b` Billions |  |
| `columnFormat.decimals` | Decimals (-1 = field format) | Décimales (-1 = format du champ) | number | integer | `-1` | -1 to 6 |  |
| `columnFormat.prefix` | Prefix | Préfixe | text | text | (empty) |  |  |
| `columnFormat.suffix` | Suffix | Suffixe | text | text | (empty) |  |  |
| `columnFormat.cf` | Conditional formatting | Mise en forme conditionnelle | dropdown | enumeration | `none` | `none` None; `negative` Colored negatives; `dataBar` Data bars ★; `colorScale` Background color scale ★; `textScale` Text color scale ★; `icons` Icons (▲ ● ▼) ★; `pill` Colored pill ★ | Quick formatting of a column (★). Free, like in the native table: Cell elements card (gradient, rules, a measure giving the color or an icon). |
| `columnFormat.barColor` | Bar color (empty = accent) | Couleur des barres (vide = accent) | color | fill | (empty) | hex color |  |
| `columnFormat.barOnly` | Bar only (no value) | Barre seule (sans valeur) | toggle | bool | `false` | true / false |  |
| `columnFormat.scale` | Scale colors | Couleurs du dégradé | dropdown | enumeration | `accent` | `accent` Background → style accent; `style` Style palette; `greenRed` Green → red; `redGreen` Red → green; `custom` Custom |  |
| `columnFormat.scaleType` | Color scale type | Échelle du dégradé | dropdown | enumeration | `linear` | `linear` Linear; `log` Logarithmic ★; `quantile` Quantiles (rank) ★ | Linear: proportional to the value. Logarithmic: spreads small values when a few large ones crush the rest. Quantiles: each shade covers as many cells (rank of the value). |
| `columnFormat.cfGroups` | Group rows and totals | Lignes de groupe et totaux | dropdown | enumeration | `none` | `none` Detail only; `level` Scale per level (groups included) | By default, conditional formatting only colors detail cells. "Scale per level" also colors group rows (subtotals), each level with its own scale (regions together, cities together). |
| `columnFormat.lowColor` | Low color | Couleur basse | color | fill | `#F7F4EF` | hex color |  |
| `columnFormat.highColor` | High color | Couleur haute | color | fill | `#B8462A` | hex color |  |
| `columnFormat.negColor` | Negative color | Couleur des négatifs | color | fill | `#C0392B` | hex color |  |
| `columnFormat.posColor` | Positive color (icons) | Couleur des positifs (icônes) | color | fill | `#2E7D4F` | hex color |  |
| `columnFormat.iconMode` | Icon rule | Règle des icônes | dropdown | enumeration | `sign` | `sign` Sign (positive / zero / negative); `terciles` Thirds of the values (high / mid / low) |  |
| `columnFormat.width` | Width (px, 0 = auto) | Largeur (px, 0 = auto) | number | integer | `0` | 0 to 800 |  |
| `columnFormat.group` | Group | Groupe | text | text | (empty) |  | Neighboring columns with the same group name share a header with a + / − button. Use "›" for a subgroup: Sales › 2025. |
| `columnFormat.groupKeep` | Stays visible when the group is collapsed | Reste visible quand le groupe est réduit | toggle | bool | `false` | true / false |  |
| `columnFormat.bold` | Bold | Gras | toggle | bool | `false` | true / false |  |
| `columnFormat.fontColor` | Text color (empty = values) | Couleur du texte (vide = valeurs) | color | fill | (empty) | hex color |  |
| `columnFormat.background` | Background color (empty = none) | Couleur d'arrière-plan (vide = aucune) | color | fill | (empty) | hex color |  |
| `columnFormat.applyHeader` | Apply to header too | Appliquer aussi à l'en-tête | toggle | bool | `false` | true / false | Text color, background, bold and alignment of the column on its header too (like "Specific column › Apply to header" in the native table). |
| `columnFormat.applyTotal` | Apply to total too | Appliquer aussi au total | toggle | bool | `false` | true / false |  |
| `columnFormat.image` | Images | Images | dropdown | enumeration | `auto` | `auto` Automatic (data:image…); `on` Always (raw base64, SVG); `part` Chunk of the previous column's image; `off` Never (text) | Automatic: a data:image/… value (or an Image URL column holding base64) becomes an image. Always: also raw base64 and SVG text. Chunk: this column continues the previous column's image (text joined, column hidden), for images longer than 32,766 characters. |

### Cell elements / Éléments de cellule (`cellElements`, 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.cellElements` 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 |
|---|---|---|---|---|---|---|---|
| `cellElements.bgMode` | Background color | Couleur d'arrière-plan | dropdown | enumeration | `none` | `none` None; `gradient` Gradient; `rules` Rules; `field` Field value | Like conditional formatting in the native table: gradient, rules, or a measure that returns the color (#RRGGBB, rgb(), CSS name). |
| `cellElements.bgField` | Based on field | Selon le champ | dropdown | enumeration | (empty) |  | The column itself, another displayed column, or a field of the "Cell elements fields" role (not displayed). |
| `cellElements.bgLow` | Minimum color (empty = style) | Couleur minimale (vide = style) | color | fill | (empty) | hex color |  |
| `cellElements.bgMid` | Center color (empty = none) | Couleur centrale (vide = aucune) | color | fill | (empty) | hex color |  |
| `cellElements.bgHigh` | Maximum color (empty = style) | Couleur maximale (vide = style) | color | fill | (empty) | hex color |  |
| `cellElements.bgMin` | Minimum (empty = lowest value) | Minimum (vide = valeur la plus basse) | text | text | (empty) |  | A number (0), a percentage of the range (10%) or a percentile (p10). |
| `cellElements.bgMax` | Maximum (empty = highest value) | Maximum (vide = valeur la plus haute) | text | text | (empty) |  | A number (100), a percentage of the range (90%) or a percentile (p90). |
| `cellElements.bgRules` | Rules | Règles | textarea | text | (empty) |  | One rule per line: condition(s), then ":" and the color. E.g. ">= 100 : #2E7D4F", ">= 50 and < 100 : orange", "< 50 : red", "blank : #CCCCCC", "else : gray". A % = share of the range (min → max), like "Percent" in Power BI: ">= 80% : green". The first matching rule wins. |
| `cellElements.fontMode` | Font color | Couleur de police | dropdown | enumeration | `none` | `none` None; `gradient` Gradient; `rules` Rules; `field` Field value | Like conditional formatting in the native table: gradient, rules, or a measure that returns the color (#RRGGBB, rgb(), CSS name). |
| `cellElements.fontField` | Based on field | Selon le champ | dropdown | enumeration | (empty) |  | The column itself, another displayed column, or a field of the "Cell elements fields" role (not displayed). |
| `cellElements.fontLow` | Minimum color (empty = style) | Couleur minimale (vide = style) | color | fill | (empty) | hex color |  |
| `cellElements.fontMid` | Center color (empty = none) | Couleur centrale (vide = aucune) | color | fill | (empty) | hex color |  |
| `cellElements.fontHigh` | Maximum color (empty = style) | Couleur maximale (vide = style) | color | fill | (empty) | hex color |  |
| `cellElements.fontMin` | Minimum (empty = lowest value) | Minimum (vide = valeur la plus basse) | text | text | (empty) |  | A number (0), a percentage of the range (10%) or a percentile (p10). |
| `cellElements.fontMax` | Maximum (empty = highest value) | Maximum (vide = valeur la plus haute) | text | text | (empty) |  | A number (100), a percentage of the range (90%) or a percentile (p90). |
| `cellElements.fontRules` | Rules | Règles | textarea | text | (empty) |  | One rule per line: condition(s), then ":" and the color. E.g. ">= 100 : #2E7D4F", ">= 50 and < 100 : orange", "< 50 : red", "blank : #CCCCCC", "else : gray". A % = share of the range (min → max), like "Percent" in Power BI: ">= 80% : green". The first matching rule wins. |
| `cellElements.scale` | Gradient scale | Échelle des dégradés | dropdown | enumeration | `linear` | `linear` Linear; `log` Logarithmic ★; `quantile` Quantiles (rank) ★ |  |
| `cellElements.iconMode` | Icons | Icônes | dropdown | enumeration | `none` | `none` None; `rules` Rules; `field` Field value | Rules: a marker set (green / amber / red dots, arrows…) by value; without rules, thirds of the range. Field value: a measure returning an icon name (green, amber, red, up, down, check, warning…), an emoji, or an SVG / base64 image ★. |
| `cellElements.iconField` | Based on field | Selon le champ | dropdown | enumeration | (empty) |  |  |
| `cellElements.iconSet` | Icon set | Jeu d'icônes | dropdown | enumeration | `traffic` | `traffic` Green / amber / red dots; `arrows` Arrows; `triangles` Triangles; `symbols` Symbols (✓ ! ✗); `flags` Flags; `shapes` Shapes (circle, diamond, triangle); `stars` Stars |  |
| `cellElements.iconRules` | Icon rules | Règles des icônes | textarea | text | (empty) |  | One rule per line, then ":" and the icon: high / mid / low (of the chosen set) or a name (green, amber, red, up, down, flat, check, warning, cross, star…). E.g. ">= 0.1 : high", ">= 0 : mid", "else : low". Empty: thirds of the range. |
| `cellElements.iconPos` | Icon layout | Disposition de l'icône | dropdown | enumeration | `left` | `left` Left of the value; `right` Right of the value; `only` Icon only |  |
| `cellElements.iconAlign` | Icon vertical alignment | Alignement vertical de l'icône | dropdown | enumeration | `middle` | `top` Top; `middle` Middle; `bottom` Bottom |  |
| `cellElements.iconSize` | Icon size (px, 0 = text size) ★ | Taille de l'icône (px, 0 = taille du texte) ★ | number | integer | `0` | 0 to 64 |  |
| `cellElements.urlMode` | Web URL | URL web | dropdown | enumeration | `none` | `none` None; `field` Field value | The value becomes a link to the address given by the field (https only, opened by Power BI). |
| `cellElements.urlField` | Based on field | Selon le champ | dropdown | enumeration | (empty) |  |  |
| `cellElements.applyValues` | Apply to values | Appliquer aux valeurs | toggle | bool | `true` | true / false |  |
| `cellElements.applyTotals` | Apply to totals and subtotals | Appliquer aux totaux et sous-totaux | toggle | bool | `false` | true / false |  |

### Grid / Grille (`grid`, Format pane)

**Layout / Mise en page**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `grid.density` | Density | Densité | dropdown | enumeration | `normal` | `compact` Compact; `normal` Normal; `comfortable` Comfortable |  |
| `grid.fit` | Stretch columns to the visual width | Étirer les colonnes à la largeur du visuel | toggle | bool | `true` | true / false | Like "Grow to fit" in the native table. Off: each column is as wide as its content. |
| `grid.defaultWidth` | Default column width (px, 0 = fit to content) | Largeur par défaut des colonnes (px, 0 = selon le contenu) | number | integer | `0` | 0 to 800 | Like "Fixed width" in the native table: the same width for every column, except those set in Column formatting › Width or with the mouse. |
| `grid.rowHeight` | Minimum row height (px, 0 = automatic) | Hauteur minimale des lignes (px, 0 = automatique) | number | integer | `0` | 0 to 300 | Taller rows (images, icons, wall displays). Text stays vertically centered. |

**Lines / Traits**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `grid.rowLines` | Lines between rows | Traits entre les lignes | toggle | bool | `true` | true / false |  |
| `grid.colLines` | Lines between columns | Traits entre les colonnes | toggle | bool | `false` | true / false |  |
| `grid.lineColor` | Line color (empty = style grid) | Couleur des traits (vide = grille du style) | color | fill | (empty) | hex color |  |
| `grid.lineWidth` | Line width (px) | Épaisseur des traits (px) | number | integer | `1` | 1 to 6 |  |
| `grid.banding` | Banded rows | Lignes alternées | toggle | bool | `false` | true / false |  |
| `grid.bandColor` | Banded row background (empty = automatic) | Fond des lignes alternées (vide = automatique) | color | fill | (empty) | hex color | Visible when `grid.banding` = `true` |
| `grid.bandText` | Banded row text (empty = values text) | Texte des lignes alternées (vide = texte des valeurs) | color | fill | (empty) | hex color | Visible when `grid.banding` = `true` |
| `grid.hover` | Highlight hovered row | Surligner la ligne survolée | toggle | bool | `true` | true / false |  |

### Values / Valeurs (`cells`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `cells.fontSize` | Size | Taille | number | formatting | `12` | 7 to 30 |  |
| `cells.color` | Color (empty = style text) | Couleur (vide = texte du style) | color | fill | (empty) | hex color |  |
| `cells.background` | Background color (empty = none) | Couleur d'arrière-plan (vide = aucune) | color | fill | (empty) | hex color |  |
| `cells.bold` | Bold | Gras | toggle | bool | `false` | true / false |  |
| `cells.italic` | Italic | Italique | toggle | bool | `false` | true / false |  |
| `cells.wrap` | Text wrap | Retour automatique à la ligne | toggle | bool | `false` | true / false |  |
| `cells.blank` | Text for blank cells | Texte des cellules vides | text | text | (empty) |  |  |
| `cells.selColor` | Selected rows background (empty = light accent) | Fond des lignes sélectionnées (vide = accent pâle) | color | fill | (empty) | hex color |  |
| `cells.urlIcon` | Link icon instead of web addresses | Icône de lien à la place des adresses web | toggle | bool | `false` | true / false | Like "URL icon › Values" in the native table: a URL column (Web URL data category) or a cell elements link shows a clickable icon. |

### Column headers / En-têtes de colonnes (`columnHeaders`, Format pane)

The card header toggle is `columnHeaders.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `columnHeaders.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `columnHeaders.fontSize` | Size | Taille | number | formatting | `12` | 7 to 30 |  |
| `columnHeaders.bold` | Bold | Gras | toggle | bool | `true` | true / false |  |
| `columnHeaders.italic` | Italic | Italique | toggle | bool | `false` | true / false |  |
| `columnHeaders.caps` | Small caps | Petites majuscules | toggle | bool | `false` | true / false |  |
| `columnHeaders.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `columnHeaders.background` | Background color (empty = none) | Couleur d'arrière-plan (vide = aucune) | color | fill | (empty) | hex color |  |
| `columnHeaders.align` | Alignment | Alignement | dropdown | enumeration | `auto` | `auto` Same as the column (numbers right); `left` Left; `center` Center; `right` Right |  |
| `columnHeaders.wrap` | Text wrap | Retour automatique à la ligne | toggle | bool | `true` | true / false |  |
| `columnHeaders.rotation` | Text angle (°) ★ | Inclinaison du texte (°) ★ | slider | numeric | `0` | -90 to 90 | 0: horizontal. 45: slanted upward, like Excel. 90: vertical, read from bottom to top. Negative angles slant downward (-90: read from top to bottom). Long headers take little width. |
| `columnHeaders.rotLength` | Maximum length of a slanted line (px) | Longueur maximale d'une ligne inclinée (px) | number | integer | `120` | 40 to 400 | Visible when `columnHeaders.rotation` = . With "Text wrap", a longer header continues on the next line (4 lines at most); without it, it is cut with "…". |
| `columnHeaders.underline` | Rule under headers (text color) | Trait sous les en-têtes (couleur du texte) | toggle | bool | `true` | true / false |  |
| `columnHeaders.sortable` | Sort by clicking a header | Trier en cliquant sur un en-tête | toggle | bool | `true` | true / false | Click: descending (numbers) or A to Z (text), again: the reverse, a third time: model order. Power BI's own sort (… › Sort by) also works. |
| `columnHeaders.resizable` | Resize with the mouse | Largeur ajustable à la souris | toggle | bool | `true` | true / false | Drag the edge of a header. Double-click resets the width. |
| `columnHeaders.urlIcon` | Link icon in URL column headers | Icône de lien dans les en-têtes des colonnes d'URL | toggle | bool | `false` | true / false | Like "URL icon › Headers" in the native table. |

### Row headers / En-têtes de lignes (`rowHeaders`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `rowHeaders.layout` | Layout | Disposition | dropdown | enumeration | `stepped` | `stepped` Stepped (one indented column); `tabular` Tabular (one column per level) |  |
| `rowHeaders.indent` | Indent per level (px) | Décalage par niveau (px) | number | integer | `16` | 0 to 60 | Visible when `rowHeaders.layout` = `stepped` |
| `rowHeaders.icons` | + / − buttons | Boutons + / − | toggle | bool | `true` | true / false |  |
| `rowHeaders.boldParents` | Bold groups | Groupes en gras | toggle | bool | `true` | true / false |  |
| `rowHeaders.shade` | Shade group rows | Teinter les lignes de groupe | toggle | bool | `true` | true / false |  |
| `rowHeaders.fontSize` | Size | Taille | number | formatting | `12` | 7 to 30 |  |
| `rowHeaders.italic` | Italic | Italique | toggle | bool | `false` | true / false |  |
| `rowHeaders.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |
| `rowHeaders.background` | Background color (empty = none) | Couleur d'arrière-plan (vide = aucune) | color | fill | (empty) | hex color |  |
| `rowHeaders.wrap` | Text wrap | Retour automatique à la ligne | toggle | bool | `false` | true / false |  |
| `rowHeaders.iconColor` | + / − button color (empty = secondary text) | Couleur des boutons + / − (vide = texte secondaire) | color | fill | (empty) | hex color | Visible when `rowHeaders.icons` = `true` |
| `rowHeaders.iconSize` | + / − button size (px) | Taille des boutons + / − (px) | number | integer | `13` | 8 to 28 | Visible when `rowHeaders.icons` = `true` |
| `rowHeaders.maxWidth` | Maximum width (% of the visual) | Largeur maximale (% du visuel) | number | integer | `40` | 10 to 80 |  |

### Subtotals / Sous-totaux (`subTotals`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `subTotals.rowSubtotals` | Row subtotals | Sous-totaux des lignes | toggle | bool | `true` | true / false |  |
| `subTotals.rowSubtotalsType` | Position | Position | dropdown | enumeration | `Top` | `Top` On the group row; `Bottom` "Total" row below the group | Visible when `subTotals.rowSubtotals` = `true` |
| `subTotals.columnSubtotals` | Column subtotals | Sous-totaux des colonnes | toggle | bool | `true` | true / false |  |
| `subTotals.grandRow` | Grand total row | Ligne de total général | toggle | bool | `true` | true / false | Visible when `subTotals.rowSubtotals` = `true` |
| `subTotals.grandCol` | Grand total column | Colonne de total général | toggle | bool | `true` | true / false | Visible when `subTotals.columnSubtotals` = `true` |
| `subTotals.grandColPos` | Grand total column position | Position de la colonne de total | dropdown | enumeration | `right` | `right` Right (after all columns); `left` Left (after the row headers, frozen) ★ | Visible when `subTotals.columnSubtotals` = `true` |
| `subTotals.label` | Total label | Libellé du total | text | text | (empty) |  |  |
| `subTotals.background` | Totals background (empty = automatic) | Arrière-plan des totaux (vide = automatique) | color | fill | (empty) | hex color |  |
| `subTotals.color` | Totals text (empty = text) | Texte des totaux (vide = texte) | color | fill | (empty) | hex color |  |
| `subTotals.bold` | Bold totals | Totaux en gras | toggle | bool | `true` | true / false |  |

### Expand and collapse / Développer et réduire (`expand`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `expand.startLevel` | Levels expanded at start | Niveaux développés au départ | number | integer | `1` | 0 to 10 | 0: only the first level is shown. 1: its children are shown too… |
| `expand.remember` | Save the state in the report (edit mode) | Mémoriser l'état dans le rapport (mode édition) | toggle | bool | `true` | true / false |  |

### Column groups / Groupes de colonnes (`colGroups`, Format pane)

The card header toggle is `colGroups.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `colGroups.show` | Collapsible groups ★ | Groupes repliables ★ | toggle | bool | `false` | true / false | + / − button on group headers (multi-level "Columns" field, or groups named in Column formatting › Group). A collapsed group keeps its subtotal when there is one. |
| `colGroups.startCollapsed` | Groups collapsed at start | Groupes réduits au départ | toggle | bool | `false` | true / false |  |
| `colGroups.remember` | Save the state in the report (edit mode) | Mémoriser l'état dans le rapport (mode édition) | toggle | bool | `true` | true / false |  |
| `colGroups.separators` | Lines between groups | Traits entre les groupes | toggle | bool | `true` | true / false | Strong vertical line between two column groups (lighter between subgroups), in the header and down every row. |

### Sparklines ★ / Mini-graphiques ★ (`sparklines`, Format pane)

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

The card header toggle is `sparklines.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `sparklines.show` | Show | Afficher | toggle | bool | `false` | true / false | Adds, for each measure, a column that draws the row along the matrix columns (years, months…): each row's trend at a glance. A field in "Columns" is needed. |
| `sparklines.kind` | Type | Type | dropdown | enumeration | `line` | `line` Line; `bar` Columns |  |
| `sparklines.position` | Position | Position | dropdown | enumeration | `end` | `end` After the columns; `start` After the row headers |  |
| `sparklines.title` | Header | En-tête | text | text | (empty) |  | With several measures, each measure's name is added. |
| `sparklines.width` | Minimum width (px) | Largeur minimale (px) | number | integer | `90` | 30 to 400 |  |
| `sparklines.color` | Color (empty = style accent) | Couleur (vide = accent du style) | color | fill | (empty) | hex color |  |
| `sparklines.lineWidth` | Line width | Épaisseur des courbes | number | numeric | `1.5` | 0.5 to 4 |  |
| `sparklines.area` | Area under the line | Aire sous la courbe | toggle | bool | `false` | true / false |  |
| `sparklines.last` | Highlight the last value | Mettre en avant la dernière valeur | toggle | bool | `true` | true / false |  |
| `sparklines.minMax` | Minimum and maximum points | Points minimum et maximum | toggle | bool | `false` | true / false | Minimum in the unfavorable color, maximum in the favorable color (style colors). |
| `sparklines.negColor` | Negative columns (empty = unfavorable) | Barres négatives (vide = défavorable) | color | fill | (empty) | hex color |  |
| `sparklines.sameScale` | Same scale for every row | Même échelle pour toutes les lignes | toggle | bool | `false` | true / false | Off: each sparkline uses its full height (read the shape). On: rows can be compared with each other. |
| `sparklines.zero` | Axis from zero (lines) | Axe depuis zéro (courbes) | toggle | bool | `false` | true / false |  |

### Images (`images`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `images.size` | Size | Dimension | dropdown | enumeration | `fixed` | `fixed` Fixed (same box for every image); `auto` Variable (each image's proportions) |  |
| `images.height` | Height (px) | Hauteur (px) | number | integer | `28` | 8 to 400 | Fixed: box height. Variable: maximum height. |
| `images.width` | Width (px, 0 = same as height) | Largeur (px, 0 = comme la hauteur) | number | integer | `0` | 0 to 800 | Fixed: box width (0: square). Variable: maximum width (0: no limit). |
| `images.fit` | Fit | Ajustement | dropdown | enumeration | `contain` | `contain` Contain (whole image); `cover` Crop (fill the box); `fill` Stretch | Visible when `images.size` = `fixed` |
| `images.align` | Alignment | Alignement | dropdown | enumeration | `auto` | `auto` Same as the column; `left` Left; `center` Center; `right` Right |  |
| `images.invalid` | Value that is not an image | Valeur qui n'est pas une image | dropdown | enumeration | `blank` | `blank` Blank cell; `text` Original text | A web address is never loaded (embedded images only: base64 or data URI). |
| `images.headers` | Images in row and column headers | Images dans les en-têtes de lignes et de colonnes | toggle | bool | `true` | true / false | A data:image/… value of the "Rows" or "Columns" field (flag, logo) is shown as an image; screen readers still read its text. |

### Toolbar / Barre d'outils (`toolbar`, Format pane)

The card header toggle is `toolbar.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `toolbar.show` | Show | Afficher | toggle | bool | `true` | true / false | Expand all / collapse all buttons and search above the matrix. |
| `toolbar.buttons` | Expand all / Collapse all | Tout développer / Tout réduire | toggle | bool | `true` | true / false |  |
| `toolbar.search` | Search in rows | Recherche dans les lignes | toggle | bool | `false` | true / false |  |
| `toolbar.placeholder` | Placeholder | Texte indicatif | text | text | (empty) |  |  |

### Auto-scroll / Défilement automatique (`autoScroll`, Format pane)

The card header toggle is `autoScroll.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `autoScroll.show` | Auto-scroll ★ | Défilement automatique ★ | toggle | bool | `false` | true / false | Scrolls the rows by itself when they do not fit in the visual (vertical scrollbar): ideal in a report page tooltip or on a wall display. |
| `autoScroll.speed` | Speed (rows per second) | Vitesse (lignes par seconde) | number | numeric | `1` | 0.1 to 20 | Visible when `autoScroll.show` = `true` |
| `autoScroll.loop` | Loop (back to the top at the end) | Boucler (revenir en haut à la fin) | toggle | bool | `true` | true / false | Visible when `autoScroll.show` = `true` |
| `autoScroll.pause` | Pause at the top and bottom (s) | Pause en haut et en bas (s) | number | numeric | `2` | 0 to 30 | Visible when `autoScroll.show` = `true` |
| `autoScroll.hoverPause` | Pause on mouse hover | Pause au survol de la souris | toggle | bool | `true` | true / false | Visible when `autoScroll.show` = `true` |

### 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). |
| `tooltip.rowLabels` | Repeat the row and the column | Rappeler la ligne et la colonne | toggle | bool | `true` | true / false | A cell's tooltip starts with its row and column headers (Region, City, Year…), then the value and the "Tooltips" fields. |

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

- `state`: `state.widths` (text), `state.expanded` (text), `state.colGroups` (text), internal state saved by the visual in edit mode (column widths, positions of dragged annotations); leave it alone.
- `header`: `header.show` (bool), `header.fontSize` (formatting), `header.bold` (bool), `header.caps` (bool), `header.color` (fill), `header.background` (fill), `header.wrap` (bool), `header.rotation` (numeric), `header.rotLength` (integer), `header.underline` (bool), `header.sortable` (bool), `header.resizable` (bool).