# Gauge Plume: technical reference for AI assistants

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

Use it to help someone build a report with Gauge 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/gauge (French: https://plumevisuals.com/fr/visuels/gauge)
- Summary: The gauge Power BI never had: red, amber and green ranges, a needle, a readable target and ▲▼ gap, one gauge per category.
- Power BI visual GUID (`visualType`): `plumeGauge1F054613CBF04C5D8B56ED96A49BC450`
- 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

Gauge Plume (identifier `gauge`) is a Power BI custom visual (base range, version 1.1.0.0, installed from its `.pbiviz` file; AppSource submission in preparation) that shows **one value on a scale against a target**, like the native Power BI gauge (same fields: Value, Minimum value, Maximum value, Target value) with what the native gauge lacks:

**New in version 1.1.0.0 (30/10/2026):** Free native-parity addition: target label size, color, units, decimals, prefix and suffix.

- **Nine shapes** (`gauge.type`), eight of them free: semicircle `semi` (default), `arc240`, `arc270`, full ring `ring`, `custom` angles (`gauge.startAngle`, `gauge.sweep`), horizontal `linear`, `vertical`, `bullet` chart (Stephen Few: grey qualitative bands, thin value bar, target line); `thermometer` is premium ★.
- **Color ranges** (red / amber / green): 2 or 3 ranges free, limits in % of the scale, as values, or from measures; ★ in **% of the target** (each gauge of a grid uses its own target) (the Range limits field, up to 4 measures). The fill and the value take the color of the range reached (`gauge.colorByRange`).
- **Readable min / max and target**: min and max labels under the ends of the arc, never cut; the automatic maximum is rounded above the value **and** the target (never "twice the value" unless `scale.autoMax` = `double`); the target label is placed outside the arc and the radius shrinks to keep it readable.
- **Gap to target written under the value**: "▼ 15% below target", colored favorable / unfavorable; ★ with the Comparison field, "▲ +9.4% vs Revenue LY" (`comparison.lowerIsBetter` for costs and lead times).
- **Needle** (free): tapered, line, arrow or pointer on the arc.
- **One gauge per category** (the category field): a grid of gauges with a shared or per-gauge scale, sorted by data, value, % of target or name; clicking a gauge cross-filters the page.
- **Play axis ★** (premium since the free / premium rebalancing of 2026-10-22, common Plume player): steps through periods; the needle and the arc glide from one period to the next on a scale fixed for the whole sequence.
- Values out of scale are flagged with a ▲ tip and the exact value (or the scale is extended); negative scales fill from zero.
- Premium ★: the play axis, the Comparison field, the thermometer, ranges in % of the target, the gap arc, 4 or 5 ranges, continuous gradient ranges, car-dashboard dials, the Sport needle, needles for the target, the comparison and up to 3 extra measures, a history sparkline under each gauge, needle memory (min. and max. reached) while playing.

## Free vs premium (★)

- Every feature works without a key and nothing is ever blocked. Free features never show a watermark. The default view uses no ★ feature.
- Shared Style card (the same in every Plume visual): the styles `none`, `minimal` and `blackWhite`, the two Plume gradient palettes (`crest`, `crestDiverging`), "Follow report theme" and all custom colors are **free**; every other `style.preset`, the other gradient palettes (`style.palette`) and `style.themeJson` ("Theme JSON ★") are **premium**.
- Free in Gauge Plume: eight shapes (all but `thermometer`), Value / Minimum / Maximum / Target fields, 2 or 3 color ranges (limits in % of the scale, as values, or a Range limits field with 1 or 2 measures), range names, limit values on the scale, the needle (shapes `classic`, `line`, `arrow`, `pointer`), ticks, the callout content (`value`, % of scale, % of target, both), the ▲▼ gap to target, one gauge per category, tooltips, dynamic formats.
- Premium features of Gauge Plume (the watermark appears only when they actually apply):
  - a field in **Play axis ★** (`play`) holding data, even a single frame;
  - a measure in **Comparison ★** (`comparison`) with `comparison.show` on (default on);
  - `gauge.type` = `thermometer` ("Thermometer ★");
  - `ranges.mode` = `target` ("In % of the target ★") with `ranges.show` on, a known target and no Range limits measure;
  - `target.gapArc` ("Gap arc ★") with a known target;
  - `ranges.count` = `4` or `5`, or 3 or 4 measures in Range limits; `ranges.gradient` ("Continuous gradient ★"), with `ranges.show` on;
  - `dial.skin` = `classic`, `sport`, `retro` or `cockpit` (arc shapes only);
  - `needle.style` = `sport` ("Sport (counterweight) ★"), with the needle shown;
  - `needle.targetNeedle` (with a target) and `needle.compareNeedle` (with a comparison); any measure in **Extra needles ★** (`needles`);
  - a field in **History (date) ★** (`trend`) with `history.show` on (default on);
  - `play.trace` ("Needle memory ★") with at least two periods in the play axis.
- Without a valid key, a premium feature in use shows, in edit mode, a "Premium preview" note in the footer; in reading view, **"Plume Visuals · Premium preview"** (French « Plume Visuals · Aperçu premium ») is repeated lightly across the whole visual, without catching the mouse. It disappears once a key is pasted in **Format › Plume Studio License › License key** (`license.key`), the **first card** of the Format pane. Premium options and list values have " ★" appended to their label.
- Accepted keys: only keys starting with `PLUM1.` shown in the buyer's account on plumevisuals.com, checked offline (Ed25519 signature), covering `gauge` or the whole catalog. In edit mode, a wrong key shows "Invalid license key", "License expired (date)" or "This key does not cover this visual".
- Licenses last one year (one-time payment, no automatic renewal, key accepted for 30 more days, reminders 30 and 7 days before the end). Prices per year: 39 € personal, 99 € SME, 299 € enterprise, or the catalog pack (199 € / 399 € / 1,199 € per year; tiers by number of users: personal 1–10, SME 11–200, enterprise more than 200).

## Expected data shape

One number per gauge: measures, evaluated for the current filters (and for each category value when the category field is used).

| Region (`category`) | Revenue (`value`) | Target (`target`) | Revenue LY (`comparison`) |
|---|---|---|---|
| North | 1,412,000 | 1,350,000 | 1,301,000 |
| South | 1,098,000 | 1,180,000 | 1,012,000 |

- **One gauge per… (category)** (`category`, « Une jauge par… (catégorie) », one column): one gauge per value, in a grid (up to `layout.maxGauges`, 60 by default; "+N" beyond).
- **Value** (`value`, « Valeur », one measure, required).
- **Minimum value**, **Maximum value** (`min`, `max`, one measure each): the scale; otherwise `scale.min` / `scale.max` (text), otherwise 0 and the automatic maximum. Field > fixed value > automatic. A percentage measure (format %) with values up to 1 gets a 0–100% scale.
- **Target value** (`target`, « Valeur cible »): marker, label, gap ▲▼; otherwise `target.value` (fixed).
- **Comparison (previous year…) ★** (`comparison`, « Comparaison (année précédente…) ★ »): change ▲▼ under the value and a small hollow marker.
- **Range limits** (`thresholds`, « Limites des plages », up to 4 measures): the limits between ranges, in value units; they replace `ranges.mode`, `ranges.count` and `ranges.t1`–`t4`.
- **Extra needles ★** (`needles`, up to 3 measures): one needle each, with a needle legend.
- **History (date) ★** (`trend`, one column): the gauge shows the **last period**; a sparkline under the gauge shows every period.
- **Play axis ★** (`play`, « Axe de lecture ★ », one column): one frame per value.
- **Tooltips** (`tooltips`) and **Dynamic format** (`format`, see below).
- Volume: windows of 30,000 rows, more fetched with `fetchMoreData` up to 100,000 rows (a warning beyond).

## DAX recipes

```dax
Revenue = SUM ( Sales[Amount] )
Target = SUM ( Sales[Target amount] )
Revenue LY = CALCULATE ( [Revenue], SAMEPERIODLASTYEAR ( 'Date'[Date] ) )

// A rate: return 0.72 for 72% and give the measure the % format (scale 0–100% automatically)
Satisfaction = DIVIDE ( [Satisfied answers], [Answers] )

// Range limits from measures (drop them into Range limits, in this order)
Low limit = [Target] * 0.9
High limit = [Target]

// A scale ending at 120% of the target
Scale max = [Target] * 1.2

// Fill color driven by DAX: rename the measure gauge.fillColor in Dynamic format
Color versus target = IF ( [Revenue] >= [Target], "#2E7D4F", "#2A6F97" )
```

Do not put a column in Value without checking its summarization (sum by default). For a lead time or a cost, choose `ranges.colors` = `greenRed` (and, with a Comparison ★ measure, turn on `comparison.lowerIsBetter`).

## Interactions with the report

- Click a gauge (with the category field): cross-filter on that category; Ctrl + click adds one; click on an empty spot clears. Cross-highlighting from other visuals dims the gauges without highlighted values and shows the highlighted part. Context menu everywhere (right-click on a gauge or on the background).
- Hover: Power BI tooltip with value, target, % of target, comparison and change, minimum, maximum, range reached and the Tooltips measures; report-page tooltips are supported.
- Keyboard: Tab to the gauges, arrows to move, Enter or Space selects, Esc clears; on the play bar, Space plays or pauses, arrows step, Home / End. High contrast, ARIA labels ("Revenue: 1.53M, target 1.8M, 85% of the target…"), French and English.
- Animation: the arc and the needle glide to the new value (650 ms) after a filter; reduced when `style.animate` is off or the system asks for reduced motion.

## Dynamic formats

- **fx button** (Power BI conditional formatting) on colors and texts of the Format pane.
- **"Dynamic format" well** (`format`): measures renamed `card.setting` (e.g. `gauge.fillColor`, `gauge.type`, `ranges.t1`, `target.labelText`, `title.text`) drive any setting and win over the fixed value. Driving a ★ setting by DAX still shows the watermark without a key.

```dax
// renamed gauge.type
Gauge type = IF ( HASONEVALUE ( Sales[Region] ), "semi", "bullet" )
// renamed ranges.names
Range names = "Watch;Close;Reached"
```

## Format pane: option IDs

- Card order: `license`, `style`, `gauge`, `scale`, `ranges`, `needle`, `dial`, `callout`, `target`, `comparison`, `layout`, `history`, `play`, `tooltip`, `interaction`, then `title`, `source`, `container`, `texts`. Cards whose field is empty (Several gauges, History, Playback, Comparison) and settings replaced by a field (`target.value`, `scale.min`, `scale.max`, range limits) are hidden. Format pane in version 1.1.0.0 (30/10/2026), top to bottom: `license`, `style`, `layout`, `gauge`, `scale`, `ranges`, `needle`, `dial`, `callout`, `target`, `comparison`, `history`, `play`, `interaction`, `tooltip`, `title`, `source`, `container`, `texts`. Settings moved or renamed in this version keep working in older reports (the old names are still read).
- `gauge`: `type` (`semi` | `arc240` | `arc270` | `ring` | `custom` | `linear` | `vertical` | `bullet` | `thermometer` ★), `startAngle` (−360–360, −120, 0 = top), `sweep` (20–360, 240), `thickness` (3–80 % of the radius or height, 22), `rounded`, `trackColor`, `fillShow`, `fillColor` (empty = style data color), `colorByRange` (true), `fromZero` (true), `overflow` (`mark` | `extend` | `none`).
- `scale`: `min`, `max` (text, empty = automatic), `autoMax` (`nice` | `double` | `target`), `reverse`, `minMax` (true), `ticks` (false), `tickCount` (2–20, 5), `minor` (0–9, 4), `tickLabels`, `fontSize` (9), `color`, `tickUnits`, `tickDecimals`, `tickPrefix`, `tickSuffix`.
- `ranges`: `show` (false), `mode` (`percent` | `target` ★ | `values`), `count` (`2` | `3` | `4` ★ | `5` ★), `t1`–`t4` (50, 80, 90, 95), `colors` (`redGreen` | `greenRed` | `style` | `custom`), `c1`–`c5`, `gradient` ★, `display` (`track` faded in the track | `band` thin outer band | `full` solid speedometer), `opacity` (5–100, 28), `names` (separated by `;`), `showName` (true), `limitLabels`.
- `needle`: `show` (false), `style` (`classic` | `line` | `arrow` | `pointer` | `sport` ★), `color`, `width` (1–16, 4), `length` (40–115 % of the radius, 92), `hub`, `targetNeedle` ★, `compareNeedle` ★, `legend` (true).
- `dial`: `skin` (`none` | `classic` ★ | `sport` ★ | `retro` ★ | `cockpit` ★), `faceColor`.
- `callout`: `show`, `content` (`value` | `pctScale` | `pctTarget` | `valuePct`), `autoSize` (true), `fontSize` (8–120, 32: maximum when automatic), `color` (empty = range reached or text), `bold`, `units`, `decimals` (−1 = auto), `prefix`, `suffix`, `showLabel` (false), `label`, `labelSize` (11).
- `target`: `show`, `value` (fixed, text), `marker` (`line` | `triangle` | `dot`), `color`, `label`, `labelContent` (`nameValue` | `value` | `name`), `labelText`, `gap` (▲▼ under the value, true), `gapArc` ★ (false).
- `comparison` (card « Comparaison ★ », shown with the Comparison ★ field): `show`, `label` (default "vs <measure name>"), `content` (`pct` | `abs` | `both`), `marker`, `lowerIsBetter`, `posColor` (#2E7D4F), `negColor` (#C0392B).
- `layout`: `columns` (0 = automatic, up to 12), `sort` (`data` | `valueDesc` | `valueAsc` | `pctDesc` | `name`), `sharedScale` (true), `labelPosition` (`top` | `bottom` | `none`), `labelSize`, `gap` (12 px), `maxGauges` (1–200, 60).
- `history`: `show` ★ (true), `kind` (`area` | `line` | `columns`), `height` (10–50 % of the gauge, 22), `color`, `targetLine`, `lastDot`.
- `play` (common player): `start` (`last` by default), `speed` (ms per frame, 1000), `loop`, `autoPlay`, `transition`, `controls`, `position`, `ticks`, `tickLabels`, `stepButtons`, `speedButton`, `showLabel` (false in Gauge Plume), `labelSize` (32), `labelPosition` (`topLeft`), `trace` ★.
- `tooltip`: `show`, `pct`, `range`. `interaction`: `dim`.

## 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": "plumeGauge1F054613CBF04C5D8B56ED96A49BC450",
  "query": {
    "queryState": {
      "category":   { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Region" } }, "queryRef": "Sales.Region", "nativeQueryRef": "Region" } ] },
      "value":      { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Revenue" } }, "queryRef": "Sales.Revenue", "nativeQueryRef": "Revenue" } ] },
      "target":     { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Target" } }, "queryRef": "Sales.Target", "nativeQueryRef": "Target" } ] },
      "comparison": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Revenue LY" } }, "queryRef": "Sales.Revenue LY", "nativeQueryRef": "Revenue LY" } ] }
    }
  },
  "objects": {
    "gauge":  [ { "properties": { "type": { "expr": { "Literal": { "Value": "'arc240'" } } } } } ],
    "ranges": [ { "properties": { "show": { "expr": { "Literal": { "Value": "true" } } },
                                  "mode": { "expr": { "Literal": { "Value": "'target'" } } },
                                  "t1":   { "expr": { "Literal": { "Value": "90D" } } },
                                  "t2":   { "expr": { "Literal": { "Value": "100D" } } } } } ],
    "needle": [ { "properties": { "show": { "expr": { "Literal": { "Value": "true" } } } } } ],
    "layout": [ { "properties": { "sort": { "expr": { "Literal": { "Value": "'pctDesc'" } } } } } ]
  }
}
```

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`. The style sets the fill color, the font and the track; `minimal` draws a thinner arc, rounded styles round the ends, `cockpit`, `terminal` and `blueprint` show tick marks. Colors set in the Gauge, Color ranges and Needle cards win over the style.
- `style.themeJson` (Theme JSON ★): a JSON theme as plain text (format v2 with optional `extends` and groups `colors`, `palettes`, `typography`, `shape`, `table`, `marks`, `effects`). Full reference: https://plumevisuals.com/ai/tutorials/en/themes-json.md.

## Common pitfalls

- "Add a measure in "Value"": only the target or the comparison is placed.
- The gauge is almost empty: the scale is too wide; set `scale.max`, drop a measure into Maximum value, or `scale.autoMax` = `target`.
- "140%" instead of 72%: the rate measure returns 72 instead of 0.72.
- The ranges ignore the target: `ranges.mode` is `percent` (of the scale), or there is no target (the visual then falls back to % of the scale).
- The settings Range limits / Number of ranges disappeared: a measure is in the Range limits field, it decides.
- The gauge shows December only: a field is in History (date) ★; the gauge shows the last period by design. For a total, remove the field or use the Play axis ★.
- A ▲ tip at the end of the arc: the value is above the maximum (`gauge.overflow`).
- Watermark visible: a Play axis ★ field, a Comparison ★ measure, the thermometer, ranges in % of the target, the gap arc, 4 or 5 ranges (or 3–4 limit measures), gradient ranges, a dial skin, the Sport needle, target / comparison / extra needles, History with `history.show`, needle memory, a ★ style or a theme JSON, without a valid key.
- The visual makes no network request: data and license key stay in the report; no R or Python.

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

A logarithmic scale, a custom image or SVG as the dial face, several values stacked in one gauge (concentric rings, multi-series radial bars), a different measure per gauge of the grid (every gauge uses the same Value measure split by the category), a drill-down hierarchy in the category, a "liquid fill" or shape-filling gauge (that is Shape Gauge Plume), dragging the needle or the target to change a value (what-if input), exporting the gauge as an image, sounds or blinking alarms, live data feeds (the visual only shows the report's data).

## 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` | One gauge per… (category) | Une jauge par… (catégorie) | column | 1 | One gauge for each value of the field (region, product, sales person…), side by side |
| `value` | Value | Valeur | measure | 1 | The measure shown by the gauge |
| `min` | Minimum value | Valeur minimale | measure | 1 | Start of the scale (otherwise 0 or Format › Scale › Minimum) |
| `max` | Maximum value | Valeur maximale | measure | 1 | End of the scale (otherwise rounded above the value and the target, or Format › Scale › Maximum) |
| `target` | Target value | Valeur cible | measure | 1 | Goal: a marker and its label on the gauge |
| `comparison` | Comparison (previous year…) ★ | Comparaison (année précédente…) ★ | measure | 1 | Premium: value to compare with: change ▲▼ under the value and a small marker on the gauge |
| `thresholds` | Range limits | Limites des plages | measure | 4 | Up to 4 measures: the limits between the color ranges (red / orange / green…) |
| `needles` | Extra needles ★ | Aiguilles supplémentaires ★ | measure | 3 | Up to 3 measures, each one drawn as its own needle (forecast, budget, best month…) |
| `trend` | History (date) ★ | Historique (date) ★ | column | 1 | A date or period: a sparkline of the value under each gauge; the gauge shows the last period |
| `play` | Play axis ★ | Axe de lecture ★ | column | 1 | Premium: a date, a year or an ordered category: the needle and the arc move from one value to the next (play button) |
| `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` + `trend` + `play` (one row per combination), 30,000 rows per data window (more fetched automatically); measures = `value`, `min`, `max`, `target`, `comparison`, `thresholds`, `needles`, `tooltips`, `format`.
Capabilities: supportsHighlight, supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).

## Format pane options (191)

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

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

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

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

**Style**

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

**Custom colors / Couleurs personnalisées**

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

**Text / Texte**

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

**Animations**

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

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `layout.columns` | Columns (0 = automatic) | Colonnes (0 = automatique) | number | integer | `0` | 0 to 12 |  |
| `layout.sort` | Order | Ordre | dropdown | enumeration | `data` | `data` Data order; `valueDesc` Value, descending; `valueAsc` Value, ascending; `pctDesc` % of target, descending; `name` Name (A → Z) |  |
| `layout.sharedScale` | Same scale for every gauge | Même échelle pour toutes les jauges | toggle | bool | `true` | true / false | Off: each gauge computes its own automatic maximum (the Minimum / Maximum fields always apply per gauge). |
| `layout.labelPosition` | Category name | Nom de la catégorie | dropdown | enumeration | `top` | `top` Above; `bottom` Below; `none` Hidden |  |
| `layout.labelSize` | Name size | Taille du nom | number | formatting | `11` | 6 to 30 |  |
| `layout.gap` | Space between gauges (px) | Espace entre les jauges (px) | number | integer | `12` | 0 to 60 |  |
| `layout.maxGauges` | Maximum number of gauges | Nombre maximal de jauges | number | integer | `60` | 1 to 200 |  |

### Gauge / Jauge (`gauge`, Format pane)

**Shape / Forme**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gauge.type` | Gauge type | Type de jauge | dropdown | enumeration | `semi` | `semi` Semicircle (180°); `arc240` Arc (240°); `arc270` Arc (270°); `ring` Ring (full circle); `custom` Arc: custom angles; `linear` Horizontal linear; `vertical` Vertical linear; `bullet` Bullet chart; `thermometer` Thermometer ★ |  |
| `gauge.startAngle` | Start angle (°, 0 = top) | Angle de départ (°, 0 = en haut) | number | integer | `-120` | -360 to 360 | Visible when `gauge.type` = `custom` |
| `gauge.sweep` | Arc sweep (°) | Ouverture de l'arc (°) | number | integer | `240` | 20 to 360 | Visible when `gauge.type` = `custom` |
| `gauge.thickness` | Thickness (% of radius or height) | Épaisseur (% du rayon ou de la hauteur) | number | integer | `22` | 3 to 80 |  |
| `gauge.rounded` | Rounded ends | Extrémités arrondies | toggle | bool | `false` | true / false |  |
| `gauge.trackColor` | Track color (empty = grid) | Couleur de la piste (vide = grille) | color | fill | (empty) | hex color |  |

**Fill / Remplissage**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gauge.fillShow` | Fill up to the value | Remplir jusqu'à la valeur | toggle | bool | `true` | true / false |  |
| `gauge.fillColor` | Color (empty = style data color) | Couleur (vide = couleur des données du style) | color | fill | (empty) | hex color | Visible when `gauge.fillShow` = `true` |
| `gauge.colorByRange` | Color of the range reached | Couleur de la plage atteinte | toggle | bool | `true` | true / false | With color ranges: the fill and the value take the color of the range where the value is. |
| `gauge.fromZero` | Fill from zero (negative scale) | Remplir depuis zéro (échelle négative) | toggle | bool | `true` | true / false | When the scale crosses zero, the fill starts at zero: a negative value fills to the left. |
| `gauge.overflow` | Value out of scale | Valeur hors de l'échelle | dropdown | enumeration | `mark` | `mark` Flag it (▲ tip and exact value); `extend` Extend the scale; `none` Stop at the edge |  |

### Scale / Échelle (`scale`, Format pane)

**Minimum and maximum / Minimum et maximum**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `scale.min` | Minimum (without field) | Minimum (sans champ) | text | text | (empty) |  |  |
| `scale.max` | Maximum (without field) | Maximum (sans champ) | text | text | (empty) |  |  |
| `scale.autoMax` | Automatic maximum | Maximum automatique | dropdown | enumeration | `nice` | `nice` Rounded above the value and the target; `double` Twice the value (like Power BI); `target` The target (100% = target) |  |
| `scale.reverse` | Reverse direction | Sens inversé | toggle | bool | `false` | true / false |  |

**Ticks / Graduations**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `scale.minMax` | Minimum and maximum labels | Étiquettes du minimum et du maximum | toggle | bool | `true` | true / false |  |
| `scale.ticks` | Tick marks | Graduations | toggle | bool | `false` | true / false |  |
| `scale.tickCount` | Number of major ticks | Nombre de graduations principales | number | integer | `5` | 2 to 20 | Visible when `scale.ticks` = `true` |
| `scale.minor` | Minor ticks between two major ones | Graduations secondaires entre deux principales | number | integer | `4` | 0 to 9 | Visible when `scale.ticks` = `true` |
| `scale.tickLabels` | Tick labels | Étiquettes des graduations | toggle | bool | `true` | true / false | Visible when `scale.ticks` = `true` |
| `scale.fontSize` | Text size | Taille du texte | number | formatting | `9` | 6 to 24 |  |
| `scale.color` | Color (empty = secondary) | Couleur (vide = secondaire) | color | fill | (empty) | hex color |  |
| `scale.tickUnits` | Display units | Unités d'affichage | dropdown | enumeration | `auto` | `auto` Auto; `none` None; `k` Thousands; `m` Millions; `b` Billions |  |
| `scale.tickDecimals` | Decimals (-1 = auto) | Décimales (-1 = auto) | number | integer | `-1` | -1 to 6 |  |
| `scale.tickPrefix` | Prefix | Préfixe | text | text | (empty) |  |  |
| `scale.tickSuffix` | Suffix (e.g. €) | Suffixe (ex. €) | text | text | (empty) |  |  |

### Color ranges / Plages de couleurs (`ranges`, Format pane)

The card header toggle is `ranges.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `ranges.show` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `ranges.mode` | Range limits | Limites des plages | dropdown | enumeration | `percent` | `percent` In % of the scale; `target` In % of the target ★; `values` Values | Ignored when the Range limits field is filled (one measure per limit). % of the target: each gauge of a grid uses its own target. |
| `ranges.count` | Number of ranges | Nombre de plages | dropdown | enumeration | `3` | `2` 2; `3` 3; `4` 4 ★; `5` 5 ★ |  |
| `ranges.t1` | Limit 1 | Limite 1 | number | numeric | `50` |  |  |
| `ranges.t2` | Limit 2 | Limite 2 | number | numeric | `80` |  | Visible when `ranges.count` = `3` or `4` or `5` |
| `ranges.t3` | Limit 3 | Limite 3 | number | numeric | `90` |  | Visible when `ranges.count` = `4` or `5` |
| `ranges.t4` | Limit 4 | Limite 4 | number | numeric | `95` |  | Visible when `ranges.count` = `5` |
| `ranges.colors` | Colors | Couleurs | dropdown | enumeration | `redGreen` | `redGreen` Red → green (high is good); `greenRed` Green → red (low is good); `style` Style gradient; `custom` Custom |  |
| `ranges.c1` | Range 1 color | Couleur de la plage 1 | color | fill | (empty) | hex color | Visible when `ranges.colors` = `custom` |
| `ranges.c2` | Range 2 color | Couleur de la plage 2 | color | fill | (empty) | hex color | Visible when `ranges.colors` = `custom` |
| `ranges.c3` | Range 3 color | Couleur de la plage 3 | color | fill | (empty) | hex color | Visible when `ranges.colors` = `custom` |
| `ranges.c4` | Range 4 color | Couleur de la plage 4 | color | fill | (empty) | hex color | Visible when `ranges.colors` = `custom` |
| `ranges.c5` | Range 5 color | Couleur de la plage 5 | color | fill | (empty) | hex color | Visible when `ranges.colors` = `custom` |
| `ranges.gradient` | Continuous gradient ★ | Dégradé continu ★ | toggle | bool | `false` | true / false | The colors blend smoothly along the scale instead of solid bands. |
| `ranges.display` | Range display | Affichage des plages | dropdown | enumeration | `track` | `track` In the track, faded; `band` Thin outer band; `full` Solid (speedometer) |  |
| `ranges.opacity` | Faded ranges opacity (%) | Opacité des plages atténuées (%) | number | integer | `28` | 5 to 100 | Visible when `ranges.display` = `track` |
| `ranges.names` | Range names (separated by ;) | Noms des plages (séparés par ;) | text | text | (empty) |  |  |
| `ranges.showName` | Write the name of the range reached | Écrire le nom de la plage atteinte | toggle | bool | `true` | true / false |  |
| `ranges.limitLabels` | Limit values on the scale | Valeurs des limites sur l'échelle | toggle | bool | `false` | true / false |  |

### Needle / Aiguille (`needle`, Format pane)

The card header toggle is `needle.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `needle.show` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `needle.style` | Shape | Forme | dropdown | enumeration | `classic` | `classic` Tapered; `line` Line; `arrow` Arrow; `pointer` Pointer on the arc; `sport` Sport (counterweight) ★ |  |
| `needle.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |
| `needle.width` | Width (px) | Largeur (px) | number | integer | `4` | 1 to 16 |  |
| `needle.length` | Length (% of radius) | Longueur (% du rayon) | number | integer | `92` | 40 to 115 |  |
| `needle.hub` | Hub | Moyeu | toggle | bool | `true` | true / false |  |
| `needle.targetNeedle` | Needle for the target ★ | Aiguille pour la cible ★ | toggle | bool | `false` | true / false |  |
| `needle.compareNeedle` | Needle for the comparison ★ | Aiguille pour la comparaison ★ | toggle | bool | `false` | true / false |  |
| `needle.legend` | Needle legend (several needles) | Légende des aiguilles (plusieurs aiguilles) | toggle | bool | `true` | true / false |  |

### Dial / Cadran (`dial`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `dial.skin` | Skin | Habillage | dropdown | enumeration | `none` | `none` None; `classic` Classic (meter) ★; `sport` Sport (dashboard) ★; `retro` Retro (pressure gauge) ★; `cockpit` Cockpit (screen) ★ | Car-dashboard faces for the arc gauges: face, bezel, ticks and needle drawn in the visual. |
| `dial.faceColor` | Face color (empty = skin color) | Couleur du fond (vide = celle de l'habillage) | color | fill | (empty) | hex color | Visible when `dial.skin` = `classic` or `sport` or `retro` or `cockpit` |

### Callout value / Valeur centrale (`callout`, Format pane)

The card header toggle is `callout.show`.

**Value / Valeur**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `callout.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `callout.content` | Content | Contenu | dropdown | enumeration | `value` | `value` Value; `pctScale` % of the scale; `pctTarget` % of the target; `valuePct` Value and % of the target |  |
| `callout.autoSize` | Automatic size | Taille automatique | toggle | bool | `true` | true / false |  |
| `callout.fontSize` | Size (maximum when automatic) | Taille (maximum en automatique) | number | formatting | `32` | 8 to 120 |  |
| `callout.color` | Color (empty = range reached or text) | Couleur (vide = plage atteinte ou texte) | color | fill | (empty) | hex color |  |
| `callout.bold` | Bold | Gras | toggle | bool | `true` | true / false |  |

**Numbers / Nombres**

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

**Label / Libellé**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `callout.showLabel` | Label under the value | Libellé sous la valeur | toggle | bool | `false` | true / false |  |
| `callout.label` | Label text | Texte du libellé | text | text | (empty) |  | Visible when `callout.showLabel` = `true` |
| `callout.labelSize` | Label size | Taille du libellé | number | formatting | `11` | 6 to 30 |  |

### 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 |  |
| `target.value` | Fixed value (without field) | Valeur fixe (sans champ) | text | text | (empty) |  |  |
| `target.marker` | Marker | Repère | dropdown | enumeration | `line` | `line` Line; `triangle` Triangle; `dot` Dot |  |
| `target.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |
| `target.label` | Label | Étiquette | toggle | bool | `true` | true / false |  |
| `target.labelContent` | Label content | Contenu de l'étiquette | dropdown | enumeration | `nameValue` | `nameValue` Name and value; `value` Value; `name` Name | Visible when `target.label` = `true` |
| `target.labelText` | Target name | Nom de la cible | text | text | (empty) |  | Visible when `target.label` = `true`. Empty: the name of the “Target value” field (“Target” for a fixed value). The gap under the value keeps neutral words (“below target”). |
| `target.labelSize` | Label size | Taille de l'étiquette | number | formatting | `9` | 6 to 30 | Visible when `target.label` = `true` |
| `target.labelColor` | Label color (empty = target color) | Couleur de l'étiquette (vide = couleur de la cible) | color | fill | (empty) | hex color | Visible when `target.label` = `true` |
| `target.labelUnits` | Display units | Unités d'affichage | dropdown | enumeration | `auto` | `auto` Auto; `none` None; `k` Thousands; `m` Millions; `b` Billions | Visible when `target.label` = `true` |
| `target.labelDecimals` | Decimals (-1 = auto) | Décimales (-1 = auto) | number | integer | `-1` | -1 to 6 | Visible when `target.label` = `true` |
| `target.labelPrefix` | Prefix | Préfixe | text | text | (empty) |  | Visible when `target.label` = `true` |
| `target.labelSuffix` | Suffix (e.g. €) | Suffixe (ex. €) | text | text | (empty) |  | Visible when `target.label` = `true` |
| `target.gap` | Gap to target under the value (▲▼) | Écart à la cible sous la valeur (▲▼) | toggle | bool | `true` | true / false |  |
| `target.gapArc` | Gap arc between value and target ★ | Arc d'écart entre la valeur et la cible ★ | toggle | bool | `false` | true / false | Paints the part of the scale between the value and the target: favorable color when the target is beaten, unfavorable otherwise. |

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

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

The card header toggle is `comparison.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `comparison.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `comparison.label` | Label | Libellé | text | text | (empty) |  |  |
| `comparison.content` | Change shown | Écart affiché | dropdown | enumeration | `pct` | `pct` In %; `abs` As a value; `both` Value and % |  |
| `comparison.marker` | Marker on the gauge | Repère sur la jauge | toggle | bool | `true` | true / false |  |
| `comparison.lowerIsBetter` | A decrease is favorable | Une baisse est favorable | toggle | bool | `false` | true / false |  |
| `comparison.posColor` | Favorable | Favorable | color | fill | `#2E7D4F` | hex color |  |
| `comparison.negColor` | Unfavorable | Défavorable | color | fill | `#C0392B` | hex color |  |

### History (sparkline) / Historique (mini-courbe) (`history`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `history.show` | Sparkline under the gauge ★ | Mini-courbe sous la jauge ★ | toggle | bool | `true` | true / false | Needs the History (date) field. The gauge shows the last period; the sparkline shows every period. |
| `history.kind` | Shape | Forme | dropdown | enumeration | `area` | `area` Area; `line` Line; `columns` Columns |  |
| `history.height` | Height (% of the gauge) | Hauteur (% de la jauge) | number | integer | `22` | 10 to 50 |  |
| `history.color` | Color (empty = fill) | Couleur (vide = remplissage) | color | fill | (empty) | hex color |  |
| `history.targetLine` | Target line | Ligne de la cible | toggle | bool | `true` | true / false |  |
| `history.lastDot` | Dot on the last period | Point sur la dernière période | toggle | bool | `true` | true / false |  |

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

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `play.start` | Frame shown on opening | Image affichée à l'ouverture | dropdown | enumeration | `last` | `last` The last one (most recent); `first` The first one |  |
| `play.speed` | Duration of a frame (ms) | Durée d'une image (ms) | number | integer | `1000` | 100 to 10000 | At speed ×1; the speed button of the play bar multiplies it (×0.5 to ×4) for the session. |
| `play.loop` | Loop | Lecture en boucle | toggle | bool | `false` | true / false |  |
| `play.autoPlay` | Play automatically on opening | Lecture automatique à l'ouverture | toggle | bool | `false` | true / false | Once, from the first frame. Not when animations are reduced (Style › Animations or the system) nor on a dashboard tile. |
| `play.transition` | Animated transitions | Transitions animées | toggle | bool | `true` | true / false | Values, positions and colors move smoothly from one frame to the next. |
| `play.controls` | Play bar | Barre de lecture | toggle | bool | `true` | true / false |  |
| `play.position` | Bar position | Position de la barre | dropdown | enumeration | `bottom` | `bottom` Bottom; `top` Top | Visible when `play.controls` = `true` |
| `play.ticks` | Tick marks | Graduations | dropdown | enumeration | `auto` | `auto` Automatic; `all` Every frame; `none` None | Visible when `play.controls` = `true` |
| `play.tickLabels` | Tick labels | Étiquettes des graduations | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |
| `play.stepButtons` | Start and end buttons | Boutons début et fin | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |
| `play.speedButton` | Speed button | Bouton de vitesse | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |
| `play.showLabel` | Current value in large type | Valeur en cours en grand | toggle | bool | `false` | true / false |  |
| `play.labelSize` | Large value size | Taille de la valeur en grand | number | formatting | `32` | 12 to 160 | Visible when `play.showLabel` = `true` |
| `play.labelPosition` | Large value position | Position de la valeur en grand | dropdown | enumeration | `topLeft` | `bottomRight` Bottom right; `topRight` Top right; `topLeft` Top left; `bottomLeft` Bottom left; `center` Center | Visible when `play.showLabel` = `true` |
| `play.trace` | Needle memory (min. and max. reached) ★ | Mémoire de l'aiguille (min. et max. atteints) ★ | toggle | bool | `false` | true / false | While playing, the part of the scale already reached is drawn and the highest and lowest values are marked. |

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `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.pct` | % of the target | % de la cible | toggle | bool | `true` | true / false | Visible when `tooltip.show` = `true` |
| `tooltip.range` | Range reached | Plage atteinte | 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. |
