# Hexbin 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 Hexbin 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/hexbin (French: https://plumevisuals.com/fr/visuels/hexbin)
- Summary: Too many points for a scatter chart? Group them into hexagons colored by count or average, then zoom in down to the points.
- Power BI visual GUID (`visualType`): `plumeHexbinE30C7F7C4238475A8F1967FA03B31913`
- 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

Hexbin Plume (identifier `hexbin`) is a Power BI custom visual (version 1.1.0.0, installed from its `.pbiviz` file; AppSource submission in preparation) that draws a **hexagonal binning scatter chart**: points placed by two measures are grouped into bins colored by how many points they hold, or by an aggregate of a Value measure. Power BI has no native hexbin: the native scatter chart samples dense data (about 3,500 points, 10,000 at most) and shows shape, not density.

**New in version 1.1.0.0 (30/10/2026):** Free native-parity additions: X and Y **zoom sliders**, "Round the range", and a free **Symmetry and ratio** card in the Analytics pane (shading around y = x, total ratio or fixed slope line).

- **No sampling**: 30,000-row windows, then `fetchMoreData` up to **300,000 points**; every point is counted. 100,004 rows render in under a second in the test bench.
- **Bins**: hexagons (pointy or flat top) or squares; circles ★ and triangles ★. Automatic size (about one bin per 260 px², larger with few points), radius in px or number of columns; spacing, rounded corners, outline, grid of empty bins; a minimum number of points per bin, bins below it hidden or ★ drawn as points (isolated values).
- **Value of a bin**: number of points, share of points, or sum, average, median, minimum, maximum of the `value` measure (`bins.aggregate` = `auto` → average with a Value field, count otherwise).
- **Colors**: density-aware gradient of the style (small values take the shade closest to the background), one color by intensity, or the dominant category of the Legend field; linear or square root (default) scale, fixed bounds; ★ log scale, ★ diverging scale, ★ outliers ignored (2nd–98th percentile); ★ dominant category and its share, difference between two categories, change between frames, equal-count classes, custom thresholds.
- **Semantic zoom**: Shift + drag zooms into a rectangle; bins keep their screen size and are recomputed on the view; raw points appear when few remain (`points.show` = `zoom`). Double-click or ⟲ to zoom out; mouse wheel zoom is an option.
- **Play axis ★** with the shared Plume player: density changes from frame to frame with color and size transitions, a shared color scale (`colorScale.scope` = `all`) and an accumulate mode (`play.cumulative`).
- **Analytics ★**: contour lines (kernel density), marginal histograms aligned on the bins, least-squares trend on every point (per category, R², equation), reference lines; small multiples.

## 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 Hexbin Plume: hexagons and squares, every size and value setting (minimum points per bin with hidden bins), gradient, one color and dominant category coloring, linear and square root scales, fixed bounds, points, labels, axes (linear or log), legend, zoom and semantic zoom, cross-filtering, cross-highlighting, tooltips.
- Rebalanced on 10/22/2026 (visual never published before): the play axis, the log and diverging color scales, ignoring extreme values and drawing sparse bins as points became premium.
- Premium features of Hexbin Plume:
  - `dataColors.mode` = `purity` (dominant category and its share), `compare` (difference between two categories), `change` (change between frames) — only when the Legend (or Play axis for `change`) field is filled;
  - `bins.shape` = `circle` or `triangle`; `bins.sizeBy` = `count` or `value` (proportional size, bivariate hexbin);
  - the `play` role (Play axis ★, card « Playback ★ »): watermark as soon as the field is filled;
  - `colorScale.scale` = `quantile` or `thresholds`; `colorScale.scale` = `log`, `colorScale.diverging`, `colorScale.clip` — only when the gradient uses them (`dataColors.mode` = `gradient` or `single`);
  - `bins.sparse` = `points` — only when `bins.minCount` ≥ 2;
  - the `multiples` role (Small multiples ★); `marginals.show`; `contours.show`; `trend.show`; reference lines (`reference.*`).
- 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 `hexbin` 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, key accepted for 30 more days, reminders 30 and 7 days before the end). Prices: 39 € personal, 99 € SME, 299 € enterprise per year, or the catalog pack (199 € / 399 € / 1,199 € per year; tiers by number of users: personal 1–10, SME 11–200, enterprise more than 200).

## Expected data shape

One row per point: an ID in Details, two measures for the position.

| Details (`details`) | Legend (`legend`) | Play axis (`play`) | X axis (`x`) | Y axis (`y`) | Value (`value`) |
|---|---|---|---|---|---|
| L00001 | Bristol | 2023 | 48 | 212,000 | 760 |
| L00002 | York | 2021 | 95 | 218,000 | 1,090 |

- **Details (one point each)** (`details`, « Détails (un point par valeur) », one column): one point per value. Without it Power BI aggregates everything into one point (or one per legend value).
- **Legend (category)** (`legend`, « Légende (catégorie) », one column): category of each point; categories are sorted; beyond 12 the least frequent are grouped into "Others".
- **X axis**, **Y axis** (`x`, `y`, one measure each, required). Date-typed measures are shown as dates.
- **Value (per bin)** (`value`, « Valeur (par case) », one measure): aggregated in each bin with `bins.aggregate`.
- **Play axis ★** (`play`, « Axe de lecture ★ », one column): one frame per value; numbers and dates sorted. Premium: watermark without a key as soon as it holds data.
- **Small multiples ★** (`multiples`, one column): one chart per value, same axes, bins and colors (36 at most).
- **Tooltips** (`tooltips`): their average is added to a bin's tooltip; their value to a point's tooltip. **Dynamic format** (`format`, see below).
- The selection ID of a point is made of Details, Legend and Small multiples (not the play axis): clicking a bin selects all its items in every frame.

## DAX recipes

```dax
// One home per point (Details = Homes[Home]): an average returns the home's value
Average area = AVERAGE ( Homes[Area] )
Average price = AVERAGE ( Homes[Price] )
Average rent = AVERAGE ( Homes[Rent] )

// Dynamic title (renamed title.text in the Dynamic format well)
Density title = FORMAT ( CALCULATE ( COUNTROWS ( Homes ), ALLSELECTED () ), "#,0" ) & " homes: price vs area"

// 100,004-row test table
Points = ADDCOLUMNS ( GENERATESERIES ( 1, 100004, 1 ), "X", 40 + MOD ( [Value] * 7919, 120 ), "Y", 1500 + MOD ( [Value] * 104729, 2500 ) )
```

## Interactions with the report

- Click a bin: cross-filter on all its points (selection IDs of every point, deduplicated); Ctrl to add; clicking the only selected bin again clears. Drag: rectangle or lasso selection. Click a legend item: that category. Click an empty area: clear.
- Cross-highlighting from other visuals (`supportsHighlight`): each bin shows the highlighted share as an inner bin of proportional area; the selection is drawn the same way.
- Hover a bin: outline, its points (`points.show` = `hover`), Power BI tooltip: frame, panel, number of points and share, aggregate, X and Y ranges of the bin, dominant category and share, A / B shares and gap (compare), before and change (change), highlighted count, averages of the Tooltips measures; report-page tooltips receive up to 300 point identities.
- Context menu everywhere (bin = first point of the bin, point, empty area, axes, title, start screen). Keyboard: Tab, arrows from bin to bin, Enter selects, Esc clears; player keys (Space, arrows, Home, End) on the play bar. High contrast: bins drawn with the host colors and sized by count; French and English.
- Zoom, frame and speed are session state: nothing is saved with persistProperties.

## Dynamic formats

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

```dax
// renamed bins.sizeMode and bins.radius
Bin size mode = "radius"
Bin radius = IF ( COUNTROWS ( ALLSELECTED ( Homes ) ) > 20000, 10, 16 )
```

## Format pane: option IDs

- Card order: `license`, `style`, `dataColors`, `bins`, `colorScale`, `points`, `labels`, `xAxis`, `yAxis`, `legend`, `play`, `zoom`, `smallMultiples`, `marginals`, `contours`, `interaction`, then `title`, `source`, `container`, `texts`; Analytics pane: `reference`, `trend`. Format pane in version 1.1.0.0 (30/10/2026), top to bottom: `license`, `style`, `dataColors`, `bins`, `colorScale`, `points`, `labels`, `xAxis`, `yAxis`, `gridlines`, `legend`, `play`, `zoom`, `smallMultiples`, `marginals`, `contours`, `interaction`, `tooltip`, `title`, `source`, `container`, `texts`; Analytics pane: `reference`, `trend`, `symmetry`. Settings moved or renamed in this version keep working in older reports (the old names are still read).
- `dataColors`: `mode` (`gradient` | `single` | `category` | `purity` ★ | `compare` ★ | `change` ★), `single`, `fill` (per category), `compareA`, `compareB` (text; empty = most frequent / all the others), `changeRef` (`previous` | `first`).
- `bins`: `shape` (`hexagon` | `square` | `circle` ★ | `triangle` ★), `orientation` (`pointy` | `flat`), `sizeMode` (`auto` | `radius` | `columns`), `radius` (4–80, 14), `columns` (3–200, 24), `gap` (0–12, 1), `roundness` (0–100, 0), `aggregate` (`auto` | `count` | `percent` | `sum` | `average` | `median` | `min` | `max`), `minCount` (1–10,000, 1), `sparse` (`hide` | `points` ★), `sizeBy` (`none` | `count` ★ | `value` ★), `minSize` (5–100, 25), `opacity` (10–100, 100), `outline`, `outlineColor`, `outlineWidth` (0.5–6, 1), `emptyGrid`.
- `colorScale`: `scale` (`linear` | `sqrt` | `log` ★ | `quantile` ★ | `thresholds` ★), `classes` (2–9, 5), `thresholds` (text, `10; 50; 100`), `diverging` ★, `center` (`zero` | `average` | `median` | `constant`), `centerValue`, `min`, `max` (text, empty = auto), `clip` ★, `scope` (`all` | `frame`).
- `points`: `show` (`hover` | `zoom` | `always` | `none`), `threshold` (50–20,000, 1,500), `size` (1–12, 2.5), `color`, `opacity` (10–100, 70).
- `labels`: `show`, `content` (`value` | `count` | `percent` | `category`), `which` (`top` | `all`), `n` (10), `fontSize`, `color`, `bold`, `halo`, `declutter`, `units`, `decimals`, `prefix`, `suffix`.
- `xAxis`, `yAxis`: the shared value-axis settings (`scale` `linear` | `log`, `min`, `max`, `zero`, `ticks`, `invert`, titles, gridlines, `zeroLine`…).
- `play` ★: `start`, `speed`, `loop`, `autoPlay`, `transition`, `controls`, `position`, `ticks`, `tickLabels`, `stepButtons`, `speedButton`, `showLabel`, `labelSize`, `labelPosition`, `cumulative`.
- `zoom`: `rect` (on), `wheel` (off), `refine` (on). `smallMultiples`: `columns`, `minHeight`, `gap`, `titleSize`, `border`. `marginals` ★: `show`, `size` (40), `color`. `contours` ★: `show`, `levels` (5), `bandwidth` (0 = auto), `color`, `width`. `trend` ★: `show`, `perCategory`, `showR2`, `showEquation`, `color`, `style`, `width`. `interaction`: `hover`, `dim`, `brush`, `brushShape` (`rectangle` | `lasso`), `hoverOutline`.

## Editing a PBIP report (visual.json)

`visualType` is the visual GUID, `queryState` keys are the data role names, `objects` keys are the option IDs. Booleans `true` / `false`, numbers suffixed with `D`, strings and enumeration values in single quotes.

```json
{
  "visualType": "plumeHexbinE30C7F7C4238475A8F1967FA03B31913",
  "query": {
    "queryState": {
      "details": { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Homes" } }, "Property": "Home" } }, "queryRef": "Homes.Home", "nativeQueryRef": "Home" } ] },
      "x":       { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Homes" } }, "Property": "Average area" } }, "queryRef": "Homes.Average area", "nativeQueryRef": "Average area" } ] },
      "y":       { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Homes" } }, "Property": "Average price" } }, "queryRef": "Homes.Average price", "nativeQueryRef": "Average price" } ] }
    }
  },
  "objects": {
    "bins":       [ { "properties": { "sizeMode": { "expr": { "Literal": { "Value": "'radius'" } } }, "radius": { "expr": { "Literal": { "Value": "16D" } } } } } ],
    "dataColors": [ { "properties": { "mode": { "expr": { "Literal": { "Value": "'gradient'" } } } } } ],
    "license":    [ { "properties": { "key": { "expr": { "Literal": { "Value": "'PLUM1.…'" } } } } } ]
  }
}
```

The custom visual package must also be embedded in the report (Power BI does this when the visual is imported from the `.pbiviz` file).

## 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`. The gradient follows the style's sequential palette, oriented so that small values are closest to the background; diverging modes use its diverging palette; categories use its categorical colors.
- `style.themeJson` (Theme JSON ★): a JSON theme as plain text (format v2 with optional `extends` and groups `colors`, `palettes`, `typography`, `shape`, `table`, `marks`, `effects`). Full reference: https://plumevisuals.com/ai/tutorials/en/themes-json.md.

## Common pitfalls

- A single bin: the Details field is empty, Power BI aggregates everything.
- "No point to show": X or Y holds no numbers.
- Every bin has the same color: one point per bin (bins too small or little data); use a larger radius.
- Coloring by category, difference or change does not apply, with a message in edit mode: the Legend (or Play axis) field is missing; the gradient applies, without watermark.
- Points missing with a log axis: zero or negative values are left out and reported in edit mode.
- A click on a very dense bin takes a second: it selects tens of thousands of points; zoom in first.
- Watermark visible: a Play axis field, a log or diverging color scale, extreme values ignored, sparse bins drawn as points, a ★ coloring, circles or triangles, proportional size, classes or thresholds, small multiples, marginal histograms, contour lines, trend, reference lines, a ★ style or a theme JSON, without a valid key.
- The visual makes no network request: data and license key stay in the report; no R or Python.

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

Geographic hexbins on a map (latitude / longitude with a basemap), 3D extruded bins, a mode or distinct count of a text column per bin, images per bin, annotations added by clicking, exporting the chart as an image, saving the zoom or the current frame 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 |
|---|---|---|---|---|---|
| `details` | Details (one point each) | Détails (un point par valeur) | column | 1 | One point per value (customer, order, sensor reading…). Without it, Power BI adds up the measures into one point per legend value. |
| `legend` | Legend (category) | Légende (catégorie) | column | 1 | Category of each point: dominant category per bin, comparison of two groups ★ |
| `x` | X axis | Axe X | measure | 1 |  |
| `y` | Y axis | Axe Y | measure | 1 |  |
| `value` | Value (per bin) | Valeur (par case) | measure | 1 | Measure aggregated in each bin (sum, average, median, minimum, maximum). Empty = number of points. |
| `play` | Play axis ★ | Axe de lecture ★ | column | 1 | Premium: a date, a year or an ordered category; the density moves from one value to the next (play button). |
| `multiples` | Small multiples ★ | Petits multiples ★ | column | 1 | One small hexbin chart per value, sharing the same axes, bins and colors |
| `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 = `details` + `legend` + `play` + `multiples` (one row per combination), 30,000 rows per data window (more fetched automatically); measures = `x`, `y`, `value`, `tooltips`, `format`.
Capabilities: supportsHighlight, supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).

## Format pane options (272)

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 | `gradient` | `gradient` Gradient by value; `single` One color (intensity by value); `category` Dominant category (Legend field); `purity` Dominant category and its share ★; `compare` Difference between two categories ★; `change` Change between frames (play axis) ★ |  |
| `dataColors.single` | Color | Couleur | color | fill | (empty) | hex color |  |
| `dataColors.fill` | Color | Couleur | color | fill | (empty) | hex color |  |
| `dataColors.compareA` | Category A (empty = most frequent) | Catégorie A (vide = la plus fréquente) | text | text | (empty) |  | A value of the Legend field. Each bin shows which category is over-represented: its share of A minus its share of B. |
| `dataColors.compareB` | Category B (empty = all the others) | Catégorie B (vide = toutes les autres) | text | text | (empty) |  |  |
| `dataColors.changeRef` | Compare with | Comparer à | dropdown | enumeration | `previous` | `previous` The previous frame; `first` The first frame |  |

### Bins / Cases (`bins`, Format pane)

**Shape and size / Forme et taille**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `bins.shape` | Shape | Forme | dropdown | enumeration | `hexagon` | `hexagon` Hexagons; `square` Squares; `circle` Circles ★; `triangle` Triangles ★ |  |
| `bins.orientation` | Orientation | Orientation | dropdown | enumeration | `pointy` | `pointy` Pointy top; `flat` Flat top | Visible when `bins.shape` = `hexagon` or `circle` |
| `bins.sizeMode` | Bin size | Taille des cases | dropdown | enumeration | `auto` | `auto` Automatic; `radius` Radius (px); `columns` Number of columns | Automatic: about one bin per 260 px² (450 on a medium visual), larger when there are few points. Radius stays the same when the visual is resized; columns follow its width. |
| `bins.radius` | Radius (px) | Rayon (px) | number | integer | `14` | 4 to 80 | Visible when `bins.sizeMode` = `radius` |
| `bins.columns` | Columns | Colonnes | number | integer | `24` | 3 to 200 | Visible when `bins.sizeMode` = `columns` |
| `bins.gap` | Spacing (px) | Espacement (px) | number | numeric | `1` | 0 to 12 |  |
| `bins.roundness` | Corner rounding (%) | Arrondi des angles (%) | number | integer | `0` | 0 to 100 |  |

**Bin value / Valeur des cases**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `bins.aggregate` | Calculation | Calcul | dropdown | enumeration | `auto` | `auto` Automatic; `count` Number of points; `percent` Share of points (%); `sum` Sum; `average` Average; `median` Median; `min` Minimum; `max` Maximum | Automatic: average of the Value field when it is filled, otherwise the number of points. |
| `bins.minCount` | Minimum points per bin | Points au minimum par case | number | integer | `1` | 1 to 10000 | Bins with fewer points are hidden (or drawn as points, below). |
| `bins.sparse` | Bins under the minimum | Cases sous le minimum | dropdown | enumeration | `hide` | `hide` Hidden; `points` Drawn as points (isolated values) ★ |  |

**Proportional size ★ / Taille proportionnelle ★**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `bins.sizeBy` | Bin size by | Taille des cases selon | dropdown | enumeration | `none` | `none` Nothing (full bins); `count` The number of points ★; `value` The bin value ★ | Bivariate hexbin: with the Value field, the color shows its average (or sum…) and “The number of points” sizes the bins. |
| `bins.minSize` | Smallest bin size (%) | Taille de la plus petite case (%) | number | integer | `25` | 5 to 100 | Visible when `bins.sizeBy` = `count` or `value` |

**Outline and background / Contour et fond**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `bins.opacity` | Opacity (%) | Opacité (%) | number | integer | `100` | 10 to 100 |  |
| `bins.outline` | Outline | Contour | toggle | bool | `false` | true / false |  |
| `bins.outlineColor` | Outline color (empty = background) | Couleur du contour (vide = fond) | color | fill | (empty) | hex color | Visible when `bins.outline` = `true` |
| `bins.outlineWidth` | Outline width | Épaisseur du contour | number | numeric | `1` | 0.5 to 6 | Visible when `bins.outline` = `true` |
| `bins.emptyGrid` | Grid of empty bins | Grille des cases vides | toggle | bool | `false` | true / false | Draws the outline of every bin of the grid, even the empty ones. |

### Color scale / Échelle de couleurs (`colorScale`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `colorScale.scale` | Scale | Échelle | dropdown | enumeration | `sqrt` | `linear` Linear; `sqrt` Square root (more shades for small values); `log` Logarithmic ★; `quantile` Equal-count classes ★; `thresholds` Custom thresholds ★ |  |
| `colorScale.classes` | Number of classes | Nombre de classes | number | integer | `5` | 2 to 9 | Visible when `colorScale.scale` = `quantile` |
| `colorScale.thresholds` | Thresholds | Seuils | text | text | (empty) |  | Visible when `colorScale.scale` = `thresholds`. Values separated by semicolons: one color class between two thresholds. |
| `colorScale.diverging` | Diverging scale (around a center) ★ | Échelle divergente (autour d'un centre) ★ | toggle | bool | `false` | true / false | Uses the diverging palette of the style: below the center on one side, above it on the other (margins, gaps to a target). |
| `colorScale.center` | Center | Centre | dropdown | enumeration | `zero` | `zero` Zero; `average` Average of the bins; `median` Median of the bins; `constant` Fixed value | Visible when `colorScale.diverging` = `true` |
| `colorScale.centerValue` | Center value | Valeur du centre | number | numeric | `0` |  | Visible when `colorScale.center` = `constant` |
| `colorScale.min` | Minimum | Minimum | text | text | (empty) |  |  |
| `colorScale.max` | Maximum | Maximum | text | text | (empty) |  |  |
| `colorScale.clip` | Ignore extreme values (2% on each side) ★ | Ignorer les valeurs extrêmes (2 % de chaque côté) ★ | toggle | bool | `false` | true / false | The gradient goes from the 2nd to the 98th percentile of the bins: one very dense bin no longer washes out the others. |
| `colorScale.scope` | Scale with a play axis | Échelle avec un axe de lecture | dropdown | enumeration | `all` | `all` Shared by all frames; `frame` Per frame | Shared: the same color means the same value in every frame (densities can be compared over time). |

### Points (`points`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `points.show` | Show points | Afficher les points | dropdown | enumeration | `hover` | `hover` Those of the hovered bin; `zoom` When few remain (zoom); `always` Always; `none` Never | When few: points appear over the bins as soon as the view holds fewer than the number below (zoom in to see them). |
| `points.threshold` | Maximum visible points | Nombre de points visibles au plus | number | integer | `1500` | 50 to 20000 | Visible when `points.show` = `zoom` |
| `points.size` | Size (px) | Taille (px) | number | numeric | `2.5` | 1 to 12 |  |
| `points.color` | Color (empty = text or category) | Couleur (vide = texte ou catégorie) | color | fill | (empty) | hex color |  |
| `points.opacity` | Opacity (%) | Opacité (%) | number | integer | `70` | 10 to 100 |  |

### 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` Bin value; `count` Number of points; `percent` Share of points; `category` Dominant category |  |
| `labels.which` | Labeled bins | Cases étiquetées | dropdown | enumeration | `top` | `top` Largest values (N); `all` All where the text fits |  |
| `labels.n` | N | N | number | integer | `10` | 1 to 500 | Visible when `labels.which` = `top` |
| `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 |  |

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

### X axis / Axe X (`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 |  |
| `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.units` | Display units | Unités d'affichage | dropdown | enumeration | `auto` | `auto` Auto; `none` None; `k` Thousands; `m` Millions; `b` Billions |  |
| `xAxis.decimals` | Decimals (-1 = auto) | Décimales (-1 = auto) | number | integer | `-1` | -1 to 6 |  |
| `xAxis.prefix` | Prefix | Préfixe | text | text | (empty) |  |  |
| `xAxis.suffix` | Suffix (e.g. €) | Suffixe (ex. €) | text | text | (empty) |  |  |
| `xAxis.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 |
|---|---|---|---|---|---|---|---|
| `xAxis.scale` | Scale | Échelle | dropdown | enumeration | `linear` | `linear` Linear; `log` Logarithmic |  |
| `xAxis.min` | Minimum | Minimum | text | text | (empty) |  | Minimum and maximum accept a measure (Dynamic format field: xAxis.min, xAxis.max, yAxis.min, yAxis.max) to keep the same scale when another visual filters this one. |
| `xAxis.max` | Maximum | Maximum | text | text | (empty) |  | Minimum and maximum accept a measure (Dynamic format field: xAxis.min, xAxis.max, yAxis.min, yAxis.max) to keep the same scale when another visual filters this one. |
| `xAxis.zero` | Always include zero | Toujours inclure zéro | toggle | bool | `false` | true / false | Visible when `xAxis.scale` = `linear` |
| `xAxis.ticks` | Number of ticks (approx.) | Nombre de graduations (environ) | number | integer | `5` | 2 to 20 |  |
| `xAxis.invert` | Invert axis | Inverser l'axe | toggle | bool | `false` | true / false |  |
| `xAxis.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 |
|---|---|---|---|---|---|---|---|
| `xAxis.showTitle` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `xAxis.titleText` | Text | Texte | text | text | (empty) |  | Visible when `xAxis.showTitle` = `true` |

### Y axis / Axe Y (`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 |  |
| `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.units` | Display units | Unités d'affichage | dropdown | enumeration | `auto` | `auto` Auto; `none` None; `k` Thousands; `m` Millions; `b` Billions |  |
| `yAxis.decimals` | Decimals (-1 = auto) | Décimales (-1 = auto) | number | integer | `-1` | -1 to 6 |  |
| `yAxis.prefix` | Prefix | Préfixe | text | text | (empty) |  |  |
| `yAxis.suffix` | Suffix (e.g. €) | Suffixe (ex. €) | text | text | (empty) |  |  |
| `yAxis.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 |
|---|---|---|---|---|---|---|---|
| `yAxis.scale` | Scale | Échelle | dropdown | enumeration | `linear` | `linear` Linear; `log` Logarithmic |  |
| `yAxis.min` | Minimum | Minimum | text | text | (empty) |  | Minimum and maximum accept a measure (Dynamic format field: xAxis.min, xAxis.max, yAxis.min, yAxis.max) to keep the same scale when another visual filters this one. |
| `yAxis.max` | Maximum | Maximum | text | text | (empty) |  | Minimum and maximum accept a measure (Dynamic format field: xAxis.min, xAxis.max, yAxis.min, yAxis.max) to keep the same scale when another visual filters this one. |
| `yAxis.zero` | Always include zero | Toujours inclure zéro | toggle | bool | `false` | true / false | Visible when `yAxis.scale` = `linear` |
| `yAxis.ticks` | Number of ticks (approx.) | Nombre de graduations (environ) | number | integer | `5` | 2 to 20 |  |
| `yAxis.invert` | Invert axis | Inverser l'axe | toggle | bool | `false` | true / false |  |
| `yAxis.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 |
|---|---|---|---|---|---|---|---|
| `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)

**Horizontal**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gridlines.hShow` | Show | Afficher | toggle | bool | `true` | 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.zeroLine` | Zero line | Ligne du zéro | toggle | bool | `true` | true / false |  |

**Vertical**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gridlines.vShow` | Show | Afficher | toggle | bool | `false` | 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 |  |

**Plot area / Zone de tracé**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gridlines.plotColor` | Background color (empty = none) | Couleur d'arrière-plan (vide = aucune) | color | fill | (empty) | hex color |  |
| `gridlines.plotTransparency` | Transparency (%) | Transparence (%) | slider | numeric | `0` | 0 to 100 |  |

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

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `zoom.x` | X axis zoom slider | Curseur de zoom de l'axe X | toggle | bool | `false` | true / false |  |
| `zoom.y` | Y axis zoom slider | Curseur de zoom de l'axe Y | toggle | bool | `false` | true / false |  |
| `zoom.rect` | Shift + drag: zoom into a rectangle | Maj + glisser : zoomer sur un rectangle | toggle | bool | `true` | true / false | Double-click the chart, or the ⟲ button, to zoom out. |
| `zoom.wheel` | Mouse wheel: zoom | Molette : zoomer | toggle | bool | `false` | true / false | Off by default so that the report page keeps scrolling. |
| `zoom.refine` | Semantic zoom: refine the bins | Zoom sémantique : affiner les cases | toggle | bool | `true` | true / false | Zooming in keeps the bins the same size on screen, so each covers a smaller range of values: the detail appears. |

### Marginal histograms ★ / Histogrammes en marge ★ (`marginals`, 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 `marginals.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `marginals.show` | Show ★ | Afficher ★ | toggle | bool | `false` | true / false | Distribution of X above the chart and of Y on its right, with the same classes as the bins. |
| `marginals.size` | Height (px) | Hauteur (px) | number | integer | `40` | 16 to 160 |  |
| `marginals.color` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |

### Contour lines ★ / Lignes de niveau ★ (`contours`, 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 `contours.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `contours.show` | Show ★ | Afficher ★ | toggle | bool | `false` | true / false | Smoothed density of the points drawn as contour lines over the bins. |
| `contours.levels` | Number of lines | Nombre de lignes | number | integer | `5` | 2 to 15 |  |
| `contours.bandwidth` | Smoothing (px, 0 = automatic) | Lissage (px, 0 = automatique) | number | integer | `0` | 0 to 120 |  |
| `contours.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |
| `contours.width` | Width | Épaisseur | number | numeric | `1.2` | 0.5 to 4 |  |

### Small multiples ★ / Petits multiples ★ (`smallMultiples`, 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 |
|---|---|---|---|---|---|---|---|
| `smallMultiples.columns` | Columns (0 = automatic) | Colonnes (0 = automatique) | number | integer | `0` | 0 to 12 |  |
| `smallMultiples.minHeight` | Minimum chart height (px) | Hauteur minimale d'un graphique (px) | number | integer | `120` | 60 to 600 |  |
| `smallMultiples.gap` | Spacing (px) | Espacement (px) | number | integer | `12` | 0 to 60 |  |
| `smallMultiples.titleSize` | Title size | Taille des titres | number | formatting | `10` | 6 to 24 |  |
| `smallMultiples.border` | Frame around each chart | Cadre autour de chaque graphique | toggle | bool | `false` | true / false |  |

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

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

**Playback / Lecture**

| 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 | `last` | `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 | `1000` | 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 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 | `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` |

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

**More settings / Autres réglages**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `play.cumulative` | Accumulate frames | Cumuler les images | toggle | bool | `false` | true / false | Each frame shows every point up to it (the density builds up over time). |

### 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.hlScale` | Scale during cross-highlighting | Échelle pendant une surbrillance croisée | dropdown | enumeration | `all` | `all` All data (the scale stays); `highlighted` Refocus on the highlighted points | When another visual sends a highlight (Format › Edit interactions › Highlight), the axes and colors keep all the data; a filter removes the points: then set the axis minimum and maximum with a measure (Dynamic format). |
| `interaction.brush` | Select by drawing a rectangle | Sélection en traçant un rectangle | toggle | bool | `true` | true / false | Drag on the chart to select every point inside (Ctrl to add). A click on a bin selects all its points. |
| `interaction.brushShape` | Selection shape | Forme de la sélection | dropdown | enumeration | `rectangle` | `rectangle` Rectangle; `lasso` Lasso (freehand) | Visible when `interaction.brush` = `true` |
| `interaction.hoverOutline` | Outline the hovered bin | Souligner la case survolée | toggle | bool | `true` | 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.axis1` | Axis | Axe | dropdown | enumeration | `y` | `y` Y axis (horizontal); `x` X axis (vertical) |  |
| `reference.kind1` | Value | Valeur | dropdown | enumeration | `average` | `constant` Constant; `average` Average; `median` Median; `min` Minimum; `max` Maximum; `percentile` Percentile |  |
| `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.axis2` | Axis | Axe | dropdown | enumeration | `y` | `y` Y axis (horizontal); `x` X axis (vertical) |  |
| `reference.kind2` | Value | Valeur | dropdown | enumeration | `constant` | `constant` Constant; `average` Average; `median` Median; `min` Minimum; `max` Maximum; `percentile` Percentile |  |
| `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.axis3` | Axis | Axe | dropdown | enumeration | `y` | `y` Y axis (horizontal); `x` X axis (vertical) |  |
| `reference.kind3` | Value | Valeur | dropdown | enumeration | `median` | `constant` Constant; `average` Average; `median` Median; `min` Minimum; `max` Maximum; `percentile` Percentile |  |
| `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.bandAxis` | Axis | Axe | dropdown | enumeration | `y` | `y` Y axis; `x` X axis |  |
| `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 |  |

### 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 | Least-squares line computed on every point (not on the bins). |
| `trend.perCategory` | One trend per category | Une tendance par catégorie | toggle | bool | `false` | true / false |  |
| `trend.showR2` | Show R² | Afficher le R² | toggle | bool | `true` | true / false |  |
| `trend.showEquation` | Show the equation | Afficher l'équation | toggle | bool | `false` | true / false |  |
| `trend.color` | Color (empty = text or category) | Couleur (vide = texte ou catégorie) | color | fill | (empty) | hex color |  |
| `trend.style` | Line style | Style de trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `trend.width` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |

### Symmetry and ratio / Symétrie et ratio (`symmetry`, Analytics pane)

**Symmetry shading / Ombrage de symétrie**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `symmetry.show` | Show | Afficher | toggle | bool | `false` | true / false | Shades the areas where Y is above and below X, around the y = x diagonal (X and Y in the same unit). |
| `symmetry.colorAbove` | Color where Y > X (empty = favorable) | Couleur où Y > X (vide = favorable) | color | fill | (empty) | hex color |  |
| `symmetry.colorBelow` | Color where Y < X (empty = unfavorable) | Couleur où Y < X (vide = défavorable) | color | fill | (empty) | hex color |  |
| `symmetry.opacity` | Opacity (%) | Opacité (%) | number | integer | `8` | 2 to 40 |  |
| `symmetry.diagonal` | y = x diagonal | Diagonale y = x | toggle | bool | `true` | true / false |  |

**Ratio line / Ligne de ratio**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `symmetry.ratio` | Show | Afficher | toggle | bool | `false` | true / false | A line from the origin whose slope is the overall ratio Y ÷ X of the points (like Power BI), or a fixed slope. |
| `symmetry.ratioMode` | Slope | Pente | dropdown | enumeration | `total` | `total` Total Y ÷ total X; `constant` Fixed value |  |
| `symmetry.ratioValue` | Fixed slope | Pente fixe | number | numeric | `1` |  | Visible when `symmetry.ratioMode` = `constant` |
| `symmetry.ratioColor` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `symmetry.ratioStyle` | Line style | Style de trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `symmetry.ratioLabel` | Show the slope | Afficher la pente | toggle | bool | `true` | true / false |  |

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