Aller au contenu
Plume Visuals
← Retour
Gamme de base

KPI Plume

Des cartes KPI qui se retournent : valeur, comparaison, objectif, tendance, icône, et au dos la définition et les chiffres de votre choix.

Tutoriels ↓
Installer depuis Microsoft MarketplacePage officielle du visuel chez Microsoft · installation gratuite

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

KPI Plume affiche une carte par mesure, ou une carte par région, produit ou équipe avec une carte « Total ». Chaque carte réunit la valeur (exacte sur la période, même pour un taux), l'écart à la période précédente ou à N-1, la progression vers l'objectif (un champ ou un objectif saisi pour la carte), une courbe de tendance et une icône choisie parmi 134. Au survol, au clic ou sur l'icône ↻, la carte se retourne : une définition ou un texte avec variables, et les chiffres choisis KPI par KPI, y compris des mesures qui ne s'affichent qu'au dos. Les cartes tiennent toujours dans le visuel, sans barre de défilement. En premium : deuxième comparaison (budget et N-1), état vert / orange / rouge selon l'objectif et la comparaison, formes cercle, feuille et ticket, anneau d'objectif, premier KPI en grand et animations porte, rideau ou cube.

Cas d'usage

  • Bandeau de KPI en haut d'un tableau de bord
  • Un KPI par région, avec une carte « Total »
  • La définition de chaque indicateur au dos de sa carte
  • Suivi d'objectifs mensuels : vert, orange ou rouge selon des seuils

GratuitInclus gratuitement

  • Une carte par mesure ou par catégorie, carte « Total », grille automatique sans barre de défilement
  • Valeur exacte sur la période, unités automatiques (valeur entière quand elle tient, sinon 1,5 M €), compteur animé, KPI vides masqués
  • Comparaison au champ, à la période précédente ou à la première : %, valeur, flèches ▲▼, zone neutre
  • Objectif par carte (champ ou valeur saisie), barre de progression, état selon des seuils
  • 134 icônes Lucide par thème, ou une icône donnée par une mesure ; lien ↗ par carte
  • Retournement au survol, au clic ou sur ↻ ; dos au choix KPI par KPI : texte, définition, mesures du dos
  • Clic sur une carte par catégorie : filtre croisé ; clavier, lecteurs d'écran, contraste élevé
  • Titre et note de chaque KPI par une mesure texte, libellés de référence, comme la carte native
  • Distance à l'objectif, date de la dernière période, barre d'accent à droite ou de la couleur choisie
  • Formats dynamiques : n'importe quel réglage du volet Format piloté par une mesure DAX
  • Styles Minimal et Noir et blanc, couleurs personnalisées

PremiumFonctions premium

  • Deuxième comparaison (budget et N-1 sur la même carte)
  • État « objectif et comparaison » : vert, orange, rouge
  • Formes cercle, feuille, coins coupés, ticket ; objectif en anneau ou en puce
  • Tendance en colonnes ou en escalier ; premier KPI en grand, à gauche ou en haut
  • Animations volet, porte, rideau, zoom, cube ; mouvement « rebond »
  • 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ébutant13 min de lectureKPI Plume : des cartes KPI qui se retournent pour expliquer le chiffrePrise en main de KPI Plume dans Power BI : préparez vos mesures, créez un bandeau de cartes avec écart, objectif et tendance, puis rédigez le dos qui s'affiche au clic.
  2. Cas pratiquesIntermédiaire13 min de lectureKPI Plume : 11 cas pratiques (N-1, budget, objectifs, icônes, dos)Pas à pas : comparer à N-1 et au budget, un objectif par carte, des cartes vertes, orange ou rouges, choisir les icônes et le dos de chaque KPI, ajouter un lien…
  3. Champs et réglagesIntermédiaire40 min de lectureKPI Plume : tous les champs et réglages expliquésChaque zone de champ et chaque réglage du volet Format de KPI Plume : à quoi il sert, ses valeurs possibles et sa valeur par défaut.
  4. Bases communesBien démarrer avec les visuels PlumeInstallation, licence, styles et réglages communs à tous les visuels.

Champs à glisser dans le visuel

ChampContenu
Valeurs (un KPI par mesure)Chaque mesure est une carteObligatoire
Comparaison (année précédente…)N-1, période précédente… (même rang que la valeur, ou n° choisi par KPI)Facultatif
Comparaison 2 (budget…)Budget… : deuxième écart sous le premierFacultatifPremium
ObjectifBarre de progression (même rang, n° choisi, ou objectif saisi par KPI)Facultatif
Axe de tendance (date)Mois, semaine, année : dessine la tendanceFacultatif
Un KPI par… (catégorie)Répète les KPI pour chaque région, produit…Facultatif
Dos de la carte (texte)Mesure texte au dos : définition, commentaireFacultatif
Dos de la carte : chiffresMesures montrées seulement au dos, choisies par KPIFacultatif
Icône (mesure texte)Nom d'icône, emoji ou image SVG intégréeFacultatif
Titre (mesure texte)Titre de chaque KPI calculé en DAX, apparié par rangFacultatif
Note (mesure texte)Note de chaque KPI calculée en DAX, appariée par rangFacultatif
Libellés de référenceMesures écrites sous la valeur ou en bas de la carte, comme la carte nativeFacultatif
Libellés de référence : détailsDétail affiché à côté de chaque libellé de référenceFacultatif
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 KPI 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.4.0.0. Vous pouvez la copier dans votre assistant pour qu'il vous guide.

Version Markdown brute (/ai/visuals/kpi-card.md)
# KPI Plume: technical reference for AI assistants

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

Use it to help someone build a report with KPI 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/kpi-card (French: https://plumevisuals.com/fr/visuels/kpi-card)
- Summary: KPI cards that flip: value, comparison, target, trend, icon, and on the back the definition and the figures you choose.
- Power BI visual GUID (`visualType`): `plumeKpiCardC478BD14F72F4580AC1F80652CEB51D7`
- 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

KPI Plume (formerly Plume KPI) is a Power BI custom visual (base range, version 1.4.0.0, installed from the `.pbiviz` file; AppSource submission in progress) that draws KPI cards: one card per measure, or, with a category field, one card per region / product / team (optionally plus a "Total" card). Cards always fit in the visual with no scroll bar (`layout.overflow` = `fit`, default; `scroll` keeps the minimum sizes and scrolls). Each card shows a title, an icon (134 built-in Lucide icons in 11 themes, chosen per KPI in `kpiFormat.icon` or picked automatically from the measure name: revenue → €, orders → cart, rate → %, customers → people…; or given by a text measure in the Icon field), an optional ↗ link button (`kpiFormat.link`), the value with automatic units per number (1.5M, 171K, 451), a comparison (change in % or value, ▲▼ arrows, badge, "vs …" label, neutral zone, good / bad / neutral colors), a target (a field, or a value typed per KPI in `kpiFormat.targetValue`; progress bar or text; ring and bullet ★), an optional second comparison ★ (Comparison 2 field) and a trend sparkline (line, area, smooth area; columns and step ★) placed at the bottom, in the background or on the right. The signature feature: cards **flip** (on hover, on click, or on the ↻ icon) to show their back: an information text with **bold**, line breaks and placeholders, plus key figures chosen KPI by KPI in the dynamic card "Back of the card: content per KPI" (`backItems`: comparison, change, comparison 2, target, achievement, period, last period, min, max, average, tooltip fields, and up to 8 measures of the "Back of the card: figures" field shown only on the back). At rest a card is drawn flat (no 3D transform) so its text stays sharp; 3D is only used during the flip. Trend-axis dates sent by Power BI Desktop as ISO text are read as dates ("Dec 2025 vs Nov 2025"; `sparkline.dateFormat` overrides the period format). The visual makes no network request.

**New in version 1.4.0.0 (30/10/2026):** Format pane reorganized (`compare` → `comparison`, `trend` → `sparkline`); free native-parity additions: **Title** and **Note** text-measure fields per KPI, **Reference labels** fields and card, accent bar on the right with its own color, KPI title position and italics, distance to target, date of the last period.

## Free vs premium (★)

- Every feature works without a key and nothing is ever blocked. Free features never show a watermark.
- Shared Style card (the same in every Plume visual): the styles `none`, `minimal` and `blackWhite`, the two Plume gradient palettes (`crest`, `crestDiverging`), "Follow report theme" and all custom colors (`style.customColors` and the colors under it) are **free**; every other `style.preset`, the other gradient palettes (`style.palette`) and `style.themeJson` ("Theme JSON ★") are **premium** (watermark without a key). See "Styles and theme JSON" below.
- Using a premium feature without a valid key shows **"Plume Visuals · Premium preview"** (French: « Plume Visuals · Aperçu premium ») in the footer of the visual, with an "Unlock →" link to the pricing page. It disappears once a key is pasted in **Format › Plume Studio License › License key** (`license.key`; French: « Licence Plume Studio › Clé de licence »), the **first card** of the Format pane.
- Premium features of KPI Plume:
  - `card.shape` = `circle`, `leaf`, `chamfer` ("Cut corners ★") or `ticket`;
  - `layout.arrange` = `heroLeft` / `heroTop` ("First one large, on the left / on top ★", size in `layout.heroSize`);
  - `target.style` = `ring` or `bullet`: counts only when a Target field is present and `target.show` is on;
  - `sparkline.type` = `columns` or `step`: counts only with a Trend axis field and `sparkline.show` on;
  - `flip.animation` = `slide`, `door`, `curtain`, `zoom`, `cube`, and `flip.easing` = `bounce`: count only when `flip.trigger` is not `none`;
  - the **Comparison 2** field (`reference2`): counts when it is filled and `comparison.show` and `comparison.show2` are on;
  - `comparison.statusFrom` = `both` ("Target and comparison (green, amber, red) ★").
- Free in 1.3: per-KPI icons, the Icon field, fixed target and field numbers per KPI, the back content per KPI and the "Back of the card: figures" field, the link per card, `layout.hideBlank`, `layout.overflow`, `comparison.statusFrom` = `compare` / `compare2` / `target` (thresholds with `comparison.warnFrom`, amber `comparison.warnColor`).
- 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 `kpi-card` 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), for this visual: 39 € personal, 99 € SME, 299 € enterprise per year, or the catalog packs (199 € / 399 € / 1,199 € per year; tiers by number of users, designers and viewers included: personal 1–10, SME 11–200, enterprise more than 200). Version 1.3.2.0, available on plumevisuals.com (`.pbiviz` file); AppSource submission in progress.

## Expected data shape

A **matrix** data view: trend periods on rows, category members on columns, measures in cells, plus the grand total that Power BI computes (hidden `subTotals` object, kept on).

- **Values (one KPI per measure)** (`values`, « Valeurs (un KPI par mesure) », measures, required): one card per measure.
- **Comparison (previous year…)** (`reference`, « Comparaison (année précédente…) », measures): compared with the value **of the same rank** (1st with 1st…), or the field number set per KPI in `kpiFormat.refField` (0 = same rank, -1 = none).
- **Comparison 2 (budget…)** ★ (`reference2`, « Comparaison 2 (budget…) », measures, same rank): second change under the first one (label `kpiFormat.refLabel2`).
- **Target** (`target`, « Objectif », measures): target of the KPI of the same rank, or the field number set in `kpiFormat.targetField`; `kpiFormat.targetValue` (non-zero) types a fixed target for one KPI instead.
- **Trend axis (date)** (`trend`, « Axe de tendance (date) », one column): month, week, year… draws the sparkline (data window of 2,000 periods).
- **One KPI per… (category)** (`category`, « Un KPI par… (catégorie) », one column): repeats the KPIs for each member.
- **Back of the card (text)** (`backText`, « Dos de la carte (texte) », measures): text measure shown on the back of the KPI of the same rank (a definition, a comment).
- **Back of the card: figures** (`backFields`, « Dos de la carte : chiffres », up to 8 measures): label + value rows shown only on the back, with the measure's own format; switched on or off per KPI with `backItems.f1` … `backItems.f8`.
- **Icon (text measure)** (`icon`, « Icône (mesure texte) », measures, same rank): an icon key (`trendUp`) or Lucide name (`trending-up`), an emoji or short symbol, or an inline image `data:image/svg+xml…` (also png, jpeg, gif, webp). Web addresses are never loaded.
- **Tooltips** (`tooltips`, « Infobulles », measures) and **Dynamic format** (`format`, « Format dynamique », measures named `card.setting`).

| Month (`trend`) | Revenue (`values`) | Target (`target`) |
|---|---|---|
| 2025-10-01 | 118 400 | 110 000 |
| 2025-11-01 | 151 900 | 110 000 |
| Total | 1 512 000 | 1 320 000 |

- With a trend axis, `value.aggregate` = `total` (default) shows the **total row computed by Power BI** (exact for rates and averages); if no total is available it falls back to the last period. Other values: `last`, `first`, `avg`, `max`, `min` of the periods.
- `comparison.source` = `auto` uses the Comparison field when filled, otherwise the previous period of the trend axis. With `previous` / `first`, the change compares the **last period** with the previous / first one (label like "Dec 2025 vs Nov 2025"), even when the displayed value is the total.
- Status (`comparison.statusFrom`): `auto` (default) = good / bad from the sign of the change (`kpiFormat.lowerIsBetter` reverses it, `comparison.neutral` = neutral band in %), without a comparison from the target being reached; `compare` / `compare2` = from one change; `target` = good from 100 %, warning (amber) from `comparison.warnFrom` % (default 90), bad below; `both` ★ = good when the target is reached, warning when only a comparison is favorable, bad otherwise. Each change badge keeps the color of its own direction.

## DAX recipes

```dax
Revenue = SUM ( Sales[Amount] )
Orders = COUNTROWS ( Sales )
Average basket = DIVIDE ( [Revenue], [Orders] )
Margin rate = DIVIDE ( SUM ( Sales[Margin] ), [Revenue] )
Target = 110000 * DISTINCTCOUNT ( Sales[Month] )

// Comparison field: needs a marked date table; take the trend axis from that table too
Revenue LY = CALCULATE ( [Revenue], SAMEPERIODLASTYEAR ( 'Calendar'[Date] ) )

// Back of the card (text)
Revenue back = "Top region: " & MAXX ( TOPN ( 1, VALUES ( Sales[Region] ), [Revenue] ), Sales[Region] )
```

Back text placeholders (`kpiFormat.backText`): `{name}`, `{value}`, `{ref}`, `{delta}`, `{deltaPct}`, `{ref2}`, `{delta2}`, `{deltaPct2}`, `{target}`, `{progress}`, `{min}`, `{max}`, `{avg}` are formatted values; `{first}`, `{last}`, `{period}` are period labels. `**…**` = bold; a line break or a literal `\n` = new paragraph. `kpiFormat.note` (note under the value) accepts `{value}`, `{ref}`, `{delta}`, `{target}`, `{progress}`, `{period}`. Back text priority: the text set for that measure, then the Back of the card measure, then the "All KPIs" text. `backItems.textAfter` puts it after the figures; `back.figLayout` (`auto` / `columns` / `stacked`) and `back.fit` (shrink to 75 % before scrolling, no visible scroll bar) keep the back readable.

## Interactions with the report

- With One KPI per…, clicking a card cross-filters the report (`interaction.select`), other cards are dimmed (`interaction.dim`), clicking the background clears. When `flip.trigger` = `click`, a click flips and **Ctrl + click** filters.
- Power BI tooltips on cards (value, comparison, change, target, tooltip fields) when `tooltip.show` is on and `flip.trigger` is not `hover`; per-period tooltip on the sparkline (`tooltip.periodTip`). Context menu on each card.
- Keyboard: Tab to reach the cards, ← → to move, Enter or Space flips, Esc flips back. The back is announced to screen readers. Reduced motion makes flips and the counter instant. High contrast uses host colors. Never flips on a dashboard tile. `flip.preview` shows the back in edit mode to format it.

## Dynamic formats

- **No fx button**: Power BI does not offer conditional formatting of Format pane options to table / matrix visuals (Table Plume, Matrix Plume, KPI Plume). Everything goes through the **Dynamic format** well (role `format`).
- Rename each measure for this visual `card.setting`, e.g. `flip.trigger`, `layout.arrange`, `title.text`, `kpiFormat.backText`. Case, accents and the separator are ignored. It wins over the fixed setting, the style and the JSON theme.
- KPI Plume reads the **grand total** value. Examples: `"Data as of " & FORMAT ( MAX ( Sales[Month] ), "mmmm yyyy" )` renamed `kpiFormat.backText`; `IF ( ISFILTERED ( Sales[Region] ), "none", "click" )` renamed `flip.trigger`.
- For the dynamic card **Per-KPI settings**, only the "All KPIs" level is driven (`kpiFormat.color`, `kpiFormat.backText`…); a value set for one specific measure in the pane stays first.
- Driving a setting with DAX is free; a ★ value set by DAX still shows the watermark without a key.

## Format pane: how to read the tables below

- Each option has an ID `card.option` (for example `flip.trigger`). The card is the capabilities.json **object name**, the option is the **property name**. Note that the visual has a Format card named `card` ("Card"), so its options read `card.shape`, `card.colorBy`…
- Card order: `license` (always first), `style` (shared Style card), `kpiFormat` (dynamic card "Per-KPI settings": a list at the top, "Apply settings to", picks "All KPIs" or one measure), then `layout`, `card`, `kpiTitle`, `value`, `icon`, `comparison`, `target`, `trend`, `flip`, `back`, `backItems` (dynamic card "Back of the card: content per KPI", same "Apply settings to" list, only when `flip.trigger` is not `none`), `interaction`, then `title`, `source`, `container` and `texts`. Format pane in version 1.4.0.0 (30/10/2026), top to bottom: `license`, `style`, `kpiFormat`, `backItems`, `layout`, `card`, `kpiTitle`, `value`, `refLabels`, `icon`, `comparison`, `target`, `sparkline`, `flip`, `back`, `interaction`, `tooltip`, `title`, `source`, `container`, `texts`. Settings moved or renamed in this version keep working in older reports (the old names are still read).
- Labels follow the language of Power BI Desktop; `texts.language` can force French or English inside the visual.
- "Visible when" means the option only appears when another option has one of the listed values (most `flip` options only when `flip.trigger` is not `none`).

## Editing a PBIP report (visual.json)

`visualType` is the visual GUID, `queryState` keys are the data role names, `objects` keys are the option IDs. Literal syntax: booleans `true` / `false`, numbers suffixed with `D`, strings and enumeration values in single quotes (double an apostrophe inside), colors wrapped in `solid.color`. Per-KPI settings are entries of `kpiFormat` with a `selector` on the measure's `queryRef`.

```json
{
  "visualType": "plumeKpiCardC478BD14F72F4580AC1F80652CEB51D7",
  "query": {
    "queryState": {
      "values": { "projections": [
        { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Revenue" } }, "queryRef": "Sales.Revenue", "nativeQueryRef": "Revenue" },
        { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Margin rate" } }, "queryRef": "Sales.Margin rate", "nativeQueryRef": "Margin rate" } ] },
      "target": { "projections": [
        { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Target" } }, "queryRef": "Sales.Target", "nativeQueryRef": "Target" } ] },
      "trend": { "projections": [
        { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Month" } }, "queryRef": "Sales.Month", "nativeQueryRef": "Month" } ] }
    }
  },
  "objects": {
    "layout":  [ { "properties": { "arrange": { "expr": { "Literal": { "Value": "'row'" } } } } } ],
    "card":    [ { "properties": { "colorBy": { "expr": { "Literal": { "Value": "'status'" } } },
                                   "statusBar": { "expr": { "Literal": { "Value": "'left'" } } } } } ],
    "trend":   [ { "properties": { "type": { "expr": { "Literal": { "Value": "'line'" } } } } } ],
    "flip":    [ { "properties": { "trigger": { "expr": { "Literal": { "Value": "'hover'" } } },
                                   "animation": { "expr": { "Literal": { "Value": "'fade'" } } },
                                   "duration": { "expr": { "Literal": { "Value": "400D" } } } } } ],
    "kpiFormat": [
      { "properties": { "backText": { "expr": { "Literal": { "Value": "'**Revenue** for the period: {value}.\\nBest month: {max}.'" } } },
                        "color": { "solid": { "color": { "expr": { "Literal": { "Value": "'#b8462a'" } } } } } },
        "selector": { "metadata": "Sales.Revenue" } },
      { "properties": { "icon": { "expr": { "Literal": { "Value": "'percent'" } } },
                        "decimals": { "expr": { "Literal": { "Value": "1D" } } } },
        "selector": { "metadata": "Sales.Margin rate" } } ],
    "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). Do not turn off the hidden `subTotals` properties: the period total comes from them.

## Styles and theme JSON

- `style.preset` takes one of the 20 style IDs shared by every Plume visual: `none`, `minimal`, `blackWhite`, `press`, `vintage`, `earth`, `nordic`, `executive`, `accessible`, `pastel`, `bauhaus`, `climate`, `blueprint`, `unknownPleasures`, `dark`, `neon`, `terminal`, `infographic`, `cockpit`, `hologram`.
- `style.themeJson` (Format › Style › Theme JSON ★) takes a JSON theme as plain text. Format v2: an object with an optional `extends` (a style ID above) and optional groups `colors`, `palettes`, `typography`, `shape`, `table`, `marks`, `effects`; the v1 flat format (`style`, `palette`, `accent`, `background`…) is still read. Every field is optional. Colors are `#RRGGBB` (`#RGB` and `#RRGGBBAA` accepted, opacity ignored). Unknown fields and values outside the allowed lists are ignored, out-of-range numbers are clamped. Invalid JSON shows "Invalid theme JSON: ignored" in edit mode and the visual keeps its look.
- Full field list with allowed values, examples and troubleshooting: tutorial https://plumevisuals.com/ai/tutorials/en/themes-json.md (French: https://plumevisuals.com/ai/tutorials/fr/themes-json.md). The same JSON can be pasted in every Plume visual of a page.
- Priority (the last one wins): visual defaults → `style.preset` → `style.themeJson` → `style.palette` (if not "Style or theme palette") → `style.followTheme` → custom colors → options set by hand in the other cards → DAX formats (fx button, "Dynamic format" field) → Windows high contrast.

## Common pitfalls

- Target or comparison on the wrong card: pairing is by rank; keep the same order in Values, Comparison, Target and Back of the card, or set `kpiFormat.targetField` / `kpiFormat.refField` for that KPI, or type a fixed target (`kpiFormat.targetValue`).
- The change does not match the displayed value: with `comparison.source` = `auto` and no Comparison field, it compares the last two periods of the trend axis. Add a last-year measure.
- `Revenue LY` blank or wrong: time intelligence on a date table, but the trend axis comes from the fact table; take both from the date table.
- A click flips instead of filtering: `flip.trigger` = `click`; use Ctrl + click, or `hover` / `icon` (with `hover`, cards show no Power BI tooltip: the back replaces it).
- Watermark visible: a ★ shape, layout, target style, trend type, animation or easing, a filled Comparison 2 field, the "Target and comparison" status, or a ★ style / palette / Theme JSON, without a valid key.
- Choosing the icon of one card: Per-KPI settings, pick the measure in "Apply settings to", then Icon (the list reads "Theme · Icon").

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

An fx button on any option, a needle gauge or speedometer, more than one target per KPI, a third comparison, a forecast on the sparkline, icons or images loaded from a web address (only built-in icons, symbols / emoji, or `data:image/…` from the Icon field), page navigation or drillthrough on click (only the context menu and the ↗ link), drill-down on the trend, a play / animation over time, write-back of targets, dynamic Top N of categories, highlighting from other visuals.

## 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 |
|---|---|---|---|---|---|
| `values` | Values (one KPI per measure) | Valeurs (un KPI par mesure) | measure | several | Each measure is one KPI card. |
| `reference` | Comparison (previous year…) | Comparaison (année précédente…) | measure | several | Compared with the value of the same rank (1st with 1st…). |
| `reference2` | Comparison 2 (budget…) | Comparaison 2 (budget…) | measure | several | Second comparison of the KPI of the same rank, shown under the first one. |
| `target` | Target | Objectif | measure | several | Goal of the KPI of the same rank: progress bar or ring. |
| `trend` | Trend axis (date) | Axe de tendance (date) | column | 1 | Draws the sparkline (month, week, year…). |
| `category` | One KPI per… (category) | Un KPI par… (catégorie) | column | 1 | Repeats the KPIs for each value of the field (region, product…). |
| `backText` | Back of the card (text) | Dos de la carte (texte) | measure | several | Text measure shown on the back of the KPI of the same rank (a definition, a comment…). |
| `backFields` | Back of the card: figures | Dos de la carte : chiffres | measure | several | Measures shown only on the back (label and value). Choose them per KPI in “Back of the card: content per KPI”. |
| `icon` | Icon (text measure) | Icône (mesure texte) | measure | several | Icon name (trending-up, euro…), emoji or SVG image (data:image/svg+xml…) for the KPI of the same rank, for instance per category. |
| `titles` | Title (text measure) | Titre (mesure texte) | measure | several | Title of the KPI of the same rank, computed by DAX (for instance “Sales” & the selected year). Replaces Per-KPI settings › Title. |
| `notes` | Note (text measure) | Note (mesure texte) | measure | several | Note under the value of the KPI of the same rank, computed by DAX. Placeholders such as {delta} are filled. |
| `refLabels` | Reference labels | Libellés de référence | measure | several | Measures shown under the value (label and value), like the reference labels of the native card. |
| `refDetails` | Reference labels: details | Libellés de référence : détails | measure | several | Detail written under the reference label of the same rank (text or number). |
| `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: matrix (like the native matrix visual, subtotals computed by Power BI), rows = `trend`, columns = `category`, 2,000 rows per data window (more fetched automatically); values = `values`, `reference`, `reference2`, `target`, `backText`, `backFields`, `icon`, `titles`, `notes`, `refLabels`, `refDetails`, `tooltips`, `format`.
Capabilities: supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).

## Format pane options (228)

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

### Per-KPI settings / Réglages par KPI (`kpiFormat`, 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.kpiFormat` 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 |
|---|---|---|---|---|---|---|---|
| `kpiFormat.title` | Title (empty = measure name) | Titre (vide = nom de la mesure) | text | text | (empty) |  |  |
| `kpiFormat.note` | Note under the value | Note sous la valeur | text | text | (empty) |  | Short text such as “Year to date”. Placeholders: {value}, {ref}, {delta}, {target}, {progress}, {period}. |
| `kpiFormat.icon` | Icon | Icône | dropdown | enumeration | `auto` | `auto` Automatic (from the name); `none` None; `euro` Finance · Euro; `dollar` Finance · Dollar; `pound` Finance · Pound sterling; `coins` Finance · Coins; `banknote` Finance · Banknote; `wallet` Finance · Wallet; `piggyBank` Finance · Piggy bank (savings); `creditCard` Finance · Credit card; `receipt` Finance · Receipt; `landmark` Finance · Bank; `handCoins` Finance · Payment; `calculator` Finance · Calculator; `percent` Finance · Percent; `badgePercent` Finance · Discount; `cart` Sales · Cart; `bag` Sales · Shopping bag; `store` Sales · Store; `tag` Sales · Tag (price); `ticket` Sales · Ticket; `handshake` Sales · Handshake (deals); `briefcase` Sales · Briefcase; `gift` Sales · Gift; `megaphone` Sales · Megaphone (marketing); `users` People · People; `user` People · Person; `userPlus` People · New customer; `userCheck` People · Verified customer; `userMinus` People · Lost customer; `contact` People · Contact; `baby` People · Baby; `smile` People · Smile (satisfaction); `frown` People · Frown; `thumbsUp` People · Thumbs up; `messages` People · Messages; `target` Performance · Target; `trendUp` Performance · Rise; `trendDown` Performance · Fall; `bars` Performance · Column chart; `barsH` Performance · Bar chart; `line` Performance · Line chart; `pie` Performance · Pie chart; `gauge` Performance · Gauge; `activity` Performance · Activity; `award` Performance · Award; `trophy` Performance · Trophy; `medal` Performance · Medal; `flag` Performance · Flag (milestone); `rocket` Performance · Rocket (launch); `star` Performance · Star; `zapFast` Performance · Speedometer; `layers` Performance · Layers; `sigma` Performance · Sum; `clock` Time · Clock; `timer` Time · Timer; `hourglass` Time · Hourglass; `calendar` Time · Calendar; `calendarCheck` Time · Calendar check; `calendarDays` Time · Days; `history` Time · History; `truck` Operations · Truck (delivery); `box` Operations · Box (stock); `packageCheck` Operations · Package delivered; `boxes` Operations · Boxes; `warehouse` Operations · Warehouse; `factory` Operations · Factory; `wrench` Operations · Wrench (maintenance); `settings` Operations · Settings; `hardHat` Operations · Hard hat; `forklift` Operations · Forklift; `ship` Operations · Ship; `plane` Operations · Plane; `car` Operations · Car; `route` Operations · Route; `fuel` Operations · Fuel; `clipboard` Operations · Checklist; `check` Status · Check; `checkPlain` Status · Tick; `circleX` Status · Rejected; `alert` Status · Alert; `alertCircle` Status · Warning; `info` Status · Information; `shield` Status · Shield; `shieldCheck` Status · Security; `lock` Status · Lock; `bell` Status · Bell; `bug` Status · Bug; `eye` Status · Eye (views); `leaf` Energy and environment · Leaf; `sprout` Energy and environment · Sprout; `recycle` Energy and environment · Recycle; `bolt` Energy and environment · Bolt (energy); `battery` Energy and environment · Battery; `plug` Energy and environment · Plug; `sun` Energy and environment · Sun; `cloud` Energy and environment · Cloud; `cloudRain` Energy and environment · Rain; `wind` Energy and environment · Wind; `flame` Energy and environment · Flame; `drop` Energy and environment · Drop (water); `waves` Energy and environment · Waves; `thermometer` Energy and environment · Thermometer; `trees` Energy and environment · Trees; `globe` Energy and environment · Globe; `heart` Health and education · Heart; `heartPulse` Health and education · Heart pulse; `stethoscope` Health and education · Stethoscope; `pill` Health and education · Pill; `hospital` Health and education · Hospital; `graduation` Health and education · Graduation; `book` Health and education · Book; `school` Health and education · School; `dumbbell` Health and education · Dumbbell (sport); `utensils` Health and education · Utensils (meals); `coffee` Health and education · Coffee; `phone` Digital · Phone; `mail` Digital · Mail; `message` Digital · Message; `click` Digital · Click; `monitor` Digital · Monitor; `smartphone` Digital · Smartphone; `server` Digital · Server; `database` Digital · Database; `wifi` Digital · Wi-Fi; `download` Digital · Download; `upload` Digital · Upload; `share` Digital · Share; `search` Digital · Search; `link` Digital · Link; `fileText` Digital · Document; `home` Places · House; `building` Places · Building; `mapPin` Places · Location; `map` Places · Map; `hotel` Places · Hotel | Choose “All KPIs” or one measure in “Apply settings to” above, then its icon (134 Lucide icons, by theme). |
| `kpiFormat.symbol` | Or symbol / emoji (replaces the icon) | Ou symbole / emoji (remplace l'icône) | text | text | (empty) |  |  |
| `kpiFormat.color` | KPI color (empty = “Card” card) | Couleur du KPI (vide = carte « Carte ») | color | fill | (empty) | hex color |  |
| `kpiFormat.units` | Display units | Unités d'affichage | dropdown | enumeration | `fit` | `fit` Automatic (full value when it fits); `auto` Abbreviated (K, M, bn); `none` None; `k` Thousands; `m` Millions; `b` Billions | Automatic: the full value with the format of the measure when it fits in the card, otherwise abbreviated (1.5M). |
| `kpiFormat.decimals` | Decimals (-1 = automatic) | Décimales (-1 = automatique) | number | integer | `-1` | -1 to 6 |  |
| `kpiFormat.prefix` | Prefix | Préfixe | text | text | (empty) |  |  |
| `kpiFormat.suffix` | Suffix | Suffixe | text | text | (empty) |  |  |
| `kpiFormat.lowerIsBetter` | Lower is better | Plus bas = mieux | toggle | bool | `false` | true / false | A decrease is shown in the “good” color (costs, delays, incidents…). |
| `kpiFormat.refLabel` | Comparison label | Libellé de la comparaison | text | text | (empty) |  | Empty: “vs” + name of the comparison measure (or of the previous period). |
| `kpiFormat.refLabel2` | Comparison 2 label | Libellé de la comparaison 2 | text | text | (empty) |  | Second comparison (“Comparison 2” field). Empty: “vs” + name of the measure. |
| `kpiFormat.targetValue` | Fixed target (0 = “Target” field) | Objectif fixe (0 = champ « Objectif ») | number | numeric | `0` |  | A target typed here for this KPI, without a measure. It replaces the “Target” field. |
| `kpiFormat.targetField` | “Target” field number (0 = same rank, -1 = none) | N° du champ « Objectif » (0 = même rang, -1 = aucun) | number | integer | `0` | -1 to 30 | By default the 1st target goes with the 1st value, the 2nd with the 2nd… Type 2 to use the 2nd measure of “Target” for this KPI. |
| `kpiFormat.refField` | “Comparison” field number (0 = same rank, -1 = none) | N° du champ « Comparaison » (0 = même rang, -1 = aucun) | number | integer | `0` | -1 to 30 |  |
| `kpiFormat.link` | Link (web address) | Lien (adresse web) | text | text | (empty) |  | Adds a ↗ button to the card that opens this address (https:// or mailto: only; Power BI opens secure links only). Power BI asks for confirmation. |
| `kpiFormat.backText` | Back of the card text | Texte du dos de la carte | textarea | text | (empty) |  | Shown when the card flips (a definition, for instance). **bold**, line breaks and placeholders: {name}, {value}, {ref}, {delta}, {deltaPct}, {ref2}, {delta2}, {deltaPct2}, {target}, {progress}, {min}, {max}, {avg}, {first}, {last}, {period}. |

### Back of the card: content per KPI / Dos de la carte : contenu par KPI (`backItems`, 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.backItems` 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 |
|---|---|---|---|---|---|---|---|
| `backItems.text` | Text (Per-KPI settings or “Back of the card” field) | Texte (Réglages par KPI ou champ « Dos de la carte ») | toggle | bool | `true` | true / false |  |
| `backItems.textAfter` | Text after the figures | Texte après les chiffres | toggle | bool | `false` | true / false |  |
| `backItems.ref` | Comparison value | Valeur de comparaison | toggle | bool | `true` | true / false |  |
| `backItems.delta` | Change | Écart | toggle | bool | `true` | true / false |  |
| `backItems.ref2` | Comparison 2 and change | Comparaison 2 et écart | toggle | bool | `true` | true / false |  |
| `backItems.target` | Target | Objectif | toggle | bool | `true` | true / false |  |
| `backItems.progress` | Target achievement | Atteinte de l'objectif | toggle | bool | `true` | true / false |  |
| `backItems.period` | Period | Période | toggle | bool | `true` | true / false |  |
| `backItems.last` | Last period | Dernière période | toggle | bool | `true` | true / false |  |
| `backItems.min` | Minimum | Minimum | toggle | bool | `true` | true / false |  |
| `backItems.max` | Maximum | Maximum | toggle | bool | `true` | true / false |  |
| `backItems.avg` | Average | Moyenne | toggle | bool | `true` | true / false |  |
| `backItems.tooltips` | “Tooltips” fields | Champs « Infobulles » | toggle | bool | `true` | true / false |  |
| `backItems.f1` | Back figure 1 | Chiffre 1 du dos | toggle | bool | `true` | true / false |  |
| `backItems.f2` | Back figure 2 | Chiffre 2 du dos | toggle | bool | `true` | true / false |  |
| `backItems.f3` | Back figure 3 | Chiffre 3 du dos | toggle | bool | `true` | true / false |  |
| `backItems.f4` | Back figure 4 | Chiffre 4 du dos | toggle | bool | `true` | true / false |  |
| `backItems.f5` | Back figure 5 | Chiffre 5 du dos | toggle | bool | `true` | true / false |  |
| `backItems.f6` | Back figure 6 | Chiffre 6 du dos | toggle | bool | `true` | true / false |  |
| `backItems.f7` | Back figure 7 | Chiffre 7 du dos | toggle | bool | `true` | true / false |  |
| `backItems.f8` | Back figure 8 | Chiffre 8 du dos | toggle | bool | `true` | true / false |  |

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `layout.arrange` | Arrangement | Agencement | dropdown | enumeration | `auto` | `auto` Automatic grid; `row` One row; `column` One column; `grid` Grid (number of columns); `heroLeft` First one large, on the left ★; `heroTop` First one large, on top ★ | Automatic: the number of columns that gives the best card proportions. |
| `layout.columns` | Number of columns | Nombre de colonnes | number | integer | `3` | 1 to 12 | Visible when `layout.arrange` = `grid` |
| `layout.heroSize` | First KPI size (%) | Taille du premier KPI (%) | number | integer | `45` | 20 to 80 | Visible when `layout.arrange` = `heroLeft` or `heroTop` |
| `layout.gap` | Gap between cards | Espace entre les cartes | number | integer | `12` | 0 to 60 |  |
| `layout.overflow` | When the cards do not fit | Quand les cartes ne tiennent pas | dropdown | enumeration | `fit` | `fit` Shrink them (never a scroll bar); `scroll` Keep the minimum sizes and scroll | Shrink: every card stays visible, the minimum sizes only choose the number of columns. |
| `layout.minWidth` | Minimum card width (px) | Largeur minimale d'une carte (px) | number | integer | `150` | 60 to 800 | Below this size, the cards wrap (and scroll if “Keep the minimum sizes” is chosen). |
| `layout.minHeight` | Minimum card height (px) | Hauteur minimale d'une carte (px) | number | integer | `96` | 40 to 600 |  |
| `layout.lastRow` | Incomplete last row | Dernière ligne incomplète | dropdown | enumeration | `left` | `left` Aligned left; `center` Centered; `stretch` Stretched |  |
| `layout.order` | KPI order | Ordre des KPI | dropdown | enumeration | `data` | `data` Field order; `valueDesc` Value, descending; `valueAsc` Value, ascending; `deltaDesc` Best change first; `nameAsc` Name A → Z |  |
| `layout.hideBlank` | Hide blank KPIs | Masquer les KPI vides | toggle | bool | `false` | true / false | A card whose value is blank is not drawn (for instance a region without sales). |
| `layout.totalCard` | “Total” card (with “One KPI per…”) | Carte « Total » (avec « Un KPI par… ») | toggle | bool | `false` | true / false | Adds a card with the total over all categories, first. |
| `layout.totalLabel` | Total label | Libellé du total | text | text | (empty) |  | Visible when `layout.totalCard` = `true` |

### Card / Carte (`card`, Format pane)

**Shape / Forme**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `card.shape` | Shape | Forme | dropdown | enumeration | `rounded` | `rect` Rectangle; `rounded` Rounded corners (Frame › Rounded corners); `pill` Pill; `circle` Circle ★; `leaf` Leaf (two rounded corners) ★; `chamfer` Cut corners ★; `ticket` Ticket (notches) ★; `underline` Underlined (no fill); `none` None (text only) |  |
| `card.fill` | Fill (empty = automatic) | Fond (vide = automatique) | color | fill | (empty) | hex color | Automatic: the style background, slightly raised on dark backgrounds. |
| `card.fillOpacity` | Fill opacity (%) | Opacité du fond (%) | number | integer | `100` | 0 to 100 |  |
| `card.tint` | KPI color tint in the fill (%) | Teinte de la couleur du KPI dans le fond (%) | number | integer | `0` | 0 to 40 |  |
| `card.border` | Border | Bordure | toggle | bool | `true` | true / false |  |
| `card.borderColor` | Color (empty = lines) | Couleur (vide = traits) | color | fill | (empty) | hex color | Visible when `card.border` = `true` |
| `card.borderWidth` | Width | Épaisseur | number | numeric | `1` | 0.5 to 6 | Visible when `card.border` = `true` |
| `card.shadow` | Soft shadow | Ombre douce | toggle | bool | `false` | true / false |  |

**Colors and status / Couleurs et état**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `card.colorBy` | KPI color | Couleur des KPI | dropdown | enumeration | `accent` | `accent` Style accent (same for all); `palette` One color per KPI (palette); `status` By status (good / bad) | Used by the icon, the sparkline and the status bar. |
| `card.statusBar` | Accent bar (status) | Barre d'accent (état) | dropdown | enumeration | `none` | `none` None; `left` Left; `top` Top; `right` Right; `bottom` Bottom | Colored by the status of the card (good, warning, bad), otherwise the KPI color. |
| `card.statusWidth` | Accent bar width | Épaisseur de la barre d'accent | number | integer | `4` | 1 to 16 | Visible when `card.statusBar` = `left` or `top` or `right` or `bottom` |
| `card.accentColor` | Bar color (empty = status or KPI) | Couleur de la barre (vide = état ou KPI) | color | fill | (empty) | hex color | Visible when `card.statusBar` = `left` or `top` or `right` or `bottom` |

**Content / Contenu**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `card.layout` | Content layout | Disposition du contenu | dropdown | enumeration | `stack` | `stack` Stacked (title, value, details); `center` Centered; `split` Value left, trend right |  |
| `card.align` | Alignment | Alignement | dropdown | enumeration | `left` | `left` Left; `center` Center; `right` Right | Visible when `card.layout` = `stack` or `split` |
| `card.vAlign` | Vertical position | Position verticale | dropdown | enumeration | `top` | `top` Top; `middle` Middle; `bottom` Bottom |  |
| `card.padding` | Inner padding | Marge intérieure | number | integer | `14` | 0 to 48 |  |
| `card.hover` | Hover effect | Effet au survol | dropdown | enumeration | `lift` | `none` None; `lift` Lift; `outline` Accent outline; `glow` Glow |  |

### KPI titles / Titre des KPI (`kpiTitle`, Format pane)

The card header toggle is `kpiTitle.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `kpiTitle.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `kpiTitle.fontSize` | Size | Taille | number | formatting | `12` | 7 to 32 |  |
| `kpiTitle.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `kpiTitle.bold` | Bold | Gras | toggle | bool | `false` | true / false |  |
| `kpiTitle.italic` | Italic | Italique | toggle | bool | `false` | true / false |  |
| `kpiTitle.caps` | Small caps | Petites majuscules | toggle | bool | `false` | true / false |  |
| `kpiTitle.wrap` | Text wrap | Retour automatique à la ligne | toggle | bool | `true` | true / false | On a narrow card the title wraps (up to three lines) and gets slightly smaller before being cut. |
| `kpiTitle.position` | Position | Position | dropdown | enumeration | `above` | `above` Above the value; `below` Below the value | Below the value: like the category label of the native card. |

### Value / Valeur (`value`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `value.autoSize` | Automatic size | Taille automatique | toggle | bool | `true` | true / false | The value fills the room left in the card, up to the maximum size. |
| `value.fontSize` | Size (maximum if automatic) | Taille (maximale si automatique) | number | formatting | `36` | 10 to 160 |  |
| `value.weight` | Weight | Graisse | dropdown | enumeration | `600` | `400` Regular; `600` Semibold; `700` Bold |  |
| `value.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |
| `value.statusColor` | Color by status (good / bad) | Couleur selon l'état (bon / mauvais) | toggle | bool | `false` | true / false |  |
| `value.aggregate` | Displayed value (with a trend axis) | Valeur affichée (avec un axe de tendance) | dropdown | enumeration | `total` | `total` Period total (computed by the measure); `last` Last period; `first` First period; `avg` Average of the periods; `max` Maximum; `min` Minimum | Total: the measure evaluated over the whole filter context (exact for ratios and averages). |
| `value.countUp` | Animated counter | Compteur animé | toggle | bool | `true` | true / false | The value counts up when data changes (respects Style › Animations). |
| `value.blank` | Text when blank | Texte si vide | text | text | (empty) |  |  |

### Reference labels / Libellés de référence (`refLabels`, Format pane)

The card header toggle is `refLabels.show`.

**Content / Contenu**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `refLabels.show` | Show | Afficher | toggle | bool | `true` | true / false | Shown when measures are placed in “Reference labels” (label = measure name, value with its format; “Details” under it). |
| `refLabels.pairing` | KPIs concerned | KPI concernés | dropdown | enumeration | `all` | `all` Every label on each KPI; `rank` By rank (1st label with the 1st KPI…) |  |
| `refLabels.max` | Maximum per card | Nombre maximal par carte | number | integer | `3` | 1 to 8 |  |

**Layout / Disposition**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `refLabels.position` | Position | Position | dropdown | enumeration | `below` | `below` Below the value; `bottom` Bottom of the card |  |
| `refLabels.arrange` | Arrangement | Agencement | dropdown | enumeration | `row` | `row` Side by side; `column` Stacked |  |
| `refLabels.divider` | Divider | Séparateur | toggle | bool | `true` | true / false |  |
| `refLabels.background` | Background | Arrière-plan | toggle | bool | `false` | true / false |  |
| `refLabels.bgColor` | Background color (empty = KPI tint) | Couleur de l'arrière-plan (vide = teinte du KPI) | color | fill | (empty) | hex color | Visible when `refLabels.background` = `true` |

**Text / Texte**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `refLabels.titleSize` | Label size | Taille du libellé | number | formatting | `10` | 7 to 24 |  |
| `refLabels.titleColor` | Label color (empty = secondary text) | Couleur du libellé (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `refLabels.valueSize` | Value size | Taille de la valeur | number | formatting | `13` | 7 to 32 |  |
| `refLabels.valueColor` | Value color (empty = text) | Couleur de la valeur (vide = texte) | color | fill | (empty) | hex color |  |
| `refLabels.detailSize` | Details size | Taille des détails | number | formatting | `10` | 7 to 24 |  |

### Icon / Icône (`icon`, Format pane)

The card header toggle is `icon.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `icon.show` | Show | Afficher | toggle | bool | `true` | true / false | The icon of each KPI is chosen in Per-KPI settings › Icon, or by a text measure in the “Icon” field. |
| `icon.position` | Position | Position | dropdown | enumeration | `topRight` | `topRight` Top right; `topLeft` Before the title; `left` Left of the value; `above` Above (centered); `background` Watermark |  |
| `icon.style` | Icon background | Fond de l'icône | dropdown | enumeration | `circle` | `plain` None; `circle` Round badge; `square` Square badge; `ring` Ring; `solid` Solid badge |  |
| `icon.size` | Size | Taille | number | integer | `30` | 12 to 96 |  |
| `icon.color` | Color (empty = KPI color) | Couleur (vide = couleur du KPI) | color | fill | (empty) | hex color |  |

### Comparison / Comparaison (`comparison`, Format pane)

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 |  |
| `comparison.source` | Compare with | Comparer à | dropdown | enumeration | `auto` | `auto` Automatic; `reference` “Comparison” field; `previous` Previous period (trend axis); `first` First period (trend axis) | Automatic: the “Comparison” field if present, otherwise the previous period of the trend axis. |
| `comparison.mode` | Display | Afficher | dropdown | enumeration | `pct` | `pct` Change in %; `abs` Change in value; `both` Change in value and %; `ref` Comparison value |  |
| `comparison.arrow` | Arrow | Flèche | dropdown | enumeration | `triangle` | `triangle` ▲ ▼; `arrow` ↑ ↓; `chevron` ⌃ ⌄; `none` None |  |
| `comparison.badge` | As a badge | En pastille | toggle | bool | `true` | true / false |  |
| `comparison.showLabel` | Label (“vs …”) | Libellé (« vs … ») | toggle | bool | `true` | true / false |  |
| `comparison.fontSize` | Size | Taille | number | formatting | `12` | 7 to 30 |  |
| `comparison.neutral` | Neutral zone (± %) | Zone neutre (± %) | number | numeric | `0` | 0 to 50 | A change smaller than this percentage is shown in the neutral color. |
| `comparison.show2` | Comparison 2 (“Comparison 2” field) | Comparaison 2 (champ « Comparaison 2 ») | toggle | bool | `true` | true / false | A second change under the first one, for instance vs budget and vs last year. |
| `comparison.statusFrom` | Card status (good, warning, bad) | État de la carte (bon, alerte, mauvais) | dropdown | enumeration | `auto` | `auto` Automatic (comparison, otherwise target); `compare` Comparison; `compare2` Comparison 2; `target` Target (thresholds); `both` Target and comparison (green, amber, red) ★ | Colors the status bar, the value and the cards “by status”. Target and comparison: good when the target is reached, warning when only the comparison is favorable, bad otherwise. |
| `comparison.warnFrom` | Warning from (% of target) | Alerte à partir de (% de l'objectif) | number | integer | `90` | 0 to 100 | Visible when `comparison.statusFrom` = `target`. With “Target”: good from 100 %, warning from this percentage, bad below. 0 = no warning level. |
| `comparison.goodColor` | “Good” color | Couleur « bon » | color | fill | `#2E7D4F` | hex color |  |
| `comparison.warnColor` | “Warning” color | Couleur « alerte » | color | fill | `#C77C02` | hex color | Visible when `comparison.statusFrom` = `target` or `both` |
| `comparison.badColor` | “Bad” color | Couleur « mauvais » | color | fill | `#C0392B` | hex color |  |
| `comparison.neutralColor` | Neutral color (empty = secondary text) | Couleur neutre (vide = texte secondaire) | color | fill | (empty) | hex color |  |

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

The card header toggle is `target.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `target.show` | Show | Afficher | toggle | bool | `true` | true / false | Drawn when a field is placed in “Target”. |
| `target.style` | Shape | Forme | dropdown | enumeration | `bar` | `bar` Progress bar; `ring` Ring ★; `bullet` Bullet (bar and marker) ★; `text` Text only |  |
| `target.thickness` | Thickness | Épaisseur | number | integer | `6` | 2 to 24 |  |
| `target.showPct` | Percentage reached | Pourcentage atteint | toggle | bool | `true` | true / false |  |
| `target.label` | Label | Libellé | text | text | (empty) |  |  |
| `target.distance` | Distance to target | Distance à l'objectif | dropdown | enumeration | `none` | `none` Hidden; `pct` In %; `abs` As a value; `both` Value and % | Like the native KPI: “▲ +5.2% vs Target”, colored good / bad (“Lower is better” respected). |
| `target.color` | Color (empty = KPI color, “good” when reached) | Couleur (vide = couleur du KPI, « bon » si atteint) | color | fill | (empty) | hex color |  |
| `target.trackColor` | Track color (empty = grid) | Couleur du rail (vide = grille) | color | fill | (empty) | hex color |  |

### Sparkline / Courbe de tendance (`sparkline`, Format pane)

The card header toggle is `sparkline.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `sparkline.show` | Show | Afficher | toggle | bool | `true` | true / false | Drawn when a field is placed in “Trend axis”. |
| `sparkline.dateFormat` | Period format (empty = automatic) | Format des périodes (vide = automatique) | text | text | (empty) |  | Dates of the trend axis in the comparison label, the back and the tooltips. Automatic: month and year for monthly dates (Dec 2025), the year for yearly dates. Examples: mmm yy, dd/mm/yyyy. |
| `sparkline.type` | Type | Type | dropdown | enumeration | `area` | `line` Line; `area` Area; `smooth` Smooth area; `columns` Columns ★; `step` Step ★ |  |
| `sparkline.position` | Position | Position | dropdown | enumeration | `bottom` | `bottom` Bottom of the card; `background` Card background; `right` Right |  |
| `sparkline.height` | Height (% of the card) | Hauteur (% de la carte) | number | integer | `32` | 10 to 70 |  |
| `sparkline.color` | Color (empty = KPI color) | Couleur (vide = couleur du KPI) | color | fill | (empty) | hex color |  |
| `sparkline.width` | Line width | Épaisseur du trait | number | numeric | `1.5` | 0.5 to 5 |  |
| `sparkline.opacity` | Area opacity (%) | Opacité de l'aire (%) | number | integer | `22` | 0 to 100 |  |
| `sparkline.lastDot` | Dot on the last value | Point sur la dernière valeur | toggle | bool | `true` | true / false |  |
| `sparkline.minMax` | Minimum and maximum markers | Repères minimum et maximum | toggle | bool | `false` | true / false |  |
| `sparkline.refLine` | Target line | Ligne de l'objectif | toggle | bool | `false` | true / false | Horizontal line at the target value (per period: target ÷ number of periods when “Displayed value” is the total). |
| `sparkline.zero` | Start at zero | Partir de zéro | toggle | bool | `false` | true / false |  |
| `sparkline.showDate` | Date of the last period | Date de la dernière période | toggle | bool | `false` | true / false | Writes the last period of the trend axis under the value (like the “Date” option of the native KPI). |

### Flip / Retournement (`flip`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `flip.trigger` | Flip the card | Retourner la carte | dropdown | enumeration | `click` | `none` Never; `hover` On hover; `click` On click; `icon` On click on the ↻ icon | The back shows the information text (Per-KPI settings or “Back of the card” field) and key figures (card “Back of the card: content per KPI”). Keyboard: Enter. |
| `flip.animation` | Animation | Animation | dropdown | enumeration | `flipX` | `flipX` Horizontal flip; `flipY` Vertical flip; `fade` Fade; `slide` Sliding panel ★; `door` Door (swing) ★; `curtain` Curtain ★; `zoom` Zoom ★; `cube` Cube ★ | Visible when `flip.trigger` = `hover` or `click` or `icon` |
| `flip.direction` | Direction | Sens | dropdown | enumeration | `left` | `left` To the left; `right` To the right; `up` Upwards; `down` Downwards | Visible when `flip.trigger` = `hover` or `click` or `icon` |
| `flip.duration` | Duration (ms) | Durée (ms) | number | integer | `600` | 100 to 3000 | Visible when `flip.trigger` = `hover` or `click` or `icon` |
| `flip.easing` | Motion | Mouvement | dropdown | enumeration | `smooth` | `smooth` Smooth; `easeInOut` Ease in and out; `linear` Linear; `bounce` Bounce ★ | Visible when `flip.trigger` = `hover` or `click` or `icon` |
| `flip.autoBack` | Flip back after (s, 0 = never) | Revenir seule après (s, 0 = jamais) | number | integer | `0` | 0 to 120 | Visible when `flip.trigger` = `click` or `icon` |
| `flip.single` | One flipped card at a time | Une seule carte retournée à la fois | toggle | bool | `true` | true / false | Visible when `flip.trigger` = `click` or `icon` |
| `flip.hint` | ↻ indicator on the cards | Indicateur ↻ sur les cartes | toggle | bool | `true` | true / false | Visible when `flip.trigger` = `hover` or `click` or `icon` |
| `flip.preview` | Show the back (preview in edit mode) | Montrer le dos (aperçu en mode édition) | toggle | bool | `false` | true / false | Visible when `flip.trigger` = `hover` or `click` or `icon`. Shows every back while you format them. Ignored in reading view. |

### Back of the card / Dos de la carte (`back`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `back.content` | Content | Contenu | dropdown | enumeration | `both` | `both` Text and key figures; `text` Text only (figures if no text); `figures` Key figures only |  |
| `back.figures` | Key figures | Chiffres clés | dropdown | enumeration | `all` | `all` All available; `compare` Comparison and target; `trend` Trend (min, max, average) | Visible when `back.content` = `both` or `figures` |
| `back.figLayout` | Figures layout | Disposition des chiffres | dropdown | enumeration | `auto` | `auto` Automatic (two columns, stacked when the card is narrow); `columns` Label left, value right; `stacked` Value under the label | Visible when `back.content` = `both` or `figures` |
| `back.fit` | Shrink the text to fit | Réduire le texte pour tout afficher | toggle | bool | `true` | true / false | The text gets smaller (down to 75 %) before the back scrolls. |
| `back.showTitle` | Repeat the title | Rappeler le titre | toggle | bool | `true` | true / false |  |
| `back.fontSize` | Text size | Taille du texte | number | formatting | `12` | 7 to 32 |  |
| `back.align` | Alignment | Alignement | dropdown | enumeration | `left` | `left` Left; `center` Center |  |
| `back.fill` | Fill (empty = KPI tint) | Fond (vide = teinte du KPI) | color | fill | (empty) | hex color |  |
| `back.solid` | Solid KPI color fill | Fond plein à la couleur du KPI | toggle | bool | `false` | true / false | Text in white or black for contrast. |
| `back.textColor` | Text color (empty = automatic) | Couleur du texte (vide = automatique) | color | fill | (empty) | hex color |  |

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `interaction.select` | Click = filter the report (with “One KPI per…”) | Clic = filtrer le rapport (avec « Un KPI par… ») | toggle | bool | `true` | true / false | With “Flip on click”, use Ctrl + click to select. |
| `interaction.dim` | Opacity of unselected cards (%) | Opacité des cartes non sélectionnées (%) | number | integer | `35` | 5 to 90 |  |

### 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). Not on a card that flips on hover (the back gives the details). |
| `tooltip.periodTip` | Tooltip per period on the sparkline | Infobulle par période sur la courbe | toggle | bool | `true` | true / false | Visible when `tooltip.show` = `true` |

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

- `subTotals`: `subTotals.rowSubtotals` (bool), `subTotals.perRowLevel` (bool), `subTotals.columnSubtotals` (bool), `subTotals.perColumnLevel` (bool), `subTotals.levelSubtotalEnabled` (bool), `subTotals.rowSubtotalsType` (enumeration), read by Power BI itself to compute the subtotals sent to the visual (not shown in the Format pane).
- `compare`: `compare.show` (bool), `compare.source` (enumeration), `compare.mode` (enumeration), `compare.arrow` (enumeration), `compare.badge` (bool), `compare.showLabel` (bool), `compare.fontSize` (formatting), `compare.neutral` (numeric), `compare.show2` (bool), `compare.statusFrom` (enumeration), `compare.warnFrom` (integer), `compare.goodColor` (fill), `compare.warnColor` (fill), `compare.badColor` (fill), `compare.neutralColor` (fill).
- `trend`: `trend.show` (bool), `trend.dateFormat` (text), `trend.type` (enumeration), `trend.position` (enumeration), `trend.height` (integer), `trend.color` (fill), `trend.width` (numeric), `trend.opacity` (integer), `trend.lastDot` (bool), `trend.minMax` (bool), `trend.refLine` (bool), `trend.zero` (bool), `trend.hoverTip` (bool).