# Chord 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 Chord 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/chord (French: https://plumevisuals.com/fr/visuels/chord)
- Summary: Who exchanges with whom, both ways: a readable chord diagram, with labels that never overlap and years replayed with animation.
- Power BI visual GUID (`visualType`): `plumeChordC66BF01D5AA54B1F91E8D1DA4CFB6000`
- 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

Chord Plume (identifier `chord`) is a Power BI custom visual (version 1.1.0.0, installed from its `.pbiviz` file; not yet on AppSource) that draws **chord diagrams**: names (regions, countries, teams, brands) as arcs around a circle, and one ribbon per pair of names showing what they exchange. Power BI Desktop has no native chord diagram (only Microsoft's older free "Chord" custom visual).

**New in version 1.1.0.0 (30/10/2026):** Format pane reorganized (`labels.*` → `categoryLabels.*`); free parity with Microsoft's Chord: bold / italic category labels, bold / italic / rotated ticks, ribbon outline color and width, axis sort.

- **Both directions**: with `layout.direction` = `both` ("Both ways in one ribbon"), each end of a ribbon is as wide as what its arc sends to the other (asymmetric ribbon) and the arc length is what the name sends; `arrows` draws one ribbon per direction with an arrowhead at the destination (arc = sent + received); `undirected` adds both directions (equal ends). `auto` (default) picks `both` when every name sends something, otherwise `arrows` (a name that only receives would have no arc).
- **Two kinds of data**: one row per flow (From, To, Value), or a **matrix**: no To field and two or more measures in Value, each measure being a destination named after the measure.
- **Labels never overlap**: along the arcs (curved), radial, or horizontal with leader lines; `auto` puts each label along its arc when it fits, otherwise horizontal (wide visual) or radial; labels that still do not fit are shortened (…) or left out, largest arcs first.
- **Busy data**: the names with the most traffic (sent + received) keep their arc, the rest is merged into a gray "Others" arc (`layout.maxGroups`, 20); small ribbons can be hidden ★ (`flows.minShare`); self-flows (A → A) drawn as loops or hidden; ticks in values or % of total ★.
- **Order**: largest first, alphabetical, data order (respects Sort by column), custom list, fewer crossings ★ (partners side by side), net balance ★. Ribbon ends inside each arc are ordered by the position of the partner, which avoids crossings.
- **Play axis ★**: one diagram per period (dates and numbers sorted, text in data order), most recent period shown first, animated transitions between periods; arcs keep their place and color over all periods (order, Others and colors are computed on the whole data).
- Premium ★: two half circles (`layout.shape` = `bipartite`: From on the left, To on the right), indicator ring (`ring.kind` = `inout` sent / received, `net` net balance ▲▼, `change` change since the previous or first period), net balance and fewer-crossings orders, groups (From group / To group fields: grouped arcs under a named outer arc, color shades), highlighted names (`flows.focus`), gradient ribbons, ribbons colored by the stronger direction, small ribbons hidden, ticks in % of total, and the play axis (since the 22/10/2026 rebalancing).

## 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 Chord Plume: circle shape, matrix of measures, all flow directions, colors by origin / destination / neutral, all label placements and contents, ticks in values, Others, self-loops, orders size / alpha / data / custom, hover modes, selection, highlighting, tooltips.
- Premium features of Chord Plume: the Play axis field with at least one value (« Axe de lecture ★ », card « Lecture ★ » / « Playback ★ »); `layout.shape` = `bipartite`; `layout.order` = `net`, or `auto` with at least 3 names; `flows.colorBy` = `gradient`, or `dominant` with one ribbon per direction or two half circles; `flows.minShare` when at least one ribbon is actually hidden; `ticks.unit` = `percent` with ticks shown; `flows.focus` (any name); `ring.kind` = `inout`, `net` or `change` (change only counts when a Play axis field is present); the From group / To group fields with at least one value.
- 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 `chord` or the whole catalog. In edit mode, a wrong key shows "Invalid license key", "License expired (date)" or "This key does not cover this visual".
- Licenses last one year (one-time payment, no automatic renewal). Prices: 39 € personal, 99 € SME, 299 € enterprise per year, or the catalog pack.

## Expected data shape

One row per flow, with a measure for the size.

| From (`source`) | To (`target`) | Play axis (`play`) | Value (`value`) |
|---|---|---|---|
| Île-de-France | Nouvelle-Aquitaine | 2025 | 5,540 |
| Nouvelle-Aquitaine | Île-de-France | 2025 | 1,540 |

- **From** (`source`, « De », one column, required): one arc per value. A name found in From and To is a single arc (circle shape).
- **To** (`target`, « Vers », one column): required unless the Value well holds two or more measures (matrix).
- **Value** (`value`, « Valeur (ou une mesure par destination) », 1 to 30 measures): rows of the same pair are added up; without a measure each row counts as 1 (a hint says so); negative values are left out with a warning icon; blanks ignored.
- **Play axis ★** (`play`, « Axe de lecture ★ », one column): one diagram per value; premium (watermark without a key, never blocked).
- **From group ★** / **To group ★** (`sourceGroup`, `targetGroup`, one column each): group of each origin / destination (continent, division).
- **Tooltips** (`tooltips`, up to 5 measures) and **Dynamic format** (`format`, see below).
- Volume of data: windows of 30,000 rows, more fetched with `fetchMoreData`; 100,004 rows (60 names, 28 periods) render in well under 2.5 s.

## DAX recipes

```dax
// One row per flow: a simple sum
People moving = SUM ( Moves[People] )

// Matrix (one column per destination): one measure per column, named after the destination
Sales = SUM ( 'Shared work'[To Sales] )
Marketing = SUM ( 'Shared work'[To Marketing] )

// Dynamic title (renamed title.text in the Dynamic format well)
Dynamic title = "Moves between regions: " & FORMAT ( CALCULATE ( [People moving], ALLSELECTED () ), "#,0" ) & " people"
```

To compare two periods without the play axis, filter the visual on one year and use the tooltip; with the play axis, `ring.kind` = `change` ★ shows the change since the previous or first period.

## Interactions with the report

- Hover an arc: its ribbons stay sharp, the others are dimmed (`interaction.hoverFlows`: `both`, `out` sent only, `in` received only). Hover a ribbon: that ribbon.
- Click an arc: cross-filter on all its flows (every From + To combination of its ribbons, up to 5,000 identities); click a ribbon: the pair (both directions in one ribbon, or one direction with arrows); Ctrl + click adds; click empty space clears. Cross-highlighting from other visuals is drawn as the highlighted part at the start of each ribbon end and arc. Context menu everywhere (arcs, ribbons, empty space, labels, title, landing page).
- Tooltips: arc = name, period, group, sent, received, internal, net balance (▲ / ▼), share of total, change since the reference period, highlighted; ribbon = A → B, B → A, net balance, share of what A sends, Tooltips measures. Report-page tooltips are supported.
- Keyboard: Tab to the chart, arrows move from arc to arc then ribbon to ribbon (announced to screen readers), Enter selects, Esc clears. High contrast: ribbons drawn as host-colored strokes, arcs and ring in host colors. French and English.
- The visual never calls `persistProperties`: every setting comes from the Format pane.

## Dynamic formats

- **fx button** (Power BI conditional formatting) on colors and texts of the Format pane, and on each name's color in Data colors.
- **"Dynamic format" well** (`format`): measures renamed `card.setting` (e.g. `title.text`, `layout.order`, `flows.focus`, `ring.kind`) drive any setting and win over the fixed value. Driving a ★ setting by DAX still shows the watermark without a key. These measures never become flows.

## Format pane: option IDs

- Card order: `license`, `style`, `dataColors`, `layout`, `flows`, `ring`, (`groups` with a group field), `categoryLabels`, `ticks`, `interaction`, then `play` (shared player card) when the Play axis field is used, then `title`, `source`, `container`, `texts`. Format pane in version 1.1.0.0 (30/10/2026), top to bottom: `license`, `style`, `layout`, `dataColors`, `flows`, `ring`, `groups`, `categoryLabels`, `ticks`, `play`, `interaction`, `tooltip`, `title`, `source`, `container`, `texts`. Settings moved or renamed in this version keep working in older reports (the old names are still read).
- `dataColors`: `mode` (`auto` | `single`), `single`, `fill` (per name).
- `layout`: `shape` (`circle` | `bipartite` ★), `direction` (`auto` | `both` | `arrows` | `undirected`), `order` (`size` | `auto` ★ | `alpha` | `data` | `custom` | `net` ★), `customOrder` (text, `;`-separated), `startAngle` (0–359, 0), `clockwise` (true), `padAngle` (0–20 degrees, 2), `arcWidth` (2–60 px, 12), `size` (40–100 %, 100), `maxGroups` (2–60, 20), `selfLoops` (`show` | `hide`).
- `flows`: `colorBy` (`source` | `target` | `dominant` ★ | `gradient` ★ | `neutral`), `opacity` (5–100, 68), `outline` (true), `arrowSize` (0–40 px, 10), `minShare` ★ (0–20 % of total, 0), `focus` ★ (text, `;`-separated names), `dimOpacity` (5–100, 30).
- `ring`: `kind` (`none` | `inout` ★ | `net` ★ | `change` ★), `reference` (`previous` | `first`), `width` (3–40 px, 10), `values` (true).
- `groups` ★: `show` (true), `gap` (0–30 degrees, 6), `shades` (true), `fontSize` (9).
- `categoryLabels`: `show`, `placement` (`auto` | `curved` | `radial` | `horizontal`), `content` (`name` | `nameValue` | `namePct` | `all`), `fontSize` (10), `color`, `maxWidth` (10–45 %, 25), `halo`, `units`, `decimals`, `prefix`, `suffix`.
- `ticks`: `show` (false), `unit` (`value` | `percent` ★), `step` (0 = automatic), `fontSize` (8), `color`.
- `interaction`: `hover` (true), `dim` (5–80, 25), `hoverFlows` (`both` | `out` | `in`).
- `play` ★ (shared Plume player, card « Lecture ★ », shown with a Play axis field; session state only, never saved): `start` (`last` | `first`), `speed` (100–10000 ms per frame, 1000), `loop` (false), `autoPlay` (false), `transition` (true), `controls` (true), `position` (`bottom` | `top`), `ticks` (`auto` | `all` | `none`), `tickLabels`, `stepButtons`, `speedButton`, `showLabel` (true), `labelSize` (12–160, 44), `labelPosition` (`bottomRight` | `topRight` | `topLeft` | `bottomLeft` | `center`). Play bar: play / pause, slider, start / end buttons, speed ×0.5 to ×4; keyboard Space, arrows, Page Up / Down, Home / End.

## 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": "plumeChordC66BF01D5AA54B1F91E8D1DA4CFB6000",
  "query": {
    "queryState": {
      "source": { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Moves" } }, "Property": "Origin region" } }, "queryRef": "Moves.Origin region", "nativeQueryRef": "Origin region" } ] },
      "target": { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Moves" } }, "Property": "Destination region" } }, "queryRef": "Moves.Destination region", "nativeQueryRef": "Destination region" } ] },
      "value":  { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Moves" } }, "Property": "People moving" } }, "queryRef": "Moves.People moving", "nativeQueryRef": "People moving" } ] },
      "play":   { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Moves" } }, "Property": "Year" } }, "queryRef": "Moves.Year", "nativeQueryRef": "Year" } ] }
    }
  },
  "objects": {
    "layout": [ { "properties": { "order": { "expr": { "Literal": { "Value": "'auto'" } } }, "maxGroups": { "expr": { "Literal": { "Value": "12D" } } } } } ],
    "ring":   [ { "properties": { "kind": { "expr": { "Literal": { "Value": "'net'" } } } } } ]
  }
}
```

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-specific defaults: Minimal = thin arcs, no ribbon outline; Unknown Pleasures = neutral ribbons; Neon, Graphite, Hologram = more opaque ribbons and glow.
- `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 name has two arcs: it is spelled differently in From and To (space, accent, case), or the shape is two half circles (by design).
- Pointed ribbons with no width on one side: the flow only goes one way (both-ways mode); use `arrows` if preferred.
- The landing page asks for "To": From and a single measure only; add To or a second measure (matrix).
- "Without Value, each From → To row counts as 1": no measure in Value.
- A gray "Others" arc: more names than `layout.maxGroups`.
- The "Change" ring draws nothing: no Play axis field (a hint says so; no watermark then).
- Watermark visible: a Play axis field, two half circles, net balance or fewer-crossings order, gradient or stronger-direction ribbons, hidden small ribbons, ticks in %, a highlighted name, an indicator ring, a group field, a ★ style or a theme JSON, without a valid key.
- The visual makes no network request: data and license key stay in the report.

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

Ribbon color driven by a measure, value labels written on the ribbons, dragging arcs to reorder them, zooming into a group on click, images or flags at the end of the arcs, two diagrams side by side for a comparison, hierarchical edge bundling, network (force-directed) layouts, exporting the chart as an image.

## 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 |
|---|---|---|---|---|---|
| `source` | From | De | column | 1 | Origin of each flow (country, department, product…). With To: one flow per row. |
| `target` | To | Vers | column | 1 | Destination of each flow. Without To, drop several measures in Value: each measure is a destination (matrix). |
| `value` | Value (or one measure per destination) | Valeur (ou une mesure par destination) | measure | 30 | Size of the flows. Without To, each measure is a destination named after the measure (matrix of measures). |
| `play` | Play axis ★ | Axe de lecture ★ | column | 1 | Premium: year, month…: one diagram per value, played with animated transitions. |
| `sourceGroup` | From group ★ | Groupe de De ★ | column | 1 | Premium: group of each From item (continent, division…): grouped arcs with an outer ring. |
| `targetGroup` | To group ★ | Groupe de Vers ★ | column | 1 | Premium: group of each To item (often the same field as From group, from the destination table). |
| `tooltips` | Tooltips | Infobulles | measure | 5 |  |
| `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 = `source` + `target` + `play` + `sourceGroup` + `targetGroup` (one row per combination), 30,000 rows per data window (more fetched automatically); measures = `value`, `tooltips`, `format`.
Capabilities: supportsHighlight, supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).

## Format pane options (138)

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

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

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

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

**Style**

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

**Custom colors / Couleurs personnalisées**

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

**Text / Texte**

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

**Animations**

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

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `layout.shape` | Shape | Forme | dropdown | enumeration | `circle` | `circle` Circle (one arc per name); `bipartite` Two half circles (From on the left, To on the right) ★ | Two half circles: origins on the left, destinations on the right (exporters and importers, channels and products). A name found on both sides gets two arcs. |
| `layout.direction` | Flow direction | Sens des flux | dropdown | enumeration | `auto` | `auto` Automatic; `both` Both ways in one ribbon (each end = what it sends); `arrows` One ribbon per direction, with an arrow; `undirected` Undirected (both ways added up) | Automatic: both ways in one ribbon when every name sends something, otherwise one ribbon per direction with an arrow (a name that only receives would have no arc). |
| `layout.order` | Arc order | Ordre des arcs | dropdown | enumeration | `size` | `size` Largest first; `auto` Fewer crossings (partners side by side) ★; `alpha` Alphabetical; `data` Data order (Sort by column); `custom` Custom (list); `net` Net balance (gainers first) ★ | Order of the arcs, clockwise from the start angle. Net balance: names that receive more than they send come first. |
| `layout.customOrder` | Custom order (separated by ;) | Ordre personnalisé (séparé par ;) | text | text | (empty) |  | Visible when `layout.order` = `custom`. Names in this order, the others after them (largest first). |
| `layout.startAngle` | Start angle (degrees, 0 = top) | Angle de départ (degrés, 0 = en haut) | number | integer | `0` | 0 to 359 |  |
| `layout.clockwise` | Clockwise | Sens des aiguilles d'une montre | toggle | bool | `true` | true / false |  |
| `layout.padAngle` | Space between arcs (degrees) | Espace entre les arcs (degrés) | number | numeric | `2` | 0 to 20 |  |
| `layout.arcWidth` | Arc thickness (px) | Épaisseur des arcs (px) | number | integer | `12` | 2 to 60 |  |
| `layout.size` | Circle size (%) | Taille du cercle (%) | number | integer | `100` | 40 to 100 |  |
| `layout.maxGroups` | Names shown at most (the rest in « Others ») | Noms affichés au plus (le reste dans « Autres ») | number | integer | `20` | 2 to 60 | The names with the most traffic (sent + received) keep their arc; the others are merged into « Others ». |
| `layout.selfLoops` | Flows to itself (A → A) | Flux vers soi-même (A → A) | dropdown | enumeration | `show` | `show` Show (loop on the arc); `hide` Hide | Moves inside the same name (internal transfers, moves within a region). |

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

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `dataColors.mode` | Coloring | Coloration | dropdown | enumeration | `auto` | `auto` Palette (one color per name); `single` Single color |  |
| `dataColors.single` | Color | Couleur | color | fill | (empty) | hex color |  |
| `dataColors.fill` | Color | Couleur | color | fill | (empty) | hex color |  |

### Ribbons / Rubans (`flows`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `flows.colorBy` | Ribbon color | Couleur des rubans | dropdown | enumeration | `source` | `source` Origin; `target` Destination; `dominant` The stronger direction ★; `gradient` Gradient origin → destination ★; `neutral` Neutral (gray) | The stronger direction (with one ribbon per direction): both ribbons of a pair take the color of the name that sends the most. |
| `flows.opacity` | Opacity (%) | Opacité (%) | number | integer | `68` | 5 to 100 |  |
| `flows.outline` | Ribbon outline | Contour des rubans | toggle | bool | `true` | true / false |  |
| `flows.outlineColor` | Outline color (empty = ribbon color) | Couleur du contour (vide = couleur du ruban) | color | fill | (empty) | hex color | Visible when `flows.outline` = `true` |
| `flows.outlineWidth` | Outline width | Épaisseur du contour | number | numeric | `0.6` | 0.2 to 4 | Visible when `flows.outline` = `true` |
| `flows.arrowSize` | Arrow length (px) | Longueur des flèches (px) | number | integer | `10` | 0 to 40 | Used with « One ribbon per direction ». |
| `flows.minShare` | Hide ribbons below (% of total) ★ | Masquer les rubans sous (% du total) ★ | number | numeric | `0` | 0 to 20 | Ribbons smaller than this share of the total are not drawn (the arcs keep their size). |
| `flows.focus` | Highlight ★ | Mettre en avant ★ | text | text | (empty) |  | Only the arcs and ribbons of these names keep their color (several names separated by ;). Stays on the page, in PDF exports too. |
| `flows.dimOpacity` | Dimmed ribbons: opacity (% of opacity) | Rubans en retrait : opacité (% de l'opacité) | number | integer | `30` | 5 to 100 | Ribbons set back by a highlight. |

### Indicator ring / Anneau d'indicateurs (`ring`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `ring.kind` | Ring around the arcs | Anneau autour des arcs | dropdown | enumeration | `none` | `none` None; `inout` Sent and received (share of each way) ★; `net` Net balance (received − sent) ★; `change` Change since the reference period ★ | Net balance: a bar outside each arc, ▲ when the name receives more than it sends, ▼ otherwise. Change: needs a Play axis field. |
| `ring.reference` | Reference period | Période de référence | dropdown | enumeration | `previous` | `previous` The previous period; `first` The first period | Visible when `ring.kind` = `change` |
| `ring.width` | Thickness (px) | Épaisseur (px) | number | integer | `10` | 3 to 40 |  |
| `ring.values` | Write the values (▲ ▼) | Écrire les valeurs (▲ ▼) | toggle | bool | `true` | true / false |  |

### Groups (hierarchy) ★ / Groupes (hiérarchie) ★ (`groups`, 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 |
|---|---|---|---|---|---|---|---|
| `groups.show` | Outer group arcs | Arc extérieur des groupes | toggle | bool | `true` | true / false | With a From group / To group field (★): the names of a group stay together, under an outer arc with the group name. |
| `groups.gap` | Space between groups (degrees) | Espace entre les groupes (degrés) | number | numeric | `6` | 0 to 30 |  |
| `groups.shades` | Group color, shades for its names | Couleur du groupe, nuances pour ses noms | toggle | bool | `true` | true / false |  |
| `groups.fontSize` | Text size | Taille du texte | number | formatting | `9` | 6 to 20 |  |

### Category labels / Étiquettes des catégories (`categoryLabels`, Format pane)

The card header toggle is `categoryLabels.show`.

**Labels / Étiquettes**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `categoryLabels.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `categoryLabels.placement` | Placement | Placement | dropdown | enumeration | `auto` | `auto` Automatic (along the arc, otherwise radial); `curved` Along the arcs; `radial` Radial; `horizontal` Horizontal, with a leader line | Labels never overlap: a label that does not fit is shortened (…) or left out, the largest arcs first. |
| `categoryLabels.content` | Content | Contenu | dropdown | enumeration | `namePct` | `name` Name; `nameValue` Name and value; `namePct` Name and % of total; `all` Name, value and % |  |
| `categoryLabels.fontSize` | Text size | Taille du texte | number | formatting | `10` | 6 to 24 |  |
| `categoryLabels.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |
| `categoryLabels.maxWidth` | Maximum label room (% of the visual) | Place maximale des étiquettes (% du visuel) | number | integer | `25` | 10 to 45 |  |
| `categoryLabels.halo` | Text halo | Halo autour du texte | toggle | bool | `true` | true / false |  |
| `categoryLabels.bold` | Bold (name) | Gras (nom) | toggle | bool | `true` | true / false |  |
| `categoryLabels.italic` | Italic | Italique | toggle | bool | `false` | true / false |  |

**Numbers / Nombres**

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

### Ticks / Graduations (`ticks`, Format pane)

The card header toggle is `ticks.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `ticks.show` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `ticks.unit` | Scale in | Graduer en | dropdown | enumeration | `value` | `value` Values; `percent` % of total ★ |  |
| `ticks.step` | Step (0 = automatic) | Pas (0 = automatique) | number | numeric | `0` | 0 to … |  |
| `ticks.fontSize` | Text size | Taille du texte | number | formatting | `8` | 6 to 16 |  |
| `ticks.color` | Color (empty = secondary) | Couleur (vide = secondaire) | color | fill | (empty) | hex color |  |
| `ticks.bold` | Bold | Gras | toggle | bool | `false` | true / false |  |
| `ticks.italic` | Italic | Italique | toggle | bool | `false` | true / false |  |
| `ticks.rotate` | Rotate values along the circle | Valeurs tournées le long du cercle | toggle | bool | `true` | true / false | Off: the tick values stay horizontal. |

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

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `play.start` | Frame shown on opening | Image affichée à l'ouverture | dropdown | enumeration | `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.controls` | Play bar | Barre de lecture | toggle | bool | `true` | true / false |  |
| `play.position` | Bar position | Position de la barre | dropdown | enumeration | `bottom` | `bottom` Bottom; `top` Top | Visible when `play.controls` = `true` |
| `play.ticks` | Tick marks | Graduations | dropdown | enumeration | `auto` | `auto` Automatic; `all` Every frame; `none` None | Visible when `play.controls` = `true` |
| `play.tickLabels` | Tick labels | Étiquettes des graduations | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |
| `play.stepButtons` | Start and end buttons | Boutons début et fin | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |
| `play.speedButton` | Speed button | Bouton de vitesse | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |
| `play.showLabel` | Current value in large type | Valeur en cours en grand | toggle | bool | `true` | true / false |  |
| `play.labelSize` | Large value size | Taille de la valeur en grand | number | formatting | `44` | 12 to 160 | Visible when `play.showLabel` = `true` |
| `play.labelPosition` | Large value position | Position de la valeur en grand | dropdown | enumeration | `bottomRight` | `bottomRight` Bottom right; `topRight` Top right; `topLeft` Top left; `bottomLeft` Bottom left; `center` Center | Visible when `play.showLabel` = `true` |

### 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.hoverFlows` | Hovering an arc: ribbons shown | Survol d'un arc : rubans montrés | dropdown | enumeration | `both` | `both` Sent and received; `out` Sent only; `in` Received only |  |

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

- `labels`: `labels.show` (bool), `labels.placement` (enumeration), `labels.content` (enumeration), `labels.fontSize` (formatting), `labels.color` (fill), `labels.maxWidth` (integer), `labels.halo` (bool), `labels.units` (enumeration), `labels.decimals` (integer), `labels.prefix` (text), `labels.suffix` (text).
