Waterfall Plume
Le graphique en cascade de Power BI, avec les sous-totaux, la valeur de départ et le pont budget → réel qu'on attendait, plus un pont prix-volume-mix.
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 ».
Waterfall Plume fait deux graphiques. En cascade classique, il reprend le graphique en cascade de Power BI (Catégorie, Répartition, Infobulles) et ajoute ce que les utilisateurs réclament : une valeur de départ et une valeur de fin de contrôle, un pont budget → réel par catégorie, le total masqué ou renommé, un ordre personnalisé, des liaisons réglables. Dès qu'une quantité est posée, il devient un pont prix-volume-mix qui décompose l'écart de CA ou de marge entre deux périodes en effets volume, mix, prix, nouveaux et arrêtés, calculés produit par produit, avec une somme exacte. En premium : sous-totaux où vous voulez (marge brute, EBITDA), barres horizontales, regroupement des petites étapes, détail d'un effet par produit.
Cas d'usage
- Compte de résultat : du CA au résultat net, avec marge brute et EBITDA
- Budget → réel (ou N-1 → N) par service, région ou compte
- Trésorerie : solde d'ouverture, flux, solde de clôture
- Écart de CA N-1 → N : volume, mix, prix
GratuitInclus gratuitement
- Parité avec la cascade de Power BI : Catégorie, Répartition (Répartitions au plus + Autres), Infobulles, couleurs, axe depuis zéro, tri
- Valeur de départ, valeur de fin de contrôle avec barre d'écart, pont budget → réel avec une valeur de référence
- Total affiché, masqué ou renommé ; ordre personnalisé ; une barre par mesure ; liaisons en pointillés, tirets ou continues
- Pont prix-volume-mix : volume, mix, prix, nouveaux, arrêtés, autres écarts, somme exacte, infobulles qui expliquent chaque effet
- Étiquettes lisibles : unité adaptée à chaque valeur (« −31,4 k€ » à côté de « 1,43 M€ »), sans chevauchement ; totaux d'une couleur distincte des hausses et des baisses dans tous les styles ; dates lisibles et triées
- Clic = filtre croisé ; clavier, contraste élevé, menu contextuel partout
- Comme la cascade native : légende, position des étiquettes, titre de l'axe, quadrillage entre les catégories, « Trier l'axe », exploration
- Formats dynamiques : bouton fx sur les couleurs et les textes, tout réglage piloté en DAX
PremiumFonctions premium
- Sous-totaux à des positions choisies et « définir comme total » ; sous-total après chaque catégorie
- Barres horizontales (cascade et pont prix-volume-mix)
- Regroupement des petites étapes dans « Autres »
- Pont prix-volume-mix : détail d'un effet par produit au clic, pont par produit
- 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.
- Prise en mainDébutant7 min de lectureGraphique en cascade Power BI : du chiffre d'affaires au résultatPrise en main de Waterfall Plume : préparer les données, construire une cascade comme celle de Power BI, renommer le total, puis passer au pont prix-volume-mix.
- Cas pratiquesIntermédiaire7 min de lectureWaterfall Plume : 9 cas pratiques (budget, sous-totaux, PVM…)Pas à pas : trésorerie avec contrôle, pont budget → réel, écart d'une année à l'autre par canal, marge brute et EBITDA, barres horizontales, pont prix-volume-mix.
- Champs et réglagesIntermédiaire17 min de lectureWaterfall Plume : tous les champs et réglages de la cascadeChaque champ et chaque réglage de Waterfall Plume, cascade et pont prix-volume-mix : départ, sous-totaux, regroupement, effets, axes, avec valeurs possibles et défauts.
- Bases communesBien démarrer avec les visuels PlumeInstallation, licence, styles et réglages communs à tous les visuels.
Champs à glisser dans le visuel
| Champ | Contenu | |
|---|---|---|
| Catégorie (ou Produit) | Une étape par valeur ; produit du pont prix-volume-mix | Facultatif |
| Répartition | Écart d'une catégorie à la suivante, comme Power BI | Facultatif |
| Période (comparaison) | Année, trimestre : totaux comparés | Facultatif |
| Valeurs (montant) | Mesure : montant de chaque étape (plusieurs sans catégorie) | Obligatoire |
| Valeur de référence (budget, N-1…) | Budget ou N-1 : pont référence → valeurs | Facultatif |
| Valeur de départ | Solde d'ouverture | Facultatif |
| Valeur de fin (contrôle) | Solde mesuré ; barre d'écart si besoin | Facultatif |
| Quantité (prix-volume-mix) | Mesure : unités vendues ; déclenche le pont prix-volume-mix | Facultatif |
| Quantité de référence (prix-volume-mix) | Prix-volume-mix sans Période : quantité N-1 | Facultatif |
| Infobulles | Mesures ajoutées à l'infobulle de chaque étape | Facultatif |
| Format dynamique | Mesures renommées carte.réglage (ex. title.text) : le volet Format piloté en DAX | Facultatif |
Il vous manque une fonction ? Nous adaptons nos visuels ou en créons sur mesure. Demander un visuel sur mesure
Un bug dans Waterfall 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/waterfall.md)# Waterfall 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 Waterfall 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/waterfall (French: https://plumevisuals.com/fr/visuels/waterfall)
- Summary: Power BI's waterfall chart with the subtotals, start value and budget-to-actual bridge you were waiting for, plus a price-volume-mix bridge.
- Power BI visual GUID (`visualType`): `plumeWaterfall9B3F32EBD7B24799B76C4056F6F566E2`
- 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
Waterfall Plume is a Power BI custom visual (version 1.4.0.0, installed from its `.pbiviz` file; AppSource submission in progress) that draws **two charts**:
**New in version 1.4.0.0 (30/10/2026):** Format pane reorganized (new **Gridlines** card); free native-parity additions: color of the "Others" bar, legend (Increase / Decrease / Total), data label position, scale kept under filters (`yAxis.min` / `yAxis.max` from a "Dynamic format" measure).
- a **classic waterfall** that matches Power BI's native waterfall chart (Category, Breakdown, Tooltips, "Maximum breakdowns" + Others, increase / decrease / total colors, axis from zero, sorting) and adds what users ask for on the forums: a **start value** (opening balance), an **end value check** with a "Gap" bar, a **budget-to-actual bridge** by category (Reference value), a hidden or renamed total, a **custom step order**, one bar per measure (an income statement made of measures), adjustable connectors (dotted, dashed, solid, color), the split of each category, and, with premium, **subtotals** at chosen positions ("Gross margin", "EBITDA"), **horizontal bars** and **grouping of small steps** into "Others (n)";
- a **price-volume-mix bridge**: it explains the change in revenue (or margin) between two periods as volume, mix and price effects, plus new products, discontinued products and other changes, computed by the visual product by product from a product field, a quantity measure and an amount measure (no DAX decomposition needed). A summary strip shows amount, quantities and average price (reference → compared, with ▲▼), and each bar's tooltip explains the effect in one sentence with its main contributor.
**Chart type** (`cascade.mode`, Format › Waterfall › Chart type): `auto` (default) = price-volume-mix bridge as soon as a measure is in **Quantity (price-volume-mix)**, waterfall otherwise; `waterfall` or `pvm` force one of them. Reports saved before 1.3.0.0 (all price-volume-mix bridges, with a quantity) open unchanged.
**Readability (1.3.1.0):** with `labels.units` = `auto`, each label gets its own unit, never larger than the chart's ("−€31.4K" next to "€1.43M"), always with at least 2 significant digits, even with forced units (never "€0M"); the same rule applies to the summary strip and the breakdown by product. Labels are placed without overlap (shifted, otherwise hidden: the value stays in the tooltip, which shows the full value in the measure's format). With `dataColors.total` empty, totals take the style's main color only if it clearly differs from increases, decreases and the background, otherwise a neutral tint of the style; in Black and white, decreases are light with a dashed border. Dates in Category, Breakdown or Period (including the ISO text sent by Power BI Desktop) are read as local dates, sorted chronologically and written in the column's format (or "April 2025", "2025" when the format is generic).
## The price-volume-mix calculation
For each product *i* sold in **both** periods (Q = quantity, P = amount ÷ quantity, index 0 = reference, 1 = compared; Qtot = total quantity of the products sold in both periods; share0(i) = Q0(i) ÷ Qtot0):
| Effect | Formula |
|---|---|
| Volume | (Qtot1 − Qtot0) × share0(i) × P0(i) |
| Mix | (Q1(i) − Qtot1 × share0(i)) × P0(i) |
| Price | Q1(i) × (P1(i) − P0(i)) |
| New | Amount1 of products with no quantity and no amount in the reference |
| Discontinued | − Amount0 of products with no quantity and no amount in the compared period |
| Other changes | Amount1 − Amount0 of the remaining products (no usable quantity: services, discounts, net returns) |
Per product, Volume + Mix + Price = Amount1 − Amount0, so the bridge lands exactly on the total change. Worked example: Candle 100 units / 1,000 → 90 / 990; Vase 50 / 1,500 → 90 / 2,520. Volume +500, Mix +600, Price −90, total +1,010 = 3,510 − 2,500. `effects.layout` = `vp` merges mix into volume; `effects.newLost` = `volume` puts new and discontinued products into volume.
## Free vs premium (★)
- Every feature works without a key and nothing is ever blocked. Free features never show a watermark, and the default settings use no premium feature (except the price-volume-mix breakdown by product, offered on click: see below).
- 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**. See "Styles and theme JSON" below.
- Premium features of Waterfall Plume (the watermark appears only when they actually apply):
- waterfall: `cascade.subtotals` ("Subtotals ★", when at least one entry matches a step), `cascade.subtotalEach` ("Subtotal after each category ★"), `cascade.group` = `topN` or `share` ("Keep the N largest ★", "Below a % of the total ★", only when steps are actually grouped);
- both charts: `bars.orientation` = `horizontal` ("Bars (horizontal) ★");
- price-volume-mix: the **Breakdown by product ★** card (`detail`): `detail.show` ("Open on bar click") is **on by default**; clicking (or pressing Enter on) a bar opens the split of that effect by product, and the watermark then appears without a key. Turn `detail.show` off to never offer it. `effects.view` = `products` ("Product (change of each product) ★"): a bridge of each product's change (top `effects.topN` + "Others").
- Premium options and list values carry " ★" in their label.
- Watermark without a valid key (CHARTE 1.9, "continuous watermark"): in edit mode, a **"Plume Visuals · Premium preview"** badge (French: « Plume Visuals · Aperçu premium ») in the footer with an "Unlock →" link to the pricing page; in reading mode (published report), "Plume Visuals · Premium preview" is repeated over the whole visual, without capturing the mouse or keyboard. 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.
- Accepted keys: only keys starting with `PLUM1.` from the buyer's account on plumevisuals.com, checked offline (Ed25519 signature), covering `waterfall` 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". `license.showOwner` displays "Licensed to <holder>".
- Licenses last one year (one-time payment, no automatic renewal, key accepted for 30 more days, reminders 30 and 7 days before the end). Prices per year: 39 € personal, 99 € SME, 299 € enterprise, or a catalog pack (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). Renewing gives a new key to paste instead of the old one.
## Fields (data roles)
| Field (EN / FR) | Role | Kind | Use |
|---|---|---|---|
| Category (or Product) / Catégorie (ou Produit) | `category` | 1 column | One step per value; the product level of the price-volume-mix bridge |
| Breakdown / Répartition | `breakdown` | 1 column | Change from one category to the next (like Power BI), or split of each category |
| Period (comparison) / Période (comparaison) | `period` | 1 column | Waterfall: one total per period, categories explain the change; price-volume-mix: the two periods compared |
| Values (amount) / Valeurs (montant) | `amount` | measure (1 with a category, up to 30 without) | Step amount; revenue or margin of the price-volume-mix bridge |
| Reference value (budget, last year…) / Valeur de référence (budget, N-1…) | `amountBase` | 1 measure | Waterfall: budget-to-actual bridge; price-volume-mix without Period: reference amount |
| Start value / Valeur de départ | `startValue` | 1 measure | Start bar (opening balance) |
| End value (check) / Valeur de fin (contrôle) | `endValue` | 1 measure | Measured end bar; a "Gap" bar shows any difference with start + steps |
| Quantity (price-volume-mix) / Quantité (prix-volume-mix) | `quantity` | 1 measure | Turns on the price-volume-mix bridge (Chart type = Automatic) |
| Reference quantity (price-volume-mix) / Quantité de référence (prix-volume-mix) | `quantityBase` | 1 measure | Price-volume-mix without Period: reference quantity |
| Tooltips / Infobulles | `tooltips` | measures | Added to the tooltip of each step that matches a data row |
| Dynamic format / Format dynamique | `format` | measures | Drives any setting with DAX (see below); never drawn |
## Expected data shape
**Waterfall** (one row per step; the sign matters, a cost is negative). The fields in use decide the form:
| Fields | Form |
|---|---|
| Category + Values | Simple waterfall: one step per category, then a "Total" bar; axis from zero |
| Category + Values + Reference value | Budget-to-actual: start = reference total, one step per category = Values − Reference, end = Values total ("Difference between Revenue and Budget." in the tooltip) |
| Category + Breakdown + Values | `cascade.breakdownMode` = `change` (default, like Power BI): each category is a total and the breakdown items explain the change to the next one (top `cascade.maxBreakdowns`, default 5, + "Others (n)"); `split`: each category is split into its items |
| Category + Period + Values | One total per period, categories explain the change from one period to the next (`cascade.compare` = `all`, `firstLast` or `prevLast`) |
| Values only (several measures) | One bar per measure, then the total (income statement made of measures) |
| + Start value / End value | Start bar instead of 0 / measured end bar with a "Gap" bar if needed |
Start and End values: if the measure returns the same value for every category (an opening balance), that value is used; otherwise the sum over the categories.
```dax
Result =
DATATABLE (
"Account", STRING, "Order", INTEGER, "Amount", DOUBLE,
{ { "Revenue", 1, 1000 }, { "Cost of sales", 2, -400 }, { "Staff costs", 3, -250 }, { "Rent", 4, -80 },
{ "Marketing", 5, -60 }, { "Other income", 6, 30 }, { "Taxes", 7, -50 } }
)
Total amount = SUM ( Result[Amount] )
// Account sorted by Order (Column tools › Sort by column) → total 190
// cascade.subtotals = "Cost of sales = Gross margin; Marketing = EBITDA" → Gross margin 600, EBITDA 210
```
**Price-volume-mix bridge** (one row per product, measures evaluated per period):
| Product (`category`) | Period (`period`) | Quantity (`quantity`) | Amount (`amount`) |
|---|---|---|---|
| Candle | 2024 | 100 | 1,000 |
| Candle | 2025 | 90 | 990 |
| Vase | 2025 | 90 | 2,520 |
- `effects.compare` = `firstLast` (default) or `prevLast`. Dates and numbers are sorted; text values keep the data order.
- Without a Period field: **Reference quantity** and **Reference value** are both required; Quantity and Values are then the compared period.
- The Product level decides what is "price" and what is "mix": at category level, a shift between products of the same category becomes a price effect. With a margin as the amount, the "price" is the unit margin.
Limits: a warning icon above 10,000 rows (products) or 60 periods. Messages: "Add a "Period" field (at least two values), or the "Reference quantity" and "Reference value" measures." (price-volume-mix without a comparison); "Quantities are zero or missing: volume, mix and price effects cannot be computed."; "Subtotals not found (unknown step name): …" (edit mode only).
## DAX recipes
```dax
Revenue = SUM ( Sales[Amount] )
Items sold = SUM ( Sales[Quantity] )
Revenue budget = SUM ( Budget[Amount] ) // Reference value of a budget-to-actual bridge
// Without a Period field: reference measures (marked date table related to Sales[Date]); filter the page on the compared year
Items sold LY = CALCULATE ( [Items sold], SAMEPERIODLASTYEAR ( 'Date'[Date] ) )
Revenue LY = CALCULATE ( [Revenue], SAMEPERIODLASTYEAR ( 'Date'[Date] ) )
// Cash flow: same value for every category = used as is
Opening cash =
VAR FirstDay = MIN ( 'Date'[Date] )
RETURN CALCULATE ( SUM ( Balances[Balance] ), Balances[Date] = FirstDay )
```
## Interactions with the report
- Waterfall: clicking a step, a total (pillar) or "Others" cross-filters the report on the category, the breakdown item or the period ("Others" selects the grouped categories); Ctrl + click adds; clicking the background clears. Context menu everywhere (bars, totals, axis labels, background, title).
- Price-volume-mix: effect bars (volume, mix, price…) are not data points; clicking them opens the breakdown by product ★ (when `detail.show` is on); in the breakdown, clicking a product cross-filters on it; × closes it. With `effects.view` = `products`, clicking a product bar selects that product; Alt + click opens its breakdown.
- Keyboard: arrows between bars, Enter to activate (open or close the breakdown), Esc to clear. Direction is always given by ▲▼ (`bars.arrows`), never by color only; high contrast uses the host colors and draws decreases dashed. Other visuals cross-filter it (no highlighting).
## Dynamic formats
- **fx button** on every color and text of the Format pane (Field value, Rules, Gradient).
- **"Dynamic format" well** (`format` role, French « Format dynamique »): drop measures and rename each one, for this visual, `card.setting`. It drives any setting (sizes, toggles, lists, fonts, colors, texts), including the 1.3 ones (`cascade.*`, `bars.orientation`, `bars.connectorStyle`, `bars.connectorColor`, `dataColors.subtotal`), and wins over the fixed setting, the style and an fx rule. With a Period field the measure is repeated in each period: the first one wins. A ★ setting driven by DAX still shows the watermark without a key.
```dax
// renamed bars.orientation: horizontal bars ★ when there are many accounts (whole-visual value thanks to ALLSELECTED)
Orientation = IF ( CALCULATE ( DISTINCTCOUNT ( Result[Account] ), ALLSELECTED () ) > 12, "horizontal", "vertical" )
// renamed dataColors.lowerIsBetter: TRUE when the amount is a cost
Costs mode = SELECTEDVALUE ( 'Analysed measure'[Is cost], FALSE () )
```
## Format pane
- Each option has an ID `card.option` (object name + property name in capabilities.json); full list with values in the reference tables.
- Card order: `license` (always first), `style`, `dataColors` (favorable, unfavorable, totals, `subtotal`, `lowerIsBetter`), `cascade` (groups: Chart type `mode`; Steps `sort`, `customOrder`, `breakdownMode`, `compare`, `maxBreakdowns`, `group`, `groupN`, `groupPct`, `othersLabel`; Start, subtotals and total `startLabel`, `showTotal`, `totalLabel`, `subtotals` ★, `subtotalEach` ★, `gapLabel`), `effects` (price-volume-mix only: `view`, `layout`, `newLost`, `compare`, `topN`, labels), `bars` (`orientation`, `width`, `connectors`, `connectorStyle`, `connectorColor`, `arrows`), `labels`, `summary`, `detail` (★, price-volume-mix only), `xAxis` (steps axis), `yAxis` (value axis), `interaction`, then `title`, `source`, `container`, `texts`. Format pane in version 1.4.0.0 (30/10/2026), top to bottom: `license`, `style`, `dataColors`, `cascade`, `effects`, `bars`, `labels`, `xAxis`, `yAxis`, `gridlines`, `legend`, `summary`, `detail`, `interaction`, `tooltip`, `title`, `source`, `container`, `texts`. Settings moved or renamed in this version keep working in older reports (the old names are still read).
- "Visible when": in a price-volume-mix bridge, only `cascade.mode` shows in the Waterfall card; `effects` and `detail` only in a price-volume-mix bridge. Waterfall: `breakdownMode` with Category + Breakdown; `compare` with a Breakdown as change or a Period; `maxBreakdowns` with a Breakdown or a Period; `group` only for a simple waterfall, budget-to-actual or measures; `subtotals`, `startLabel`, `showTotal`, `gapLabel` hidden with a Breakdown as change or a Period; `showTotal` hidden for budget-to-actual; `subtotalEach` only with `breakdownMode` = `split`; `customOrder` only with `sort` = `custom`. `effects.compare` only with a Period field.
- `yAxis.zero` ("Start at zero (otherwise: broken axis)"): on by default for a waterfall (like Power BI, the pane shows it on), off by default for a price-volume-mix bridge (broken axis with break marks on the totals).
- Labels follow the language of Power BI Desktop; `texts.language` forces French or English inside the visual. An empty title gives an automatic title built from the fields ("Revenue change by Channel").
## Editing a PBIP report (visual.json)
`visualType` is the visual GUID, `queryState` keys are the data role names, `objects` keys are the option IDs. Booleans `true` / `false`, numbers suffixed with `D`, strings and enumeration values in single quotes, colors in `solid.color`.
```json
{
"visualType": "plumeWaterfall9B3F32EBD7B24799B76C4056F6F566E2",
"query": {
"queryState": {
"category": { "projections": [ { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Result" } }, "Property": "Account" } }, "queryRef": "Result.Account", "nativeQueryRef": "Account" } ] },
"amount": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Result" } }, "Property": "Total amount" } }, "queryRef": "Result.Total amount", "nativeQueryRef": "Total amount" } ] }
}
},
"objects": {
"cascade": [ { "properties": { "subtotals": { "expr": { "Literal": { "Value": "'Cost of sales = Gross margin; Marketing = EBITDA'" } } },
"totalLabel": { "expr": { "Literal": { "Value": "'Net income'" } } },
"sort": { "expr": { "Literal": { "Value": "'data'" } } } } } ],
"bars": [ { "properties": { "connectorStyle": { "expr": { "Literal": { "Value": "'solid'" } } } } } ],
"dataColors": [ { "properties": { "subtotal": { "solid": { "color": { "expr": { "Literal": { "Value": "'#B8952A'" } } } } } } } ],
"license": [ { "properties": { "key": { "expr": { "Literal": { "Value": "'PLUM1.…'" } } } } } ]
}
}
```
For a price-volume-mix bridge, project `category` (product), `period` (year), `quantity` and `amount`, and set for example `"effects": [ { "properties": { "compare": { "expr": { "Literal": { "Value": "'prevLast'" } } } } } ]`. The custom visual package must also be embedded in the report (Power BI does this when the visual is imported from the `.pbiviz` file).
## Styles and theme JSON
- `style.preset` takes one of the 20 style IDs shared by every Plume visual: `none`, `minimal`, `blackWhite`, `press`, `vintage`, `earth`, `nordic`, `executive`, `accessible`, `pastel`, `bauhaus`, `climate`, `blueprint`, `unknownPleasures`, `dark`, `neon`, `terminal`, `infographic`, `cockpit`, `hologram`.
- `style.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
- A price-volume-mix bridge instead of a waterfall: a measure is in Quantity; remove it or set `cascade.mode` = `waterfall`.
- Steps in alphabetical order: no "Sort by column" on the category; or use `cascade.sort` = `custom` with `cascade.customOrder` (names separated by semicolons, case-insensitive).
- A cost going up: the amount is positive in the data; flip its sign in the measure.
- No percentage in the labels: the percentage needs a start bar (start value, reference, first total); a share of the final total would be misleading. The tooltip still gives "Share of total".
- "Subtotals not found": misspelled step name in `cascade.subtotals`. A subtotal row already in the data ("Gross margin"): enter its name alone, it becomes a subtotal (running total).
- "Add a Period field…" message: the Period has one value under the current filters, or only one reference measure is set.
- Mix looks wrong: the product level is too coarse (category) or too fine (SKU with few sales). Large "Other changes": products with an amount but no quantity in one period (services, discounts, returns).
- Watermark after a click on a price-volume-mix bar: the breakdown by product ★ is on by default (`detail.show`).
- Costs: set `dataColors.lowerIsBetter` so that decreases are green.
- The visual makes no network request: data and license key stay in the report.
## Features that do NOT exist (do not suggest them)
A stacked waterfall (mixed signs in one bar; use the Breakdown instead), small multiples, hierarchy drill-down (product within category), one color per category (color means favorable / unfavorable), more than two periods in one price-volume-mix bridge, a currency or exchange-rate effect, a cost-of-goods or margin-rate effect, a customer or channel mix in addition to the product mix, effects written back to the model as measures, export of the breakdown.
## 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 |
|---|---|---|---|---|---|
| `category` | Category (or Product) | Catégorie (ou Produit) | column | 1 | |
| `breakdown` | Breakdown | Répartition | column | 1 | |
| `period` | Period (comparison) | Période (comparaison) | column | 1 | |
| `amount` | Values (amount) | Valeurs (montant) | measure | 30 | |
| `amountBase` | Reference value (budget, last year…) | Valeur de référence (budget, N-1…) | measure | 1 | |
| `startValue` | Start value | Valeur de départ | measure | 1 | |
| `endValue` | End value (check) | Valeur de fin (contrôle) | measure | 1 | |
| `quantity` | Quantity (price-volume-mix) | Quantité (prix-volume-mix) | measure | 1 | |
| `quantityBase` | Reference quantity (price-volume-mix) | Quantité de référence (prix-volume-mix) | measure | 1 | |
| `tooltips` | Tooltips | Infobulles | measure | several | |
| `format` | Dynamic format | Format dynamique | measure | several | Measures named card.setting (e.g. title.fontSize): drive any Format option with DAX |
Data view: categorical, categories = `category` + `breakdown` (one row per combination); measures = `quantity`, `amount`, `quantityBase`, `amountBase`, `startValue`, `endValue`, `tooltips`, `format`, grouped into series by `period`.
Capabilities: supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).
## Format pane options (167)
Columns: option ID (`object.property`), labels EN / FR as shown in Power BI, control type, PBIP literal type, default value, allowed values, notes.
### Plume Studio License / Licence Plume Studio (`license`, Format pane)
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `license.buy` | Get a license | Obtenir une licence | info | text | `plumevisuals.com` | | |
| `license.key` | License key | Clé de licence | text | text | (empty) | | Paste the key received after purchase on plumevisuals.com (starts with PLUM1.). Checked offline. |
| `license.showOwner` | Show license holder (edit mode) | Afficher le titulaire (mode édition) | toggle | bool | `true` | true / false | |
### Style (`style`, Format pane)
**Style**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `style.preset` | Style | Style | dropdown | enumeration | `none` | `none` None; `minimal` Minimal; `blackWhite` Black & White; `press` Newspaper ★; `vintage` Vintage (antique plate) ★; `earth` Earth ★; `nordic` Nordic ★; `executive` Executive ★; `accessible` Accessible (high legibility) ★; `pastel` Pastel ★; `bauhaus` Bauhaus (pop) ★; `climate` Climate ★; `blueprint` Blueprint ★; `unknownPleasures` Unknown Pleasures ★; `dark` Graphite (dark) ★; `neon` Neon ★; `terminal` Terminal (Matrix) ★; `infographic` Infographic ★; `cockpit` Cockpit (HUD) ★; `hologram` Hologram ★ | Complete look shared by all Plume visuals: colors, three palettes, fonts, frame, table header, marks and effects. Customize colors below. |
| `style.themeJson` | Theme JSON ★ | Thème JSON ★ | textarea | text | (empty) | | Paste a JSON theme: see the 'JSON themes' tutorial on plumevisuals.com |
| `style.followTheme` | Follow report theme | Suivre le thème du rapport | toggle | bool | `false` | true / false | Text, background, accent and data colors come from the Power BI report theme. |
| `style.reverse` | Reverse gradients | Inverser les dégradés | toggle | bool | `false` | true / false | |
**Custom colors / Couleurs personnalisées**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `style.customColors` | Customize colors | Personnaliser les couleurs | toggle | bool | `false` | true / false | Start from the style and pick your own colors. A color left empty keeps the style's color. |
| `style.colorBackground` | Background | Fond | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorText` | Text | Texte | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorMuted` | Secondary text | Texte secondaire | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorGrid` | Lines and grid | Traits et grille | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorAccent` | Accent | Accent | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorPositive` | Favorable | Favorable | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorNegative` | Unfavorable | Défavorable | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series1` | Series 1 | Série 1 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series2` | Series 2 | Série 2 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series3` | Series 3 | Série 3 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series4` | Series 4 | Série 4 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series5` | Series 5 | Série 5 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series6` | Series 6 | Série 6 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series7` | Series 7 | Série 7 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series8` | Series 8 | Série 8 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.palette` | Gradient palette | Palette du dégradé | dropdown | enumeration | `auto` | `auto` Style or theme palette; `crest` Plume (sequential); `crestDiverging` Plume (diverging); `viridis` Viridis ★; `magma` Magma ★; `inferno` Inferno ★; `cividis` Cividis (colorblind-safe) ★; `warmingStripes` Warming stripes ★; `rdYlBu` Red–Yellow–Blue ★; `brBG` Brown–Teal (drought) ★; `spectral` Spectral ★; `blues` Blues ★; `reds` Reds ★; `grays` Grays ★; `press` Press (ink and paper) ★; `nordic` Nordic ★; `earth` Earth (ochre to umber) ★; `pastel` Pastel ★; `okabeIto` Okabe-Ito (colorblind-safe) ★ | Visible when `style.customColors` = `true`. Gradient from the catalog (Viridis, Magma…). The start, middle and end colors below replace it. |
| `style.scaleLow` | Gradient: start | Dégradé : début | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.scaleMid` | Gradient: middle (diverging) | Dégradé : milieu (écarts) | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.scaleHigh` | Gradient: end | Dégradé : fin | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
**Text / Texte**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `style.fontFamily` | Font | Police | font | formatting | `Segoe UI, wf_segoe-ui_normal, helvetica, arial, sans-serif` | | Used by every text of the visual (title, axes, labels, cells). |
**Animations**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `style.animate` | Animations | Animations | toggle | bool | `true` | true / false | Smooth transitions when data changes. Automatically disabled when the system asks to reduce motion. |
### Data colors / Couleurs des données (`dataColors`, Format pane)
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `dataColors.increase` | Increase (favorable) | Augmentation (favorable) | color | fill | `#2E7D4F` | hex color | |
| `dataColors.decrease` | Decrease (unfavorable) | Diminution (défavorable) | color | fill | `#C0392B` | hex color | |
| `dataColors.total` | Total (empty = palette) | Total (vide = palette) | color | fill | (empty) | hex color | |
| `dataColors.subtotal` | Subtotals (empty = total) | Sous-totaux (vide = total) | color | fill | (empty) | hex color | Waterfall: subtotal bars and intermediate category totals. |
| `dataColors.others` | Other (empty = by direction) | Autres (vide = selon le sens) | color | fill | (empty) | hex color | The « Others (n) » bar of grouped steps or breakdowns, like the « Other » color of the native waterfall. |
| `dataColors.lowerIsBetter` | A decrease is favorable (costs) | Une baisse est favorable (coûts) | toggle | bool | `false` | true / false | For costs or discounts: increases are shown in the « unfavorable » color. |
### Waterfall / Cascade (`cascade`, Format pane)
**Chart type / Type de graphique**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `cascade.mode` | Chart type | Type de graphique | dropdown | enumeration | `auto` | `auto` Automatic (from the fields); `waterfall` Waterfall; `pvm` Price-volume-mix bridge | Automatic: price-volume-mix bridge when a Quantity is set, otherwise a classic waterfall. |
**Steps / Étapes**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `cascade.sort` | Step order | Ordre des étapes | dropdown | enumeration | `data` | `data` Data order (Sort axis); `valueDesc` Value, descending; `valueAsc` Value, ascending; `absDesc` Largest changes first; `nameAsc` Name A → Z; `nameDesc` Name Z → A; `custom` Custom list | Data order: the order of the model, or the one chosen with « … › Sort axis » in the visual header. |
| `cascade.customOrder` | Custom order | Ordre personnalisé | text | text | (empty) | | Visible when `cascade.sort` = `custom`. Step names separated by semicolons; steps not listed follow in data order. |
| `cascade.breakdownMode` | With a Breakdown | Avec une Répartition | dropdown | enumeration | `change` | `change` Change between categories (like Power BI); `split` Split of each category | Change: each category is a total and the breakdown explains the change from one category to the next. Split: each category value is split into its breakdown items. |
| `cascade.compare` | Totals compared | Totaux comparés | dropdown | enumeration | `all` | `all` All, one after the other; `firstLast` The first and the last; `prevLast` The previous and the last | |
| `cascade.maxBreakdowns` | Maximum breakdowns | Répartitions affichées au plus | number | integer | `5` | 1 to 50 | The largest changes are shown; the others are grouped in « Other ». |
| `cascade.group` | Group small steps | Regrouper les petites étapes | dropdown | enumeration | `none` | `none` No; `topN` Keep the N largest ★; `share` Below a % of the total ★ | |
| `cascade.groupN` | Steps kept | Étapes gardées | number | integer | `8` | 1 to 50 | Visible when `cascade.group` = `topN` |
| `cascade.groupPct` | Threshold (% of changes) | Seuil (% des écarts) | number | numeric | `2` | 0 to 50 | Visible when `cascade.group` = `share`. Steps smaller than this share of the sum of all changes (in absolute value) are grouped. |
| `cascade.othersLabel` | Grouped steps label | Libellé du regroupement | text | text | (empty) | | |
**Start, subtotals and total / Départ, sous-totaux et total**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `cascade.startLabel` | Start label | Libellé du départ | text | text | (empty) | | |
| `cascade.showTotal` | Show total | Afficher le total | toggle | bool | `true` | true / false | |
| `cascade.totalLabel` | Total label | Libellé du total | text | text | (empty) | | Visible when `cascade.showTotal` = `true` |
| `cascade.subtotals` | Subtotals ★ | Sous-totaux ★ | text | text | (empty) | | « Step = Name »: a subtotal named Name after the step. A step name alone: this step becomes a subtotal (running total). Separate entries with semicolons. |
| `cascade.subtotalEach` | Subtotal after each category ★ | Sous-total après chaque catégorie ★ | toggle | bool | `false` | true / false | |
| `cascade.gapLabel` | Label of the gap to the end value | Libellé de l'écart avec la valeur de fin | text | text | (empty) | | |
### Effects (price-volume-mix) / Effets (prix-volume-mix) (`effects`, Format pane)
**Calculation / Calcul**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `effects.view` | Break down by | Décomposer par | dropdown | enumeration | `effects` | `effects` Effect (volume, mix, price…); `products` Product (change of each product) ★ | |
| `effects.layout` | Effects shown | Effets affichés | dropdown | enumeration | `vmp` | `vmp` Volume, mix and price; `vp` Volume (mix included) and price | Visible when `effects.view` = `effects` |
| `effects.newLost` | New and discontinued products | Produits nouveaux et arrêtés | dropdown | enumeration | `separate` | `separate` Separate effects; `volume` Included in volume | Visible when `effects.view` = `effects` |
| `effects.compare` | With a Period field, compare | Avec un champ Période, comparer | dropdown | enumeration | `firstLast` | `firstLast` The first and the last period; `prevLast` The previous and the last period | |
| `effects.topN` | Products shown (bridge by product) | Produits affichés (pont par produit) | number | integer | `8` | 2 to 30 | Visible when `effects.view` = `products` |
**Labels / Libellés**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `effects.baseLabel` | Reference period | Période de référence | text | text | (empty) | | |
| `effects.currentLabel` | Compared period | Période comparée | text | text | (empty) | | |
| `effects.volumeName` | Volume effect | Effet volume | text | text | (empty) | | |
| `effects.mixName` | Mix effect | Effet mix | text | text | (empty) | | |
| `effects.priceName` | Price effect | Effet prix | text | text | (empty) | | |
| `effects.newName` | New products | Nouveaux produits | text | text | (empty) | | |
| `effects.lostName` | Discontinued products | Produits arrêtés | text | text | (empty) | | |
### Bars / Barres (`bars`, Format pane)
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `bars.orientation` | Orientation | Orientation | dropdown | enumeration | `vertical` | `vertical` Columns (vertical); `horizontal` Bars (horizontal) ★ | |
| `bars.width` | Bar width (%) | Largeur des barres (%) | number | integer | `62` | 10 to 95 | |
| `bars.connectors` | Connector lines | Traits de liaison | toggle | bool | `true` | true / false | |
| `bars.connectorStyle` | Connector style | Style des liaisons | dropdown | enumeration | `dotted` | `dotted` Dotted; `dashed` Dashed; `solid` Solid | Visible when `bars.connectors` = `true` |
| `bars.connectorColor` | Connector color (empty = secondary) | Couleur des liaisons (vide = secondaire) | color | fill | (empty) | hex color | Visible when `bars.connectors` = `true` |
| `bars.arrows` | ▲▼ arrows in labels | Flèches ▲▼ dans les étiquettes | toggle | bool | `true` | true / false | The direction is never shown by color alone. |
### Data labels / Étiquettes de données (`labels`, Format pane)
The card header toggle is `labels.show`.
**Labels / Étiquettes**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `labels.show` | Show | Afficher | toggle | bool | `true` | true / false | |
| `labels.content` | Content | Contenu | dropdown | enumeration | `valuePct` | `valuePct` Value and % of reference; `value` Value; `pct` % of reference | |
| `labels.position` | Position | Position | dropdown | enumeration | `auto` | `auto` Outside end; `insideEnd` Inside end; `center` Inside center; `insideBase` Inside base | Inside: the label moves outside the bar when it does not fit. |
| `labels.fontSize` | Size | Taille | number | formatting | `10` | 6 to 24 | |
| `labels.color` | Color (empty = automatic) | Couleur (vide = automatique) | color | fill | (empty) | hex color | Automatic: readable color depending on the background (inside bars: white or dark). |
| `labels.bold` | Bold | Gras | toggle | bool | `false` | true / false | |
| `labels.italic` | Italic | Italique | toggle | bool | `false` | true / false | |
| `labels.halo` | Text halo | Halo autour du texte | toggle | bool | `true` | true / false | |
**Numbers / Nombres**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `labels.units` | Display units | Unités d'affichage | dropdown | enumeration | `auto` | `auto` Auto; `none` None; `k` Thousands; `m` Millions; `b` Billions | |
| `labels.decimals` | Decimals (-1 = auto) | Décimales (-1 = auto) | number | integer | `-1` | -1 to 6 | |
| `labels.prefix` | Prefix | Préfixe | text | text | (empty) | | |
| `labels.suffix` | Suffix (e.g. €) | Suffixe (ex. €) | text | text | (empty) | | |
### Category axis / Axe des catégories (`xAxis`, Format pane)
The card header toggle is `xAxis.show`.
**Labels / Étiquettes**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `xAxis.show` | Show | Afficher | toggle | bool | `true` | true / false | |
| `xAxis.fontSize` | Text size | Taille du texte | number | formatting | `9` | 6 to 24 | |
| `xAxis.color` | Color (empty = secondary) | Couleur (vide = secondaire) | color | fill | (empty) | hex color | |
| `xAxis.line` | Axis line | Trait de l'axe | toggle | bool | `true` | true / false | |
**Axis title / Titre de l'axe**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `xAxis.showTitle` | Axis title | Titre de l'axe | toggle | bool | `false` | true / false | |
| `xAxis.titleText` | Title text | Texte du titre | text | text | (empty) | | Visible when `xAxis.showTitle` = `true` |
### Value axis / Axe des valeurs (`yAxis`, Format pane)
The card header toggle is `yAxis.show`.
**Values / Valeurs**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `yAxis.show` | Show | Afficher | toggle | bool | `true` | true / false | |
| `yAxis.position` | Position | Position | dropdown | enumeration | `left` | `left` Left; `right` Right | |
| `yAxis.fontSize` | Size | Taille | number | formatting | `9` | 6 to 24 | |
| `yAxis.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color | |
| `yAxis.units` | Display units | Unités d'affichage | dropdown | enumeration | `auto` | `auto` Auto; `none` None; `k` Thousands; `m` Millions; `b` Billions | |
| `yAxis.decimals` | Decimals (-1 = auto) | Décimales (-1 = auto) | number | integer | `-1` | -1 to 6 | |
| `yAxis.prefix` | Prefix | Préfixe | text | text | (empty) | | |
| `yAxis.suffix` | Suffix (e.g. €) | Suffixe (ex. €) | text | text | (empty) | | |
| `yAxis.line` | Axis line | Trait de l'axe | toggle | bool | `false` | true / false | |
**Range / Échelle**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `yAxis.min` | Minimum | Minimum | text | text | (empty) | | Empty = automatic. To keep the same scale when filtering: « Dynamic format » field, measure yAxis.min = CALCULATE ( [Measure], REMOVEFILTERS () ) (or ALL ( Table )). |
| `yAxis.max` | Maximum | Maximum | text | text | (empty) | | Empty = automatic. To keep the same scale when filtering: « Dynamic format » field, measure yAxis.max = CALCULATE ( [Measure], REMOVEFILTERS () ) (or ALL ( Table )). |
| `yAxis.zero` | Start at zero (otherwise: broken axis) | Commencer à zéro (sinon : axe coupé) | toggle | bool | `false` | true / false | Off: the axis starts near the smallest bar so that small effects stay visible; total bars show a break mark. |
| `yAxis.ticks` | Number of ticks (approx.) | Nombre de graduations (environ) | number | integer | `5` | 2 to 20 | |
**Axis title / Titre de l'axe**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `yAxis.showTitle` | Show | Afficher | toggle | bool | `false` | true / false | |
| `yAxis.titleText` | Text | Texte | text | text | (empty) | | Visible when `yAxis.showTitle` = `true` |
### Gridlines / Quadrillage (`gridlines`, Format pane)
**Value gridlines / Lignes des valeurs**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gridlines.show` | Show | Afficher | toggle | bool | `true` | true / false | Horizontal with columns, vertical with horizontal bars (the gridlines turn with the chart). |
| `gridlines.color` | Color (empty = style grid) | Couleur (vide = grille du style) | color | fill | (empty) | hex color | Visible when `gridlines.show` = `true` |
| `gridlines.style` | Line style | Style du trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted | Visible when `gridlines.show` = `true` |
| `gridlines.width` | Width | Épaisseur | number | integer | `1` | 1 to 6 | Visible when `gridlines.show` = `true` |
| `gridlines.zeroLine` | Zero line | Ligne du zéro | toggle | bool | `true` | true / false | |
**Category gridlines / Lignes entre les catégories**
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gridlines.catShow` | Show | Afficher | toggle | bool | `false` | true / false | |
| `gridlines.catColor` | Color (empty = style grid) | Couleur (vide = grille du style) | color | fill | (empty) | hex color | Visible when `gridlines.catShow` = `true` |
| `gridlines.catStyle` | Line style | Style du trait | dropdown | enumeration | `dotted` | `solid` Solid; `dashed` Dashed; `dotted` Dotted | Visible when `gridlines.catShow` = `true` |
| `gridlines.catWidth` | Width | Épaisseur | number | integer | `1` | 1 to 6 | Visible when `gridlines.catShow` = `true` |
### Legend / Légende (`legend`, Format pane)
The card header toggle is `legend.show`.
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `legend.show` | Show | Afficher | toggle | bool | `false` | true / false | Increase, decrease, total (and subtotal, other): like the legend of the native waterfall chart. |
| `legend.position` | Position | Position | dropdown | enumeration | `top` | `top` Top; `bottom` Bottom; `right` Right; `left` Left | |
| `legend.align` | Alignment | Alignement | dropdown | enumeration | `left` | `left` Start; `center` Center; `right` End | Visible when `legend.position` = `top` or `bottom` |
| `legend.showTitle` | Legend title | Titre de la légende | toggle | bool | `false` | true / false | |
| `legend.titleText` | Title text | Texte du titre | text | text | (empty) | | Visible when `legend.showTitle` = `true` |
| `legend.fontSize` | Size | Taille | number | formatting | `9` | 6 to 24 | |
| `legend.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color | |
### Summary strip / Bandeau de synthèse (`summary`, Format pane)
The card header toggle is `summary.show`.
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `summary.show` | Show | Afficher | toggle | bool | `true` | true / false | Amount, quantities and average price: reference → compared period. |
| `summary.fontSize` | Text size | Taille du texte | number | formatting | `12` | 8 to 20 | |
### Breakdown by product ★ / Détail par produit ★ (`detail`, Format pane)
This card controls premium features (★): they work without a license key but show the watermark while in use.
The card header toggle is `detail.show`.
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `detail.show` | Open on bar click | Ouvrir au clic sur une barre | toggle | bool | `true` | true / false | Click an effect: its contribution by product appears next to the bridge. |
| `detail.position` | Position | Position | dropdown | enumeration | `auto` | `auto` Automatic; `right` Right; `bottom` Bottom | |
| `detail.topN` | Products shown | Produits affichés | number | integer | `8` | 3 to 30 | |
### Interactions (`interaction`, Format pane)
| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `interaction.hover` | Highlight on hover | Mettre en avant au survol | toggle | bool | `true` | true / false | |
| `interaction.dim` | Dimmed items opacity (%) | Opacité des éléments estompés (%) | number | integer | `25` | 5 to 80 | |
### 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). |
| `tooltip.explain` | Explanation sentence | Phrase d'explication | toggle | bool | `true` | true / false | A sentence that explains the step (change, volume, mix or price effect…), on several short lines. |
| `tooltip.contributor` | Main contributor | Principal contributeur | toggle | bool | `true` | true / false | |
### 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. |