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