Aller au contenu
Plume Visuals
← Retour
Gamme de base

Graphique en essaim pour Power BI Beeswarm Plume

Chaque élément est un point : un essaim d'abeilles sans chevauchement, avec groupes, médiane, quartiles et un axe de lecture qui fait glisser les points.

Tutoriels ↓

Démo interactive

Le vrai visuel Power BI, exécuté dans votre navigateur avec les données fictives du rapport d'exemple. Changez de scénario, de style ou d'année : le visuel se met à jour comme dans Power BI. Fonctions premium ★ montrées ici sans filigrane ; dans Power BI, sans licence, elles affichent « Plume Visuals · Aperçu premium ».

Power BI n'a ni essaim d'abeilles, ni nuage de points à une dimension, ni boîte à moustaches. Beeswarm Plume place chaque magasin, client ou commande à sa valeur exacte et décale les points juste assez pour qu'aucun n'en cache un autre, toujours de la même façon : le dessin ne change pas à chaque actualisation. Une bande par groupe avec son nombre de points, la médiane et la moyenne, le rang et le centile de chaque point dans l'infobulle, et jusqu'à 100 000 points. En premium : l'axe de lecture qui fait glisser chaque point d'une année à l'autre, les quartiles, le tri des groupes par médiane, les étiquettes des valeurs atypiques, boîte à moustaches, violon et nuage de pluie, histogramme de points, comparaison de chaque point à l'an dernier, recherche dans le visuel, petits multiples et images dans les points.

Cas d'usage

  • Chiffre d'affaires par magasin, région par région
  • Délais de livraison par commande et par transporteur, avec les valeurs atypiques
  • Prix du m² de chaque commune, année après année (axe de lecture)
  • Salaires, notes, temps de traitement : voir chaque individu et la dispersion

GratuitInclus gratuitement

  • Un point par élément à sa valeur exacte, sans chevauchement, toujours le même dessin ; disposition essaim, dispersion ou bande
  • Horizontal ou vertical, des deux côtés ou d'un seul ; taille par une mesure ; réduction automatique des points
  • Une bande par groupe (nom, nombre de points, ordre par nombre ou par nom), légende, 22 formes gratuites
  • Médiane, moyenne et leurs valeurs ; rang et centile de chaque point dans l'infobulle
  • Sélection au clic, au rectangle, par groupe ou légende ; clavier, lecteurs d'écran, contraste élevé
  • Jusqu'à 200 000 lignes ; échelle linéaire ou logarithmique ; étiquettes sans chevauchement
  • Quadrillage, curseur de zoom, arrondir la plage ; noms de groupe longs sur plusieurs lignes, nom affiché au choix avec deux champs Détails, lasso
  • Formats dynamiques (fx, tout réglage piloté en DAX) ; styles Minimal et Noir et blanc

PremiumFonctions premium

  • Axe de lecture : les points glissent d'une année à l'autre, la sélection suit chaque élément
  • Quartiles, groupes rangés par médiane, gros points au centre, étiquettes des valeurs atypiques
  • Boîte à moustaches (Tukey, min-max, centiles), valeurs atypiques cerclées ; violon (densité) ; nuage de pluie
  • Tamis : histogramme de points où chaque élément reste sélectionnable
  • Comparaison de chaque point à une référence (an dernier, objectif) : tiges, couleurs favorable / défavorable
  • Recherche dans le visuel, liste de points mis en avant, champ « Mise en avant » ; traînées pendant la lecture
  • Petits multiples, images incorporées (base64) dans les points, dégradé, lignes de référence, 131 formes
  • Styles communs au catalogue (Néon, Journal, Nordique…), palettes, thème JSON

Utilisables sans clé pour les essayer, avec un filigrane.

Tutoriels

Commencez par la prise en main, puis piochez dans les cas pratiques. La page « Champs et réglages » décrit chaque option du volet Format.

  1. Prise en mainDébutant7 min de lectureUn essaim d'abeilles dans Power BI : chaque élément, sans recouvrementPrise en main de Beeswarm Plume : préparer la table et la mesure, insérer le visuel, comparer des groupes, lire la médiane et le rang de chaque point, sélectionner.
  2. Cas pratiquesIntermédiaire6 min de lectureBeeswarm Plume : 9 cas pratiques pour lire une distributionPas à pas : animer les points d'une année à l'autre, comparer à l'an dernier, nuage de pluie, boîte à moustaches, recherche dans le visuel, gros volumes.
  3. Champs et réglagesIntermédiaire25 min de lectureBeeswarm Plume : tous les champs et réglages expliquésChaque zone de champ et chaque réglage du volet Format de Beeswarm Plume : à quoi il sert, ses valeurs possibles et sa valeur par défaut, fonctions premium comprises.
  4. Bases communesBien démarrer avec les visuels PlumeInstallation, licence, styles et réglages communs à tous les visuels.

Champs à glisser dans le visuel

ChampContenu
Détails (un point par valeur)Magasin, client, commande… (jusqu'à 2 champs)Obligatoire
ValeurMesure : position de chaque pointObligatoire
Groupe (une bande par valeur)Région, catégorie : un essaim par valeurFacultatif
Légende (couleur)Une couleur (et une forme) par valeurFacultatif
TailleFacultatif : surface des pointsFacultatif
Axe de lectureAnnée, date ou catégorie : les points glissentFacultatifPremium
Comparer àValeur de référence de chaque point (N-1, objectif)FacultatifPremium
Petits multiplesUn petit essaim par valeurFacultatifPremium
ImageMesure : image incorporée (data:image/… ou base64) dans le pointFacultatifPremium
Mise en avantNi vide ni 0 : le point ressortFacultatifPremium
Valeur de référenceMesure pour les lignes de référence ★Facultatif
InfobullesMesures supplémentairesFacultatif
Format dynamiqueMesures renommées carte.réglage (ex. title.text) : le volet Format piloté en DAXFacultatif

Il vous manque une fonction ? Nous adaptons nos visuels ou en créons sur mesure. Demander un visuel sur mesure

Un bug dans Beeswarm Plume, ou une idée pour l'améliorer ? Signaler un bug · Proposer une idée

Référence technique pour assistants IA

Section destinée aux assistants IA (ChatGPT, Claude, Copilot…) : tous les champs, toutes les options du volet Format avec leurs noms internes, le format des données et des exemples DAX. Générée depuis le code du visuel, version 1.1.0.0. Vous pouvez la copier dans votre assistant pour qu'il vous guide.

Version Markdown brute (/ai/visuals/beeswarm.md)
# Beeswarm 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 Beeswarm 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/beeswarm (French: https://plumevisuals.com/fr/visuels/beeswarm)
- Summary: Every item is a dot: a beeswarm chart with no overlap, with groups, median, quartiles and a play axis that glides the dots.
- Power BI visual GUID (`visualType`): `plumeBeeswarm2C62844BD5AB404A8D59CCCC7D73C0DF`
- 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

Beeswarm Plume (identifier `beeswarm`) is a Power BI custom visual (version 1.1.0.0, installed from its `.pbiviz` file; AppSource submission in preparation) that draws **beeswarm charts**: every item (customer, store, product, order, town) is a dot placed at its exact value along a value axis, moved sideways just enough so that no dot covers another. Power BI has no native beeswarm, one-dimensional dot plot or box plot; the usual workaround (native scatter chart with a random "jitter" column in DAX) overlaps, changes at every refresh and has no statistics.

**New in version 1.1.0.0 (30/10/2026):** Format pane reorganized (`valueAxis` → `valAxis`, `compare` → `comparison`, search box in **Search**, gridlines in **Gridlines**); free **zoom slider** on the value axis and "Round the range".

- **Deterministic, overlap-free layout**: dots are placed in value order (or by size ★, largest in the middle) at the free position nearest to the baseline; the same data always gives the same picture. On both sides (symmetric) or on one side. Other layouts: random jitter (stable, drawn from each item's key), strip (all dots on one line), sieve ★ (columns of dots, a dot histogram).
- **Automatic dot size**: when a band is crowded, every dot shrinks by the same factor (same size in every band and every play-axis frame; minimum radius 0.6 px; the gap between dots never exceeds half a radius). Beyond about 20,000 dots in one band, a fast staggered-grid layout is used (each dot at most one radius away from its exact value).
- **Groups**: the `group` role gives one band per value, with its name and dot count ("n = 60"); click a name to select all its dots; order by data, count or name, or by median ★.
- **Statistics**: median (on by default), quartile ★ and mean markers, values written next to them; hovering a marker shows n, min, Q1, median, mean, Q3, max of the group. Quantiles use the QUARTILE.INC / PERCENTILE.INC method. Box plot ★ (Tukey 1.5 × IQR, min-max, 5–95 or 10–90 percentile whiskers, ringed outliers) and violin ★ (Gaussian kernel density, Silverman bandwidth) behind the dots; one side + violin = **raincloud plot**.
- **Tooltip**: item name, group, legend, value, size, comparison, and the **rank and percentile** of the dot in its group ("3 of 60 · percentile 95").
- **Play axis ★** (shared Plume player, premium since 10/22/2026): one frame per value of the `play` field; dots **glide** from one frame to the next (each item followed by its identity), enter and leave with a fade, medians and violins glide too; play / pause, slider, ×0.5 to ×4 speed, loop, large current value, keyboard; "Reduce motion" respected. A selected dot stays selected in every frame. ★ history trails of selected or highlighted dots.
- **Comparison with a reference ★** (`compare` role): a stem from each dot's reference value (last year, target) to the dot, a hollow dot at the reference, colors by favorable / unfavorable gap, ▲ / ▼ and % in the tooltip.
- **In-visual search ★**: readers type a name, matching dots stand out and are labeled, Enter selects them. Also a list of names in the Format pane ★ and the `highlight` measure ★.
- Small multiples ★ (up to 36 charts sharing the value axis), embedded images inside dots ★, gradient colors ★, reference lines ★.
- Dots drawn on a canvas: up to 100,000 dots (about 4 s for 100,004 rows in the test bench); 10,000 dots in one band laid out exactly in well under a second.

## 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 Beeswarm Plume: swarm, jitter and strip layouts, both orientations, both sides, placement by value; Details, Value, Group, Legend, Size, Reference value and Tooltips fields; the 22 free shapes and one shape per legend category; automatic size; median, mean and their values; rank and percentile; data labels (extremes, top or bottom N, selected, all); group order by data, count or name; linear and log scales; legend; rectangle selection; colors by palette, single color, per category.
- Premium features of Beeswarm Plume: the `play` field ("Play axis ★") as soon as it is filled, and its "Playback ★" card; `stats.quartiles`; `swarm.bandOrder` = `medianDesc` or `medianAsc` (with the `group` field); `swarm.order` = `size` (swarm layout, with the `size` field); `labels.which` = `outliers` (labels shown) — rebalancing of 10/22/2026; `swarm.mode` = `sieve`; any of the 131 other shapes in `swarm.shape`; `stats.box`; `stats.violin`; `dataColors.mode` = `gradient`; the `compare` field with `comparison.show` on; `search.show`, `highlight.names` and the `highlight` field; `play.trail` = `selected` or `highlighted`; the `multiples` field; the `image` field; reference lines (`reference.show1`, `show2`, `show3`, `band`).
- 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 `beeswarm` 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 item (or several rows the measure adds up), with a measure for the value.

| Store (`details`) | Region (`group`) | Format (`legend`) | Sales (`value`) |
|---|---|---|---|
| Bordeaux Lac | Nouvelle-Aquitaine | Out of town | 1,820,000 |
| Pessac | Nouvelle-Aquitaine | Downtown | 640,000 |

- **Details (one dot each)** (`details`, « Détails (un point par valeur) », up to 2 columns, combined): what a dot stands for. Without Details, the measure is aggregated: one dot per group (or a single dot).
- **Value** (`value`, « Valeur », one measure, required): position of each dot. Blank values are not placed; with a log scale, zero and negative values are not placed either (message in edit mode).
- **Group (one band each)** (`group`, « Groupe (une bande par valeur) », one column): one swarm per value.
- **Legend (color)** (`legend`, « Légende (couleur) », one column): color (and, optionally, shape) per category. Without a legend and with a group, dots take their group's color.
- **Size** (`size`, « Taille », one measure): dot area proportional to the absolute value, between `swarm.minSize` and `swarm.maxSize` radii.
- **Play axis ★** (`play`, « Axe de lecture ★ », one column, premium): a year, a date or an ordered category; numbers and dates sorted, texts in Power BI order; dates on January 1 shown as "2024".
- **Compare with ★** (`compare`, « Comparer à ★ », one measure): reference value per dot.
- **Small multiples ★** (`multiples`, one column), **Image ★** (`image`, a text measure returning `data:image/png;base64,…`, SVG, JPEG, GIF, WebP or raw base64; web addresses are never loaded), **Highlight ★** (`highlight`, not blank and not 0 = highlighted).
- **Reference value** (`reference`, one measure): its average is the "Reference value field" option of the reference lines.
- **Tooltips** (`tooltips`) and **Dynamic format** (`format`, see below).
- Volume of data: windows of 30,000 rows, more fetched with `fetchMoreData` up to 200,000 rows.

## DAX recipes

```dax
// One row per store: the value of each dot
Total sales = SUM ( Stores[Sales] )

// Reference for the comparison ★: last year
Sales PY = CALCULATE ( [Total sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) )

// Highlight ★: stores to watch
To watch = IF ( [Total sales] < 0.8 * [Sales PY], 1 )

// Dynamic title (renamed title.text in the Dynamic format well)
Swarm title = "Sales of " & COUNTROWS ( ALLSELECTED ( Stores ) ) & " stores · median "
    & FORMAT ( CALCULATE ( MEDIAN ( Stores[Sales] ), ALLSELECTED ( Stores ) ), "$#,0" )

// Image ★ stored as base64 text (no web address)
Badge = "data:image/png;base64," & SELECTEDVALUE ( Stores[Logo base64] )
```

To check a median or quartile shown by the visual: `PERCENTILE.INC ( Stores[Sales], 0.25 )` gives the same Q1 as the visual (method 7).

## Interactions with the report

- Click a dot: cross-filters on that item (in every play-axis frame); Ctrl / Shift for several; click again to clear; drag on empty space: rectangle selection (Ctrl adds); click a group name or a legend item: all its dots. Cross-highlighting from other visuals dims the other dots. Selected dots are labeled. Context menu everywhere (dot, empty area, landing page, legend).
- Hover a dot: Power BI tooltip (report-page tooltips supported) and an accent ring; hover a median / quartile / mean marker or a group name: group statistics.
- Keyboard: Tab to the swarm, ← → dots of the group in value order, ↑ ↓ neighboring group, Home / End, Enter selects, Esc clears, Page Up / Page Down previous / next play-axis frame; screen-reader announcement "name: value · rank r of n". High contrast: host colors, one shape per legend category, hollow dots. French and English.
- Session state only (never saved): play-axis frame, search text, keyboard focus.

## Dynamic formats

- **fx button** (Power BI conditional formatting) on colors and texts of the Format pane, including one color per category in Data colors.
- **"Dynamic format" well** (`format`): measures renamed `card.setting` (e.g. `title.text`, `stats.lineColor`, `swarm.size`, `swarm.mode`) 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`, `swarm`, `stats`, `labels`, `valueAxis`, `legend`, `comparison`, `highlight`, `play`, `smallMultiples`, `images`, `interaction`, then `title`, `source`, `container`, `texts`; `reference` in the Analytics pane. `comparison`, `play`, `smallMultiples` and `images` are shown only when their field is filled. Format pane in version 1.1.0.0 (30/10/2026), top to bottom: `license`, `style`, `dataColors`, `swarm`, `stats`, `labels`, `valAxis`, `gridlines`, `legend`, `comparison`, `highlight`, `search`, `zoom`, `play`, `smallMultiples`, `images`, `interaction`, `tooltip`, `title`, `source`, `container`, `texts`; Analytics pane: `reference`. Settings moved or renamed in this version keep working in older reports (the old names are still read).
- `dataColors`: `mode` (`auto` | `single` | `gradient` ★, default `auto`), `single`, `gradientBy` (`value` | `size` | `delta`, default `value`).
- `swarm`: `mode` (`swarm` | `jitter` | `strip` | `sieve` ★, default `swarm`), `orientation` (`horizontal` | `vertical`, default `horizontal`), `side` (`both` | `positive` | `negative`, default `both`), `order` (`value` | `size` ★, default `value`), `jitterWidth` (5–100, 70), `shape` (153 shape IDs of the shared library; free: `circle`, `square`, `roundedSquare`, `rectangle`, `triangle`, `diamond`, `hexagon`, `star`, `heart`, `cloud`, `drop`, `bubble`, `arrow`, `person`, `house`; default `circle`), `shapeByLegend`, `size` (0.5–40, 5), `autoFit` (on), `padding` (0–12, 1), `minSize` (0.5–40, 3), `maxSize` (1–80, 14), `opacity` (10–100, 88), `hollow`, `outline` (on), `outlineColor`, `bandLabels` (on), `bandLabelSize` (6–24, 10), `showCount` (on), `bandOrder` (`data` | `medianDesc` ★ | `medianAsc` ★ | `count` | `name`, default `data`), `separators` (on), `stripes`, `bandGap` (0–60, 6).
- `stats`: `median` (on), `quartiles` ★, `mean`, `values`, `lineColor`, `lineWidth` (0.5–6, 1.5), `box` ★, `whiskers` (`iqr` | `minmax` | `p5` | `p10`, default `iqr`), `outliers` (on), `boxWidth` (10–100, 70), `violin` ★, `bandwidth` (0–1000000000, 0), `violinOpacity` (0–80, 16).
- `labels`: `show`, `content` (`name` | `nameValue` | `value`, default `name`), `which` (`extremes` | `top` | `bottom` | `outliers` ★ | `selected` | `all`, default `extremes`), `n` (1–100, 5), `fontSize` (6–24, 10), `color`, `bold`, `halo` (on), `declutter` (on), `units` (`auto` | `none` | `k` | `m` | `b`, default `auto`), `decimals` (-1–6, -1), `prefix`, `suffix`.
- `valAxis`: `show` (on), `fontSize` (6–24, 9), `color`, `units` (`auto` | `none` | `k` | `m` | `b`, default `auto`), `decimals` (-1–6, -1), `prefix`, `suffix`, `line`, `scale` (`linear` | `log`, default `linear`), `min`, `max`, `zero`, `ticks` (2–20, 5), `invert`, `showTitle`, `titleText`, `gridlines.vShow` (on), `gridlines.vStyle` (`solid` | `dashed` | `dotted`, default `solid`), `gridlines.vColor`, `gridlines.zeroLine` (on).
- `legend`: `show` (on), `position` (`top` | `bottom` | `right` | `left`, default `top`), `align` (`left` | `center` | `right`, default `left`), `showTitle`, `titleText`, `fontSize` (6–24, 9), `color`, `interactive` (on).
- `comparison`: `show` (on) ★, `stems` (on), `ghosts` (on), `colorByGap`, `higherIsBetter` (on), `positiveColor` (#2E7D4F), `negativeColor` (#C0392B), `stemWidth` (0.5–6, 1.5).
- `highlight`: `search.show` ★, `names` ★, `color`, `othersOpacity` (5–100, 22), `labels` (on).
- `play` ★ (card « Lecture ★ » / "Playback ★"): `start` (`last` | `first`, default `last`), `speed` (100–10000, 1000), `loop`, `autoPlay`, `transition` (on), `controls` (on), `position` (`bottom` | `top`, default `bottom`), `ticks` (`auto` | `all` | `none`, default `auto`), `tickLabels` (on), `stepButtons` (on), `speedButton` (on), `showLabel` (on), `labelSize` (12–160, 44), `labelPosition` (`bottomRight` | `topRight` | `topLeft` | `bottomLeft` | `center`, default `bottomRight`), `trail` (`none` | `selected` ★ | `highlighted` ★, default `none`).
- `smallMultiples`: `columns` (0–12, 0), `minHeight` (50–600, 110), `gap` (0–60, 12), `titleSize` (6–24, 10), `border`.
- `images`: `imageSize` (6–120, 22), `imageBorder` (on).
- `reference` (Analytics pane; lines 1 to 3 with suffix 1, 2, 3, then the band): `show1`, `kind1` (`constant` | `average` | `median` | `min` | `max` | `percentile` | `measure`, default `average`), `value1` (–, 0), `pct1` (1–99, 90), `label1`, `showValue1` (on), `color1`, `style1` (`solid` | `dashed` | `dotted`, default `dashed`), `width1` (0.5–6, 1.5), `labelPos1` (`end` | `start` | `none`, default `end`), `band`, `bandFrom` (–, 0), `bandTo` (–, 0), `bandLabel`, `bandColor`, `bandOpacity` (2–60, 12).
- `interaction`: `hover` (on), `dim` (5–80, 25), `brush` (on), `rank` (on).

## 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": "plumeBeeswarm2C62844BD5AB404A8D59CCCC7D73C0DF",
  "query": {
    "queryState": {
      "details": { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Stores" } }, "Property": "Store" } }, "queryRef": "Stores.Store", "nativeQueryRef": "Store" } ] },
      "group":   { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Stores" } }, "Property": "Region" } }, "queryRef": "Stores.Region", "nativeQueryRef": "Region" } ] },
      "value":   { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Stores" } }, "Property": "Total sales" } }, "queryRef": "Stores.Total sales", "nativeQueryRef": "Total sales" } ] }
    }
  },
  "objects": {
    "swarm":   [ { "properties": { "side": { "expr": { "Literal": { "Value": "'positive'" } } } } } ],
    "stats":   [ { "properties": { "quartiles": { "expr": { "Literal": { "Value": "true" } } }, "violin": { "expr": { "Literal": { "Value": "true" } } } } } ],
    "labels":  [ { "properties": { "show": { "expr": { "Literal": { "Value": "true" } } }, "which": { "expr": { "Literal": { "Value": "'top'" } } }, "n": { "expr": { "Literal": { "Value": "3D" } } } } } ],
    "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`. Style adjustments in Beeswarm Plume (on settings left at their default): Minimal removes the gridlines and the lines between groups, Journal (`press`) uses dotted gridlines, Black and white turns on one shape per legend category, Unknown Pleasures and the "outlined" fill use hollow dots, the "glass" fill lowers the opacity, glowing styles add a glow to the dots.
- `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 dot, or one per group: nothing in Details.
- Fewer dots than rows: blank values, or two items with the same name (add a code as a second Details field).
- Tiny dots: too many dots for the band; enlarge the visual, use fewer groups, or use the jitter layout.
- "Nothing to place": the Value measure is blank for every item.
- Log scale message: zero or negative values are not placed.
- Small multiples taller than the visual: the area scrolls (set `smallMultiples.minHeight` lower).
- Watermark visible: a filled Play axis field, quartiles, groups sorted by median, placement by size (with Size), outlier labels, sieve, a ★ shape, box plot, violin, gradient, Compare with field, search, highlight list or field, history trails, small multiples, images, reference lines, a ★ style or a theme JSON, without a valid key.
- The visual makes no network request: data, images and license key stay in the report; no R or Python.

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

Force-directed (random) layout, lasso selection, a second value axis, connecting lines between dots of the same item within a frame, readers saving their search or highlights in the report, exporting the chart as an image, loading images from web addresses, more than 36 small multiples, more than 200,000 rows.

## 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 dot each) | Détails (un point par valeur) | column | 2 | One dot per value (customer, product, store…); two fields are combined. |
| `value` | Value | Valeur | measure | 1 | Places each dot along the value axis. |
| `group` | Group (one band each) | Groupe (une bande par valeur) | column | 1 | One swarm per value, to compare groups. |
| `legend` | Legend (color) | Légende (couleur) | column | 1 | Colors the dots by category. |
| `size` | Size | Taille | measure | 1 | Dot area proportional to this measure. |
| `play` | Play axis ★ | Axe de lecture ★ | column | 1 | Premium: a date, a year or an ordered category; the dots glide from one value to the next (play button). |
| `compare` | Compare with ★ | Comparer à ★ | measure | 1 | A reference value per dot (last year, target): a stem shows the gap. |
| `multiples` | Small multiples ★ | Petits multiples ★ | column | 1 | One small swarm per value, sharing the same value axis. |
| `image` | Image ★ | Image ★ | measure | 1 | An embedded image per dot (data:image/…;base64 or raw base64); web addresses are never loaded. |
| `highlight` | Highlight ★ | Mise en avant ★ | measure | 1 | Not blank and not 0: the dot stands out, the others fade. |
| `reference` | Reference value | Valeur de référence | measure | 1 | Target or benchmark for the reference lines (Analytics pane). |
| `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` + `group` + `legend` + `multiples` + `play` (one row per combination), 30,000 rows per data window (more fetched automatically); measures = `value`, `size`, `compare`, `image`, `highlight`, `reference`, `tooltips`, `format`.
Capabilities: supportsHighlight, supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).

## Format pane options (236)

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 (by legend, else by group); `single` Single color; `gradient` Gradient by a value ★ |  |
| `dataColors.single` | Color | Couleur | color | fill | (empty) | hex color |  |
| `dataColors.fill` | Color | Couleur | color | fill | (empty) | hex color |  |
| `dataColors.gradientBy` | Gradient value | Valeur du dégradé | dropdown | enumeration | `value` | `value` Value (position); `size` Size; `delta` Gap to the reference |  |

### Swarm / Essaim (`swarm`, Format pane)

**Layout / Disposition**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `swarm.mode` | Layout | Disposition | dropdown | enumeration | `swarm` | `swarm` Swarm (no overlap); `jitter` Random jitter; `strip` Strip (dots on one line); `sieve` Sieve (dot columns) ★ | Swarm: each dot at its exact value, pushed aside just enough not to cover another one (the same picture every time). Sieve: dots stacked in columns, like a histogram made of dots. |
| `swarm.orientation` | Orientation | Orientation | dropdown | enumeration | `horizontal` | `horizontal` Horizontal (values at the bottom); `vertical` Vertical (values on the left) |  |
| `swarm.side` | Side | Côté | dropdown | enumeration | `both` | `both` Both sides (symmetric); `positive` One side (above or right); `negative` One side (below or left) | One side with the violin ★ gives a raincloud plot: half violin on one side, dots on the other. |
| `swarm.order` | Placement order | Ordre de placement | dropdown | enumeration | `value` | `value` By value (classic swarm); `size` By size (large dots in the middle) ★ | Visible when `swarm.mode` = `swarm` |
| `swarm.jitterWidth` | Jitter width (% of the band) | Largeur de la dispersion (% de la bande) | number | integer | `70` | 5 to 100 | Visible when `swarm.mode` = `jitter` |

**Dots / Points**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `swarm.shape` | Shape | Forme | dropdown | enumeration | `circle` | `circle` Circle; `square` Square; `roundedSquare` Rounded square; `rectangle` Rectangle; `triangle` Triangle; `diamond` Diamond; `hexagon` Hexagon; `star` Star; `heart` Heart; `ellipse` Ellipse ★; `pentagon` Pentagon ★; `octagon` Octagon ★; `rightTriangle` Right triangle ★; `parallelogram` Parallelogram ★; `trapezoid` Trapezoid ★; `ring` Ring ★; `semicircle` Semicircle ★; `arch` Arch ★; `capsule` Pill ★; `star6` Six-pointed star ★; `seal` Seal ★; `cross` Cross ★; `arrow` Arrow; `arrowUp` Arrow up ★; `arrowDown` Arrow down ★; `arrowLeft` Arrow left ★; `doubleArrow` Double arrow ★; `chevron` Chevron ★; `check` Check mark ★; `close` Close (X) ★; `plus` Plus ★; `minus` Minus ★; `warning` Warning ★; `info` Information ★; `playButton` Play button ★; `bubble` Speech bubble; `thought` Thought bubble ★; `flag` Flag ★; `bookmark` Bookmark ★; `tag` Tag ★; `bolt` Lightning bolt ★; `shield` Shield ★; `award` Award ★; `puzzle` Puzzle piece ★; `gear` Gear ★; `lock` Lock ★; `key` Key ★; `bell` Bell ★; `eye` Eye ★; `cloud` Cloud; `drop` Drop; `sun` Sun ★; `moon` Moon ★; `snowflake` Snowflake ★; `leaf` Leaf ★; `pine` Pine tree ★; `tree` Tree ★; `flower` Flower ★; `mountain` Mountain ★; `wave` Wave ★; `flame` Flame ★; `umbrella` Umbrella ★; `apple` Apple ★; `fish` Fish ★; `paw` Paw print ★; `rain` Rain ★; `sprout` Sprout ★; `person` Person; `man` Man ★; `woman` Woman ★; `child` Child ★; `people` Group of people ★; `bust` User bust ★; `house` House; `building` Office building ★; `factory` Factory ★; `castle` Castle ★; `shop` Shop ★; `bank` Bank ★; `hospital` Hospital ★; `book` Book ★; `envelope` Envelope ★; `phone` Phone ★; `laptop` Laptop ★; `monitor` Monitor ★; `gift` Gift ★; `clock` Clock ★; `calendar` Calendar ★; `pencil` Pencil ★; `lightbulb` Light bulb ★; `cup` Trophy ★; `crown` Crown ★; `trashCan` Trash can ★; `barrel` Barrel; `bottle` Bottle; `wineGlass` Wine glass; `glass` Glass; `mug` Mug ★; `jar` Jar ★; `bucket` Bucket ★; `battery` Battery; `batteryVertical` Vertical battery; `thermometer` Thermometer; `testTube` Test tube ★; `tank` Tank ★; `funnel` Funnel ★; `hourglass` Hourglass ★; `bag` Bag ★; `piggyBank` Piggy bank ★; `flask` Flask ★; `beaker` Beaker ★; `can` Can ★; `coffeeCup` Coffee cup ★; `vase` Vase ★; `milkCarton` Milk carton ★; `france` Metropolitan France ★; `africa` Africa ★; `australia` Australia ★; `southAmerica` South America ★; `pin` Map pin ★; `globe` Globe ★; `foldedMap` Folded map ★; `compass` Compass ★; `city` City skyline ★; `target` Target ★; `barChart` Bar chart ★; `pieChart` Pie chart ★; `trendUp` Trend up ★; `coin` Coin ★; `banknote` Banknote ★; `wallet` Wallet ★; `creditCard` Credit card ★; `cart` Shopping cart ★; `briefcase` Briefcase ★; `percent` Percent ★; `podium` Podium ★; `megaphone` Megaphone ★; `gem` Gem ★; `medal` Medal ★; `clipboard` Clipboard ★; `handshake` Handshake ★; `car` Car ★; `truck` Truck ★; `bus` Bus ★; `bicycle` Bicycle ★; `plane` Plane ★; `boat` Sailboat ★; `train` Train ★; `rocket` Rocket ★; `helicopter` Helicopter ★; `ship` Cargo ship ★; `fuel` Fuel pump ★; `scooter` Scooter ★ | 22 free shapes; the others (★) show the watermark without a license. The space kept for each dot stays a circle: no shape spills onto its neighbor. |
| `swarm.shapeByLegend` | One shape per legend category | Une forme par catégorie de légende | toggle | bool | `false` | true / false | Circle, square, diamond, triangle, hexagon, star…: the category can be read without the colors (always on in high contrast). |
| `swarm.size` | Dot radius (px) | Rayon des points (px) | number | numeric | `5` | 0.5 to 40 |  |
| `swarm.autoFit` | Shrink dots so that everything fits | Réduire les points pour que tout tienne | toggle | bool | `true` | true / false | When a band is too crowded, all dots get smaller (the same size in every band and every frame). |
| `swarm.padding` | Space between dots (px) | Espace entre les points (px) | number | numeric | `1` | 0 to 12 |  |
| `swarm.minSize` | Smallest dot radius (Size field) | Rayon du plus petit point (champ Taille) | number | numeric | `3` | 0.5 to 40 |  |
| `swarm.maxSize` | Largest dot radius (Size field) | Rayon du plus grand point (champ Taille) | number | numeric | `14` | 1 to 80 |  |
| `swarm.opacity` | Opacity (%) | Opacité (%) | number | integer | `88` | 10 to 100 |  |
| `swarm.hollow` | Hollow dots | Points creux | toggle | bool | `false` | true / false |  |
| `swarm.outline` | Outline | Contour | toggle | bool | `true` | true / false |  |
| `swarm.outlineColor` | Outline color (empty = background) | Couleur du contour (vide = fond) | color | fill | (empty) | hex color | Visible when `swarm.outline` = `true` |

**Groups (bands) / Groupes (bandes)**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `swarm.bandLabels` | Group names | Noms des groupes | toggle | bool | `true` | true / false |  |
| `swarm.bandLabelSize` | Name size | Taille des noms | number | formatting | `10` | 6 to 24 |  |
| `swarm.bandLabelLines` | Maximum lines per name | Lignes au plus par nom | number | integer | `2` | 1 to 4 | Long names wrap to the next line (then “…”); the full name is in the tooltip of the name. |
| `swarm.bandLabelWidth` | Maximum room for names (% of the width) | Place maximale des noms (% de la largeur) | number | integer | `32` | 10 to 60 |  |
| `swarm.showCount` | Dot count under the name | Nombre de points sous le nom | toggle | bool | `true` | true / false |  |
| `swarm.bandOrder` | Group order | Ordre des groupes | dropdown | enumeration | `data` | `data` Data order (Power BI sort); `medianDesc` Median, descending ★; `medianAsc` Median, ascending ★; `count` Number of dots; `name` Name (A → Z) |  |
| `swarm.separators` | Lines between groups | Traits entre les groupes | toggle | bool | `true` | true / false |  |
| `swarm.stripes` | Alternate bands | Bandes alternées | toggle | bool | `false` | true / false |  |
| `swarm.bandGap` | Gap between groups (px) | Écart entre les groupes (px) | number | integer | `6` | 0 to 60 |  |

### Statistics / Statistiques (`stats`, Format pane)

**Markers / Repères**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `stats.median` | Median | Médiane | toggle | bool | `true` | true / false |  |
| `stats.quartiles` | Quartiles (Q1 and Q3) ★ | Quartiles (Q1 et Q3) ★ | toggle | bool | `false` | true / false |  |
| `stats.mean` | Mean | Moyenne | toggle | bool | `false` | true / false |  |
| `stats.values` | Write the marker values | Écrire les valeurs des repères | toggle | bool | `false` | true / false |  |
| `stats.lineColor` | Marker color (empty = text) | Couleur des repères (vide = texte) | color | fill | (empty) | hex color |  |
| `stats.lineWidth` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |

**Box plot ★ / Boîte à moustaches ★**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `stats.box` | Box plot ★ | Boîte à moustaches ★ | toggle | bool | `false` | true / false | Quartile box and whiskers drawn behind the dots of each group. |
| `stats.whiskers` | Whiskers | Moustaches | dropdown | enumeration | `iqr` | `iqr` 1.5 × interquartile range (Tukey); `minmax` Minimum and maximum; `p5` 5th and 95th percentiles; `p10` 10th and 90th percentiles |  |
| `stats.outliers` | Ring the outliers | Cercler les valeurs atypiques | toggle | bool | `true` | true / false | Dots beyond the whiskers get a ring in the unfavorable color. |
| `stats.boxWidth` | Box width (% of the band) | Largeur de la boîte (% de la bande) | number | integer | `70` | 10 to 100 |  |

**Violin ★ / Violon ★**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `stats.violin` | Violin (density) ★ | Violon (densité) ★ | toggle | bool | `false` | true / false | Smoothed density behind the dots. With Swarm › Side = one side, half a violin on the other side: a raincloud plot. |
| `stats.bandwidth` | Smoothing (0 = automatic) | Lissage (0 = automatique) | number | numeric | `0` | 0 to 1000000000 | Kernel width in the unit of the value. Automatic: Silverman's rule. |
| `stats.violinOpacity` | Fill opacity (%) | Opacité du remplissage (%) | number | integer | `16` | 0 to 80 |  |

### 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 | `name` | `name` Name (Details); `nameValue` Name and value; `value` Value |  |
| `labels.which` | Labeled dots | Points étiquetés | dropdown | enumeration | `extremes` | `extremes` Minimum and maximum of each group; `top` The N largest; `bottom` The N smallest; `outliers` Outliers (1.5 × interquartile range) ★; `selected` Selected only; `all` All (no overlap) | Selected and highlighted dots are always labeled. |
| `labels.n` | N | N | number | integer | `5` | 1 to 100 | Visible when `labels.which` = `top` or `bottom` |
| `labels.detailField` | Name shown (two Details fields) | Nom affiché (deux champs Détails) | dropdown | enumeration | `both` | `both` Both (A · B); `first` The first field; `second` The second field | With two fields in Details (e.g. Town and County): the name written in the labels and at the top of the tooltip. Both stay in the tooltip and the search. |
| `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) |  |  |

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

The card header toggle is `valAxis.show`.

**Values / Valeurs**

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

**Range / Échelle**

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

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

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

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

**Value lines / Lignes des valeurs**

| 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 |  |
| `gridlines.zeroLine` | Zero line | Ligne du zéro | toggle | bool | `true` | 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 | `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 |  |

### Comparison ★ / Comparaison ★ (`comparison`, 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 `comparison.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `comparison.show` | Show ★ | Afficher ★ | toggle | bool | `true` | true / false | Needs the “Compare with ★” field: a reference value per dot (last year, target, budget). |
| `comparison.stems` | Gap stem (from the reference to the dot) | Tige de l'écart (de la référence au point) | toggle | bool | `true` | true / false |  |
| `comparison.ghosts` | Hollow dot at the reference | Point creux à la référence | toggle | bool | `true` | true / false |  |
| `comparison.colorByGap` | Color dots by their gap | Colorer les points selon l'écart | toggle | bool | `false` | true / false | Favorable, unfavorable or unchanged; the direction is also written in the tooltip (▲ ▼). |
| `comparison.higherIsBetter` | An increase is favorable | Une hausse est favorable | toggle | bool | `true` | true / false |  |
| `comparison.positiveColor` | Favorable color | Couleur favorable | color | fill | `#2E7D4F` | hex color |  |
| `comparison.negativeColor` | Unfavorable color | Couleur défavorable | color | fill | `#C0392B` | hex color |  |
| `comparison.stemWidth` | Stem width | Épaisseur de la tige | number | numeric | `1.5` | 0.5 to 6 |  |

### Highlight ★ / Mise en avant ★ (`highlight`, 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 |
|---|---|---|---|---|---|---|---|
| `highlight.names` | Highlighted dots ★ | Points mis en avant ★ | textarea | text | (empty) |  | Names of the Details field (case and accents ignored). The “Highlight ★” field does the same with a measure. |
| `highlight.color` | Color (empty = dot color) | Couleur (vide = couleur du point) | color | fill | (empty) | hex color |  |
| `highlight.othersOpacity` | Other dots opacity (%) | Opacité des autres points (%) | number | integer | `22` | 5 to 100 |  |
| `highlight.labels` | Label highlighted (and found) dots | Étiqueter les points mis en avant (et trouvés) | toggle | bool | `true` | true / false |  |

### Search ★ / Recherche ★ (`search`, 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 `search.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `search.show` | Search box in the visual ★ | Champ de recherche dans le visuel ★ | toggle | bool | `false` | true / false | Readers type a name: matching dots stand out and are labeled (Highlight card colors); Enter selects them. |
| `search.hideInView` | Hide in reading view | Masquer en mode lecture | toggle | bool | `false` | true / false | The box only appears in edit mode (published, exported or presented report: no box). |
| `search.hideWhilePlaying` | Hide while playing (play axis) | Masquer pendant la lecture (axe de lecture) | toggle | bool | `true` | true / false | The box disappears during the animation (video, recording) and comes back on pause. |
| `search.placeholder` | Placeholder | Texte indicatif | text | text | (empty) |  |  |

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `zoom.slider` | Value axis zoom slider | Curseur de zoom de l'axe des valeurs | toggle | bool | `false` | true / false | Movable window and two handles below the axis (like the native zoom slider); double-click = full view. Not saved in the report. |

### Images ★ (`images`, 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 |
|---|---|---|---|---|---|---|---|
| `images.imageSize` | Minimum diameter of a dot with an image (px) | Diamètre minimal d'un point avec image (px) | number | integer | `22` | 6 to 120 | Dots that carry an image (“Image ★” field) are drawn at least this large so the image stays legible. |
| `images.imageBorder` | Border in the dot color | Bordure de la couleur du point | toggle | bool | `true` | true / false |  |

### 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 | `110` | 50 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.trail` | Dot history | Historique des points | dropdown | enumeration | `none` | `none` None; `selected` Selected dots ★; `highlighted` Highlighted dots ★ | Earlier values of the dot (from the first frame to the current one), drawn as a trail along the value axis. |

### 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 dots | When another visual sends a highlight (Format › Edit interactions › Highlight), the axis keeps all the data; a filter removes the dots: 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 dot inside the rectangle (Ctrl to add). |
| `interaction.brushShape` | Selection shape | Forme de la sélection | dropdown | enumeration | `rectangle` | `rectangle` Rectangle; `lasso` Lasso (freehand) | Visible when `interaction.brush` = `true` |
| `interaction.rank` | Rank and percentile in the tooltip | Rang et centile dans l'infobulle | toggle | bool | `true` | true / false | Rank of the dot in its group (1 = largest value) and its percentile. |

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

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

**Line 1 / Ligne 1**

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

**Line 2 / Ligne 2**

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

**Line 3 / Ligne 3**

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

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

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

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

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

- `valueAxis`: `valueAxis.show` (bool), `valueAxis.fontSize` (formatting), `valueAxis.color` (fill), `valueAxis.units` (enumeration), `valueAxis.decimals` (integer), `valueAxis.prefix` (text), `valueAxis.suffix` (text), `valueAxis.line` (bool), `valueAxis.scale` (enumeration), `valueAxis.min` (text), `valueAxis.max` (text), `valueAxis.zero` (bool), `valueAxis.ticks` (integer), `valueAxis.invert` (bool), `valueAxis.round` (bool), `valueAxis.showTitle` (bool), `valueAxis.titleText` (text), `valueAxis.grid` (bool), `valueAxis.gridColor` (fill), `valueAxis.gridStyle` (enumeration), `valueAxis.zeroLine` (bool).
- `compare`: `compare.show` (bool), `compare.stems` (bool), `compare.ghosts` (bool), `compare.colorByGap` (bool), `compare.higherIsBetter` (bool), `compare.positiveColor` (fill), `compare.negativeColor` (fill), `compare.stemWidth` (numeric).