# Table Plume: technical reference for AI assistants

> Power BI custom visual by Plume Studio (Plume Visuals). Visual version **1.6.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 Table 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/table (French: https://plumevisuals.com/fr/visuels/table)
- Summary: The Power BI table, redesigned: sort and resize with the mouse, search, frozen first column, bars, icons and pills per column.
- Power BI visual GUID (`visualType`): `plumeTable9B3E6C1F4A8D4E2B9C7F05A3D8E1B6C2`
- 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

Table Plume is a Power BI custom visual that replaces the native table with a grid formatted column by column. Columns and measures are dropped in one well and shown in that order. Users click a header to sort (numbers descending first, text A → Z, then the reverse, then the model order; natural sort, so "Lot 2" before "Lot 10"), drag a header edge to resize (double-click = automatic width), and search the whole table (accent-insensitive). The first column and the headers stay frozen while scrolling, and a total row stays visible at the bottom (or at the top). Each column has its own alignment, units, decimals, prefix, suffix, colors, width and total, plus premium conditional formatting: data bars, background or text color scales, ▲ ● ▼ icons and colored pills. Web URL columns become clickable links (opened by Power BI). Beyond 300 rows only visible rows are drawn. Since version 1.2.0.0, three premium features: **angled column headers** (-90° to 90°, like Excel's text orientation), **collapsible column groups** (columns given the same group name share a header with a + / − button) and **row groups** (title rows for the values of the first 1 to 5 columns, detail rows indented below). Since version 1.3.0.0, premium **auto-scroll**: rows that do not fit scroll by themselves (for a report page tooltip or a wall display). Since version 1.5.0.0, premium **sparklines**: a field dropped in the optional **Sparkline axis** well (a date or a number: Month, Date, Year) turns each measure into a small line or column chart per row, next to its value or alone; column groups are separated by vertical lines. The visual makes no network request.

**New in version 1.6.0.0 (30/10/2026):** Free native-parity additions: new **Cell elements** card (background and font color scales or rules, icons, web URLs, data bars per column), **base64 images** (also split into chunks), Power BI **tooltips** on cells (Tooltips field, report page tooltips), default column width, row height, line thickness; column header settings moved to the **Column headers** card (`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 Table Plume:
  - `columnFormat.cf` = `dataBar` ("Data bars ★"), `colorScale` ("Background color scale ★"), `textScale` ("Text color scale ★"), `icons` ("Icons (▲ ● ▼) ★") or `pill` ("Colored pill ★"), for all columns or for any single column. `none` and `negative` ("Colored negatives") are free;
  - `columnHeaders.rotation` other than 0 ("Text angle (°) ★", angled headers), `colGroups.show` ("Collapsible groups ★"), `rowGroups.levels` other than 0 ("Group by the first columns ★") and `autoScroll.show` ("Auto-scroll ★"), all off by default;
  - sparklines: a field in **Sparkline axis** with at least one numeric measure whose `columnFormat.spark` is `line` ("Line ★", the default) or `bar` ("Columns ★"); `spark` = `none` shows the value only and stays free;
- In the Format pane, every premium option and premium list value has " ★" appended to its label and carries the description "Premium feature: usable for free with a « Premium preview » watermark…". The generated tables below star the same options.
- Accepted keys: only keys starting with `PLUM1.` shown in the buyer's account on plumevisuals.com. They are checked offline (Ed25519 signature) and must cover `table` 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). Renewing gives a new key to paste instead of the old one.
- Status: Available. Version 1.5.1.0 is the one delivered: download on plumevisuals.com (`.pbiviz` file) and AppSource (published, Microsoft certification passed, live since 18/10/2026). Version 1.5.2.0 (fix for angled headers crossing the column group lines, 13/10/2026) is in the code but not delivered yet. 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 **table** data view: one row per distinct combination of the grouping columns, with the measures evaluated for that row (exactly like the native table).

| Columns (`columns`): Product | Category | Revenue | Growth 2025 | Margin rate |
|---|---|---|---|---|
| Arc lamp | Lighting | 412 300 | +6.2% | 52.1% |
| Linen sofa | Furniture | 388 950 | −3.4% | 33.8% |

- **Columns** (`columns`, label "Columns" / « Colonnes », columns and measures, any number, required): display order = well order. Numbers are right-aligned and use the field's format string (dates use theirs too). A column whose data category is **Web URL** is rendered as a link.
- **Sparkline axis** (`sparkAxis`, « Axe des mini-graphiques », one grouping field, optional, premium when sparklines are shown): a date or a number (Month, Date, Year). See "Sparklines" below.
- **Dynamic format** (`format`, « Format dynamique », measures, optional): formatting measures named `card.setting` (see below). They never become columns.
- Volume: 30,000 rows per data window; more are fetched automatically up to 100,000 rows. Virtual scrolling beyond 300 rows.
- Totals are computed per column: `columnFormat.total` = `auto` uses the total provided by Power BI when there is one, otherwise the sum of the displayed measure values, and **nothing for columns whose format contains %**. `sum`, `avg`, `min`, `max`, `count` are computed by the visual on the displayed rows (the rows matching the search when a search is active); `none` hides it.

## DAX recipes

```dax
Revenue = SUM ( Sales[Amount] )
Gross margin = SUM ( Sales[Margin] )
Margin rate = DIVIDE ( [Gross margin], [Revenue] )            // format as Percentage
Orders = COUNTROWS ( Sales )
Average basket = DIVIDE ( [Revenue], [Orders] )                // set its Total to none
Growth 2025 =
DIVIDE ( CALCULATE ( [Revenue], Sales[Year] = "2025" ), CALCULATE ( [Revenue], Sales[Year] = "2024" ) ) - 1
```

Give ratios a percentage format string so the automatic total skips them, or set `columnFormat.total` explicitly for that column.

## Groups and angled headers ★ (since 1.2.0.0)

- **Angled headers** (`columnHeaders.rotation`, -90 to 90, 0 = unchanged): 45 slants headers upward, 90 is vertical (read bottom to top), negative angles slant downward. With `columnHeaders.wrap`, a slanted header continues on the next line once it reaches `columnHeaders.rotLength` px (balanced lines, breaks after a space, "-" or "/", 4 lines at most then "…"); without it, one line cut by "…". Each column only needs the width of its header's foot; texts overflow above the neighboring columns without being cut. `columnHeaders.rotFirst` also slants the first column. Sorting, mouse resizing and the frozen header row keep working.
- **Collapsible column groups**: turn on `colGroups.show`, then give columns a group name in **Column formatting › Group** (`columnFormat.group`, per column; "›" for a subgroup: `Sales › 2025`). Neighboring columns with the same name share a group header with a + / − button. `columnFormat.groupKeep` keeps a column visible when its group is collapsed (for example a total); a collapsed group with no kept column becomes one narrow collapsed column named after the 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. Since 1.5.0.0: `colGroups.separators` (on by default) draws a vertical line between groups (lighter between subgroups) and a collapsed group that keeps columns shows "+N" (hidden columns) next to its name.
- **Row groups**: `rowGroups.levels` = 1 to 5 groups the rows by the first 1 to 5 columns: one title row per value (the value alone across the full width, a rule to the end), sub-groups for the next columns, detail rows indented below. The grouping columns are no longer shown as columns; the first remaining column header carries their names ("Quarter › Product"). Options: `indent`, `icons` (+ / −), `startCollapsed`, `remember` (`state.rowGroups`), `count` (row count in the title), `rule`, `bold`, `shade`, `background`, `color`. Groups follow the model order, sorting applies inside each group, a search opens the groups of the matching rows, clicking a title selects all its rows (cross-filter), double-click or → / ← expands or collapses, and the toolbar gets Expand all / Collapse all. There are no subtotals per row group (use Matrix Plume): the total row covers all rows.

## Sparklines ★ (since 1.5.0.0)

- Drop a date or a number in **Sparkline axis** (`sparkAxis`, one field). Power BI then sends one row per combination of the grouping columns **and** axis point; Table Plume merges the rows of each item (same values in the non-measure columns) and keeps, for each measure, its series along the axis. Dates and numbers are sorted ascending; text axis values keep the received order (prefer a date or a month number).
- Per measure, in **Column formatting** (shown only with an axis, on measures): `spark` = `line` (default, "Line ★"), `bar` ("Columns ★") or `none` ("None (value only)"); `sparkValue` (default on; off = the sparkline alone across the column); `sparkPos` = `left` (sparkline left of the value, default) or `right`; `agg` = the value shown for the row: `auto` (default: **sum** when the sum of all points equals the total provided by Power BI, otherwise the **last value**, which is always exact; never a sum of rates), `sum`, `avg`, `last`, `first`, `min`, `max`. The header tooltip says which one is used ("Revenue: sum over Month"). Without a Power BI total, `auto` columns that are not sums show no total in the total row.
- Card **Sparklines** (`sparklines`, shown with an axis): `width` (minimum width, px, default 90), `color` (empty = style accent), `lineWidth`, `area` (area under the line), `last` (highlight the last value: dot or full-opacity column), `minMax` (minimum and maximum points in the unfavorable / favorable colors), `negColor` (negative columns), `sameScale` (same vertical scale for every row; off = each sparkline uses its full height), `zero` (line axis from zero).
- Hovering a sparkline shows each point ("Jan 2025: €10,000"; a summary beyond 36 points). Lines break at empty points. Clicking a row selects all its points (cross-filters the item). Row groups, column groups, sorting (by the row value), search, totals and auto-scroll work as without an axis.
- Typical use: products with 12 or 36 months of revenue as lines, orders as columns, margin rate with its last month.

## Auto-scroll ★ (since 1.3.0.0)

- Card **Auto-scroll** (`autoScroll`): `show` (off by default, premium), `speed` (rows per second, 0.1 to 20, default 1), `loop` (back to the top after the bottom, default on; off = stops at the bottom), `pause` (seconds at the top and at the bottom, default 2), `hoverPause` (pause while the mouse is over the visual, default on).
- It only moves when the rows do not fit (vertical scrollbar); nothing moves otherwise. Any user action (wheel, click, keyboard, touch, dragging the scrollbar) pauses it for about 4 seconds, then it resumes from there. It works with virtual scrolling, row groups and the frozen header and total row.
- Typical use: a Table Plume on a **report page tooltip** page, so a long list scrolls while the tooltip is shown; or a wall display. Reading mode and edit mode alike.

## Interactions with the report

- Click a row = select it (cross-filters the other visuals), Ctrl + click = add to the selection, Esc clears. Context menu on rows.
- Keyboard: ↑ ↓, Page Up / Page Down, Home / End to move, Enter to select, Enter on a focused header to sort. ARIA grid roles; high contrast uses the host colors and underlines the selection.
- Search (`toolbar.search`) and sorting only change what the table displays; they never filter the report. The row count reads "12 rows" or "3 of 12 rows" while searching.
- Other visuals cross-filter Table Plume (it does not support highlighting). Landing page when no field is set.
- Widths dragged with the mouse are saved in the report in edit mode (hidden object `state.widths`).

## 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`, label « Format dynamique »).
- Drop a measure in it and rename it for this visual (right-click › Rename for this visual) `card.setting`, for example `grid.density`, `title.text`, `totals.show`, `style.preset`. Case, accents and the separator are ignored (`Grid Density` = `grid.density`). It wins over the fixed setting, the style and the JSON theme.
- 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 column stays first.
- The measure is evaluated for each row: the visual keeps the common value, otherwise the first row's. Wrap it in `CALCULATE ( …, ALLSELECTED () )` to get one value for the whole visual.
- Examples: `IF ( COUNTROWS ( ALLSELECTED ( Sales[Product] ) ) > 12, "compact", "normal" )` renamed `grid.density`; `"Products · " & FORMAT ( CALCULATE ( [Revenue], ALLSELECTED () ), "#,0" )` renamed `title.text`.
- A measure in this well that is never blank can bring back empty rows when the table has no other measure; rows where all the table's measures are blank are removed otherwise.
- 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 `grid.density`). The card is the capabilities.json **object name**, the option is the **property name**.
- Card order: `license` (always first), `style` (Style card shared by every Plume visual: `preset`, `themeJson`, `followTheme`, `reverse`, then custom colors with `palette`, font, background, radius, animations), `columnFormat` (dynamic card "Column formatting": a list at the top, "Apply settings to", picks "All columns" or one column), then `grid`, `columnHeaders` (column headers), `cells` (values), `firstCol`, `totals`, `toolbar`, then `title`, `source`, `container` and `texts`. Format pane in version 1.6.0.0 (30/10/2026), top to bottom: `license`, `style`, `columnFormat`, `cellElements`, `grid`, `cells`, `columnHeaders`, `totals`, `rowGroups`, `firstCol`, `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).
- In `columnFormat`, per-column options appear only when relevant: units, decimals, prefix, suffix, conditional formatting and total for numeric columns; `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.

## 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-column settings are entries of `columnFormat` with a `selector` on the field's `queryRef`; an entry without selector is the "All columns" level. A Dynamic format measure is renamed with `displayName` in its projection.

```json
{
  "visualType": "plumeTable9B3E6C1F4A8D4E2B9C7F05A3D8E1B6C2",
  "query": {
    "queryState": {
      "columns": { "projections": [
        { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Product" } }, "queryRef": "Sales.Product", "nativeQueryRef": "Product" },
        { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Revenue" } }, "queryRef": "Sales.Revenue", "nativeQueryRef": "Revenue" },
        { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Growth 2025" } }, "queryRef": "Sales.Growth 2025", "nativeQueryRef": "Growth 2025" },
        { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Average basket" } }, "queryRef": "Sales.Average basket", "nativeQueryRef": "Average basket" } ] },
      "format": { "projections": [
        { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Table density" } }, "queryRef": "Sales.Table density", "nativeQueryRef": "Table density", "displayName": "grid.density" } ] }
    }
  },
  "objects": {
    "grid":    [ { "properties": { "banding": { "expr": { "Literal": { "Value": "true" } } } } } ],
    "totals":  [ { "properties": { "show": { "expr": { "Literal": { "Value": "true" } } },
                                   "position": { "expr": { "Literal": { "Value": "'bottom'" } } } } } ],
    "toolbar": [ { "properties": { "show": { "expr": { "Literal": { "Value": "true" } } } } } ],
    "header":  [ { "properties": { "fontSize": { "expr": { "Literal": { "Value": "11D" } } } } } ],
    "columnFormat": [
      { "properties": { "cf": { "expr": { "Literal": { "Value": "'dataBar'" } } },
                        "barColor": { "solid": { "color": { "expr": { "Literal": { "Value": "'#b8462a'" } } } } } },
        "selector": { "metadata": "Sales.Revenue" } },
      { "properties": { "cf": { "expr": { "Literal": { "Value": "'negative'" } } } }, "selector": { "metadata": "Sales.Growth 2025" } },
      { "properties": { "total": { "expr": { "Literal": { "Value": "'none'" } } } }, "selector": { "metadata": "Sales.Average basket" } } ],
    "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.widths` property 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

- Empty total for a column: its format contains % (automatic total skipped). Set `columnFormat.total` for that column if a calculation over the displayed rows is acceptable.
- Meaningless total (an average basket summed): set `columnFormat.total` = `none` for that column.
- Conditional formatting missing for a column: it only exists for numeric columns; check the column picked in "Apply settings to".
- No search box: `toolbar.show` is off by default.
- Watermark visible: a ★ conditional formatting, angled headers, column groups, row groups, auto-scroll, a ★ style or palette, or a Theme JSON is set without a valid key.
- Auto-scroll on but nothing moves: every row already fits in the visual (no vertical scrollbar), the mouse is over the visual (`autoScroll.hoverPause`), or the bottom was reached with `autoScroll.loop` off.
- Group names typed in Column formatting › Group do nothing: `colGroups.show` is off (Column groups card).
- A grouping column disappeared with row groups on: it is shown as the group title rows, and its name is in the first column header.
- A per-column setting ignored by a Dynamic format measure: the pane value set for that specific column wins over the "All columns" level.

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

Subtotals per row group, drill-down on a hierarchy field or values on rows (use Matrix Plume), an fx button on any option, conditional formatting driven by another field or a measure per cell, images or image URLs in cells, sparklines in cells, editing or write-back of cells, pagination, 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 |
|---|---|---|---|---|---|
| `columns` | Columns | Colonnes | GroupingOrMeasure | several |  |
| `sparkAxis` | Sparkline axis | Axe des mini-graphiques | column | 1 | A date or a number (Month, Date, Year…): measures are drawn along it as sparklines |
| `cellFields` | Cell elements fields | Champs des éléments de cellule | GroupingOrMeasure | 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: table (like the native table visual), columns = `columns`, `sparkAxis`, `cellFields`, `tooltips`, `format` in the order of the field well, 30,000 rows per data window (more fetched automatically).
Capabilities: supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).

## Format pane options (213)

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.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.spark` | Sparkline | Mini-graphique | dropdown | enumeration | `line` | `none` None (value only); `line` Line ★; `bar` Columns ★ | With a field in “Sparkline axis” (Month, Date…): each row's value along the axis, as a line or a column chart. |
| `columnFormat.sparkValue` | Value next to the sparkline | Valeur à côté du mini-graphique | toggle | bool | `true` | true / false | Off: the sparkline alone, across the whole column width. |
| `columnFormat.sparkPos` | Sparkline position | Position du mini-graphique | dropdown | enumeration | `left` | `left` Left of the value; `right` Right of the value |  |
| `columnFormat.agg` | Row value | Valeur de la ligne | dropdown | enumeration | `auto` | `auto` Automatic (sum when it is right, otherwise last value); `sum` Sum; `avg` Average; `last` Last value; `first` First value; `min` Minimum; `max` Maximum | With an axis, Power BI sends one value per axis point: the value shown is computed from them. Automatic: sum when Power BI confirms the measure adds up, otherwise last value (always exact). A sum or an average of ratios (rates, average basket) is approximate. |
| `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. |
| `columnFormat.total` | Total | Total | dropdown | enumeration | `auto` | `auto` Automatic (sum, except percentages); `sum` Sum; `avg` Average; `min` Minimum; `max` Maximum; `count` Count; `none` None |  |

### 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 total | Appliquer au total | 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.rotFirst` | Also slant the first column | Incliner aussi la première colonne | toggle | bool | `false` | true / false | Visible when `columnHeaders.rotation` =  |
| `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. |

### Totals / Totaux (`totals`, Format pane)

The card header toggle is `totals.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `totals.show` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `totals.label` | Label | Libellé | text | text | (empty) |  |  |
| `totals.position` | Position | Position | dropdown | enumeration | `bottom` | `bottom` Bottom (always visible); `top` Top, under the headers |  |
| `totals.bold` | Bold | Gras | toggle | bool | `true` | true / false |  |
| `totals.italic` | Italic | Italique | toggle | bool | `false` | true / false |  |
| `totals.background` | Background color (empty = automatic) | Couleur d'arrière-plan (vide = automatique) | color | fill | (empty) | hex color |  |
| `totals.color` | Text color (empty = text) | Couleur du texte (vide = texte) | color | fill | (empty) | hex color |  |

### Row groups / Groupes de lignes (`rowGroups`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `rowGroups.levels` | Group by the first columns ★ | Grouper par les premières colonnes ★ | number | integer | `0` | 0 to 5 | 0: no groups. 1: a title row for each value of the first column, its rows below and indented. 2: subgroups by the second column, and so on. Grouping columns are no longer shown as columns. |
| `rowGroups.indent` | Indent per level (px) | Retrait par niveau (px) | number | integer | `16` | 0 to 60 | Visible when `rowGroups.levels` =  |
| `rowGroups.icons` | + / − buttons (expand, collapse) | Boutons + / − (développer, réduire) | toggle | bool | `true` | true / false | Visible when `rowGroups.levels` =  |
| `rowGroups.startCollapsed` | Groups collapsed at start | Groupes réduits au départ | toggle | bool | `false` | true / false | Visible when `rowGroups.levels` =  |
| `rowGroups.remember` | Save the state in the report (edit mode) | Mémoriser l'état dans le rapport (mode édition) | toggle | bool | `true` | true / false | Visible when `rowGroups.levels` =  |
| `rowGroups.count` | Row count in the title | Nombre de lignes dans le titre | toggle | bool | `false` | true / false | Visible when `rowGroups.levels` =  |
| `rowGroups.rule` | Rule after the title | Trait après le titre | toggle | bool | `true` | true / false | Visible when `rowGroups.levels` =  |
| `rowGroups.bold` | Bold titles | Titres en gras | toggle | bool | `true` | true / false | Visible when `rowGroups.levels` =  |
| `rowGroups.shade` | Shade title rows | Teinter les lignes de titre | toggle | bool | `true` | true / false | Visible when `rowGroups.levels` =  |
| `rowGroups.background` | Title background (empty = automatic) | Fond des titres (vide = automatique) | color | fill | (empty) | hex color | Visible when `rowGroups.levels` =  |
| `rowGroups.color` | Title color (empty = text) | Couleur des titres (vide = texte) | color | fill | (empty) | hex color | Visible when `rowGroups.levels` =  |

### First column / Première colonne (`firstCol`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `firstCol.frozen` | Frozen when scrolling horizontally | Figée au défilement horizontal | toggle | bool | `true` | true / false |  |
| `firstCol.bold` | Bold | Gras | toggle | bool | `false` | true / false |  |
| `firstCol.rowNumbers` | Row numbers | Numéros de ligne | toggle | bool | `false` | 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 | Give columns a group name in Column formatting › Group ("›" for a subgroup): a group header with a + / − button appears above them. |
| `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)

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

### 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 | `false` | true / false | Search box, row count and (with row groups) expand all / collapse all above the table. |
| `toolbar.search` | Search in the table | Recherche dans le tableau | toggle | bool | `true` | true / false |  |
| `toolbar.placeholder` | Placeholder | Texte indicatif | text | text | (empty) |  |  |
| `toolbar.count` | Row count | Nombre de lignes | toggle | bool | `true` | true / false |  |

### 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's text columns | Rappeler les colonnes de texte de la ligne | toggle | bool | `true` | true / false | A cell's tooltip starts with the text columns of its row (product, category…), then the hovered 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.colGroups` (text), `state.rowGroups` (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.rotFirst` (bool), `header.underline` (bool), `header.sortable` (bool), `header.resizable` (bool).
