Skip to content
Plume Visuals
← Back

Table Plume

The Power BI table, redesigned: sort and resize with the mouse, search, frozen first column, bars, icons and pills per column.

Certified by MicrosoftMICROSOFT CERTIFIED • POWER BI •
Tutorials ↓
Get it on Microsoft MarketplaceThe visual's official Microsoft listing · free to install

Interactive demo

The real Power BI visual, running in your browser with the sample report's fictitious data. Switch scenario, style or year: the visual updates as it does in Power BI. Premium ★ features are shown here without the watermark; in Power BI, without a license, they show “Plume Visuals · Premium preview”.

Table Plume replaces the native table with a grid you format column by column: alignment, units, decimals, total, colors. Click a header to sort, drag its edge to widen it, search a word across the whole table: the first column stays frozen and the total stays visible at the bottom. As in the native table, cell elements color the background or the text and add icons and links from a measure, and base64 images show in the cells. With premium, each column can carry data bars, a background or text color scale, ▲ ● ▼ icons or colored pills. Beyond 30,000 rows, scrolling stays smooth.

Use cases

  • Product list with revenue, growth and margin
  • Order or ticket tracking, with search
  • Rankings with data bars and trend icons
  • A table in the same style as the report's Plume charts

FreeIncluded for free

  • Click a header to sort (natural sort: 2 before 10), automatic, mouse-resized or fixed widths
  • Accent-insensitive search across the whole table, row count
  • Frozen first column and headers, row numbers, banded rows, three densities
  • Total row at the top or bottom: sum, average, minimum, maximum or count, column by column
  • Per-column formatting: alignment, units, decimals, prefix, suffix, colored negatives
  • Clickable links, smooth scrolling up to 100,000 rows, keyboard, high contrast
  • Cell elements like the native table: background and font color (gradient, rules, field value), icons, web URL
  • Base64 images (even split into chunks), per-cell tooltips and report page tooltips
  • Dynamic formats: any Format pane option driven by a DAX measure
  • Minimal and Black & White styles, custom colors

PremiumPremium features

  • Sparklines: drop a date in “Sparkline axis”, each measure becomes a line or a column chart, with or without its value
  • Data bars (positive and negative) in cells
  • Background and text color scales (always readable tints)
  • ▲ ● ▼ icons by sign or by thirds of the values, colored pills
  • Angled headers from -90° to 90°, like Excel's text orientation, with clean line wrapping
  • Collapsible column groups (+ / −), clearly separated, with columns that stay visible
  • Row groups by the first columns: title rows, indent, expand or collapse all
  • Auto-scrolling rows (speed, loop, pauses): ideal in a report page tooltip
  • Logarithmic or quantile color scales, custom icons and icon size
  • Catalog-wide styles (Neon, Newspaper, Graphite…), palettes and theme JSON

Usable without a key to try them, with a watermark.

Tutorials

Start with Getting started, then pick from the how-to guides. The Fields and settings page describes every option of the Format pane.

  1. Getting startedBeginner9 min readA Power BI table formatted column by columnGet started with Table Plume: go from your data to a sortable, searchable table, formatted column by column, with totals that actually make sense.
  2. How-to guidesIntermediate6 min readTable Plume: 10 how-to guides (rates, bars, groups, auto-scroll…)Avoid summing a rate, spot drops at a glance, add bars in cells, row groups, sparklines, and auto-scroll: step-by-step recipes for Table Plume in Power BI.
  3. Fields and settingsIntermediate26 min readTable Plume: every field and setting explainedEvery field well and every Format pane setting in Table Plume, including per-column settings: what each one does, its possible values, and its default.
  4. BasicsGetting started with Plume visualsInstallation, license, styles and the settings shared by every visual.

Fields to drop into the visual

FieldContent
ColumnsColumns and measures, in display orderRequired
Sparkline axisA date or a number (Month, Year…): each measure becomes a sparklineOptionalPremium
Cell elements fieldsFields read by cell elements (color, icon, link), never displayedOptional
TooltipsMeasures added to each cell's tooltipOptional
Dynamic formatMeasures renamed card.setting (e.g. title.text): the Format pane driven by DAXOptional

Missing a feature? We adapt our visuals or build custom ones. Request a custom visual

Found a bug in Table Plume, or have an idea to improve it? Report a bug · Suggest an idea

Technical reference for AI assistants

This section is meant for AI assistants (ChatGPT, Claude, Copilot…): every field, every Format pane option with its internal name, the expected data shape and DAX examples. Generated from the visual's code, version 1.6.0.0. Paste it into your assistant so it can guide you.

Raw Markdown version (/ai/visuals/table.md)
# 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).