Skip to content
Plume Visuals
← Back
Core range

Line Plume

Lines and areas on a real time axis, with trends, forecasts and annotations that follow the data.

Tutorials ↓

Interactive demo

The real Power BI visual, running in your browser with the sample report's fictitious data. Switch scenario, style or year: the visual updates as it does in Power BI. Premium ★ features are shown here without the watermark; in Power BI, without a license, they show “Plume Visuals · Premium preview”.

Line Plume spaces dates by their real gap, with calendar ticks, and gives every series of a date in a single tooltip on hover. Straight, smooth or stepped lines, areas, secondary axis, missing values handled; small multiples, combo chart with columns, 100% areas, error bars and a zoom slider, like the native visuals. With premium, the Analytics pane adds trends and forecasts (from linear to Holt-Winters, with a forecast interval), moving averages, target and event lines; the future part turns dashed, the line changes color at a threshold, the gap between two series is shaded, and annotations attached to points follow the line when filters change.

Use cases

  • Monthly revenue by channel over three years
  • Events commented on the line (promotions, incidents)
  • A 12-month forecast with its margin of error
  • Actuals against a monthly target, green above and red below

FreeIncluded for free

  • Continuous time axis (years, quarters, months, weeks, days), numbers or categories
  • Straight, smooth or stepped lines; solid or stacked areas; missing values
  • Automatic markers, first and last, minimum and maximum; labels without overlap
  • Secondary Y axis (also with a legend), logarithmic scale, date format
  • Vertical guide on hover with every series, clickable legend, keyboard, animation
  • Small multiples (shared or own Y axis), line and column combo chart, 100% stacked areas
  • Error bars, zoom slider, gridlines, X-axis drill-down, series name from a measure
  • Dynamic formats: fx button on colors and texts, any option driven by DAX
  • Minimal and Black & White styles, custom colors, report theme
  • Per-series settings: style, width, markers, labels of each line

PremiumPremium features

  • Trends and forecasts: linear to Holt-Winters, 80 or 95% interval, equation and R²
  • Simple, weighted or exponential moving average
  • Reference lines (constants, statistics, measures) and vertical lines (today, dates, periods, events)
  • Dashed future part (from its own date for each series), threshold colors, area between two series
  • Annotations attached to points: “Annotate” button, list or text measure
  • End-of-line labels, one or several highlighted series, gradient areas
  • 17 more styles (Neon, Newspaper, Nordic…), palettes, theme JSON

Usable without a key to try them, with a watermark.

Tutorials

Start with Getting started, then pick from the how-to guides. The Fields and settings page describes every option of the Format pane.

  1. Getting startedBeginner9 min readClear line charts in Power BI with Line PlumeGet started with Line Plume in Power BI: prepare your data, plot one or several lines on a date axis and adjust the essential settings in about 10 minutes.
  2. How-to guidesIntermediate9 min readLine Plume: 8 how-to guides (dual axis, forecast, moving average…)Two axes, solid and dashed lines, moving average, forecast, dashed future part, target line, one series highlighted: step-by-step recipes for Line Plume.
  3. Fields and settingsIntermediate36 min readLine Plume: every field and setting explainedEvery field well and every setting in the Line Plume Format pane and Analytics pane, including per-series settings, with default values and premium features.
  4. Going furtherIntermediate5 min readAnnotate a line chart: comments attached to pointsExplain a peak or a dip right on the line with Line Plume: “Annotate” button, “x | series | text” list or DAX measure, annotations that follow the filters.
  5. BasicsGetting started with Plume visualsInstallation, license, styles and the settings shared by every visual.

Fields to drop into the visual

FieldContent
X axisDate, number or category; several fields = a hierarchy to drillRequired
Legend (series)Optional: one line per valueOptional
Small multiplesOptional: one chart per valueOptional
Y axis valuesOne or more measuresRequired
Secondary Y axis valuesOptional: a rate, an index…Optional
Reference lines (measures)Measure: a fixed or monthly target (stepped line)OptionalPremium
Vertical lines (events)Text, date or 1/0 measure: one line per eventOptionalPremium
Annotations (text)Text measure: one annotation per non-empty valueOptionalPremium
Lower bound (error bars)Measure: bottom of the error bar (value or deviation)Optional
Upper bound (error bars)Measure: top of the error bar (value or deviation)Optional
Series name (measure)Text measure that renames each series (e.g. "Web · +18%")Optional
TooltipsExtra measuresOptional
Dynamic formatMeasures renamed card.setting (e.g. title.text): the Format pane driven by DAXOptional

Missing a feature? We adapt our visuals or build custom ones. Request a custom visual

Found a bug in Line Plume, or have an idea to improve it? Report a bug · Suggest an idea

Technical reference for AI assistants

This section is meant for AI assistants (ChatGPT, Claude, Copilot…): every field, every Format pane option with its internal name, the expected data shape and DAX examples. Generated from the visual's code, version 1.5.0.0. Paste it into your assistant so it can guide you.

Raw Markdown version (/ai/visuals/line-chart.md)
# Line Plume: technical reference for AI assistants

> Power BI custom visual by Plume Studio (Plume Visuals). Visual version **1.5.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 Line 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/line-chart (French: https://plumevisuals.com/fr/visuels/line-chart)
- Summary: Lines and areas on a real time axis, with trends, forecasts and annotations that follow the data.
- Power BI visual GUID (`visualType`): `plumeLineChart5C1B8E47D2A04E9F9B36C7A2E1D5F084`
- 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

Line Plume (formerly Plume Line) is a Power BI custom visual (base range, version 1.5.0.0, installed from the `.pbiviz` file; AppSource submission in preparation) that draws line and area charts on a real time axis: dates are spaced by their real gap with calendar ticks (years, quarters, months, weeks, days, hours); numbers and categories work too. Straight, smooth (monotone, no overshoot) or step lines, solid or stacked areas, missing values (break, connect, zero), markers, a secondary Y axis (secondary series dashed, also with a Legend since 1.3.0.0) and a vertical hover guide that lists every series of the date in one tooltip. Premium adds **annotations attached to points** (x value + series) that follow the line when data or filters change, end-of-line labels, one highlighted series, gradient areas, and since 1.3.0.0 an Analytics pane with **trends and forecasts** (linear, polynomial, exponential, logarithmic, power, Holt, seasonal Holt-Winters, with an 80 % or 95 % forecast interval, projected periods and equation / R²), a **moving average**, **horizontal lines** (constants, statistics, free list, measures) and **vertical lines** (today, dates, shaded periods, event measure), plus a dashed **future part**, **threshold colors** and a shaded **area between two series** in Format › Lines. Since 1.4.0.0, a **Per-series settings** card sets these options series by series. Everything is computed inside the visual. New data draws from left to right; the same points glide.

**New in version 1.5.0.0 (30/10/2026):** Format pane reorganized (new **Gridlines** card); free native-parity additions: **small multiples** (shared or independent Y axis), **combo chart** (Per-series settings › Type = Columns), 100% stacked areas, **zoom slider**, error bars, date tick spacing, "Round the range", series name from a measure; premium **several highlighted series ★**.

## Free vs premium (★)

- Every feature works without a key and nothing is ever blocked. Free features never show a watermark.
- Shared Style card (the same in every Plume visual): the styles `none`, `minimal` and `blackWhite`, the two Plume gradient palettes (`crest`, `crestDiverging`), "Follow report theme" and all custom colors (`style.customColors` and the colors under it) are **free**; every other `style.preset`, the other gradient palettes (`style.palette`) and `style.themeJson` ("Theme JSON ★") are **premium** (watermark without a key). See "Styles and theme JSON" below.
- Using a premium feature without a valid key shows **"Plume Visuals · Premium preview"** (French: « Plume Visuals · Aperçu premium ») in the footer, with an "Unlock →" link to the pricing page. It disappears once a key is pasted in **Format › Plume Studio License › License key** (`license.key`; French: « Licence Plume Studio › Clé de licence »), the **first card** of the Format pane.
- Premium features of Line Plume (the watermark appears only when they actually apply):
  - the **Annotations ★** card: watermark when `annotations.show` is on (default) **and** at least one annotation exists (a valid line in `annotations.list`, or a non-blank value of the Annotations (text) measure);
  - the **End-of-line labels ★** card (`endLabels.show`), except when the free **Minimal** style turns them on by itself and they are left as they are (since 1.3.1.0); turned on by hand, or tuned under Minimal (`endLabels.content`, `fontSize`, `colorBy`, `hideLegend`), they are ★;
  - `dataColors.mode` = `highlight` ("Highlight one series ★");
  - `lines.area` = `gradient` ("Gradient ★");
  - the Analytics pane: **Horizontal lines ★** (`reference.*`, the `reference.list` free list, the role **Horizontal lines (measures)** `refY`), **Vertical lines ★** (`vlines.today`, `vlines.list`, the role **Vertical lines (events)** `events`), **Moving average ★** (`movingAvg.show`), **Trend and forecast ★** (`trend.show`);
  - Format › Lines: **future part dashed ★** (`lines.futureShow`), **threshold colors ★** (`lines.thrShow`), **area between two series ★** (`lines.betweenShow`);
- Accepted keys: only keys starting with `PLUM1.` from the buyer's account on plumevisuals.com, checked offline (Ed25519 signature), covering `line-chart` 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).

## Expected data shape

The visual reads **one row per x value** (and per series when Legend is used), with the measures evaluated for that row.

| X axis (`axis`) | Legend (`series`) | Y axis values (`values`) | Annotations (text) (`annotations`) |
|---|---|---|---|
| 2024-10-01 | Web | 48 210 | New website |
| 2024-11-01 | Web | 61 930 | |
| … | … | … | … |

- **X axis** (`axis`, label "X axis" / « Axe X », grouping, one field): a date column (use the field itself, not the Date Hierarchy), a number column (years as whole numbers) or any category. `xAxis.type` forces `continuous` or `categorical`.
- **Legend (series)** (`series`, « Légende (séries) », optional): one line per value. **With a Legend, Y axis values accepts one measure and Secondary Y axis values one measure** (one dashed line per series on the secondary axis, since 1.3.0.0).
- **Y axis values** (`values`, « Valeurs (axe Y) », measures): one line per measure without Legend.
- **Secondary Y axis values** (`values2`, « Valeurs (axe Y secondaire) », measures, optional): drawn dashed against `y2Axis`.
- **Annotations (text)** (`annotations`, « Annotations (texte) », one text measure, optional ★): one annotation per non-blank value, attached to the first main line of its group. With a Legend the measure is evaluated **per series**, so a measure that ignores the series annotates every line.
- **Horizontal lines (measures) ★** (`refY`, « Lignes horizontales (mesures) ★ », measures, optional): one line per measure, flat if the measure has the same value everywhere (target, What-if parameter), stepped if it changes along the X axis (monthly target); with a Legend, one line per series in its color; value shown in the tooltip.
- **Vertical lines (events) ★** (`events`, « Lignes verticales (événements) ★ », one measure, optional): a text measure (a line where it is not blank, labelled with the text), a date measure (a line at that date) or a 1/0 flag (a line where it is not 0).
- **Tooltips** (`tooltips`) and **Dynamic format** (`format`, see below).
- Volume: 30,000 x values per data window, more fetched automatically up to 100,000; beyond, a warning icon "Only the first n rows are loaded". Up to 60 series.

## Annotations: list syntax (`annotations.list`)

One line per annotation, `x | text` or `x | series | text`; lines starting with `#` or `//` are comments.

```text
# Comment
2023-11 | Web | Black Friday: Web record
2023-12-01 | Store | Christmas in store
2025-03-15 | Mid-March
```

- **x**: a date (`2024-06-01`, `2024-06`, `2024`, `2024-06-01T14:30`, `15/06/2024` with a day-first locale, `06/15/2024` in en-US), a number or a category as displayed. A date or number not in the data snaps to the nearest point inside the axis range; outside it, the annotation is hidden.
- **series**: optional; legend label, case and accents ignored. Empty: the first line that has a value at x.
- **text**: up to 4 wrapped lines. Escape a vertical bar as `\|`, a value starting with `#` or `//` as `\#…` / `\//…`.
- Unplaceable lines (unknown series, unreadable x) are reported at the bottom in edit mode only: "Annotation ignored (series or x not found): …". A filtered-out x is not an error.
- In edit mode (`annotations.editOnChart`), hovering shows an **"Annotate"** button: click a point, type, Enter (Esc cancels); the visual writes the line into the list. Drag to move (offsets saved in the hidden object `annotState.offsets`), double-click to edit, × to delete. Annotations from the measure can be dragged but not edited or deleted. Keyboard: Tab, "Annotate" (Enter), ← → date, ↑ ↓ line, Enter to type.

## Per-series settings (since 1.4.0.0)

Format › **Per-series settings** (`seriesFormat`, French « Réglages par série »), list **"Apply settings to"**: *All series*, then each series (each measure without a Legend; each Legend value with a Legend; with a Legend the secondary-axis measure is one entry). Priority: the series' own value, else *All series*, else the regular card (`inherit` = "Same as the … card").

- Free: `lineStyle` (`inherit`, `solid`, `dashed`, `dotted`), `width` (0 = Lines card), `shape` (`linear`, `smooth`, `step`), `markers`, `labels` (`on` / `off`), `area` (`none`, `solid`), `reference` (series counted in the computed horizontal lines).
- ★: `area` = `gradient`, `future` = `on` with its own `futureDate` (empty = the Lines card date, else today) and `futureStyle`, `threshold` = `on`, `between` = `first` / `second` (the two series of the area between two series, no names to type), `endLabel` = `on`, `trend` = `on` (a trend for this series with the Trend and forecast card settings, even when that card is off), `movingAvg` = `on`. `off` removes the feature from a series.
- One series only: `off` on All series, then `on` on that series. Example: CA solid and Marge brute dashed after July 2025 = Marge brute › Future part dashed: Yes, Starting from: 2025-07.
- In PBIP, per-series values are stored with the series selector (`"selector": { "metadata": "Sales.Revenue" }` for a measure, a data selector for a Legend value), All series without selector.

## Analytics pane (★, since 1.3.0.0)

- **Trend and forecast** (`trend.*`): `trend.kind` = `linear`, `poly` (`trend.degree` 2 to 6), `exp`, `log`, `power` (least squares), `holt` (Holt exponential smoothing, `trend.damped`), `holtWinters` (`trend.season`: 0 = automatic, 12 for months, 4 for quarters, 7 for days, 52 for weeks; needs two full seasons, else Holt). `trend.window` = 0 (all points) or the last N points; `trend.applyTo` = all series, primary axis or named series (`trend.names`, separated by `;`), one trend per series, Legend included. `trend.horizon` = 0 to 500 periods projected after the last point (months, quarters and years follow the calendar; also on a category axis: "+1, +2…" slots, or dates if categories are dates); the X axis is extended. `trend.interval` = `none`, `80`, `95` (Student prediction interval for regressions, approximate error variance at h steps for smoothing), `trend.bandOpacity`. `trend.projStyle`, `trend.endValue`, `trend.equation` (equation and R², x = period number), `trend.legend`. Hovering the projected zone shows the period, each series' forecast and the interval.
- **Moving average** (`movingAvg.*`): `period` 2 to 400 points, `method` = `simple`, `weighted`, `exponential` (α = 2 / (N + 1)), `align` = trailing or centered, `partial` (start with an incomplete window), `applyTo` / `names`, `dimSource` (opacity of the original line, 40 % by default), `legend`. Blank values are skipped. Independent from the trend (both can show).
- **Horizontal lines** (`reference.*`): 3 lines (`kindN` = constant, average, median, min, max, percentile), a band (`band`, `bandFrom`, `bandTo`), and the free list `reference.list`, one per line: `1200 | Target | #2E7D4F`, `260 000 | Record | accent | dotted`, `800..1000 | Target zone`, `y2: 30 % | Margin target` (secondary axis). Colors: `#RRGGBB`, `accent`, `favorable`, `défavorable` / `unfavorable`; styles `solid`, `dashed`, `dotted` (French `plein`, `tirets`, `pointillés`).
- **Vertical lines** (`vlines.*`): `vlines.today` (+ `todayLabel`), and the list `vlines.list`: `2024-03-15 | Launch | #B8462A | solid`, `2024-07..2024-08 | Summer` (shaded period from the start of July to the end of August), `today | Today`, `Q3 2024 | Acquisition` (category as displayed). Dates: `2024-03-15`, `2024-03`, `2024`, `15/03/2024` (`03/15/2024` in en-US). A date outside the axis is ignored; an unreadable line is reported at the bottom in edit mode only ("Horizontal line ignored" / "Vertical line ignored").
- Format › Lines: **future part** (`futureShow`, from `today` or `futureDate`, `futureStyle`): the line after that date is dashed, same series, no extra legend entry; **threshold** (`thrShow`, `thrSource` = fixed `thrValue` or the first horizontal line, `thrAbove` / `thrBelow` colors): the line, its area and markers change color at the exact crossing, the area goes from the line to the threshold; **area between two series** (`betweenShow`, `betweenA`, `betweenB`, `betweenUp`, `betweenDown`, `betweenOpacity`).

## DAX recipes

```dax
Revenue = SUM ( Sales[Amount] )
Margin rate = DIVIDE ( SUM ( Sales[Margin] ), [Revenue] )   // good candidate for the secondary axis

// Annotations (text) from a disconnected table Events[Month], Events[Text]
Event =
VAR m = MAX ( Sales[Month] )
RETURN CONCATENATEX ( FILTER ( Events, Events[Month] = m ), Events[Text], " · " )

// Horizontal lines (measures): a flat target, or a monthly target (stepped line)
Target = 40000
Monthly target = AVERAGEX ( VALUES ( Sales[Month] ), [Revenue] ) * 1.08

// Vertical lines (events): text where something happened, blank elsewhere
Milestone = SWITCH ( MAX ( Sales[Month] ), DATE ( 2024, 9, 1 ), "New website", BLANK () )

// With a Legend: annotate one series only
Event (Web only) = IF ( SELECTEDVALUE ( Sales[Channel] ) = "Web", [Event] )
```

## Interactions with the report

- Hover: vertical guide (`interaction.crosshair`) and one tooltip with every series at that x. Click = nearest point (cross-filters other visuals), Ctrl + click = add, click on the legend selects a whole series, legend hover highlights it.
- Keyboard: ← → move through x values (values are announced), Enter selects the x value, Esc clears.
- Line Plume is cross-filtered by other visuals (it does not render highlighting). Context menu, report-page tooltips, landing page, read-only on dashboards, high contrast (series told apart by solid, dashed and dotted strokes), reduced motion. No network request.

## Dynamic formats

- **fx button** on every color and text of the Format pane (*Field value*, *Rules*, *Gradient*), including `annotations.list` and `annotations.color`.
- **Dynamic format** field (role `format`): a measure renamed for this visual as `card.setting` drives **any** setting (sizes, toggles, lists, fonts, colors, texts); it wins over the fixed value, the style and an fx rule, and is never drawn. Names ignore case, accents and separator.
- Value used for a global setting: common value of all rows, else the total, else the first row; use `CALCULATE ( …, ALLSELECTED () )` for a whole-visual value.
- Examples: `annotations.list` = `CONCATENATEX ( Notes, FORMAT ( Notes[Month], "yyyy-MM" ) & " | " & Notes[Channel] & " | " & Notes[Text], UNICHAR ( 10 ) )` (line breaks are kept; the measure then overrides the typed list, so the "Annotate" button edits are not used); `lines.interpolation` = `"smooth"`; `title.subtitle` from a measure. A ★ setting driven by DAX stays ★.

## Format pane: how to read the tables below

- Each option has an ID `card.option` (object name + property name in capabilities.json).
- Card order: `license`, `style`, `dataColors` (dynamic "Data colors": mode, then one color per series stored with its selector), `lines`, `endLabels` (★), `labels`, `annotations` (★), `xAxis`, `yAxis`, `y2Axis` (shown only with secondary values), `legend`, `interaction`, then `title`, `source`, `container`, `texts`. `reference` (horizontal lines), `vlines` (vertical lines), `movingAvg` and `trend` are in the **Analytics** pane. Format pane in version 1.5.0.0 (30/10/2026), top to bottom: `license`, `style`, `dataColors`, `lines`, `seriesFormat`, `endLabels`, `labels`, `xAxis`, `yAxis`, `y2Axis`, `gridlines`, `legend`, `annotations`, `zoom`, `smallMultiples`, `interaction`, `tooltip`, `title`, `source`, `container`, `texts`; Analytics pane: `reference`, `vlines`, `errorBars`, `movingAvg`, `trend`. Settings moved or renamed in this version keep working in older reports (the old names are still read).
- `xAxis.dateFormat` is shown only for a time axis, `xAxis.labelMode` only for categories. Labels follow the Power BI Desktop language; `texts.language` can force French or English.

## Editing a PBIP report (visual.json)

`visualType` is the visual GUID, `queryState` keys are data role names, `objects` keys are option IDs. Literals: `true` / `false`, numbers with `D`, strings in single quotes (line breaks as `\n` in JSON), colors in `solid.color`.

```json
{
  "visualType": "plumeLineChart5C1B8E47D2A04E9F9B36C7A2E1D5F084",
  "query": {
    "queryState": {
      "axis":   { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Month" } }, "queryRef": "Sales.Month", "nativeQueryRef": "Month" } ] },
      "series": { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Channel" } }, "queryRef": "Sales.Channel", "nativeQueryRef": "Channel" } ] },
      "values": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Sales" } }, "Property": "Revenue" } }, "queryRef": "Sales.Revenue", "nativeQueryRef": "Revenue" } ] }
    }
  },
  "objects": {
    "lines":       [ { "properties": { "interpolation": { "expr": { "Literal": { "Value": "'smooth'" } } },
                                        "width": { "expr": { "Literal": { "Value": "2.5D" } } } } } ],
    "annotations": [ { "properties": { "list": { "expr": { "Literal": { "Value": "'2023-11 | Web | Black Friday: Web record\n2024-05 | Web | Mother''s Day campaign'" } } },
                                        "style": { "expr": { "Literal": { "Value": "'filled'" } } },
                                        "content": { "expr": { "Literal": { "Value": "'textValue'" } } } } } ],
    "xAxis":       [ { "properties": { "dateFormat": { "expr": { "Literal": { "Value": "'MMM yyyy'" } } } } } ],
    "license":     [ { "properties": { "key": { "expr": { "Literal": { "Value": "'PLUM1.…'" } } } } } ]
  }
}
```

A per-line color without Legend: `"dataColors": [ { "properties": { "fill": { "solid": { "color": { "expr": { "Literal": { "Value": "'#b8462a'" } } } } } }, "selector": { "metadata": "Sales.Revenue" } } ]`. Never write `annotState` by hand. The custom visual package must also be embedded in the report.

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

- Only years on the axis: the Date Hierarchy was dropped; use the date field itself.
- Same annotation repeated on each line: the Annotations (text) measure ignores the series (see DAX recipes).
- Annotation missing: x outside the current axis range, unknown series name, or `annotations.show` off. Check the edit-mode message at the bottom.
- `15/03/2025` read as month/day: dates in the list follow the number locale; ISO `2025-03-15` always works.
- Only one measure accepted in Y axis values: a Legend is set (one measure on each axis at most).
- Settings ignored for one series: the series has its own value in Per-series settings (it wins over the cards).
- No forecast drawn: `trend.horizon` is 0, or Holt-Winters has less than two full seasons (it falls back to Holt), or the series has fewer than 3 points.
- Log scale hides points: values ≤ 0 are ignored on a logarithmic axis.
- Watermark visible: annotations exist, end labels turned on or tuned by hand, highlight, gradient area, horizontal or vertical lines, moving average, trend, future part, threshold, area between series, or a ★ style, palette or theme JSON is used without a valid key. The free Minimal style alone never shows it.

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

Bars or columns combined with lines (use Bar Plume for bars), ARIMA / Prophet or forecasts computed outside the visual, forecasts of the secondary axis driven by another measure, more than one secondary axis, a different trend type per series, small multiples, drill-down inside the visual, play axis / time animation, annotation images or links, free-floating annotations not attached to a point, annotations on the secondary axis series from the measure, zoom slider, export of annotations.

## 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 |
|---|---|---|---|---|---|
| `axis` | X axis | Axe X | column | 1 |  |
| `series` | Legend (series) | Légende (séries) | column | 1 |  |
| `multiples` | Small multiples | Petits multiples | column | 1 |  |
| `values` | Y axis values | Valeurs (axe Y) | measure | several |  |
| `values2` | Secondary Y axis values | Valeurs (axe Y secondaire) | measure | several |  |
| `refY` | Reference lines (measures) ★ | Lignes de référence (mesures) ★ | measure | several | One horizontal line per measure (target, what-if parameter); a measure that varies along the X axis is drawn as steps. |
| `events` | Vertical lines (events) ★ | Lignes verticales (événements) ★ | measure | 1 | Text measure: a vertical line at each x where it is not empty, labeled with its text. Date measure: a vertical line at that date. |
| `annotations` | Annotations (text) ★ | Annotations (texte) ★ | measure | 1 | Optional text measure: each non-empty value is shown as an annotation on the point of the line (x and series). |
| `errorLow` | Lower bound (error bars) | Borne basse (barres d'erreur) | measure | 1 |  |
| `errorHigh` | Upper bound (error bars) | Borne haute (barres d'erreur) | measure | 1 |  |
| `seriesName` | Series name (measure) | Nom de la série (mesure) | measure | 1 | Text measure: renames each series of the legend (or the first series without a legend), e.g. "Sales " & [Year]. |
| `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 = `axis` + `multiples` (one row per combination), 30,000 rows per data window (more fetched automatically); measures = `values`, `values2`, `refY`, `events`, `annotations`, `errorLow`, `errorHigh`, `seriesName`, `tooltips`, `format`, grouped into series by `series`.
Capabilities: supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).

## Format pane options (325)

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)

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `dataColors.mode` | Coloring | Coloration | dropdown | enumeration | `auto` | `auto` Palette (one color per series); `single` Single color; `highlight` Highlight series ★ |  |
| `dataColors.single` | Color | Couleur | color | fill | (empty) | hex color |  |
| `dataColors.fill` | Color | Couleur | color | fill | (empty) | hex color |  |
| `dataColors.highlightWhat` | Highlighted series | Séries mises en avant | dropdown | enumeration | `last` | `last` Highest at the end; `first` First ones; `name` Named series |  |
| `dataColors.highlightN` | Number of series | Nombre de séries | number | integer | `1` | 1 to 12 | Highest at the end or first ones: how many series are highlighted. |
| `dataColors.highlightName` | Series names (separated by ;) | Noms des séries (séparés par ;) | text | text | (empty) |  | One or more series: "North; South". Each keeps its palette color (empty highlight color) or takes the highlight color. |
| `dataColors.highlightColor` | Highlight color (empty = accent, or palette if several) | Couleur mise en avant (vide = accent, ou palette si plusieurs) | color | fill | (empty) | hex color |  |
| `dataColors.othersColor` | Other series color (empty = style gray) | Couleur des autres séries (vide = gris du style) | color | fill | (empty) | hex color |  |

### Lines / Courbes (`lines`, Format pane)

**Stroke / Tracé**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `lines.width` | Width | Épaisseur | number | numeric | `2` | 0.5 to 8 |  |
| `lines.interpolation` | Shape | Forme | dropdown | enumeration | `linear` | `linear` Straight; `smooth` Smooth; `step` Step |  |
| `lines.style` | Line style | Style du trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `lines.missing` | Missing values | Valeurs manquantes | dropdown | enumeration | `gap` | `gap` Break the line; `connect` Connect points; `zero` Treat as zero |  |

**Markers / Marqueurs**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `lines.markers` | Markers | Marqueurs | dropdown | enumeration | `auto` | `auto` Automatic (few points); `none` None; `all` All points; `last` Last point; `ends` First and last; `minmax` Minimum and maximum |  |
| `lines.markerSize` | Size | Taille | number | integer | `6` | 2 to 20 | Visible when `lines.markers` = `auto` or `all` or `last` or `ends` or `minmax` |
| `lines.markerShape` | Shape | Forme | dropdown | enumeration | `circle` | `circle` Circle; `square` Square; `diamond` Diamond; `triangle` Triangle | Visible when `lines.markers` = `auto` or `all` or `last` or `ends` or `minmax` |
| `lines.markerHollow` | Hollow markers | Marqueurs creux | toggle | bool | `false` | true / false | Visible when `lines.markers` = `auto` or `all` or `last` or `ends` or `minmax` |

**Area / Aire**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `lines.area` | Fill under the line | Remplissage sous la courbe | dropdown | enumeration | `none` | `none` None; `solid` Solid; `gradient` Gradient ★ |  |
| `lines.areaOpacity` | Opacity (%) | Opacité (%) | number | integer | `18` | 2 to 90 | Visible when `lines.area` = `solid` or `gradient` |
| `lines.areaSeries` | Filled series | Séries remplies | dropdown | enumeration | `primary` | `primary` Primary Y axis; `all` All (secondary axis included); `named` Named series | Visible when `lines.area` = `solid` or `gradient` |
| `lines.areaNames` | Series names (separated by ;) | Noms des séries (séparés par ;) | text | text | (empty) |  | Visible when `lines.area` = `solid` or `gradient` |
| `lines.areaColor` | Color (empty = series color) | Couleur (vide = celle de la série) | color | fill | (empty) | hex color | Visible when `lines.area` = `solid` or `gradient` |
| `lines.stacked` | Stacked series | Séries empilées | toggle | bool | `false` | true / false | Each series is drawn on top of the previous one (stacked area). |
| `lines.percent` | 100% stacked | Empilées à 100 % | toggle | bool | `false` | true / false | Visible when `lines.stacked` = `true`. Each series as a share of the total of the date (100% stacked area, like the native visual). |

**Future part dashed ★ / Partie future en pointillés ★**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `lines.futureShow` | Show | Afficher | toggle | bool | `false` | true / false | The same line turns dashed after a date: actuals then forecast, with no second series and no duplicate legend entry. |
| `lines.futureFrom` | Starting from | À partir de | dropdown | enumeration | `today` | `today` Today; `date` A date or a value |  |
| `lines.futureDate` | Date or value | Date ou valeur | text | text | (empty) |  | Visible when `lines.futureFrom` = `date` |
| `lines.futureStyle` | Line style | Style du trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |

**Color by threshold ★ / Couleur selon un seuil ★**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `lines.thrShow` | Show | Afficher | toggle | bool | `false` | true / false | The line (and its area) changes color exactly where it crosses the threshold. |
| `lines.thrSource` | Threshold | Seuil | dropdown | enumeration | `value` | `value` Fixed value; `reference` First reference line |  |
| `lines.thrValue` | Value | Valeur | number | numeric | `0` |  | Visible when `lines.thrSource` = `value` |
| `lines.thrAbove` | Color above | Couleur au-dessus | color | fill | `#2E7D4F` | hex color |  |
| `lines.thrBelow` | Color below | Couleur en dessous | color | fill | `#C0392B` | hex color |  |

**Area between two series ★ / Aire entre deux séries ★**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `lines.betweenShow` | Show | Afficher | toggle | bool | `false` | true / false | Shades the gap between two lines (actual and budget, minimum and maximum…): one color when the first is above, another when it falls below. |
| `lines.betweenA` | First series (empty = 1st) | Première série (vide = la 1re) | text | text | (empty) |  |  |
| `lines.betweenB` | Second series (empty = 2nd) | Seconde série (vide = la 2e) | text | text | (empty) |  |  |
| `lines.betweenUp` | Color when the first is above | Couleur quand la première est au-dessus | color | fill | `#2E7D4F` | hex color |  |
| `lines.betweenDown` | Color when the first is below | Couleur quand la première est en dessous | color | fill | `#C0392B` | hex color |  |
| `lines.betweenOpacity` | Opacity (%) | Opacité (%) | number | integer | `22` | 2 to 90 |  |

### Per-series settings / Réglages par série (`seriesFormat`, Format pane)

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `seriesFormat.name` | Display name (empty = field name) | Nom affiché (vide = nom du champ) | text | text | (empty) |  | Renames the series in the legend, labels and tooltips. The "Series name (measure)" field computes it in DAX. |
| `seriesFormat.kind` | Type | Type | dropdown | enumeration | `inherit` | `inherit` Line; `column` Columns (combo chart) | Columns: the series is drawn as columns under the lines, on its axis (primary or secondary), like the native combo chart. |
| `seriesFormat.lineStyle` | Line style | Style de trait | dropdown | enumeration | `inherit` | `inherit` Same as the Lines card; `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `seriesFormat.width` | Width (0 = Lines card) | Épaisseur (0 = carte Courbes) | number | numeric | `0` | 0 to 8 |  |
| `seriesFormat.shape` | Shape | Forme | dropdown | enumeration | `inherit` | `inherit` Same as the Lines card; `linear` Straight; `smooth` Smooth; `step` Step |  |
| `seriesFormat.markers` | Markers | Marqueurs | dropdown | enumeration | `inherit` | `inherit` Same as the Lines card; `none` None; `all` All points; `last` Last point; `ends` First and last; `minmax` Minimum and maximum |  |
| `seriesFormat.labels` | Data labels | Étiquettes de données | dropdown | enumeration | `inherit` | `inherit` Same as the Labels card; `on` Shown; `off` Hidden |  |
| `seriesFormat.area` | Fill under the line | Remplissage sous la courbe | dropdown | enumeration | `inherit` | `inherit` Same as the Lines card; `none` None; `solid` Solid; `gradient` Gradient ★ |  |
| `seriesFormat.future` | Future part dashed | Partie future en pointillés | dropdown | enumeration | `inherit` | `inherit` Same as the Lines card; `on` Yes ★; `off` No | Yes: the line changes style from the date below (empty = the one of the Lines card, otherwise today). One series solid, the other dashed after July 2025, for instance. |
| `seriesFormat.futureDate` | Starting from (date or value) | À partir de (date ou valeur) | text | text | (empty) |  |  |
| `seriesFormat.futureStyle` | Future part line style | Trait de la partie future | dropdown | enumeration | `inherit` | `inherit` Same as the Lines card; `dashed` Dashed; `dotted` Dotted; `solid` Solid |  |
| `seriesFormat.threshold` | Color by threshold | Couleur selon le seuil | dropdown | enumeration | `inherit` | `inherit` Same as the Lines card; `on` Yes ★; `off` No |  |
| `seriesFormat.between` | Area between two series | Aire entre deux séries | dropdown | enumeration | `inherit` | `inherit` Same as the Lines card; `first` First series of the area ★; `second` Second series of the area ★ | Pick the first and second series here instead of typing their names in the Lines card. |
| `seriesFormat.endLabel` | End-of-line label | Étiquette en bout de courbe | dropdown | enumeration | `inherit` | `inherit` Same as the End-of-line labels card; `on` Yes ★; `off` No |  |
| `seriesFormat.trend` | Trend | Tendance | dropdown | enumeration | `inherit` | `inherit` Same as the Analytics pane; `on` Yes ★; `off` No | Yes: a trend for this series, with the settings of the Trend card of the Analytics pane, even when the card is off. For a single series: "No" on All series, then "Yes" on that series. |
| `seriesFormat.movingAvg` | Moving average | Moyenne mobile | dropdown | enumeration | `inherit` | `inherit` Same as the Analytics pane; `on` Yes ★; `off` No |  |
| `seriesFormat.reference` | Counted in computed lines | Comptée dans les lignes calculées | dropdown | enumeration | `inherit` | `inherit` Same as the Analytics pane (primary axis); `on` Yes; `off` No | Computed reference lines of the Analytics pane (average, median, minimum, maximum, percentile): series taken into account. |

### End-of-line labels ★ / Étiquettes en bout de courbe ★ (`endLabels`, 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 `endLabels.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `endLabels.show` | Show | Afficher | toggle | bool | `false` | true / false | Names the series directly at the end of each line, instead of a legend. |
| `endLabels.content` | Content | Contenu | dropdown | enumeration | `nameValue` | `name` Series name; `value` Last value; `nameValue` Name and last value |  |
| `endLabels.fontSize` | Text size | Taille du texte | number | formatting | `10` | 6 to 24 |  |
| `endLabels.colorBy` | Color | Couleur | dropdown | enumeration | `series` | `series` Series color; `text` Text |  |
| `endLabels.hideLegend` | Hide the legend | Masquer la légende | toggle | bool | `true` | true / false |  |

### 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 | `false` | true / false |  |
| `labels.position` | Position | Position | dropdown | enumeration | `auto` | `auto` Automatic; `above` Above; `below` Below |  |
| `labels.which` | Labeled points | Points étiquetés | dropdown | enumeration | `all` | `all` All (no overlap); `last` Last point; `ends` First and last; `minmax` Minimum and maximum |  |
| `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.halo` | Text halo | Halo autour du texte | toggle | bool | `true` | true / false |  |
| `labels.declutter` | Hide overlapping labels | Masquer les étiquettes qui se chevauchent | 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) |  |  |

### X axis / Axe X (`xAxis`, Format pane)

The card header toggle is `xAxis.show`.

**Values / Valeurs**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `xAxis.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `xAxis.fontSize` | Size | Taille | number | formatting | `9` | 6 to 24 |  |
| `xAxis.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `xAxis.labelMode` | Long labels | Étiquettes longues | dropdown | enumeration | `auto` | `auto` Automatic; `wrap` Two lines; `rotate45` Tilted (45°); `rotate90` Vertical; `truncate` Truncated (…) |  |
| `xAxis.maxSize` | Maximum room (% of the visual) | Place maximale (% du visuel) | number | integer | `30` | 10 to 60 |  |
| `xAxis.line` | Axis line | Trait de l'axe | toggle | bool | `true` | true / false |  |
| `xAxis.type` | Axis type | Type d'axe | dropdown | enumeration | `auto` | `auto` Automatic; `continuous` Continuous; `categorical` Categorical | Continuous: dates and numbers are spaced by their real gap. |
| `xAxis.dateFormat` | Date format | Format des dates | text | text | (empty) |  |  |
| `xAxis.tickUnit` | Date ticks | Graduations des dates | dropdown | enumeration | `auto` | `auto` Automatic; `year` Years; `quarter` Quarters; `month` Months; `week` Weeks; `day` Days | Continuous date axis: one tick per chosen unit. Two neighboring ticks never show the same label. |
| `xAxis.tickEvery` | Every N units | Toutes les N unités | number | integer | `1` | 1 to 100 | Visible when `xAxis.tickUnit` = `year` or `quarter` or `month` or `week` or `day` |

**Axis title / Titre de l'axe**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `xAxis.showTitle` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `xAxis.titleText` | Text | Texte | text | text | (empty) |  | Visible when `xAxis.showTitle` = `true` |

### Y axis / Axe Y (`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.scale` | Scale | Échelle | dropdown | enumeration | `linear` | `linear` Linear; `log` Logarithmic |  |
| `yAxis.min` | Minimum | Minimum | text | text | (empty) |  |  |
| `yAxis.max` | Maximum | Maximum | text | text | (empty) |  |  |
| `yAxis.zero` | Always include zero | Toujours inclure zéro | toggle | bool | `false` | true / false | Visible when `yAxis.scale` = `linear` |
| `yAxis.ticks` | Number of ticks (approx.) | Nombre de graduations (environ) | number | integer | `5` | 2 to 20 |  |
| `yAxis.invert` | Invert axis | Inverser l'axe | toggle | bool | `false` | true / false |  |
| `yAxis.round` | Round range | Arrondir la plage | toggle | bool | `true` | true / false | Computed bounds rounded to a round tick. Off: the axis stops at the extreme values. |

**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` |

### Secondary Y axis / Axe Y secondaire (`y2Axis`, Format pane)

The card header toggle is `y2Axis.show`.

**Values / Valeurs**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `y2Axis.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `y2Axis.fontSize` | Size | Taille | number | formatting | `9` | 6 to 24 |  |
| `y2Axis.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `y2Axis.units` | Display units | Unités d'affichage | dropdown | enumeration | `auto` | `auto` Auto; `none` None; `k` Thousands; `m` Millions; `b` Billions |  |
| `y2Axis.decimals` | Decimals (-1 = auto) | Décimales (-1 = auto) | number | integer | `-1` | -1 to 6 |  |
| `y2Axis.prefix` | Prefix | Préfixe | text | text | (empty) |  |  |
| `y2Axis.suffix` | Suffix (e.g. €) | Suffixe (ex. €) | text | text | (empty) |  |  |
| `y2Axis.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 |
|---|---|---|---|---|---|---|---|
| `y2Axis.scale` | Scale | Échelle | dropdown | enumeration | `linear` | `linear` Linear; `log` Logarithmic |  |
| `y2Axis.min` | Minimum | Minimum | text | text | (empty) |  |  |
| `y2Axis.max` | Maximum | Maximum | text | text | (empty) |  |  |
| `y2Axis.zero` | Always include zero | Toujours inclure zéro | toggle | bool | `false` | true / false | Visible when `y2Axis.scale` = `linear` |
| `y2Axis.ticks` | Number of ticks (approx.) | Nombre de graduations (environ) | number | integer | `5` | 2 to 20 |  |
| `y2Axis.invert` | Invert axis | Inverser l'axe | toggle | bool | `false` | true / false |  |
| `y2Axis.round` | Round range | Arrondir la plage | toggle | bool | `true` | true / false | Computed bounds rounded to a round tick. Off: the axis stops at the extreme values. |

**Axis title / Titre de l'axe**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `y2Axis.showTitle` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `y2Axis.titleText` | Text | Texte | text | text | (empty) |  | Visible when `y2Axis.showTitle` = `true` |

### Gridlines / Quadrillage (`gridlines`, Format pane)

**Horizontal**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gridlines.hShow` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `gridlines.hColor` | Color (empty = style grid) | Couleur (vide = grille du style) | color | fill | (empty) | hex color |  |
| `gridlines.hWidth` | Width | Épaisseur | number | numeric | `1` | 0.5 to 6 |  |
| `gridlines.hStyle` | Line style | Style de trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `gridlines.zeroLine` | Zero line | Ligne du zéro | toggle | bool | `true` | true / false |  |

**Vertical**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gridlines.vShow` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `gridlines.vColor` | Color (empty = style grid) | Couleur (vide = grille du style) | color | fill | (empty) | hex color |  |
| `gridlines.vWidth` | Width | Épaisseur | number | numeric | `1` | 0.5 to 6 |  |
| `gridlines.vStyle` | Line style | Style de trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |

### 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 | `true` | true / false | Shown when the chart has several series. |
| `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 |  |
| `legend.interactive` | Click = select the series | Clic = sélectionner la série | toggle | bool | `true` | true / false |  |

### Annotations ★ (`annotations`, 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 `annotations.show`.

**Content / Contenu**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `annotations.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `annotations.list` | Annotations (one per line) | Annotations (une par ligne) | textarea | text | (empty) |  | One line per annotation: "x \| text" or "x \| series \| text". x: date (2024-06-01, 2024-06, 06/15/2024), number or category as displayed. The annotation stays attached to that point of the line. In edit mode, the chart's "Annotate" button fills this list. |
| `annotations.content` | Displayed content | Contenu affiché | dropdown | enumeration | `text` | `text` Text; `textValue` Text and value; `textXValue` Text, x and value |  |
| `annotations.editOnChart` | "Annotate" button (edit mode) | Bouton « Annoter » (mode édition) | toggle | bool | `true` | true / false | In edit mode, an "Annotate" button appears when hovering the chart: then click a point of the line to annotate it. Annotations can be dragged, edited with a double-click and removed with ×. |

**Look / Apparence**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `annotations.style` | Style | Style | dropdown | enumeration | `bubble` | `bubble` Bubble; `filled` Filled label; `plain` Text only |  |
| `annotations.color` | Color (empty = series color) | Couleur (vide = celle de la série) | color | fill | (empty) | hex color |  |
| `annotations.fontSize` | Text size | Taille du texte | number | formatting | `10` | 7 to 24 |  |
| `annotations.bold` | Bold | Gras | toggle | bool | `false` | true / false |  |
| `annotations.maxWidth` | Maximum width (px) | Largeur maximale (px) | number | integer | `160` | 60 to 400 |  |

**Marker and connector / Repère et trait**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `annotations.marker` | Marker on the point | Repère sur le point | toggle | bool | `true` | true / false |  |
| `annotations.connector` | Connector | Trait vers le point | dropdown | enumeration | `line` | `line` Line; `none` None |  |
| `annotations.connectorStyle` | Line style | Style du trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted | Visible when `annotations.connector` = `line` |
| `annotations.position` | Default position | Position par défaut | dropdown | enumeration | `auto` | `auto` Automatic (no overlap); `above` Above; `below` Below; `right` Right; `left` Left | Position of annotations that have not been dragged. |
| `annotations.distance` | Distance from the point (px) | Distance au point (px) | number | integer | `26` | 6 to 160 |  |

### Zoom (`zoom`, Format pane)

The card header toggle is `zoom.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `zoom.show` | Zoom slider | Curseur de zoom | toggle | bool | `false` | true / false | Two-handle slider below the axis: choose the visible range (drag, keyboard). The position is not saved in the report. |
| `zoom.labels` | Slider labels | Étiquettes du curseur | toggle | bool | `true` | true / false |  |
| `zoom.height` | Height (px) | Hauteur (px) | number | integer | `22` | 14 to 48 |  |

### Small multiples / Petits multiples (`smallMultiples`, Format pane)

**Grid / Grille**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `smallMultiples.columns` | Columns (0 = automatic) | Colonnes (0 = automatique) | number | integer | `0` | 0 to 12 |  |
| `smallMultiples.minHeight` | Minimum panel height (px) | Hauteur minimale d'un panneau (px) | number | integer | `100` | 40 to 600 | Below that, the grid scrolls vertically. |
| `smallMultiples.gap` | Spacing (px) | Espacement (px) | number | integer | `14` | 0 to 60 |  |
| `smallMultiples.scale` | Y axis | Axe Y | dropdown | enumeration | `shared` | `shared` Shared by all panels; `independent` Independent per panel |  |
| `smallMultiples.border` | Panel border | Cadre des panneaux | toggle | bool | `false` | true / false |  |

**Titles / Titres**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `smallMultiples.titleShow` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `smallMultiples.titleSize` | Size | Taille | number | formatting | `10` | 6 to 24 |  |
| `smallMultiples.titleColor` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |
| `smallMultiples.titleAlign` | Alignment | Alignement | dropdown | enumeration | `left` | `left` Start; `center` Center |  |

### Reference lines ★ / Lignes de référence ★ (`reference`, Analytics pane)

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

**Line 1 / Ligne 1**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `reference.show1` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `reference.kind1` | Value | Valeur | dropdown | enumeration | `average` | `constant` Constant; `average` Average; `median` Median; `min` Minimum; `max` Maximum; `percentile` Percentile |  |
| `reference.value1` | Constant value | Valeur constante | number | numeric | `0` |  | Visible when `reference.kind1` = `constant` |
| `reference.pct1` | Percentile | Centile | number | integer | `90` | 1 to 99 | Visible when `reference.kind1` = `percentile` |
| `reference.label1` | Label | Libellé | text | text | (empty) |  |  |
| `reference.showValue1` | Show the value | Afficher la valeur | toggle | bool | `true` | true / false |  |
| `reference.color1` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `reference.style1` | Line style | Style de trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `reference.width1` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `reference.labelPos1` | Label position | Position du libellé | dropdown | enumeration | `end` | `end` End; `start` Start; `none` None |  |

**Line 2 / Ligne 2**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `reference.show2` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `reference.kind2` | Value | Valeur | dropdown | enumeration | `constant` | `constant` Constant; `average` Average; `median` Median; `min` Minimum; `max` Maximum; `percentile` Percentile |  |
| `reference.value2` | Constant value | Valeur constante | number | numeric | `0` |  | Visible when `reference.kind2` = `constant` |
| `reference.pct2` | Percentile | Centile | number | integer | `90` | 1 to 99 | Visible when `reference.kind2` = `percentile` |
| `reference.label2` | Label | Libellé | text | text | (empty) |  |  |
| `reference.showValue2` | Show the value | Afficher la valeur | toggle | bool | `true` | true / false |  |
| `reference.color2` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `reference.style2` | Line style | Style de trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `reference.width2` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `reference.labelPos2` | Label position | Position du libellé | dropdown | enumeration | `end` | `end` End; `start` Start; `none` None |  |

**Line 3 / Ligne 3**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `reference.show3` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `reference.kind3` | Value | Valeur | dropdown | enumeration | `median` | `constant` Constant; `average` Average; `median` Median; `min` Minimum; `max` Maximum; `percentile` Percentile |  |
| `reference.value3` | Constant value | Valeur constante | number | numeric | `0` |  | Visible when `reference.kind3` = `constant` |
| `reference.pct3` | Percentile | Centile | number | integer | `90` | 1 to 99 | Visible when `reference.kind3` = `percentile` |
| `reference.label3` | Label | Libellé | text | text | (empty) |  |  |
| `reference.showValue3` | Show the value | Afficher la valeur | toggle | bool | `true` | true / false |  |
| `reference.color3` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `reference.style3` | Line style | Style de trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `reference.width3` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `reference.labelPos3` | Label position | Position du libellé | dropdown | enumeration | `end` | `end` End; `start` Start; `none` None |  |

**More lines and bands / Autres lignes et zones**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `reference.list` | Lines (one per line) | Lignes (une par ligne) | textarea | text | (empty) |  | "value \| label \| color \| style": as many lines as needed. "a..b \| label \| color" shades a band. Prefix "y2:" for the secondary axis (y2: 0.3 \| Target margin). Color #RRGGBB and style (solid, dashed, dotted) are optional. |

**Lines from measures / Lignes issues des mesures**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `reference.mShape` | Shape | Forme | dropdown | enumeration | `auto` | `auto` Automatic; `flat` Horizontal (last value); `step` Steps along the X axis; `line` Straight, along the X axis | Measures dropped in the "Reference lines (measures)" field. Automatic: horizontal when the measure has the same value everywhere (target, what-if parameter), steps otherwise (monthly target). With a legend, one line per series, in its color. |
| `reference.mColor` | Color (empty = accent or series) | Couleur (vide = accent ou série) | color | fill | (empty) | hex color |  |
| `reference.mStyle` | Line style | Style du trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `reference.mWidth` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `reference.mLabel` | Label | Libellé | dropdown | enumeration | `nameValue` | `nameValue` Name and value; `name` Name; `value` Value; `none` None |  |

**Reference band / Bande de référence**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `reference.band` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `reference.bandFrom` | From | De | number | numeric | `0` |  |  |
| `reference.bandTo` | To | À | number | numeric | `0` |  |  |
| `reference.bandLabel` | Label | Libellé | text | text | (empty) |  |  |
| `reference.bandColor` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `reference.bandOpacity` | Opacity (%) | Opacité (%) | number | integer | `12` | 2 to 60 |  |

### Vertical lines ★ / Lignes verticales ★ (`vlines`, Analytics pane)

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

**Today / Aujourd'hui**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `vlines.today` | Show | Afficher | toggle | bool | `false` | true / false | Vertical line at today's date (date axis, or categories that are dates). |
| `vlines.todayLabel` | Label | Libellé | text | text | (empty) |  |  |
| `vlines.todayColor` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |

**Dates and periods / Dates et périodes**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `vlines.list` | Lines and periods (one per line) | Lignes et périodes (une par ligne) | textarea | text | (empty) |  | "x \| label \| color \| style": x = date (2024-03-15, 2024-03, 03/15/2024, today), number or category as displayed. "x1..x2 \| label \| color" shades a period. Optional color #RRGGBB, style: solid, dashed or dotted. Measures in the "Vertical lines (events)" field add their own lines. |

**Look / Apparence**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `vlines.color` | Color (empty = muted text) | Couleur (vide = texte atténué) | color | fill | (empty) | hex color |  |
| `vlines.style` | Line style | Style du trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `vlines.width` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `vlines.labelPos` | Labels | Libellés | dropdown | enumeration | `top` | `top` Top; `bottom` Bottom; `none` None |  |
| `vlines.labelOrient` | Text direction | Sens du texte | dropdown | enumeration | `horizontal` | `horizontal` Horizontal; `vertical` Along the line | Visible when `vlines.labelPos` = `top` or `bottom` |
| `vlines.fontSize` | Text size | Taille du texte | number | formatting | `9` | 6 to 20 |  |
| `vlines.bandOpacity` | Periods opacity (%) | Opacité des périodes (%) | number | integer | `10` | 2 to 60 |  |

### Error bars / Barres d'erreur (`errorBars`, Analytics pane)

The card header toggle is `errorBars.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `errorBars.show` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `errorBars.source` | Bounds | Bornes | dropdown | enumeration | `fields` | `fields` Lower / Upper bound fields (values); `relative` Lower / Upper bound fields (± deltas); `percent` Percentage of the value | With a single delta field, it is used on both sides. Primary and secondary axis series. |
| `errorBars.pct` | Percentage (±) | Pourcentage (±) | number | numeric | `10` | 0 to 100 | Visible when `errorBars.source` = `percent` |
| `errorBars.shape` | Shape | Forme | dropdown | enumeration | `bar` | `bar` Whiskers; `band` Shaded band |  |
| `errorBars.color` | Color (empty = series color) | Couleur (vide = celle de la série) | color | fill | (empty) | hex color |  |
| `errorBars.width` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `errorBars.cap` | Cap width (px) | Largeur des taquets (px) | number | integer | `6` | 0 to 40 | Visible when `errorBars.shape` = `bar` |
| `errorBars.opacity` | Band opacity (%) | Opacité de la bande (%) | number | integer | `18` | 2 to 80 | Visible when `errorBars.shape` = `band` |

### Moving average ★ / Moyenne mobile ★ (`movingAvg`, Analytics pane)

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

The card header toggle is `movingAvg.show`.

**Calculation / Calcul**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `movingAvg.show` | Show | Afficher | toggle | bool | `false` | true / false | Moving average of each series, on top of the line (and of any trend). |
| `movingAvg.period` | Number of points | Nombre de points | number | integer | `3` | 2 to 400 | Window size, in axis points (3 = three months on a monthly axis, 7 = one week on a daily axis). |
| `movingAvg.method` | Average | Moyenne | dropdown | enumeration | `simple` | `simple` Simple; `weighted` Weighted (recent points count more); `exponential` Exponential |  |
| `movingAvg.align` | Window | Fenêtre | dropdown | enumeration | `trailing` | `trailing` Previous points (trailing); `centered` Centered on the point | Visible when `movingAvg.method` = `simple` or `weighted` |
| `movingAvg.partial` | From the first points | Dès les premiers points | toggle | bool | `false` | true / false | Also compute on an incomplete window at the start (otherwise the average starts at the N-th point). |
| `movingAvg.applyTo` | Series | Séries | dropdown | enumeration | `all` | `all` All; `primary` Primary Y axis; `named` Named series |  |
| `movingAvg.names` | Series names (separated by ;) | Noms des séries (séparés par ;) | text | text | (empty) |  | Visible when `movingAvg.applyTo` = `named` |

**Look / Apparence**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `movingAvg.color` | Color (empty = series color) | Couleur (vide = celle de la série) | color | fill | (empty) | hex color |  |
| `movingAvg.style` | Line style | Style du trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `movingAvg.width` | Width | Épaisseur | number | numeric | `2.5` | 0.5 to 8 |  |
| `movingAvg.dimSource` | Original line opacity (%) | Opacité de la courbe d'origine (%) | number | integer | `40` | 5 to 100 | 100 = original line unchanged; lower, the moving average stands out. |
| `movingAvg.legend` | In the legend | Dans la légende | toggle | bool | `false` | true / false |  |

### Trend ★ / Tendance ★ (`trend`, Analytics pane)

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

The card header toggle is `trend.show`.

**Calculation / Calcul**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `trend.show` | Show | Afficher | toggle | bool | `false` | true / false | Trend of each series, optionally extended into the future with a forecast interval. |
| `trend.kind` | Type | Type | dropdown | enumeration | `linear` | `linear` Linear; `poly` Polynomial; `exp` Exponential; `log` Logarithmic ★; `power` Power ★; `holt` Exponential smoothing (Holt); `holtWinters` Seasonal (Holt-Winters) |  |
| `trend.degree` | Order | Degré | number | integer | `2` | 2 to 6 | Visible when `trend.kind` = `poly` |
| `trend.season` | Season in periods (0 = automatic) | Saison en périodes (0 = automatique) | number | integer | `0` | 0 to 400 | Visible when `trend.kind` = `holtWinters`. Automatic: 12 for months, 4 for quarters, 7 for days, 52 for weeks. At least two full seasons are needed. |
| `trend.damped` | Damped trend | Tendance amortie | toggle | bool | `false` | true / false | Visible when `trend.kind` = `holt` or `holtWinters`. The slope flattens along the forecast (conservative forecasts). |
| `trend.window` | Fit on the last N points (0 = all) | Calcul sur les N derniers points (0 = tous) | number | integer | `0` | 0 to 100000 |  |
| `trend.applyTo` | Series | Séries | dropdown | enumeration | `all` | `all` All; `primary` Primary Y axis; `named` Named series |  |
| `trend.names` | Series names (separated by ;) | Noms des séries (séparés par ;) | text | text | (empty) |  | Visible when `trend.applyTo` = `named` |

**Forecast / Projection**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `trend.horizon` | Forecast periods | Périodes projetées | number | integer | `0` | 0 to 500 | Number of axis steps added after the last point (months, quarters, days, categories…). 0 = no forecast. |
| `trend.interval` | Forecast interval | Intervalle de prévision | dropdown | enumeration | `80` | `none` None; `80` 80%; `95` 95% |  |
| `trend.bandOpacity` | Interval opacity (%) | Opacité de l'intervalle (%) | number | integer | `14` | 2 to 60 | Visible when `trend.interval` = `80` or `95` |
| `trend.projStyle` | Forecast line style | Style de la projection | dropdown | enumeration | `dotted` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `trend.endValue` | Value at the end of the forecast | Valeur en fin de projection | toggle | bool | `true` | true / false |  |

**Look / Apparence**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `trend.color` | Color (empty = series color) | Couleur (vide = celle de la série) | color | fill | (empty) | hex color |  |
| `trend.style` | Line style | Style du trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |
| `trend.width` | Width | Épaisseur | number | numeric | `1.5` | 0.5 to 6 |  |
| `trend.equation` | Equation and R² | Équation et R² | toggle | bool | `false` | true / false | x = period number (1 = first point of the axis). |
| `trend.legend` | In the legend | Dans la légende | toggle | bool | `false` | true / false |  |

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `interaction.hover` | Highlight on hover | Mettre en avant au survol | toggle | bool | `true` | true / false |  |
| `interaction.dim` | Dimmed items opacity (%) | Opacité des éléments estompés (%) | number | integer | `25` | 5 to 80 |  |
| `interaction.crosshair` | Vertical guide on hover | Repère vertical au survol | toggle | bool | `true` | true / false | Shows every series at the hovered date in one tooltip. |

### Tooltips / Infobulles (`tooltip`, Format pane)

The card header toggle is `tooltip.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `tooltip.show` | Show | Afficher | toggle | bool | `true` | true / false | Tooltip on hover (with the fields of the "Tooltips" well and report page tooltips). |

### Title / Titre (`title`, Format pane)

The card header toggle is `title.show`.

**Title / Titre**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `title.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `title.text` | Text | Texte | text | text | (empty) |  | Leave empty for an automatic title built from the fields. |
| `title.fontSize` | Size | Taille | number | formatting | `14` | 7 to 40 |  |
| `title.bold` | Bold | Gras | toggle | bool | `true` | true / false |  |
| `title.italic` | Italic | Italique | toggle | bool | `false` | true / false |  |
| `title.underline` | Underline | Souligné | toggle | bool | `false` | true / false |  |
| `title.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |
| `title.bgColor` | Background color | Couleur d'arrière-plan | color | fill | (empty) | hex color |  |
| `title.align` | Horizontal alignment | Alignement horizontal | dropdown | enumeration | `left` | `left` Left; `center` Center; `right` Right |  |
| `title.wrap` | Text wrap | Retour automatique à la ligne | toggle | bool | `true` | true / false |  |

**Subtitle / Sous-titre**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `title.subtitle` | Subtitle | Sous-titre | text | text | (empty) |  | Several lines allowed: type \n to go to the next line. |
| `title.subFontSize` | Size | Taille | number | formatting | `11` | 7 to 30 | Visible when `title.subtitle` =  |
| `title.subColor` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color | Visible when `title.subtitle` =  |
| `title.subItalic` | Italic | Italique | toggle | bool | `false` | true / false | Visible when `title.subtitle` =  |

**Divider / Séparateur**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `title.divider` | Show divider | Afficher le séparateur | toggle | bool | `false` | true / false |  |
| `title.dividerColor` | Color (empty = lines) | Couleur (vide = traits) | color | fill | (empty) | hex color | Visible when `title.divider` = `true` |
| `title.dividerStyle` | Line style | Style de trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted | Visible when `title.divider` = `true` |
| `title.dividerWidth` | Width | Épaisseur | number | integer | `1` | 1 to 6 | Visible when `title.divider` = `true` |

**Spacing / Espacement**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `title.spaceBelow` | Space below the title (px) | Espace sous le titre (px) | number | integer | `4` | 0 to 40 |  |

### Source note / Note de source (`source`, Format pane)

The card header toggle is `source.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `source.show` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `source.text` | Text | Texte | text | text | (empty) |  |  |
| `source.fontSize` | Size | Taille | number | formatting | `9` | 6 to 20 |  |
| `source.italic` | Italic | Italique | toggle | bool | `false` | true / false |  |
| `source.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `source.align` | Alignment | Alignement | dropdown | enumeration | `left` | `left` Left; `center` Center; `right` Right |  |

### Frame / Cadre (`container`, Format pane)

**Background / Arrière-plan**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `container.bgShow` | Background | Arrière-plan | toggle | bool | `false` | true / false |  |
| `container.bgColor` | Color | Couleur | color | fill | `#FFFFFF` | hex color | Visible when `container.bgShow` = `true` |
| `container.bgColor2` | Gradient end (optional) | Fin du dégradé (optionnel) | color | fill | (empty) | hex color | Visible when `container.bgShow` = `true` |
| `container.bgTransparency` | Transparency (%) | Transparence (%) | slider | numeric | `0` | 0 to 100 | Visible when `container.bgShow` = `true` |

**Border / Bordure**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `container.border` | Border | Bordure | toggle | bool | `false` | true / false |  |
| `container.borderColor` | Color (empty = lines) | Couleur (vide = traits) | color | fill | (empty) | hex color | Visible when `container.border` = `true` |
| `container.borderWidth` | Width | Épaisseur | number | integer | `1` | 0 to 6 | Visible when `container.border` = `true` |
| `container.radius` | Rounded corners | Coins arrondis | number | integer | `8` | 0 to 24 |  |

**Shadow / Ombre**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `container.shadow` | Shadow | Ombre | toggle | bool | `false` | true / false |  |
| `container.shadowColor` | Color (empty = soft) | Couleur (vide = douce) | color | fill | (empty) | hex color | Visible when `container.shadow` = `true` |
| `container.shadowSize` | Blur (px) | Flou (px) | number | integer | `12` | 0 to 40 | Visible when `container.shadow` = `true` |

**Spacing / Marges**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `container.padding` | Inner padding | Marge intérieure | number | integer | `8` | 0 to 40 |  |

### Language and numbers / Langue et nombres (`texts`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `texts.language` | Interface language | Langue de l'interface | dropdown | enumeration | `auto` | `auto` Same as Power BI; `fr` French; `en` English |  |
| `texts.numberLocale` | Number format locale (e.g. en-GB) | Format des nombres (ex. fr-FR) | text | text | (empty) |  | Thousands and decimal separators. Empty: same as Power BI. |

### Other objects (not in the Format pane cards above)

- `annotState`: `annotState.offsets` (text), internal state saved by the visual in edit mode (column widths, positions of dragged annotations); leave it alone.