Skip to content
Plume Visuals
← Back
Core range

Bump chart for Power BI Bump Plume

Who climbs, who falls, who enters the top: rankings over time, computed in the visual, as curves, ribbons or a metro map.

Tutorials ↓

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

Bump Plume shows how a ranking changes from one period to the next. Drop your periods in Axis, what you rank in Legend and any measure in Value: the visual ranks the entities in each period, with no RANKX, using the tie method you choose; a rank you already compute can go in the Rank field. Two tied entities never overlap. Top N keeps an “Outside the top” row where you see who leaves and who comes back. Lines draw themselves period by period. Three free designs (S-curves, sharp breaks, stacked ribbons like the Power BI ribbon chart). With premium: the ▶ button or the play bar that replays the race, with names following the head of each line, steps, modified and unique ties, a metro map, ribbons sized by value, a Ranks / Values switch for readers, ▲3 / ▼2 rank changes, podium and relegation zones, logos at both ends and annotations.

Use cases

  • Brands, products or stores ranked by revenue, year after year
  • Leagues and competitions: rounds, ties, podium and relegation
  • Market share by quarter: who enters the Top 5, who leaves it
  • Lead times, costs or durations where smaller is better (rank 1 = lowest value)

FreeIncluded for free

  • Axis, Legend and Value fields (ranked by the visual) or a Rank you already compute; up to 200 entities
  • Ties as standard 1-2-2-4 (RANKX) or dense, “=2”; tied lines never on top of each other
  • Top N in each period or on the last period, with an “Outside the top” row and ▲ entries / ▼ exits
  • S-curves (adjustable curvature), sharp breaks, stacked ribbons like the native ribbon chart
  • Names at both ends, rank inside the markers, values on points, period and rank axes, banded rows
  • Lines drawn period by period when the data arrives, animated transitions after a filter
  • Hover to bring an entity forward, cross-filtering, highlighting, tooltips with rank change and best rank, keyboard
  • Data labels, total above stacked ribbons, line style, axis titles, gridlines, period axis drill-down
  • Ranking kept under filters (dim or hide the others, ranks kept), long names on two lines
  • Dynamic formats: fx button on colors and texts, any option driven by DAX

PremiumPremium features

  • Race playback: ▶ button or play bar (shared Plume player), names following the head of the lines
  • Metro map: thick lines, 45° bends, stations and interchanges where two entities swap places; steps design
  • Modified 1-3-3-4 or unique 1-2-3-4 ties, Top N on any period
  • Ribbons sized by value, centered on the rank: ranks and amounts in one picture
  • Ranks / Values button for readers, with lines gliding to their values
  • ▲3 / ▼2 rank changes, ranking zones (podium, relegation), logos at both ends, annotations
  • Highlighted entities, final-rank gradient; catalog-wide styles, palettes, 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 startedBeginner5 min readA bump chart in Power BI: rankings over time, no RANKX neededGet started with Bump Plume: prepare a table, insert the visual, let it compute the ranks, set the Top N, read entries and exits and replay the evolution.
  2. How-to guidesIntermediate5 min readBump Plume: 9 how-to recipes for rankingsStep by step: ties like RANKX, lowest value first, Top N with entries and exits, a rank you already compute, ribbons, metro map, playback ★, zones and logos.
  3. Fields and settingsIntermediate19 min readBump Plume: every field and setting explainedEvery field well and every Format pane setting of Bump Plume: ranking, designs, markers, labels, axes, zones, views and playback, with their default values.
  4. BasicsGetting started with Plume visualsInstallation, license, styles and the settings shared by every visual.

Fields to drop into the visual

FieldContent
Axis (time)Date, year, month or sorted category: the periods, from left to rightRequired
Legend (entity)What is ranked: one line per value (200 at most)Required
Value (ranked by the visual)A measure ranked by the visual in each period; ribbon thicknessOptional
Rank (optional)A rank you already compute (1 = first), instead of the ValueOptional
ImageEmbedded logo (data:image/…;base64) at both ends of the linesOptionalPremium
AnnotationsText measure: a note on the entity's point in that periodOptionalPremium
TooltipsExtra measuresOptional
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 Bump 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.1.0.0. Paste it into your assistant so it can guide you.

Raw Markdown version (/ai/visuals/bump-chart.md)
# Bump Plume: technical reference for AI assistants

> Power BI custom visual by Plume Studio (Plume Visuals). Visual version **1.1.0.0**. This page is generated from the visual's source code at each site build: field names, option names and defaults are exact for this version.

Use it to help someone build a report with Bump 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/bump-chart (French: https://plumevisuals.com/fr/visuels/bump-chart)
- Summary: Who climbs, who falls, who enters the top: rankings over time, computed in the visual, as curves, ribbons or a metro map.
- Power BI visual GUID (`visualType`): `plumeBumpChart65AF1CF0250B4188882D035A1EA77D58`
- 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

Bump Plume (identifier `bump-chart`) is a Power BI custom visual (version 1.1.0.0, installed from its `.pbiviz` file; AppSource submission in preparation) that draws **bump charts**: how rankings change over time. Power BI has no native bump chart; its closest visual is the ribbon chart (no rank axis, no names on the ribbons).

**New in version 1.1.0.0 (30/10/2026):** Format pane reorganized (end labels in **End labels**, `labels.v*` → `labels.*`, gridlines in **Gridlines**); free full data labels with totals above columns, axis titles, gridlines, drill-down, highlight color, "keep ranks under filters", two-line long names in the metro map, annotations like Line Plume.

- **Ranks computed in the visual**: put a measure in `value` ("Value (ranked by the visual)"); in each period the entities are ranked by it (`ranking.order` = `desc`: highest value first, `asc`: lowest first). No `RANKX` needed. A rank you already compute goes in `rank` ("Rank (optional)") and wins over the value.
- **Ties** (`ranking.ties`): `competition` 1-2-2-4 (= RANKX Skip, default), `dense` 1-2-2-3 (= RANKX Dense), premium `modified` ★ 1-3-3-4 and `ordinal` ★ 1-2-3-4 (ties broken by the previous rank, then by name; premium only when the visual ranks the Value field). Tied entities are never drawn on top of each other: each gets its own row ("slot"), ordered by previous rank then name; labels write "=2" (`ranking.tieMark`), tooltips "(tied)".
- **Top N** (`ranking.topN`, 10 by default, 0 = all) with `ranking.topBasis`: `period` (the first N of each period; an entity that leaves drops with dashes into an "Outside the top N" row with an exit marker ▼ and comes back with an entry marker ▲), `last` (the first N of the last period, followed over all periods), `any` ★ (entities in the top N at least once).
- **Rank 1 at the top** (`ranking.rankOneTop`, on). A period without a value breaks the line (`ranking.missing` = `gap`) or is skipped (`connect`); 0 is ranked.
- **Designs** (`design.type`): `curve` S-curves (default, `design.curvature` 0–100), `straight` sharp breaks, `stacked` stacked ribbons like the Power BI ribbon chart (spacing, transparency 30, border), and premium `step` (steps), `metro` (metro map: thick lines, horizontal runs and 45° bends, stations, interchange capsules where two entities swap places, terminus badges) and `ribbon` (ribbons as thick as their value, centered on the rank).
- Markers with the rank number inside, names at the start and the end of the lines, values on points, hover to bring an entity forward (others fade), lines drawn period by period when data changes, and premium playback: a discreet ▶ button or a play bar that reveals periods one by one with labels following the head of the lines.

## 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 are **free**; every other `style.preset`, the other gradient palettes (`style.palette`) and `style.themeJson` ("Theme JSON ★") are **premium**.
- Free in Bump Plume: ranks from Value or Rank, standard and dense ties (like RANKX), Top N per period or on the last period with entries and exits, curves, sharp breaks, stacked ribbons, markers, names at both ends, values on points, axes, banded rows, the ranks view, drawing animation when data changes, palette or single colors, tooltips, legend, keyboard.
- Premium features of Bump Plume:
  - `design.type` = `step`, `metro` or `ribbon`;
  - `ranking.ties` = `modified` or `ordinal` (when the visual ranks the Value field) and `ranking.topBasis` = `any` (Top N ≠ 0);
  - playback: `play.controls` (play bar), `play.button` (discreet ▶ button) or `play.autoPlay`, on an interactive visual with at least two periods (since the 22/10/2026 rebalancing; the ▶ button is off by default);
  - `dataColors.mode` = `highlight` (named entities in color, others gray; `dataColors.highlightNames` separated by `;`, empty = the leader at the end) or `finalRank` (gradient by final rank);
  - `endLabels.change` (rank change ▲3 / ▼2 at the end of the lines);
  - `view.mode` = `value` (values view), also when a reader picks "Values" with the `view.toggle` button;
  - `zones.show` (ranking zones: podium, relegation);
  - the `image` role (logos) when images are shown, and annotations (`notes` role or `annotations.list`) when shown.
- Without a valid key, a premium feature in use shows, in edit mode, a "Premium preview" note in the footer; in reading view, **"Plume Visuals · Premium preview"** (French « Plume Visuals · Aperçu premium ») is repeated lightly across the whole visual, without catching the mouse. It disappears once a key is pasted in **Format › Plume Studio License › License key** (`license.key`), the **first card** of the Format pane. Premium options and list values have " ★" appended to their label.
- Accepted keys: only keys starting with `PLUM1.` shown in the buyer's account on plumevisuals.com, checked offline (Ed25519 signature), covering `bump-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".
- Licenses last one year (one-time payment, no automatic renewal). Prices: 39 € personal, 99 € SME, 299 € enterprise per year, or the catalog pack.

## Expected data shape

One row per period and per entity, with a measure.

| Axis (`axis`) | Legend (`legend`) | Value (`value`) |
|---|---|---|
| 2023 | Alpha | 400,000 |
| 2023 | Bravo | 300,000 |
| 2024 | Alpha | 300,000 |
| 2024 | Bravo | 350,000 |

- **Axis (time)** (`axis`, « Axe (temps) », one column, required): a date, year, month, number or sorted category. Dates and numbers are sorted by the visual; text keeps Power BI's sort order.
- **Legend (entity)** (`legend`, « Légende (entité) », one column, required): one line per value, up to 200.
- **Value (ranked by the visual)** (`value`, « Valeur (classée par le visuel) », one measure): required unless Rank is used. Also sets ribbon thickness.
- **Rank (optional)** (`rank`, « Rang (facultatif) », one measure): 1 = first; decimals allowed.
- **Image ★** (`image`, text measure): embedded images only: `data:image/png|jpeg|gif|webp|bmp|svg+xml;base64,…`, raw base64 or SVG text (SVG is sanitized); web addresses are ignored (no network). The last non-blank image of each entity is used.
- **Annotations ★** (`notes`, text measure): a note pinned to the entity's point in that period.
- **Tooltips** (`tooltips`) and **Dynamic format** (`format`).
- Volume: categories (periods) in windows of 30,000, more fetched with `fetchMoreData`; 100,004 rows (4 entities × 25,001 days) render in under 2.5 s; markers hide automatically when there is no room.

## DAX recipes

```dax
// One row per period and entity: a simple sum
Total revenue = SUM ( Sales[Revenue] )

// Rank 1 = fastest: keep the measure as is and set ranking.order = asc
Average lead time = AVERAGE ( Deliveries[Lead time] )

// Logo ★ from a column holding base64 text
Logo = "data:image/png;base64," & SELECTEDVALUE ( Brands[Logo base64] )

// Dynamic title (renamed title.text in the Dynamic format well)
Ranking title =
VAR y = CALCULATE ( MAX ( Sales[Year] ), ALLSELECTED () )
VAR t = CALCULATETABLE ( TOPN ( 1, VALUES ( Sales[Brand] ), CALCULATE ( SUM ( Sales[Revenue] ) ), DESC ), ALLSELECTED (), Sales[Year] = y )
RETURN "Brand ranking: " & CONCATENATEX ( t, Sales[Brand], ", " ) & " leads in " & y
```

## Interactions with the report

- Hover a line, marker or label: the entity comes in front (`interaction.front`), others fade (`interaction.dim`); tooltip with entity, period, rank (tied, outside the top), value, change since the previous period, best rank, annotation, Tooltips measures; report-page tooltips are supported.
- Click a line or a label: cross-filter on the entity; click a marker: entity × period; Ctrl for several; click an empty area: clear. Cross-highlighting from other visuals dims the other entities. Context menu everywhere.
- Keyboard: Tab to reach the chart, ↑ ↓ through entities in final-rank order (announced: "rank 3 in 2025, ▲2 since 2018, best rank 1"), Enter selects, Esc clears.
- Playback uses the shared Plume player (same settings as other Plume visuals): `play.controls` ★ (play bar with tick-marked slider, start / end, speed ×0.5–×4, keyboard; off by default), `play.button` ★ (discreet ▶ on hover when there is no bar, off by default), `play.autoPlay` ★, `play.speed` (ms per frame, 700), `play.loop`, `play.transition`, `play.follow` (labels follow the line heads), `play.showLabel` / `labelSize` (40) / `labelPosition` (current period while playing). `play.draw` (free) draws the lines period by period when data changes (`play.drawDuration`, 1400 ms); filters make points glide to their new place. "Reduce motion" is respected. Nothing is saved with persistProperties; the view chosen with the Ranks / Values button lasts for the session.

## Dynamic formats

- **fx button** (Power BI conditional formatting) on colors and texts of the Format pane, and on each entity color.
- **"Dynamic format" well** (`format`): measures renamed `card.setting` (e.g. `title.text`, `design.type`, `ranking.topN`) drive any setting and win over the fixed value. Driving a ★ setting by DAX still shows the watermark without a key.

## Format pane: option IDs

- Card order: `license`, `style`, `dataColors`, `ranking`, `design`, `markers`, `labels`, `xAxis`, `yAxis`, `zones`, `view`, `play`, `annotations`, `tooltip`, `legend`, `interaction`, then `title`, `source`, `container`, `texts`. Format pane in version 1.1.0.0 (30/10/2026), top to bottom: `license`, `style`, `dataColors`, `ranking`, `view`, `design`, `markers`, `labels`, `endLabels`, `xAxis`, `yAxis`, `gridlines`, `legend`, `zones`, `annotations`, `play`, `interaction`, `tooltip`, `title`, `source`, `container`, `texts`. Settings moved or renamed in this version keep working in older reports (the old names are still read).
- `dataColors`: `mode` (`auto` | `single` | `highlight` ★ | `finalRank` ★), `single`, `fill` (per entity), `highlightNames`, `othersColor`.
- `ranking`: `order` (`desc` | `asc`), `ties` (`competition` | `dense` | `modified` ★ | `ordinal` ★), `tieMark`, `topN` (0–200, 10), `topBasis` (`period` | `last` | `any` ★), `missing` (`gap` | `connect`), `rankOneTop`.
- `design`: `type` (`curve` | `straight` | `step` ★ | `stacked` | `metro` ★ | `ribbon` ★), `curvature` (0–100, 50), `width` (0.5–20, 3), `casing`, `interchanges`, `ribbonSize` (10–100, 80), `spacing` (0–50, 12), `transparency` (0–90, 30), `border`.
- `markers`: `show` (`auto` | `all` | `ends` | `none`), `shape` (`circle` | `square` | `diamond`), `size` (4–48, 20), `rankInside`, `fill` (`solid` | `hollow`), `entryExit`.
- `endLabels`: `start`, `end`, `content` (`name` | `rankName` | `nameValue` | `rankNameValue`), `fontSize` (10), `color`, `bold`, `maxWidth` (8–45, 22), `images`, `change` ★, `changeBase` (`start` | `prev`), `upColor`, `downColor`.
- `labels` (values on the points): `show`, `position` (`below` | `above`), `units`, `decimals`, `prefix`, `suffix`.
- `xAxis`: `show`, `position` (`bottom` | `top` | `both`), `fontSize`, `color`, `dateFormat`, `gridlines.vShow`, `gridlines.vStyle`. `yAxis`: `show`, `position` (`left` | `right` | `both`), `fontSize`, `color`, `prefix`, `gridlines.hShow`, `gridlines.banding`, `outsideLabel`.
- `zones`: `show` ★, `topCount` (3), `topLabel`, `topColor`, `bottomCount` (0), `bottomLabel`, `bottomColor`, `opacity` (10). `view`: `mode` (`rank` | `value` ★), `toggle`, `zero`.
- `play`: `draw`, `drawDuration`, `speed`, `loop`, `autoPlay` ★, `transition`, `follow`, `controls` ★ (bool), `button` ★, `position` (`bottom` | `top`), `ticks` (`auto` | `all` | `none`), `tickLabels`, `stepButtons`, `speedButton`, `showLabel`, `labelSize`, `labelPosition`. `annotations`: `show`, `list` ★ (`entity | period | text` per line), `fontSize`, `color`. `tooltip`: `show`, `value`, `change`, `best`. `interaction`: `hover`, `dim` (25), `front`.

## Editing a PBIP report (visual.json)

`visualType` is the visual GUID `plumeBumpChart65AF1CF0250B4188882D035A1EA77D58`, `queryState` keys are the data role names (`axis`, `legend`, `value`, `rank`, `image`, `notes`, `tooltips`, `format`), `objects` keys are the option IDs. Booleans `true` / `false`, numbers suffixed with `D`, strings and enumeration values in single quotes, e.g. `"ranking": [ { "properties": { "topN": { "expr": { "Literal": { "Value": "5D" } } } } } ]`.

## Common pitfalls

- "Add what is ranked… in Legend (entity)": the Legend well is empty (one line per entity is required).
- Ranks differ from RANKX: tie method or direction (`ranking.ties`, `ranking.order`).
- Periods out of order: text axis sorted alphabetically ("R10" before "R2"); use a number or Sort by column.
- Entities missing: Top N (`ranking.topN`, 0 = all).
- "Ribbons: negative values count as zero": stacked ribbons cannot stack negatives.
- Image ignored: web address or unknown format; only embedded base64 images.
- Watermark visible: play bar, ▶ button or autoplay, steps, modified or unique ties, Top N on any period, metro, ribbons sized by value, highlight or final-rank colors, rank change, values view, zones, images, annotations, a ★ style or a theme JSON, without a valid key.

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

Small multiples, reference lines and trend lines (Analytics pane), images loaded from web addresses, average ranks for ties (1, 2.5, 2.5, 4), ranking several measures without a Legend field, exporting the chart as an image, saving the reader's view in the report.

## Data fields (wells)

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

| Internal name | Label (EN) | Label (FR) | Kind | Max fields | Description |
|---|---|---|---|---|---|
| `axis` | Axis (time) | Axe (temps) | column | 4 | Periods in order: a date, a year, a month or any ordered category (rounds, seasons, waves). Several fields: drill down (year › quarter › month). |
| `legend` | Legend (entity) | Légende (entité) | column | 1 | What is ranked: products, teams, regions, brands… One line per value. |
| `value` | Value (ranked by the visual) | Valeur (classée par le visuel) | measure | 1 | The visual ranks the entities by this measure in each period (no RANKX needed). Also sets the ribbon thickness. |
| `rank` | Rank (optional) | Rang (facultatif) | measure | 1 | A rank you already compute (1 = first). Used instead of ranking the Value field. Computed with ALL(), it keeps the ranking under a filter. |
| `image` | Image ★ | Image ★ | measure | 1 | Text measure returning an embedded image (data:image/png;base64,…): logo or photo shown at both ends of the line. |
| `notes` | Annotations ★ | Annotations ★ | measure | 1 | Text measure: a note pinned to the point of the entity at that period where it is not empty. |
| `tooltips` | Tooltips | Infobulles | measure | several |  |
| `format` | Dynamic format | Format dynamique | measure | several | Measures named card.setting (e.g. title.fontSize): drive any Format option with DAX |

Data view: categorical, categories = `axis` (one row per combination), 30,000 rows per data window (more fetched automatically); measures = `value`, `rank`, `image`, `notes`, `tooltips`, `format`, grouped into series by `legend`.
Capabilities: supportsHighlight, supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).

## Format pane options (205)

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

### 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 entity); `single` Single color; `highlight` Highlight entities ★; `finalRank` Gradient by final rank ★ |  |
| `dataColors.single` | Color | Couleur | color | fill | (empty) | hex color |  |
| `dataColors.fill` | Color | Couleur | color | fill | (empty) | hex color |  |
| `dataColors.highlightNames` | Highlighted entities (separated by ;, empty = first at the end) | Entités mises en avant (séparées par ;, vide = la 1re à la fin) | text | text | (empty) |  |  |
| `dataColors.highlightColor` | Highlight color (empty = entity color) | Couleur mise en avant (vide = celle de l'entité) | color | fill | (empty) | hex color |  |
| `dataColors.othersColor` | Other entities color (empty = style gray) | Couleur des autres entités (vide = gris du style) | color | fill | (empty) | hex color |  |

### Ranking / Classement (`ranking`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `ranking.order` | Rank 1 = | Rang 1 = | dropdown | enumeration | `desc` | `desc` Highest value; `asc` Lowest value | When the visual ranks the Value field. Lowest value: times, costs, golf scores, delays… |
| `ranking.ties` | Ties | Ex aequo | dropdown | enumeration | `competition` | `competition` Standard: 1, 2, 2, 4 (RANKX Skip); `dense` Dense: 1, 2, 2, 3 (RANKX Dense); `modified` Modified: 1, 3, 3, 4 ★; `ordinal` Unique: 1, 2, 3, 4 (previous rank breaks ties) ★ | Tied entities never hide each other: they sit side by side, ordered by their previous rank, then by name. |
| `ranking.tieMark` | Mark ties (=2) | Signaler les ex aequo (=2) | toggle | bool | `true` | true / false |  |
| `ranking.topN` | Number of entities (Top N, 0 = all) | Nombre d'entités (Top N, 0 = toutes) | number | integer | `10` | 0 to 200 |  |
| `ranking.topBasis` | Top N based on | Top N calculé | dropdown | enumeration | `period` | `period` Each period (entries and exits); `last` The last period; `any` Any period ★ | Visible when `ranking.topN` = . Each period: an entity leaving the Top N drops into the « Outside the top » row (▼) and comes back up when it returns (▲). |
| `ranking.missing` | Period without a rank | Période sans rang | dropdown | enumeration | `gap` | `gap` Break the line; `connect` Connect points |  |
| `ranking.rankOneTop` | Rank 1 at the top | Rang 1 en haut | toggle | bool | `true` | true / false |  |
| `ranking.highlight` | Highlight from another visual | Surbrillance venue d'un autre visuel | dropdown | enumeration | `dim` | `dim` Dim the other entities; `hide` Hide the others (ranks kept) | Ranks are always computed over every row received: a highlighted entity keeps its rank in the full ranking. To keep the ranking under a filter (slicer), set the other visual's interaction to "Highlight" or put a rank computed with ALL() in "Rank". |

### Ranks or values / Rangs ou valeurs (`view`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `view.mode` | View | Vue | dropdown | enumeration | `rank` | `rank` Ranks (bump chart); `value` Values (lines) ★ | Values: the same lines placed at their value, to see the gaps behind the ranks. |
| `view.toggle` | Ranks / Values button in the visual | Bouton Rangs / Valeurs dans le visuel | toggle | bool | `false` | true / false | Readers switch views; lines glide to their new place. The values view is premium (★). |
| `view.zero` | Values view: include zero | Vue des valeurs : inclure zéro | toggle | bool | `false` | true / false |  |

### Design / Dessin (`design`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `design.type` | Design | Dessin | dropdown | enumeration | `curve` | `curve` S-curves; `straight` Sharp breaks; `step` Steps ★; `stacked` Stacked ribbons (ribbon chart); `metro` Metro map ★; `ribbon` Ribbons sized by value ★ | Metro map: thick lines, 45° bends, round stations and interchanges where entities swap places. Ribbons sized by value: each line is as thick as its value. Stacked ribbons: the Power BI ribbon chart. |
| `design.curvature` | Curvature (%) | Courbure (%) | number | integer | `50` | 0 to 100 | Visible when `design.type` = `curve` or `ribbon` or `stacked` |
| `design.width` | Width | Épaisseur | number | numeric | `3` | 0.5 to 20 | Visible when `design.type` = `curve` or `straight` or `step` or `metro` |
| `design.lineStyle` | Line style | Style de trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted | Visible when `design.type` = `curve` or `straight` or `step` |
| `design.casing` | Casing at crossings | Liseré aux croisements | toggle | bool | `true` | true / false | Visible when `design.type` = `curve` or `straight` or `step` or `metro`. A thin outline in the background color separates the lines where they cross. |
| `design.interchanges` | Interchanges (swapped places) | Correspondances (échanges de places) | toggle | bool | `true` | true / false | Visible when `design.type` = `metro` |
| `design.ribbonSize` | Maximum thickness (% of the row) | Épaisseur maximale (% de la rangée) | number | integer | `80` | 10 to 100 | Visible when `design.type` = `ribbon` |
| `design.spacing` | Spacing (%) | Espacement (%) | number | integer | `12` | 0 to 50 | Visible when `design.type` = `stacked` |
| `design.transparency` | Ribbon transparency (%) | Transparence des rubans (%) | number | integer | `30` | 0 to 90 | Visible when `design.type` = `ribbon` or `stacked` |
| `design.border` | Ribbon border | Bordure des rubans | toggle | bool | `false` | true / false | Visible when `design.type` = `ribbon` or `stacked` |
| `design.totals` | Total above the columns | Total au-dessus des colonnes | toggle | bool | `false` | true / false | Visible when `design.type` = `stacked`. Like the total labels of the native ribbon chart. |

### Markers / Marqueurs (`markers`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `markers.show` | Show | Afficher | dropdown | enumeration | `auto` | `auto` Automatic (when there is room); `all` At every period; `ends` At the start and the end; `none` None |  |
| `markers.shape` | Shape | Forme | dropdown | enumeration | `circle` | `circle` Circle; `square` Square; `diamond` Diamond | Visible when `markers.show` = `auto` or `all` or `ends` |
| `markers.size` | Maximum size (px) | Taille maximale (px) | number | integer | `20` | 4 to 48 | Visible when `markers.show` = `auto` or `all` or `ends` |
| `markers.rankInside` | Rank number inside the marker | Numéro du rang dans le marqueur | toggle | bool | `true` | true / false | Visible when `markers.show` = `auto` or `all` or `ends` |
| `markers.fill` | Fill | Remplissage | dropdown | enumeration | `solid` | `solid` Solid; `hollow` Hollow (colored outline) | Visible when `markers.show` = `auto` or `all` or `ends` |
| `markers.entryExit` | Top N entries and exits (▲ ▼) | Entrées et sorties du Top N (▲ ▼) | toggle | bool | `true` | true / false |  |

### 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.position` | Position | Position | dropdown | enumeration | `below` | `below` Below the point; `above` Above the point |  |
| `labels.fontSize` | Size | Taille | number | formatting | `9` | 6 to 24 |  |
| `labels.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `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 |  |

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

### End labels / Noms aux extrémités (`endLabels`, Format pane)

The card header toggle is `endLabels.show`.

**Names / Noms**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `endLabels.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `endLabels.start` | At the start | Au début | toggle | bool | `true` | true / false |  |
| `endLabels.end` | At the end | À la fin | toggle | bool | `true` | true / false |  |
| `endLabels.content` | Content | Contenu | dropdown | enumeration | `name` | `name` Name; `rankName` Rank and name; `nameValue` Name and value; `rankNameValue` Rank, name and value |  |
| `endLabels.fontSize` | Size | Taille | number | formatting | `10` | 6 to 24 |  |
| `endLabels.color` | Color (empty = entity color) | Couleur (vide = celle de l'entité) | color | fill | (empty) | hex color |  |
| `endLabels.bold` | Bold | Gras | toggle | bool | `false` | true / false |  |
| `endLabels.maxWidth` | Maximum width (% of the visual) | Largeur maximale (% du visuel) | number | integer | `22` | 8 to 45 |  |
| `endLabels.wrap` | Long names on two lines | Noms longs sur deux lignes | toggle | bool | `true` | true / false | A name wider than the reserved room goes on two lines (metro terminus badges included) instead of being cut. |
| `endLabels.images` | Images from the Image field ★ | Images du champ Image ★ | toggle | bool | `true` | true / false | Logos or photos (embedded data:image/…;base64 text) next to the names. Web addresses are ignored: a certified visual loads nothing from the internet. |

**Rank change ★ / Variation de rang ★**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `endLabels.change` | Show (▲3, ▼2) ★ | Afficher (▲3, ▼2) ★ | toggle | bool | `false` | true / false | Places gained or lost, after the name at the end of each line. |
| `endLabels.changeBase` | Since | Depuis | dropdown | enumeration | `start` | `start` The first period; `prev` The previous period |  |
| `endLabels.upColor` | Places gained | Places gagnées | color | fill | `#2E7D4F` | hex color |  |
| `endLabels.downColor` | Places lost | Places perdues | color | fill | `#C0392B` | hex color |  |

### Period axis / Axe des périodes (`xAxis`, Format pane)

The card header toggle is `xAxis.show`.

**Values / Valeurs**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `xAxis.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `xAxis.position` | Position | Position | dropdown | enumeration | `bottom` | `bottom` Bottom; `top` Top; `both` Top and bottom |  |
| `xAxis.fontSize` | Size | Taille | number | formatting | `9` | 6 to 24 |  |
| `xAxis.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `xAxis.dateFormat` | Date format | Format des dates | text | text | (empty) |  |  |

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

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

### Rank axis / Axe des rangs (`yAxis`, Format pane)

The card header toggle is `yAxis.show`.

**Values / Valeurs**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `yAxis.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `yAxis.position` | Position | Position | dropdown | enumeration | `left` | `left` Left; `right` Right; `both` Both sides |  |
| `yAxis.fontSize` | Size | Taille | number | formatting | `9` | 6 to 24 |  |
| `yAxis.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `yAxis.prefix` | Rank prefix (e.g. #) | Préfixe des rangs (ex. #) | text | text | (empty) |  |  |
| `yAxis.outsideLabel` | Outside-the-top row label | Libellé de la rangée hors top | text | text | (empty) |  |  |

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

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

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

**Vertical (periods) / Vertical (périodes)**

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

**Horizontal (ranks) / Horizontal (rangs)**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gridlines.hShow` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `gridlines.hColor` | Color (empty = style grid) | Couleur (vide = grille du style) | color | fill | (empty) | hex color |  |
| `gridlines.hWidth` | Width | Épaisseur | number | numeric | `1` | 0.5 to 6 |  |
| `gridlines.hStyle` | Line style | Style de trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `gridlines.banding` | Banded rows | Rangées alternées | toggle | bool | `false` | true / false |  |

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

### Ranking zones ★ / Zones de classement ★ (`zones`, 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 `zones.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `zones.show` | Show ★ | Afficher ★ | toggle | bool | `false` | true / false | Colored bands behind the first and the last ranks: podium, qualification, relegation… |
| `zones.topCount` | Top zone: number of ranks | Zone haute : nombre de rangs | number | integer | `3` | 0 to 50 |  |
| `zones.topLabel` | Top zone label | Libellé de la zone haute | text | text | (empty) |  |  |
| `zones.topColor` | Top zone color | Couleur de la zone haute | color | fill | `#2E7D4F` | hex color |  |
| `zones.bottomCount` | Bottom zone: number of ranks | Zone basse : nombre de rangs | number | integer | `0` | 0 to 50 |  |
| `zones.bottomLabel` | Bottom zone label | Libellé de la zone basse | text | text | (empty) |  |  |
| `zones.bottomColor` | Bottom zone color | Couleur de la zone basse | color | fill | `#C0392B` | hex color |  |
| `zones.opacity` | Opacity (%) | Opacité (%) | number | integer | `10` | 3 to 50 |  |

### Annotations ★ (`annotations`, 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 `annotations.show`.

**Content / Contenu**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `annotations.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `annotations.list` | Annotations (one per line) | Annotations (une par ligne) | textarea | text | (empty) |  | One line per annotation: "period \| text" (vertical marker on the period) or "period \| entity \| text" (attached to the entity's point). Period: date (2024-06-01, 2024-06, 06/15/2024), year, number or displayed label. "\n" starts a new line. The former "entity \| period \| text" order is still read. The Annotations ★ field adds notes from a text measure. |
| `annotations.content` | Displayed content | Contenu affiché | dropdown | enumeration | `text` | `text` Text; `textRank` Text and rank; `textValue` Text and value |  |
| `annotations.editOnChart` | Edit on the chart (edit mode) | Modifier sur le graphique (mode édition) | toggle | bool | `true` | true / false | In edit mode, annotations can be dragged, edited with a double-click and removed with ×. |

**Look / Apparence**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `annotations.style` | Style | Style | dropdown | enumeration | `bubble` | `bubble` Bubble; `filled` Filled label; `plain` Text only |  |
| `annotations.color` | Color (empty = entity color) | Couleur (vide = celle de l'entité) | color | fill | (empty) | hex color |  |
| `annotations.fontSize` | Size | Taille | number | formatting | `9` | 6 to 24 |  |
| `annotations.bold` | Bold | Gras | toggle | bool | `false` | true / false |  |
| `annotations.maxWidth` | Maximum width (px) | Largeur maximale (px) | number | integer | `160` | 60 to 400 |  |

**Marker and connector / Repère et trait**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `annotations.marker` | Marker on the point | Repère sur le point | toggle | bool | `true` | true / false |  |
| `annotations.connector` | Connector | Trait vers le point | dropdown | enumeration | `line` | `line` Line; `none` None |  |
| `annotations.connectorStyle` | Line style | Style de trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted | Visible when `annotations.connector` = `line` |
| `annotations.position` | Default position | Position par défaut | dropdown | enumeration | `auto` | `auto` Automatic (no overlap); `above` Above; `below` Below; `right` Right; `left` Left | Position of annotations that have not been dragged. |
| `annotations.distance` | Distance from the point (px) | Distance au point (px) | number | integer | `22` | 6 to 160 |  |

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

**Line drawing / Dessin des lignes**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `play.draw` | Draw the lines period by period | Dessiner les lignes période par période | toggle | bool | `true` | true / false | When the data changes, the lines draw themselves from the first period to the last. Off when animations are reduced (Style › Animations or the system). |
| `play.drawDuration` | Drawing duration (ms) | Durée du dessin (ms) | number | integer | `1400` | 200 to 8000 | Visible when `play.draw` = `true` |

**Playback ★ / Lecture ★**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `play.speed` | Duration of a frame (ms) | Durée d'une image (ms) | number | integer | `700` | 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.follow` | Labels follow the head of the lines | Étiquettes qui suivent la tête des lignes | toggle | bool | `true` | true / false |  |

**Play bar ★ / Barre de lecture ★**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `play.controls` | Play bar ★ | Barre de lecture ★ | toggle | bool | `false` | true / false |  |
| `play.button` | Discreet ▶ button (on hover) ★ | Bouton ▶ discret (au survol) ★ | toggle | bool | `false` | true / false | Visible when `play.controls` = `false`. Without the play bar: a small round button at the top right of the chart, shown on hover. |
| `play.position` | Bar position | Position de la barre | dropdown | enumeration | `bottom` | `bottom` Bottom; `top` Top | Visible when `play.controls` = `true` |
| `play.ticks` | Tick marks | Graduations | dropdown | enumeration | `auto` | `auto` Automatic; `all` Every frame; `none` None | Visible when `play.controls` = `true` |
| `play.tickLabels` | Tick labels | Étiquettes des graduations | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |
| `play.stepButtons` | Start and end buttons | Boutons début et fin | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |
| `play.speedButton` | Speed button | Bouton de vitesse | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |

**Large value ★ / Valeur en grand ★**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `play.showLabel` | Current value in large type | Valeur en cours en grand | toggle | bool | `true` | true / false |  |
| `play.labelSize` | Large value size | Taille de la valeur en grand | number | formatting | `40` | 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` |

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `interaction.hover` | Highlight on hover | Mettre en avant au survol | toggle | bool | `true` | true / false |  |
| `interaction.dim` | Dimmed items opacity (%) | Opacité des éléments estompés (%) | number | integer | `25` | 5 to 80 |  |
| `interaction.front` | Hover: entity in front | Survol : entité au premier plan | toggle | bool | `true` | true / false | The hovered line comes in front of the others, which fade. |

### 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.value` | Value | Valeur | toggle | bool | `true` | true / false |  |
| `tooltip.change` | Change since the previous period | Variation depuis la période précédente | toggle | bool | `true` | true / false |  |
| `tooltip.best` | Best rank | Meilleur rang | toggle | bool | `true` | true / false |  |

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

The card header toggle is `title.show`.

**Title / Titre**

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

**Subtitle / Sous-titre**

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

**Divider / Séparateur**

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

**Spacing / Espacement**

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

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

The card header toggle is `source.show`.

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

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

**Background / Arrière-plan**

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

**Border / Bordure**

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

**Shadow / Ombre**

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

**Spacing / Marges**

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

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

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

### Other objects (not in the Format pane cards above)

- `annotState`: `annotState.offsets` (text), internal state saved by the visual in edit mode (column widths, positions of dragged annotations); leave it alone.