# Bar Plume: technical reference for AI assistants

> Power BI custom visual by Plume Studio (Plume Visuals). Visual version **1.4.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 Bar 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/bar-chart (French: https://plumevisuals.com/fr/visuels/bar-chart)
- Summary: Power BI's 5 bar charts in one visual, with small multiples, custom series order, stacked and clustered columns and variance arrows.
- Power BI visual GUID (`visualType`): `plumeBarChart3A7E15C29B4D4F6A8E21D0C5B9F3A7E4`
- 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

Bar Plume (formerly Plume Bar) is a Power BI custom visual (base range, version 1.4.0.0, installed from the `.pbiviz` file; AppSource submission in progress) that covers Power BI's five bar charts in one visual: clustered, stacked and 100% stacked, as bars (`layout.orientation` = `horizontal`) or columns (`vertical`); with `auto` it picks horizontal bars when category names are long or numerous. It adds overlapped bars, small multiples (Small multiples field), drill-down on a hierarchy (several fields in Category, Power BI drill buttons), several measures with a Legend, a custom series order, per-series settings, fixed or maximum bar width, gaps between segments, ribbons between stacks, scrolling (`bars.scrollStart` = `end` starts on the last categories), labels with the share of the category and a detail line (Label detail field), positive and negative totals, a target marker per bar or stack, Top N with "Others", and in premium stacked-and-clustered and diverging layouts, the actual total of 100% bars, variance arrows between columns, error bars, a trend line and reference lines. Bars glide from their old value to the new one (400 ms, `style.animate`).

**New in version 1.4.0.0 (30/10/2026):** Format pane reorganized (new **Layout** card with orientation, series type and shape; new **Gridlines** card); free native-parity additions: **zoom slider**, value axis "Round the range", category-axis gridlines, scale kept under filters (`valAxis.min` / `valAxis.max` from a "Dynamic format" measure); premium **bar chart race** (Play axis ★ field, re-sort at every frame, Top N per frame, stable colors, base64 images).

## 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 Bar Plume (the watermark appears only when they actually apply):
  - `layout.type` = `stackedClustered` ("Stacked and clustered ★") or `diverging` ("Diverging (centered on zero) ★");
  - `labels.totals100` ("Total at the end of 100% bars ★", 100% stacked only);
  - the **Variance arrows ★** card (`variance.show`, `variance.mode` = `consecutive` / `firstLast` / `series`);
  - the **Error bars ★** and **Trend line ★** cards of the Analytics pane (`errorBars.show`, `trend.show`);
  - `smallMultiples.scale` = `independent` ("Independent per panel ★"), only when a field is in Small multiples;
  - `sort.topN` ("Top N ★"), with `sort.n`, `sort.others`, `sort.othersLabel`;
  - `target.variance` = `pct` ("In % ★") or `abs` ("In value ★"), only when a field is in Target;
  - `layout.shape` = `lollipop` ("Lollipop (stem and dot) ★") or `pill` ("Pill (rounded ends) ★");
  - `dataColors.mode` = `gradient` ("Gradient by value ★") or `highlight` ("Highlight one bar ★");
  - the **Reference lines ★** card of the Analytics pane (`reference.show1/2/3`, `reference.band`);
- Premium options and list values carry " ★" in their label and the description "Premium feature: usable for free with a « Premium preview » watermark…".
- Accepted keys: only keys starting with `PLUM1.` shown in the buyer's account on plumevisuals.com, checked offline (Ed25519 signature), covering `bar-chart` or the whole catalog. In edit mode, a wrong key shows "Invalid license key", "License expired (date)" or "This key does not cover this visual". `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). Prices per year: 39 € personal, 99 € SME, 299 € enterprise, or a catalog pack (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.

## Expected data shape

The visual reads **one row per category** (and per series value when Legend is used), with the measures evaluated for that row.

| Category (`category`) | Values (`values`) | Target (`target`) |
|---|---|---|
| Île-de-France | 1 412 300 | 1 350 000 |
| Bretagne | 388 950 | 420 000 |
| … | … | … |

- **Category** (`category`, label "Category" / « Axe (catégories) », grouping, up to 6 fields): one bar per value. Several fields form a hierarchy explored with Power BI's drill buttons; after "Expand all down one level", labels are concatenated ("2024 Furniture", `catAxis.concatenate` = true) or the upper level is written under the columns (false).
- **Legend (series)** (`series`, « Légende (séries) », grouping, one field, optional): one series per value (channel, year…). Unlike native charts, **a Legend can be combined with several measures**: one series per value and measure ("Store · Revenue"), each measure in a shade of the series color; with `layout.type` = `stackedClustered`, one stack per measure.
- **Values** (`values`, « Valeurs », measures, several allowed): one series per measure.
- **Small multiples** (`multiples`, « Petits multiples », grouping, one field, optional): one panel per value, in a grid (`smallMultiples.columns`, 0 = automatic); shared value axis by default, axes on outer panels only; totals, Top N, targets and analytics are kept in every panel. A click selects the category in that panel.
- **Target** (`target`, « Objectif », one measure, optional): a marker per bar (or per stack). With a Legend, the measure is evaluated per series; with `stacked` layout the stack target is the sum of the series targets. The tooltip always adds the target and the variance in % when a target exists.
- **Label detail** (`labelDetail`, « Détail des étiquettes », one measure, optional): shown under the value (`labels.detailPos` = `below`), next to it (`inline`) or instead of it (`only`) when data labels are on.
- **Lower bound / Upper bound (error bars)** (`errorLow`, `errorHigh`, one measure each, optional): bounds of the error bars ★ (`errorBars.source` = `fields` for values, `relative` for ± deltas; `percent` needs no field).
- **Tooltips** (`tooltips`, « Infobulles », measures, optional) and **Dynamic format** (`format`, « Format dynamique », measures, see below).
- Volume: up to 10,000 rows (category × small multiple) and 60 series (top-N data reduction of Power BI). Beyond the room, bars scroll.
- Values are taken as they come: Top N and "Others" are computed on the categories received, and "Others" is the **sum** of the remaining categories per series.

## DAX recipes

```dax
Revenue = SUM ( Sales[Amount] )
Gross margin = SUM ( Sales[Margin] )

// Target from a disconnected table Targets[Region], Targets[Annual target]
Target =
CALCULATE ( SUM ( Targets[Annual target] ), TREATAS ( VALUES ( Sales[Region] ), Targets[Region] ) )
    * MAX ( 1, DISTINCTCOUNT ( Sales[Year] ) )

// Year-over-year change, usable in Tooltips or for a dynamic title
Growth 2025 = DIVIDE ( CALCULATE ( [Revenue], Sales[Year] = "2025" ), CALCULATE ( [Revenue], Sales[Year] = "2024" ) ) - 1
```

For a "lower is better" metric (costs, lead times), set `target.lowerIsBetter` = true: the colors of the variance swap meaning, the sign stays mathematical.

## Interactions with the report

- Click a bar = select (cross-filters other visuals), Ctrl + click = add, click on the background = clear. Clicking the "Others" bar selects every grouped category. Legend click selects a whole series (`legend.interactive`), legend hover highlights it.
- Supports **highlighting** from other visuals: the highlighted part is drawn solid, the rest faded.
- Keyboard: Tab to the chart, arrow keys / Home / End to move between bars, Enter or Space to select (Ctrl / Shift to add), Esc to clear. Screen-reader announcements, ARIA labels.
- Context menu, Power BI tooltips (report-page tooltips too), landing page when no field is set, read-only on dashboards, high contrast (series told apart by fill), reduced motion respected. No network request.

## Dynamic formats

- **fx button** (Power BI conditional formatting) on every color and every text of the Format pane: *Field value*, *Rules*, *Gradient*. With `dataColors.mode` = `category`, each category color has its own fx button (rules color each bar like native visuals).
- **Dynamic format** field (role `format`, several measures): a measure renamed for this visual as `card.setting` (right-click › Rename for this visual) drives **any** setting: sizes, toggles, lists, fonts, colors, texts. It wins over the fixed value, the style and an fx rule; its measures are never drawn. Names ignore case, accents and separator (`Title Color` = `title.color`).
- Value used for a global setting: the common value of all bars, else the total, else the first bar. Wrap with `CALCULATE ( …, ALLSELECTED () )` for a whole-visual value. Unknown names and unusable values are reported in edit mode and ignored.
- Examples: `title.text` = `"Revenue by region · 2025 vs 2024: " & FORMAT ( CALCULATE ( [Growth 2025], ALLSELECTED () ), "+0.0 %;-0.0 %" )`; `title.color` = `IF ( CALCULATE ( [Growth 2025], ALLSELECTED () ) >= 0, "#2E7D4F", "#C0392B" )`; `sort.n` = `SELECTEDVALUE ( 'Product count'[Product count], 6 )` (a numeric range parameter). A ★ setting driven by DAX stays ★.

## Format pane: how to read the tables below

- Each option has an ID `card.option` (for example `layout.orientation`). The card is the capabilities.json **object name**, the option is the **property name**.
- Card order: `license` (always first), `style` (shared Style card: `preset`, `themeJson`, `followTheme`, `reverse`, then custom colors with `palette`, font, background, radius, animations), `dataColors` (dynamic card "Data colors": mode, then one color per series or per category, stored with its selector), `bars`, `seriesFormat` (dynamic card "Per-series settings": "Apply settings to" All series or one series; labels, label position and color, opacity, relative width when overlapped, stack when stacked and clustered, side when diverging), `sort` ("Sort and order": categories, then series order `sort.seriesBy` = `model` / `nameAsc` / `nameDesc` / `totalDesc` / `totalAsc` / `custom` with `sort.seriesNames` = "Web; Store", `sort.seriesReverse`), `target`, `variance`, `labels`, `catAxis`, `valAxis`, `legend`, `smallMultiples`, `interaction`, then `title`, `source`, `container`, `texts`. The `reference` ("Reference lines ★"), `errorBars` ("Error bars ★") and `trend` ("Trend line ★") cards are in the **Analytics** pane. Format pane in version 1.4.0.0 (30/10/2026), top to bottom: `license`, `style`, `layout`, `dataColors`, `seriesFormat`, `bars`, `labels`, `catAxis`, `valAxis`, `gridlines`, `legend`, `sort`, `target`, `variance`, `zoom`, `smallMultiples`, `play`, `race`, `interaction`, `tooltip`, `title`, `source`, `container`, `texts`; Analytics pane: `reference`, `errorBars`, `trend`. Settings moved or renamed in this version keep working in older reports (the old names are still read).
- Labels follow the language of Power BI Desktop; `texts.language` can force French or English inside the visual. "Visible when" means the option only appears when another option has one of the listed values (e.g. `sort.n` only when `sort.topN` = true, `target.goodColor` only when `target.variance` ≠ `none`).

## 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`. A per-series color uses an entry with a `selector`.

```json
{
  "visualType": "plumeBarChart3A7E15C29B4D4F6A8E21D0C5B9F3A7E4",
  "query": {
    "queryState": {
      "category": { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Region" } }, "queryRef": "Sales.Region", "nativeQueryRef": "Region" } ] },
      "values":   { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Revenue" } }, "queryRef": "Sales.Revenue", "nativeQueryRef": "Revenue" } ] },
      "target":   { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Target" } }, "queryRef": "Sales.Target", "nativeQueryRef": "Target" } ] },
      "format":   { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Dynamic title" } }, "queryRef": "Sales.Dynamic title", "nativeQueryRef": "Dynamic title", "displayName": "title.text" } ] }
    }
  },
  "objects": {
    "bars":       [ { "properties": { "orientation": { "expr": { "Literal": { "Value": "'vertical'" } } } } } ],
    "target":     [ { "properties": { "marker": { "expr": { "Literal": { "Value": "'line'" } } },
                                       "variance": { "expr": { "Literal": { "Value": "'pct'" } } } } } ],
    "labels":     [ { "properties": { "show": { "expr": { "Literal": { "Value": "true" } } },
                                       "decimals": { "expr": { "Literal": { "Value": "0D" } } } } } ],
    "catAxis":    [ { "properties": { "labelMode": { "expr": { "Literal": { "Value": "'rotate45'" } } } } } ],
    "dataColors": [ { "properties": { "fill": { "solid": { "color": { "expr": { "Literal": { "Value": "'#b8462a'" } } } } } },
                      "selector": { "metadata": "Sales.Revenue" } } ],
    "license":    [ { "properties": { "key": { "expr": { "Literal": { "Value": "'PLUM1.…'" } } } } } ]
  }
}
```

Top N: `"sort": [ { "properties": { "topN": { "expr": { "Literal": { "Value": "true" } } }, "n": { "expr": { "Literal": { "Value": "6D" } } } } } ]`. The custom visual package must also be embedded in the report (Power BI does this when the visual is imported from the `.pbiviz` file).

## Styles and theme JSON

- `style.preset` takes one of the 20 style IDs shared by every Plume visual: `none`, `minimal`, `blackWhite`, `press`, `vintage`, `earth`, `nordic`, `executive`, `accessible`, `pastel`, `bauhaus`, `climate`, `blueprint`, `unknownPleasures`, `dark`, `neon`, `terminal`, `infographic`, `cockpit`, `hologram`.
- `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

- Five native charts: clustered / stacked / 100% stacked = `layout.type` (`clustered`, `stacked`, `stacked100`), bars or columns = `layout.orientation`.
- Unwanted scrollbar: bars are thinner than `bars.minSize` (lower it) or `bars.widthMode` = `fixed` with a large `bars.barPx`. Small multiples scroll when a panel would be lower than `smallMultiples.minHeight`.
- No target marker: Target well empty, or the measure is blank for those categories (no relationship, misspelled keys).
- Variance to target computed on the first measure when several are clustered, on the stack total when stacked. Variance arrows compare category totals (`consecutive`, `firstLast`) or the first two series (`series`).
- "Others" shows a meaningless figure for a ratio or an average: "Others" is a sum. Turn off `sort.others` for non-additive measures.
- Months sorted by value: set `sort.by` = `data` (model order) with a sort-by column in the model, or `labelAsc` with `sort.natural` for codes like "M2" / "M10".
- `labels.totals` only exists for `stacked` and `stackedClustered`, `labels.totals100` for `stacked100`; `bars.groupGap` for `clustered` and `stackedClustered` (negative = partial overlap); `bars.ribbons` for `stacked` and `stacked100`.
- Labels of small stacked segments disappear when the text does not fit: turn on `labels.overflow`, or hide them on purpose with `labels.minShare`.
- Watermark visible: a ★ option is applied (see the list above) without a valid key.
- A measure in the Dynamic format field that is never blank can bring back categories without data: return BLANK when the main measure is blank.

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

Combo bar + line chart, secondary value axis, waterfall or bridge (use Waterfall Plume), continuous date axis and zoom slider (bars scroll instead), dynamic Top N by another measure than the bar value, "Others" as an average, per-bar images or icons, data-driven bar width, export of the data from the visual, play axis or animation over time, forecast (use Line Plume).

## Data fields (wells)

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

| Internal name | Label (EN) | Label (FR) | Kind | Max fields | Description |
|---|---|---|---|---|---|
| `category` | Category | Axe (catégories) | column | 6 |  |
| `series` | Legend (series) | Légende (séries) | column | 1 |  |
| `values` | Values | Valeurs | measure | several |  |
| `multiples` | Small multiples | Petits multiples | column | 1 |  |
| `target` | Target | Objectif | measure | 1 |  |
| `labelDetail` | Label detail | Détail des étiquettes | measure | 1 |  |
| `errorLow` | Lower bound (error bars) | Borne basse (barres d'erreur) | measure | 1 |  |
| `errorHigh` | Upper bound (error bars) | Borne haute (barres d'erreur) | measure | 1 |  |
| `tooltips` | Tooltips | Infobulles | measure | several |  |
| `play` | Play axis ★ | Axe de lecture ★ | column | 1 | A date, a year or an ordered category: the visual moves from one value to the next (play button) |
| `image` | Image (base64) ★ | Image (base64) ★ | measure | 1 | Text measure or column: an image (data URI or base64) per category, shown in the bar chart race. |
| `format` | Dynamic format | Format dynamique | measure | several | Measures named card.setting (e.g. title.fontSize): drive any Format option with DAX |

Data view: categorical, categories = `multiples` + `category` + `play` (one row per combination), 30,000 rows per data window (more fetched automatically); measures = `values`, `target`, `labelDetail`, `errorLow`, `errorHigh`, `image`, `tooltips`, `format`, grouped into series by `series`.
Capabilities: supportsHighlight, supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).

## Format pane options (288)

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

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

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

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

**Style**

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

**Custom colors / Couleurs personnalisées**

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

**Text / Texte**

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

**Animations**

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

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `layout.orientation` | Orientation | Orientation | dropdown | enumeration | `auto` | `auto` Automatic (based on room); `vertical` Columns (vertical); `horizontal` Bars (horizontal) | Automatic: horizontal bars when category names are long or numerous. |
| `layout.type` | Series | Séries | dropdown | enumeration | `clustered` | `clustered` Clustered (side by side); `stacked` Stacked; `stacked100` 100% stacked; `overlap` Overlapped; `stackedClustered` Stacked and clustered ★; `diverging` Diverging (centered on zero) ★ | Stacked and clustered: one stack per measure (with a legend) or per "Stack" chosen series by series. Diverging: agreement scales (Likert), side of each series in "Per-series settings". |
| `layout.divergingPct` | As % of the category | En % de la catégorie | toggle | bool | `true` | true / false | Visible when `layout.type` = `diverging` |
| `layout.shape` | Shape | Forme | dropdown | enumeration | `bar` | `bar` Bar; `lollipop` Lollipop (stem and dot) ★; `pill` Pill (rounded ends) ★ |  |

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

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `dataColors.mode` | Coloring | Coloration | dropdown | enumeration | `auto` | `auto` Palette (one color per series); `single` Single color; `category` One color per category; `gradient` Gradient by value ★; `highlight` Highlight one bar ★ |  |
| `dataColors.single` | Color | Couleur | color | fill | (empty) | hex color |  |
| `dataColors.fill` | Color | Couleur | color | fill | (empty) | hex color |  |
| `dataColors.negative` | Negative values (empty = same color) | Valeurs négatives (vide = même couleur) | color | fill | (empty) | hex color |  |
| `dataColors.highlightWhat` | Highlighted bar | Barre mise en avant | dropdown | enumeration | `max` | `max` Largest; `min` Smallest; `first` First; `last` Last; `name` Named category |  |
| `dataColors.highlightName` | Category name | Nom de la catégorie | text | text | (empty) |  |  |
| `dataColors.highlightColor` | Highlight color (empty = accent) | Couleur mise en avant (vide = accent) | color | fill | (empty) | hex color |  |
| `dataColors.othersColor` | Other bars color (empty = style gray) | Couleur des autres barres (vide = gris du style) | color | fill | (empty) | hex color |  |

### Per-series settings / Réglages par série (`seriesFormat`, 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.seriesFormat` 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 |
|---|---|---|---|---|---|---|---|
| `seriesFormat.labels` | Data labels | Étiquettes de données | dropdown | enumeration | `inherit` | `inherit` Same as the Labels card; `on` Shown; `off` Hidden |  |
| `seriesFormat.labelPos` | Label position | Position des étiquettes | dropdown | enumeration | `inherit` | `inherit` Same as the Labels card; `auto` Automatic; `outsideEnd` Outside end; `insideEnd` Inside end; `center` Center; `insideBase` Inside base |  |
| `seriesFormat.labelColor` | Label color (empty = Labels card) | Couleur des étiquettes (vide = carte Étiquettes) | color | fill | (empty) | hex color |  |
| `seriesFormat.opacity` | Opacity (%, 0 = Bars card) | Opacité (%, 0 = carte Barres) | number | integer | `0` | 0 to 100 |  |
| `seriesFormat.width` | Relative width (%, 0 = automatic) | Largeur relative (%, 0 = automatique) | number | integer | `0` | 0 to 100 | Overlapped: width of the series relative to the room (a thin bar in front of a wide one). |
| `seriesFormat.stack` | Stack (stacked and clustered) | Pile (empilées et groupées) | dropdown | enumeration | `auto` | `auto` Automatic (one per measure); `1` Stack 1; `2` Stack 2; `3` Stack 3; `4` Stack 4; `5` Stack 5; `6` Stack 6 |  |
| `seriesFormat.side` | Side (diverging) | Côté (divergentes) | dropdown | enumeration | `auto` | `auto` Automatic (first half on the left); `left` Negative (left / bottom); `right` Positive (right / top); `neutral` Neutral (across zero) |  |

### Bars / Barres (`bars`, Format pane)

**Width and spacing / Largeur et espacement**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `bars.widthMode` | Bar width | Largeur des barres | dropdown | enumeration | `relative` | `relative` Relative to the room; `fixed` Fixed (px) |  |
| `bars.thickness` | Bar thickness (%) | Épaisseur des barres (%) | number | integer | `70` | 10 to 100 | Visible when `bars.widthMode` = `relative` |
| `bars.maxPx` | Maximum width (px, 0 = no limit) | Largeur maximale (px, 0 = sans limite) | number | integer | `0` | 0 to 400 | Visible when `bars.widthMode` = `relative` |
| `bars.barPx` | Width (px) | Largeur (px) | number | integer | `24` | 2 to 300 | Visible when `bars.widthMode` = `fixed` |
| `bars.groupGap` | Gap between series (%) | Écart entre séries (%) | number | integer | `6` | -50 to 50 | Visible when `layout.type` = `clustered` or `stackedClustered`. Negative: bars of the same group partly overlap. |
| `bars.segmentGap` | Gap between segments (px) | Espace entre les segments (px) | number | integer | `0` | 0 to 12 | Visible when `layout.type` = `stacked` or `stacked100` or `stackedClustered` or `diverging` |
| `bars.outerPad` | Outer padding (% of a category) | Marge aux extrémités (% d'une catégorie) | number | integer | `0` | 0 to 100 |  |
| `bars.radius` | End rounding | Arrondi du bout | number | integer | `2` | 0 to 20 |  |
| `bars.dotSize` | Dot size | Taille du point | number | integer | `10` | 4 to 30 | Visible when `layout.shape` = `lollipop` |
| `bars.minSize` | Minimum thickness before scrolling (px) | Épaisseur minimale avant défilement (px) | number | integer | `16` | 6 to 80 |  |
| `bars.scrollStart` | Initial scroll position | Défilement au départ | dropdown | enumeration | `start` | `start` Start; `end` End (last categories) |  |
| `bars.opacity` | Opacity (%) | Opacité (%) | number | integer | `100` | 10 to 100 |  |
| `bars.border` | Outline | Contour | toggle | bool | `false` | true / false |  |
| `bars.borderColor` | Outline color (empty = style stroke) | Couleur du contour (vide = contour du style) | color | fill | (empty) | hex color | Visible when `bars.border` = `true` |

**Overlap / Superposition**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `bars.overlapOrder` | Drawing order | Ordre de dessin | dropdown | enumeration | `largestBehind` | `largestBehind` Largest behind; `series` Series order |  |
| `bars.overlapNarrow` | Following series narrower | Séries suivantes plus fines | toggle | bool | `false` | true / false | Each series is narrower than the previous one: actual inside plan, this year inside last year. |

**Track and ribbons / Rail et rubans**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `bars.track` | Track behind bars | Rail derrière les barres | toggle | bool | `false` | true / false | A light bar up to the maximum, behind each bar. |
| `bars.ribbons` | Ribbons between stacks | Rubans entre les piles | toggle | bool | `false` | true / false | Visible when `layout.type` = `stacked` or `stacked100`. Links each series from one stack to the next, like Power BI ribbons. |
| `bars.ribbonOpacity` | Ribbon opacity (%) | Opacité des rubans (%) | number | integer | `25` | 5 to 90 | Visible when `layout.type` = `stacked` or `stacked100` |

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

The card header toggle is `labels.show`.

**Labels / Étiquettes**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `labels.show` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `labels.content` | Content | Contenu | dropdown | enumeration | `value` | `value` Value; `percent` Share (of the stack, else of the total); `percentCat` Share of the category; `percentTotal` Share of the grand total; `valuePercent` Value and share; `valuePercentCat` Value and share of the category; `category` Category; `series` Series; `categoryValue` Category and value; `seriesValue` Series and value |  |
| `labels.position` | Position | Position | dropdown | enumeration | `auto` | `auto` Automatic; `outsideEnd` Outside end; `insideEnd` Inside end; `center` Center; `insideBase` Inside base |  |
| `labels.minShare` | Hide below (% of the category) | Masquer sous (% de la catégorie) | number | integer | `0` | 0 to 50 | Labels of segments smaller than this share of their category are hidden (0 = all). |
| `labels.overflow` | Overflow text | Laisser déborder le texte | toggle | bool | `false` | true / false | Stacked: the label of a segment that is too short is shown anyway (otherwise it is hidden). |
| `labels.detailPos` | "Label detail" field | Champ « Détail des étiquettes » | dropdown | enumeration | `below` | `below` On a second line; `inline` Next to the value; `only` Instead of the value |  |
| `labels.orientation` | Text orientation | Orientation du texte | dropdown | enumeration | `horizontal` | `horizontal` Horizontal; `vertical` Vertical (columns) |  |
| `labels.background` | Label background | Fond des étiquettes | toggle | bool | `false` | true / false |  |
| `labels.bgColor` | Background color (empty = visual background) | Couleur du fond (vide = fond du visuel) | color | fill | (empty) | hex color | Visible when `labels.background` = `true` |
| `labels.bgOpacity` | Background opacity (%) | Opacité du fond (%) | number | integer | `85` | 5 to 100 | Visible when `labels.background` = `true` |
| `labels.fontSize` | Size | Taille | number | formatting | `10` | 6 to 24 |  |
| `labels.color` | Color (empty = automatic) | Couleur (vide = automatique) | color | fill | (empty) | hex color | Automatic: readable color depending on the background (inside bars: white or dark). |
| `labels.bold` | Bold | Gras | toggle | bool | `false` | true / false |  |
| `labels.halo` | Text halo | Halo autour du texte | toggle | bool | `true` | true / false |  |
| `labels.declutter` | Hide overlapping labels | Masquer les étiquettes qui se chevauchent | toggle | bool | `true` | true / false |  |

**Totals / Totaux**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `labels.totals` | Total at the end of stacks | Total au bout des piles | toggle | bool | `true` | true / false | Visible when `layout.type` = `stacked` or `stackedClustered` |
| `labels.totalsSplit` | Positive and negative apart | Positifs et négatifs séparés | toggle | bool | `false` | true / false | Visible when `layout.type` = `stacked` or `stackedClustered`. With negative values: one total at each end of the stack instead of the net total. |
| `labels.totals100` | Total at the end of 100% bars ★ | Total au bout des barres 100 % ★ | toggle | bool | `false` | true / false | Visible when `layout.type` = `stacked100`. The actual total of each category (as a value), at the end of the 100% bar. |
| `labels.totalsBold` | Bold totals | Totaux en gras | toggle | bool | `true` | true / false |  |
| `labels.totalsColor` | Totals color (empty = text) | Couleur des totaux (vide = texte) | color | fill | (empty) | hex color |  |

**Numbers / Nombres**

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

### Category axis / Axe des catégories (`catAxis`, Format pane)

The card header toggle is `catAxis.show`.

**Values / Valeurs**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `catAxis.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `catAxis.fontSize` | Size | Taille | number | formatting | `9` | 6 to 24 |  |
| `catAxis.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `catAxis.labelMode` | Long labels | Étiquettes longues | dropdown | enumeration | `auto` | `auto` Automatic; `wrap` Two lines; `rotate45` Tilted (45°); `rotate90` Vertical; `truncate` Truncated (…) |  |
| `catAxis.maxSize` | Maximum room (% of the visual) | Place maximale (% du visuel) | number | integer | `30` | 10 to 60 |  |
| `catAxis.line` | Axis line | Trait de l'axe | toggle | bool | `true` | true / false |  |
| `catAxis.allLabels` | Show every label | Afficher toutes les étiquettes | toggle | bool | `false` | true / false | No label is skipped, even when categories are tight. |
| `catAxis.concatenate` | Concatenate labels | Concaténer les niveaux | toggle | bool | `true` | true / false | Expanded hierarchy ("Expand all down one level"): off, the upper level is written under the columns, once per group. |

**Axis title / Titre de l'axe**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `catAxis.showTitle` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `catAxis.titleText` | Text | Texte | text | text | (empty) |  | Visible when `catAxis.showTitle` = `true` |

### Value axis / Axe des valeurs (`valAxis`, Format pane)

The card header toggle is `valAxis.show`.

**Values / Valeurs**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `valAxis.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `valAxis.fontSize` | Size | Taille | number | formatting | `9` | 6 to 24 |  |
| `valAxis.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `valAxis.units` | Display units | Unités d'affichage | dropdown | enumeration | `auto` | `auto` Auto; `none` None; `k` Thousands; `m` Millions; `b` Billions |  |
| `valAxis.decimals` | Decimals (-1 = auto) | Décimales (-1 = auto) | number | integer | `-1` | -1 to 6 |  |
| `valAxis.prefix` | Prefix | Préfixe | text | text | (empty) |  |  |
| `valAxis.suffix` | Suffix (e.g. €) | Suffixe (ex. €) | text | text | (empty) |  |  |
| `valAxis.line` | Axis line | Trait de l'axe | toggle | bool | `false` | true / false |  |

**Range / Échelle**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `valAxis.scale` | Scale | Échelle | dropdown | enumeration | `linear` | `linear` Linear; `log` Logarithmic |  |
| `valAxis.min` | Minimum | Minimum | text | text | (empty) |  |  |
| `valAxis.max` | Maximum | Maximum | text | text | (empty) |  |  |
| `valAxis.zero` | Always include zero | Toujours inclure zéro | toggle | bool | `true` | true / false | Visible when `valAxis.scale` = `linear` |
| `valAxis.ticks` | Number of ticks (approx.) | Nombre de graduations (environ) | number | integer | `5` | 2 to 20 |  |
| `valAxis.invert` | Invert axis | Inverser l'axe | toggle | bool | `false` | true / false |  |
| `valAxis.round` | Round range | Arrondir la plage | toggle | bool | `true` | true / false | Computed bounds rounded to a round tick. Off: the axis stops at the extreme values. |

**Axis title / Titre de l'axe**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `valAxis.showTitle` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `valAxis.titleText` | Text | Texte | text | text | (empty) |  | Visible when `valAxis.showTitle` = `true` |

### Gridlines / Quadrillage (`gridlines`, Format pane)

**Value axis / Axe des valeurs**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gridlines.valShow` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `gridlines.valColor` | Color (empty = style grid) | Couleur (vide = grille du style) | color | fill | (empty) | hex color |  |
| `gridlines.valWidth` | Width | Épaisseur | number | numeric | `1` | 0.5 to 6 |  |
| `gridlines.valStyle` | Line style | Style de trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `gridlines.zeroLine` | Zero line | Ligne du zéro | toggle | bool | `true` | true / false |  |

**Category axis / Axe des catégories**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gridlines.catShow` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `gridlines.catColor` | Color (empty = style grid) | Couleur (vide = grille du style) | color | fill | (empty) | hex color |  |
| `gridlines.catWidth` | Width | Épaisseur | number | numeric | `1` | 0.5 to 6 |  |
| `gridlines.catStyle` | Line style | Style de trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |

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

The card header toggle is `legend.show`.

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

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

**Categories / Catégories**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `sort.by` | Sort by | Trier par | dropdown | enumeration | `valueDesc` | `valueDesc` Value, descending; `valueAsc` Value, ascending; `labelAsc` Category A → Z; `labelDesc` Category Z → A; `seriesDesc` One series' value, descending; `seriesAsc` One series' value, ascending; `data` Model order | Model order keeps the order of the field (dates, months, sort-by column). |
| `sort.bySeries` | Series name | Nom de la série | text | text | (empty) |  | Visible when `sort.by` = `seriesDesc` or `seriesAsc` |
| `sort.natural` | Natural sort (2 before 10) | Tri naturel (2 avant 10) | toggle | bool | `true` | true / false |  |
| `sort.topN` | Top N ★ | Top N ★ | toggle | bool | `false` | true / false |  |
| `sort.n` | N | N | number | integer | `10` | 1 to 500 | Visible when `sort.topN` = `true` |
| `sort.others` | Group the rest into "Others" | Regrouper le reste dans « Autres » | toggle | bool | `true` | true / false | Visible when `sort.topN` = `true`. "Others" is the sum of the remaining categories. Clicking it selects them. |
| `sort.othersLabel` | "Others" label | Libellé « Autres » | text | text | (empty) |  | Visible when `sort.topN` = `true` |

**Series / Séries**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `sort.seriesBy` | Series order | Ordre des séries | dropdown | enumeration | `model` | `model` Model order; `nameAsc` Name A → Z; `nameDesc` Name Z → A; `totalDesc` Total, descending; `totalAsc` Total, ascending; `custom` Custom | Order of stacks, groups and legend. Colors stay with their series. |
| `sort.seriesNames` | Names in order (separated by ;) | Noms dans l'ordre (séparés par ;) | text | text | (empty) |  | Visible when `sort.seriesBy` = `custom`. Series missing from the list follow, in model order. |
| `sort.seriesReverse` | Reverse order | Inverser l'ordre | toggle | bool | `false` | true / false |  |
| `sort.legendReverse` | Legend in the visual order of stacks | Légende dans l'ordre visuel des piles | toggle | bool | `false` | true / false | Stacked columns: the legend follows the top-to-bottom order of the segments. |

### Target / Objectif (`target`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `target.marker` | Marker | Repère | dropdown | enumeration | `line` | `line` Line; `dot` Dot; `ghost` Ghost bar | Drawn when a field is placed in "Target". |
| `target.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |
| `target.width` | Width | Épaisseur | number | numeric | `2` | 1 to 6 |  |
| `target.variance` | Variance to target | Écart à l'objectif | dropdown | enumeration | `none` | `none` None; `pct` In % ★; `abs` In value ★ |  |
| `target.goodColor` | Color when reached | Couleur si atteint | color | fill | `#2E7D4F` | hex color | Visible when `target.variance` = `pct` or `abs` |
| `target.badColor` | Color when missed | Couleur si non atteint | color | fill | `#C0392B` | hex color | Visible when `target.variance` = `pct` or `abs` |
| `target.lowerIsBetter` | Lower is better | Plus bas = mieux | toggle | bool | `false` | true / false | Visible when `target.variance` = `pct` or `abs` |

### Variance arrows ★ / Écarts entre colonnes ★ (`variance`, Format pane)

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

The card header toggle is `variance.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `variance.show` | Show ★ | Afficher ★ | toggle | bool | `false` | true / false |  |
| `variance.mode` | Compare | Comparer | dropdown | enumeration | `consecutive` | `consecutive` Each category to the previous one; `firstLast` The last category to the first one; `series` 2nd series to the 1st, within each group | Compared values: the category total (the value with a single series). |
| `variance.display` | Show the variance | Afficher l'écart | dropdown | enumeration | `pct` | `pct` In %; `abs` In value; `both` In value and % |  |
| `variance.goodColor` | Increase color | Couleur des hausses | color | fill | `#2E7D4F` | hex color |  |
| `variance.badColor` | Decrease color | Couleur des baisses | color | fill | `#C0392B` | hex color |  |
| `variance.lowerIsBetter` | Decrease is good | Baisse = bonne nouvelle | toggle | bool | `false` | true / false |  |
| `variance.fontSize` | Text size | Taille du texte | number | formatting | `9` | 6 to 20 |  |

### Zoom (`zoom`, Format pane)

The card header toggle is `zoom.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `zoom.show` | Zoom slider | Curseur de zoom | toggle | bool | `false` | true / false | Two-handle slider below the axis: choose the visible range (drag, keyboard). The position is not saved in the report. |
| `zoom.labels` | Slider labels | Étiquettes du curseur | toggle | bool | `true` | true / false |  |
| `zoom.height` | Height (px) | Hauteur (px) | number | integer | `22` | 14 to 48 |  |

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

**Grid / Grille**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `smallMultiples.columns` | Columns (0 = automatic) | Colonnes (0 = automatique) | number | integer | `0` | 0 to 12 |  |
| `smallMultiples.minHeight` | Minimum panel height (px) | Hauteur minimale d'un panneau (px) | number | integer | `80` | 40 to 600 | Below that, the grid scrolls vertically. |
| `smallMultiples.gap` | Spacing (px) | Espacement (px) | number | integer | `14` | 0 to 60 |  |
| `smallMultiples.scale` | Value axis | Axe des valeurs | dropdown | enumeration | `shared` | `shared` Shared by all panels; `independent` Independent per panel ★ |  |
| `smallMultiples.outerAxes` | Axes on outer panels only | Axes sur les bords seulement | toggle | bool | `true` | true / false | Visible when `smallMultiples.scale` = `shared` |
| `smallMultiples.border` | Panel border | Cadre des panneaux | toggle | bool | `false` | true / false |  |

**Titles / Titres**

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

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

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

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

### Bar chart race ★ / Course de barres ★ (`race`, Format pane)

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

**Ranking / Classement**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `race.order` | Bar order | Ordre des barres | dropdown | enumeration | `rank` | `rank` Ranking at each frame (re-sort); `fixed` Fixed order (Sort card) | Ranking: bars swap places when a category overtakes another. |
| `race.topN` | Bars shown (Top N of each frame) | Barres affichées (Top N de chaque image) | number | integer | `10` | 1 to 60 |  |
| `race.scale` | Value scale | Échelle des valeurs | dropdown | enumeration | `frame` | `frame` Fitted to each frame; `all` Shared by all frames |  |
| `race.interpolate` | In-between values during the transition | Valeurs intermédiaires pendant la transition | toggle | bool | `true` | true / false | Bars and labels count from one value to the next (otherwise they jump to the new value). |

**Look / Apparence**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `race.values` | Values at the end of bars | Valeurs au bout des barres | toggle | bool | `true` | true / false | Number format: Data labels card (units, decimals, prefix, suffix). |
| `race.names` | Category names | Noms des catégories | dropdown | enumeration | `axis` | `axis` On the axis; `inside` Inside the bar; `end` At the end of the bar |  |
| `race.images` | Category images | Images des catégories | toggle | bool | `true` | true / false | "Image (base64)" field: one image per category (data URI or base64; web addresses refused). |
| `race.imageShape` | Image shape | Forme de l'image | dropdown | enumeration | `circle` | `circle` Circle; `square` Rounded square | Visible when `race.images` = `true` |
| `race.total` | Frame total under the large value | Total de l'image sous la valeur en grand | toggle | bool | `false` | true / false |  |

### Reference lines ★ / Lignes de référence ★ (`reference`, Analytics pane)

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

**Line 1 / Ligne 1**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `reference.show1` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `reference.kind1` | Value | Valeur | dropdown | enumeration | `average` | `constant` Constant; `average` Average; `median` Median; `min` Minimum; `max` Maximum; `percentile` Percentile; `measure` "Target" field (average) |  |
| `reference.value1` | Constant value | Valeur constante | number | numeric | `0` |  | Visible when `reference.kind1` = `constant` |
| `reference.pct1` | Percentile | Centile | number | integer | `90` | 1 to 99 | Visible when `reference.kind1` = `percentile` |
| `reference.label1` | Label | Libellé | text | text | (empty) |  |  |
| `reference.showValue1` | Show the value | Afficher la valeur | toggle | bool | `true` | true / false |  |
| `reference.color1` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `reference.style1` | Line style | Style de trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `reference.width1` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `reference.labelPos1` | Label position | Position du libellé | dropdown | enumeration | `end` | `end` End; `start` Start; `none` None |  |

**Line 2 / Ligne 2**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `reference.show2` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `reference.kind2` | Value | Valeur | dropdown | enumeration | `constant` | `constant` Constant; `average` Average; `median` Median; `min` Minimum; `max` Maximum; `percentile` Percentile; `measure` "Target" field (average) |  |
| `reference.value2` | Constant value | Valeur constante | number | numeric | `0` |  | Visible when `reference.kind2` = `constant` |
| `reference.pct2` | Percentile | Centile | number | integer | `90` | 1 to 99 | Visible when `reference.kind2` = `percentile` |
| `reference.label2` | Label | Libellé | text | text | (empty) |  |  |
| `reference.showValue2` | Show the value | Afficher la valeur | toggle | bool | `true` | true / false |  |
| `reference.color2` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `reference.style2` | Line style | Style de trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `reference.width2` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `reference.labelPos2` | Label position | Position du libellé | dropdown | enumeration | `end` | `end` End; `start` Start; `none` None |  |

**Line 3 / Ligne 3**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `reference.show3` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `reference.kind3` | Value | Valeur | dropdown | enumeration | `median` | `constant` Constant; `average` Average; `median` Median; `min` Minimum; `max` Maximum; `percentile` Percentile; `measure` "Target" field (average) |  |
| `reference.value3` | Constant value | Valeur constante | number | numeric | `0` |  | Visible when `reference.kind3` = `constant` |
| `reference.pct3` | Percentile | Centile | number | integer | `90` | 1 to 99 | Visible when `reference.kind3` = `percentile` |
| `reference.label3` | Label | Libellé | text | text | (empty) |  |  |
| `reference.showValue3` | Show the value | Afficher la valeur | toggle | bool | `true` | true / false |  |
| `reference.color3` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `reference.style3` | Line style | Style de trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `reference.width3` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `reference.labelPos3` | Label position | Position du libellé | dropdown | enumeration | `end` | `end` End; `start` Start; `none` None |  |

**Reference band / Bande de référence**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `reference.band` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `reference.bandFrom` | From | De | number | numeric | `0` |  |  |
| `reference.bandTo` | To | À | number | numeric | `0` |  |  |
| `reference.bandLabel` | Label | Libellé | text | text | (empty) |  |  |
| `reference.bandColor` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `reference.bandOpacity` | Opacity (%) | Opacité (%) | number | integer | `12` | 2 to 60 |  |

### Error bars ★ / Barres d'erreur ★ (`errorBars`, Analytics pane)

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

The card header toggle is `errorBars.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `errorBars.show` | Show ★ | Afficher ★ | toggle | bool | `false` | true / false |  |
| `errorBars.source` | Bounds | Bornes | dropdown | enumeration | `fields` | `fields` Lower / Upper bound fields (values); `relative` Lower / Upper bound fields (± deltas); `percent` Percentage of the value | Stacked: on the stack total. With a single delta field, it is used on both sides. |
| `errorBars.pct` | Percentage (±) | Pourcentage (±) | number | numeric | `10` | 0 to 100 | Visible when `errorBars.source` = `percent` |
| `errorBars.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |
| `errorBars.width` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `errorBars.cap` | Cap width (px) | Largeur des taquets (px) | number | integer | `8` | 0 to 40 |  |
| `errorBars.band` | Shaded band instead of whiskers | Bande ombrée plutôt que des traits | toggle | bool | `false` | true / false |  |

### Trend ★ / Tendance ★ (`trend`, Analytics pane)

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

The card header toggle is `trend.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `trend.show` | Show ★ | Afficher ★ | toggle | bool | `false` | true / false |  |
| `trend.on` | Computed on | Calculée sur | dropdown | enumeration | `total` | `total` Category totals; `series` Each series (clustered, overlapped) |  |
| `trend.color` | Color (empty = text or series) | Couleur (vide = texte ou série) | color | fill | (empty) | hex color |  |
| `trend.style` | Line style | Style du trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `trend.width` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `trend.label` | Slope at the end of the line | Pente en fin de ligne | toggle | bool | `false` | true / false |  |

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

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

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

The card header toggle is `tooltip.show`.

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

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

The card header toggle is `title.show`.

**Title / Titre**

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

**Subtitle / Sous-titre**

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

**Divider / Séparateur**

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

**Spacing / Espacement**

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

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

The card header toggle is `source.show`.

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

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

**Background / Arrière-plan**

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

**Border / Bordure**

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

**Shadow / Ombre**

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

**Spacing / Marges**

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

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

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