Skip to content
Plume Visuals
← Back

Ridgeline chart for Power BI Ridgeline Plume

Overlapping ridges that tell decades of data at a glance, with time animation.

Certified by MicrosoftMICROSOFT CERTIFIED • POWER BI •
Tutorials ↓
Get it on Microsoft MarketplaceThe visual's official Microsoft listing · free to install

Interactive demo

The real Power BI visual, running in your browser with the sample report's data (Météo-France, SIM2). Premium ★ features are shown here without the watermark; in Power BI, without a license, they show “Plume Visuals · Premium preview”.

Ridgeline Plume stacks one curve per category (year, station, product…) with a slight overlap, like the famous climate charts. You instantly see how a distribution shifts over time. With premium, years appear one after another, a ridge unfolds into a detailed chart in one click, and a reference curve highlights anomalies.

Use cases

  • Temperature or soil dryness year after year
  • Sales seasonality over 10 years
  • Response-time distribution per week
  • Hourly footfall by day of week

FreeIncluded for free

  • Classic ridgeline and minimal mode (KPI tile)
  • Overlap, spacing, order, smooth curves, height scale
  • Color gradient along the curve, per-ridge or single color, 2 palettes, report theme
  • Click filters other visuals, highlighting, tooltips, context menu, drill-through
  • Full accessibility: keyboard, screen readers, high contrast
  • Gridlines, Y-axis range (scale kept under filters), a value on each ridge
  • Dynamic formats: fx button on colors and texts, any option driven by DAX
  • Minimal and Black & White styles, custom colors (background, text, accent, series, gradient)

PremiumPremium features

  • Time animation: play ▶, speed, giant counter, trail
  • Focus mode: double-click a ridge to unfold it into a detailed chart, Back button
  • Catalog-wide styles (Neon, Newspaper, Graphite…), climate palettes, theme JSON, shadow and glow
  • Reference curve, anomalies, band, thresholds, ranking
  • Comparison (all ridges in 2D, the others in gray), heatmap and perspective modes
  • Position cursor when the report is filtered, annotations

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 startedBeginner11 min readCreate a climate ridgeline in Power BIGet started with Ridgeline Plume: go from weather data to a ridgeline chart, prepare the columns, add the visual to your report and set the key options.
  2. How-to guidesIntermediate7 min readRidgeline Plume: 8 how-to guides (Unknown Pleasures, normals, animation…)Histogram per group, the Unknown Pleasures look, top 10 years, deviation from the normal, year-by-year animation and annotations, step by step.
  3. Fields and settingsIntermediate29 min readRidgeline Plume: every field and setting explainedEvery field well and every setting in the Format pane and Analytics pane of Ridgeline Plume: what each one does, its possible values and its default value.
  4. BasicsGetting started with Plume visualsInstallation, license, styles and the settings shared by every visual.

Fields to drop into the visual

FieldContent
Ridge (one per value)Category: year, station, country…Required
X axisDay of year, month, hour, numberRequired
HeightMeasure: ridge amplitudeRequired
ColorMeasure: color along the curveOptional
TooltipsExtra measuresOptional
OrderSort ridges by this valueOptional
Ridge labelText shown instead of the ridge nameOptional
ReferenceNormal, target, previous yearOptionalPremium
Band lowLower bound of the envelopeOptionalPremium
Band highUpper bound of the envelopeOptionalPremium
Cursor: current ridgee.g. SELECTEDVALUE of a disconnected tableOptionalPremium
Cursor: X positionVertical line at this XOptionalPremium
Annotation textText shown at this ridge and XOptionalPremium
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 Ridgeline 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.8.0.0. Paste it into your assistant so it can guide you.

Raw Markdown version (/ai/visuals/ridgeline-pulse.md)
# Ridgeline Plume: technical reference for AI assistants

> Power BI custom visual by Plume Studio (Plume Visuals). Visual version **1.8.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 Ridgeline 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/ridgeline-pulse (French: https://plumevisuals.com/fr/visuels/ridgeline-pulse)
- Summary: Overlapping ridges that tell decades of data at a glance, with time animation.
- Power BI visual GUID (`visualType`): `ridgelinePulseCF957CB0A5DC40138058B1F71340838F`
- 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

Ridgeline Plume is a Power BI custom visual that draws a ridgeline chart (also called joy plot): one filled curve per category ("ridge"), stacked vertically with overlap. Typical use: one ridge per year, X = day of year, Height = a daily measure (temperature, sales, response time…). Alternative display modes: minimal sparkline, comparison overlay ★, heatmap / warming stripes ★, perspective ★. Premium features also include time animation, focus mode (a ridge unfolds into a detailed chart), reference curve and anomalies, cursor, annotations.

**New in version 1.8.0.0 (30/10/2026):** Format pane reorganized to the shared v2 order; free native-parity additions: Tooltips switch, gridlines, Y-axis range (fixed or measures, scale kept under filters), data labels on the curves, X-axis unit; premium 2D comparison of all ridges (spaghetti mode ★); playback can start from the final state.

## Free vs premium (★)

- Every feature works without a key. 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.
- A ★ in a label marks a premium feature. Choosing a ★ option, or filling a ★ field, shows a "Premium preview" watermark until a license key is pasted in **Format › Plume Studio License › License key** (first card of the Format pane) (`license.key`).
- The ▶ play button (`animation.enabled`) and focus mode (`focus.enabled`) are ON by default as a showcase: the watermark only appears while they are being used, then disappears.
- Accepted keys: only the key starting with `PLUM1.` shown in the buyer's account on plumevisuals.com (since version 1.4.1.0; short 10-character keys are no longer accepted).

## Expected data shape

The visual reads a **long table: one row per (Ridge, X) pair**.

| Ridge (`ridge`) | X axis (`x`) | Height (`height`) |
|---|---|---|
| 2003 | 1 | 4.2 |
| 2003 | 2 | 4.5 |
| … | … | … |
| 2004 | 1 | 3.9 |

- **Ridge** (column, optional): one ridge per distinct value. Without a Ridge field the visual draws a single ridge named after the Height measure. Numeric names (years) are sorted numerically; text names keep Power BI's sort order (use "Sort by column" in the model).
- **X axis** (column, required). The column's data type decides the axis:
  - number / whole number → numeric axis (e.g. day of year 1–366, hour 0–23, week 1–53);
  - **date / datetime → converted to day of year**: every ridge runs from January 1st to December 31st. Putting a full `Date` column in X and `Year` in Ridge works directly;
  - text → ordinal axis in Power BI's sort order of that column (for month names, set "Sort by column" on the month number).
- **Height** (measure, required): evaluated by Power BI for each (Ridge, X) row.
- If a ridge receives several rows for the same X (for example a Date in X but no Year in Ridge, so several years fold onto the same day), the values are **averaged** and a warning is shown in edit mode. Fix: put the year (or the right grain) in Ridge.
- Each well accepts one field, except **Tooltips** (several measures).
- Volume: 30,000 rows per data window, more rows are fetched automatically (`fetchMoreData`). Example: 70 years × 366 days ≈ 25,600 rows.

### How each optional measure is read

| Field | Evaluated per | Notes |
|---|---|---|
| Color (`color`) | (Ridge, X) | Default coloring is a gradient along the curve (`colors.colorMode` = `alongCurve`). `byRidge` uses the mean of Color per ridge. |
| Tooltips (`tooltips`) | (Ridge, X) | Added to the standard Power BI tooltip; report-page tooltips are supported. |
| Order (`sortBy`) | (Ridge, X), then **averaged per ridge** (blank rows ignored) | Used when `ridges.order` = `sortAsc` / `sortDesc`, or `ridges.topNFrom` = `top`. |
| Ridge label (`label`) | first non-empty value per ridge | Text shown instead of the ridge name (e.g. "2003 — heatwave"). |
| Reference ★ (`reference`) | (Ridge, X) | Dashed curve on each ridge; `analytics.anomaly` colors the gap above / below it. |
| Band low / high ★ (`bandLow`, `bandHigh`) | (Ridge, X) | Shaded envelope (min–max, P10–P90, confidence interval). |
| Cursor: current ridge ★ (`cursor`) | **single value** (first non-blank) | Matched against the ridge name (raw value, number) or the ridge label. |
| Cursor: X position ★ (`cursorX`) | **single value** | Vertical line at this X (same type as the X field: a date is converted to day of year). |
| Annotation text ★ (`annotation`) | (Ridge, X) | Return BLANK() everywhere except where a text must appear. |

## DAX recipes

```dax
// Calculated columns on a daily table 'Meteo'
Year = YEAR ( Meteo[Date] )
DayOfYear = DATEDIFF ( DATE ( YEAR ( Meteo[Date] ), 1, 1 ), Meteo[Date], DAY ) + 1

// 7-day moving average for Height (keeps the year filter set by the ridge)
Temp smoothed 7d =
VAR d = SELECTEDVALUE ( Meteo[DayOfYear] )
RETURN
    CALCULATE (
        AVERAGE ( Meteo[TempMax] ),
        FILTER ( ALL ( Meteo[DayOfYear] ), Meteo[DayOfYear] >= d - 3 && Meteo[DayOfYear] <= d + 3 )
    )

// Reference (normal) and anomaly
Normal 1961-1990 = CALCULATE ( [Temp smoothed 7d], Meteo[Year] >= 1961, Meteo[Year] <= 1990 )
Anomaly = [Temp smoothed 7d] - [Normal 1961-1990]

// Annotation: text only where an event is recorded
Event = VAR e = MAX ( Meteo[Event] ) RETURN IF ( e = "", BLANK (), e )

// Cursor driven by a disconnected slicer table
// New table: CursorYear = SELECTCOLUMNS ( GENERATESERIES ( 1959, 2026, 1 ), "Year", [Value] )
Selected year = SELECTEDVALUE ( CursorYear[Year] )
```

The visual also has a built-in moving average ★ (`ridges.smoothing`, in points) if you prefer not to write DAX.

## Interactions with the report

- **Click on a ridge** applies a slicer-like basic filter (`In`) on the Ridge field to the other visuals (`interaction.crossFilter`, on by default). Ctrl+click adds ridges. Click in empty space clears. The filter can be synced across pages ("Sync slicers").
- **Incoming highlight**: when another visual highlights some ridges, `interaction.highlightMode` decides: `dim` the others (default), `hide` them, show a `cursor` only, or open focus automatically (`autoFocus`).
- **"Where am I" cursor ★ when the page is filtered**: a slicer that *filters* the visual removes the other years. Two solutions: (1) select the slicer, Format › Edit interactions, set Ridgeline Plume to **Highlight** instead of Filter; the visual keeps all ridges and marks the highlighted one with `interaction.cursorStyle`; or (2) feed the `cursor` / `cursorX` fields with a measure on a disconnected table (see DAX above).
- Standard Power BI behaviors are supported: tooltips and report-page tooltips, context menu, drill-through, keyboard navigation (Tab between ridges, Enter to select, Esc), screen readers, high contrast, bookmarks (focus and mode chosen in the visual are persisted).

## Format pane: how to read the tables below

- Each option has an ID `card.option` (for example `ridges.overlap`). The card is the capabilities.json **object name**, the option is the **property name**.
- Labels are shown in English and French: the Format pane follows the language of Power BI Desktop (File › Options › Regional settings › Application language). Data field names follow the same rule.
- "Visible when" means the option only appears in the Format pane when another option of the same card has one of the listed values.
- The `Reference & analytics ★` card lives in the **Analytics pane** (magnifying glass icon), not in the Format pane.
- The `state` card is internal (persists focus / mode chosen in the visual) and never appears in the Format pane: do not set it by hand.

## Editing a PBIP report (visual.json)

In a PBIP project, the visual's `visual.json` uses the visual GUID as `visualType`, the data role names as `queryState` keys, and the option IDs as `objects`. Literal syntax: booleans `true` / `false`, numbers suffixed with `D`, strings and enumeration values in single quotes, colors wrapped in `solid.color`.

```json
{
  "visualType": "ridgelinePulseCF957CB0A5DC40138058B1F71340838F",
  "query": {
    "queryState": {
      "ridge":  { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Meteo" } }, "Property": "Year" } }, "queryRef": "Meteo.Year" } ] },
      "x":      { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Meteo" } }, "Property": "DayOfYear" } }, "queryRef": "Meteo.DayOfYear" } ] },
      "height": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Meteo" } }, "Property": "Temp smoothed 7d" } }, "queryRef": "Meteo.Temp smoothed 7d" } ] }
    }
  },
  "objects": {
    "ridges":  [ { "properties": { "overlap": { "expr": { "Literal": { "Value": "250D" } } },
                                    "normalization": { "expr": { "Literal": { "Value": "'global'" } } } } } ],
    "style":   [ { "properties": { "palette": { "expr": { "Literal": { "Value": "'warmingStripes'" } } } } } ],
    "colors":  [ { "properties": { "singleColor": { "solid": { "color": { "expr": { "Literal": { "Value": "'#1d3557'" } } } } } } } ],
    "license": [ { "properties": { "key": { "expr": { "Literal": { "Value": "'PLUM1.…'" } } } } } ]
  }
}
```

The custom visual package must also be embedded in the report (Power BI does this when the visual is imported from AppSource or from the `.pbiviz` file).

## Styles and theme JSON

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

## Common pitfalls

- Empty visual or "Add a measure in Height" / "Add a field in X axis": a required field is missing, or the measure is blank for the current filters.
- Ridges look flat or identical: check `ridges.normalization` (`global` keeps ridges comparable, `perRidge` stretches each ridge to its own range).
- "Several values per X on a ridge: averaged": the Ridge field is missing or too coarse (see "Expected data shape").
- Too many ridges to read: raise `ridges.overlap`, use `labels.everyN` to thin labels, `ridges.topN` ★ to keep N ridges, or `display.scrollable` ★ to scroll.
- Month names in X appear in alphabetical order: set "Sort by column" on the month number in the model.
- Watermark visible: a ★ option is selected or a ★ field is filled without a valid key. Free features never show it.
- The visual makes no network request: data and license key stay in the report.

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

Horizon chart, spiral, small multiples, morphing animation, lasso selection, X-range brush, magnifier, density (KDE) from raw values, ridge groups, image per ridge, image / GIF export. Some of them appeared in early marketing material but were removed before version 1.4.

## 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 |
|---|---|---|---|---|---|
| `ridge` | Ridge (one per value) | Crête (une par valeur) | column | 1 | Year, station, product… |
| `x` | X axis | Axe X | column | 1 | Day of year, month, date or number |
| `height` | Height | Hauteur | measure | 1 | Ridge amplitude |
| `color` | Color | Couleur | measure | 1 | Colors the ridge (e.g. max temperature) |
| `tooltips` | Tooltips | Infobulles | measure | several | Extra values in the tooltip |
| `sortBy` | Order | Ordre | measure | 1 | Sort ridges by this value |
| `label` | Ridge label | Étiquette de crête | measure | 1 | Text shown instead of the ridge name |
| `reference` | Reference ★ | Référence ★ | measure | 1 | Normal, target, previous year… |
| `bandLow` | Band low ★ | Bande basse ★ | measure | 1 | Lower bound of the envelope |
| `bandHigh` | Band high ★ | Bande haute ★ | measure | 1 | Upper bound of the envelope |
| `cursor` | Cursor: current ridge ★ | Curseur : crête courante ★ | measure | 1 | e.g. SELECTEDVALUE of a disconnected table |
| `cursorX` | Cursor: X position ★ | Curseur : position X ★ | measure | 1 | Vertical line at this X |
| `annotation` | Annotation text ★ | Texte d'annotation ★ | measure | 1 | Text shown at this ridge and X |
| `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 = `ridge` + `x` (one row per combination), 30,000 rows per data window (more fetched automatically); measures = `height`, `color`, `tooltips`, `sortBy`, `label`, `reference`, `bandLow`, `bandHigh`, `cursor`, `cursorX`, `annotation`, `format`.
Capabilities: supportsHighlight, supportsKeyboardFocus, supportsLandingPage, supportsEmptyDataView, supportsMultiVisualSelection, supportsSynchronizingFilterState.
Network access: none (no privileges requested, no external request).

## Format pane options (232)

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) ★; `custom` Custom ★ | Visible when `style.customColors` = `true`. Gradient from the catalog (Viridis, Magma…). The start, middle and end colors below replace it. |
| `style.custom1` | Color 1 | Couleur 1 | color | fill | `#264653` | hex color | Visible when `style.palette` = `custom` |
| `style.custom2` | Color 2 | Couleur 2 | color | fill | `#2a9d8f` | hex color | Visible when `style.palette` = `custom` |
| `style.custom3` | Color 3 | Couleur 3 | color | fill | `#e9c46a` | hex color | Visible when `style.palette` = `custom` |
| `style.custom4` | Color 4 | Couleur 4 | color | fill | `#f4a261` | hex color | Visible when `style.palette` = `custom` |
| `style.custom5` | Color 5 | Couleur 5 | color | fill | `#e76f51` | hex color | Visible when `style.palette` = `custom` |
| `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 | dropdown | enumeration | `Segoe UI` | `Segoe UI` Segoe UI; `Segoe UI Semibold` Segoe UI Semibold; `Arial` Arial; `Georgia` Georgia; `Verdana` Verdana; `Tahoma` Tahoma; `Trebuchet MS` Trebuchet MS; `Courier New` Courier New; `DIN` DIN; `Segoe UI Light` Segoe UI Light; `Bahnschrift` Bahnschrift; `Consolas` Consolas; `Times New Roman` Times New Roman | Used by every text of the visual (title, axes, labels, playback bar). |

**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. |
| `style.transitionMs` | Filter change transition (ms) | Transition au changement de filtre (ms) | num | numeric | `400` | 0 to 5000 | 400 = free default; other values ★ |

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

**Mode**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `layout.mode` | Display mode | Mode d'affichage | dropdown | enumeration | `ridgeline` | `ridgeline` Ridgeline; `minimal` Minimal / sparkline; `comparison` Comparison (overlay) ★; `heatmap` Heatmap / stripes ★; `perspective` Perspective ★ |  |
| `layout.modeSwitcher` | Mode buttons in visual ★ | Boutons de mode dans le visuel ★ | toggle | bool | `false` | true / false |  |
| `layout.orientation` | Orientation | Orientation | dropdown | enumeration | `horizontal` | `horizontal` Horizontal; `vertical` Vertical ★ |  |
| `layout.perspectiveTilt` | Perspective tilt | Inclinaison perspective | slider | numeric | `35` | 0 to 80 | Visible when `layout.mode` = `perspective` |

**Plot margins / Marges du tracé**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `layout.marginTop` | Top | Haut | num | numeric | `8` | 0 to 200 |  |
| `layout.marginRight` | Right | Droite | num | numeric | `12` | 0 to 200 |  |
| `layout.marginBottom` | Bottom | Bas | num | numeric | `6` | 0 to 200 |  |
| `layout.marginLeft` | Left | Gauche | num | numeric | `6` | 0 to 200 |  |

**Size and scrolling / Taille et défilement**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `layout.scrollable` | Scroll when crowded ★ | Défilement si trop de crêtes ★ | toggle | bool | `false` | true / false |  |
| `layout.minRidgeHeight` | Min. ridge spacing (px) | Espacement mini (px) | num | numeric | `14` | 4 to 200 | Visible when `layout.scrollable` = `true` |
| `layout.autoHide` | Adapt to small sizes | S'adapter aux petites tailles | toggle | bool | `true` | true / false |  |

### Data colors / Couleurs des données (`dataColors`, Format pane)

**Coloring / Coloration**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `dataColors.colorMode` | Color by | Colorer selon | dropdown | enumeration | `alongCurve` | `alongCurve` Gradient along the curve (each X value); `byRidge` One color per ridge (mean of Color); `perRidge` Color chosen per ridge; `single` Single color |  |
| `dataColors.colorTarget` | Apply color to | Appliquer la couleur à | dropdown | enumeration | `area` | `area` Area under the curve; `line` Crest line only |  |
| `dataColors.singleColor` | Color | Couleur | color | fill | `#1d3557` | hex color | Visible when `dataColors.colorMode` = `single` |

**Fill and outline / Remplissage et contour**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `dataColors.fillOpacity` | Fill opacity (%) | Opacité du remplissage (%) | slider | numeric | `90` | 0 to 100 | Visible when `dataColors.colorTarget` = `area` |
| `dataColors.fillStyle` | Fill style | Style de remplissage | dropdown | enumeration | `solid` | `solid` Solid; `fade` Fade to baseline ★; `hatch` Hatched ★ | Visible when `dataColors.colorTarget` = `area` |
| `dataColors.strokeColor` | Outline color | Couleur du contour | color | fill | `#ffffff` | hex color | Visible when `dataColors.colorTarget` = `area` |
| `dataColors.strokeWidth` | Outline width | Épaisseur du contour | num | numeric | `1` | 0 to 10 | Visible when `dataColors.colorTarget` = `area` |
| `dataColors.strokeTopOnly` | Outline on top edge only | Contour sur le haut seulement | toggle | bool | `true` | true / false | Visible when `dataColors.colorTarget` = `area` |
| `dataColors.lineWidth` | Crest line width | Épaisseur de la ligne de crête | num | numeric | `2` | 0.5 to 10 | Visible when `dataColors.colorTarget` = `line` |
| `dataColors.hideBehind` | Hide ridges behind (opaque) | Masquer les crêtes de derrière (opaque) | toggle | bool | `true` | true / false | Visible when `dataColors.colorTarget` = `line` |
| `dataColors.underColor` | Color under the line | Couleur sous la ligne | color | fill | `#ffffff` | hex color | Visible when `dataColors.colorTarget` = `line`. Use your report background color |
| `dataColors.shadow` | Shadow | Ombre | dropdown | enumeration | `none` | `none` None; `drop` Drop shadow ★; `glow` Glow ★ |  |

### Ridges / Crêtes (`ridges`, Format pane)

**Shape / Forme**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `ridges.overlap` | Overlap (%) | Chevauchement (%) | slider | numeric | `120` | 0 to 600 |  |
| `ridges.fixedHeight` | Ridge spacing px (0 = auto) | Espacement px (0 = auto) | num | numeric | `0` | 0 to 400 |  |
| `ridges.curve` | Curve | Courbe | dropdown | enumeration | `monotone` | `linear` Linear; `monotone` Smooth; `basis` B-spline ★; `step` Step ★ |  |
| `ridges.smoothing` | Moving average (points) ★ | Moyenne mobile (points) ★ | num | numeric | `0` | 0 to 60 |  |

**Scale / Échelle**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `ridges.normalization` | Height scale | Échelle des hauteurs | dropdown | enumeration | `global` | `global` Shared by all ridges; `perRidge` Per ridge; `percentile` Clip at percentile ★; `log` Logarithmic ★ |  |
| `ridges.percentile` | Percentile | Percentile | num | numeric | `98` | 50 to 100 | Visible when `ridges.normalization` = `percentile` |
| `ridges.baseline` | Baseline | Ligne de base | dropdown | enumeration | `zero` | `zero` Zero; `min` Minimum ★; `center` Centered (stream) ★ |  |
| `ridges.negatives` | Negative values | Valeurs négatives | dropdown | enumeration | `down` | `down` Below baseline; `color` Other color ★; `hide` Hide ★ |  |
| `ridges.negativeColor` | Negative color | Couleur des négatifs | color | fill | `#2166ac` | hex color | Visible when `ridges.negatives` = `color` |

### Data labels / Étiquettes de données (`labels`, Format pane)

**Value next to the ridge name / Valeur à côté du nom**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `labels.showValue` | Value next to label ★ | Valeur à côté ★ | dropdown | enumeration | `none` | `none` None; `max` Maximum ★; `mean` Mean ★; `last` Last ★; `sum` Sum ★; `color` Mean of Color ★ |  |
| `labels.showRank` | Show rank ★ | Afficher le rang ★ | toggle | bool | `false` | true / false |  |

**Value on the curve / Valeur sur la courbe**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `labels.peakShow` | Label on each ridge | Étiquette sur chaque crête | dropdown | enumeration | `none` | `none` None; `max` At the peak (maximum); `last` At the end of the curve | Like the data labels of the native area chart: one value per ridge, overlapping labels are dropped. |
| `labels.peakSize` | Size | Taille | num | numeric | `9` | 6 to 30 | Visible when `labels.peakShow` = `max` or `last` |
| `labels.peakColor` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color | Visible when `labels.peakShow` = `max` or `last` |

**Number format / Format des nombres**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `labels.decimals` | Decimals | Décimales | num | numeric | `1` | 0 to 6 |  |
| `labels.prefix` | Prefix | Préfixe | text | text | (empty) |  |  |
| `labels.suffix` | Suffix (°C, mm…) | Suffixe (°C, mm…) | text | text | (empty) |  |  |

### Category labels / Étiquettes des catégories (`categoryLabels`, Format pane)

The card header toggle is `categoryLabels.show`.

**Ridge names / Noms des crêtes**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `categoryLabels.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `categoryLabels.position` | Position | Position | dropdown | enumeration | `left` | `left` Left; `right` Right; `baseline` On baseline; `end` End of curve |  |
| `categoryLabels.everyN` | Show 1 label every N | 1 étiquette sur N | num | numeric | `1` | 1 to 100 |  |
| `categoryLabels.fontSize` | Size | Taille | num | numeric | `10` | 6 to 40 |  |
| `categoryLabels.bold` | Bold | Gras | toggle | bool | `false` | true / false |  |
| `categoryLabels.italic` | Italic | Italique | toggle | bool | `false` | true / false |  |
| `categoryLabels.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |

### 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.format` | Format | Format | dropdown | enumeration | `auto` | `auto` Automatic; `month` Month (January); `monthShort` Month (Jan); `dayMonth` Day + month; `number` Number; `date` Full date |  |
| `xAxis.unit` | Unit of numeric values | Unité des valeurs numériques | text | text | (empty) |  | Added after each number of a numeric X axis (e.g. 10 km). Not repeated when the label already ends with it. |
| `xAxis.ticks` | Tick count (0 = auto) | Graduations (0 = auto) | num | numeric | `0` | 0 to 50 |  |
| `xAxis.rotation` | Label rotation | Rotation | num | numeric | `0` | -90 to 90 |  |
| `xAxis.fontSize` | Size | Taille | num | numeric | `9` | 6 to 30 |  |
| `xAxis.color` | Color | Couleur | color | fill | `#6B6862` | hex color |  |

**Title / Titre**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `xAxis.title` | Axis title | Titre de l'axe | text | text | (empty) |  |  |

### Y axis / Axe Y (`yAxis`, Format pane)

The card header toggle is `yAxis.show`.

**Values (focus and comparison) / Valeurs (focus et comparaison)**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `yAxis.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `yAxis.decimals` | Decimals | Décimales | num | numeric | `0` | 0 to 6 |  |
| `yAxis.suffix` | Unit suffix | Suffixe d'unité | text | text | (empty) |  |  |

**Range / Plage**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `yAxis.min` | Start (empty = auto) | Début (vide = auto) | text | text | (empty) |  | Lower bound of the heights. Drive it with a measure (fx or Dynamic format 'yAxis.min') to keep the scale when the report is filtered. |
| `yAxis.max` | End (empty = auto) | Fin (vide = auto) | text | text | (empty) |  | Upper bound of the heights (all modes with a shared scale). E.g. a measure CALCULATE(MAX(...), REMOVEFILTERS()) keeps the scale under a filter. |

**Title / Titre**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `yAxis.title` | Axis title | Titre de l'axe | text | text | (empty) |  |  |

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

**Vertical**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gridlines.vertical` | Vertical gridlines | Quadrillage vertical | toggle | bool | `true` | true / false |  |
| `gridlines.verticalColor` | Color | Couleur | color | fill | `#E4E2DD` | hex color | Visible when `gridlines.vertical` = `true` |
| `gridlines.verticalStyle` | Line style | Style de trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted | Visible when `gridlines.vertical` = `true` |
| `gridlines.verticalWidth` | Width | Épaisseur | num | numeric | `1` | 0.5 to 6 | Visible when `gridlines.vertical` = `true` |

**Horizontal (focus and comparison) / Horizontal (focus et comparaison)**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gridlines.horizontal` | Horizontal gridlines | Quadrillage horizontal | toggle | bool | `true` | true / false |  |
| `gridlines.horizontalColor` | Color | Couleur | color | fill | `#E4E2DD` | hex color | Visible when `gridlines.horizontal` = `true` |
| `gridlines.horizontalStyle` | Line style | Style de trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted | Visible when `gridlines.horizontal` = `true` |
| `gridlines.horizontalWidth` | Width | Épaisseur | num | numeric | `1` | 0.5 to 6 | Visible when `gridlines.horizontal` = `true` |

### Legend / Légende (`legend`, Format pane)

The card header toggle is `legend.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `legend.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `legend.position` | Position | Position | dropdown | enumeration | `bottom` | `bottom` Bottom; `top` Top; `right` Right |  |
| `legend.showTitle` | Title | Titre | toggle | bool | `true` | true / false |  |
| `legend.title` | Title text (empty = field name) | Texte du titre (vide = nom du champ) | text | text | (empty) |  | Visible when `legend.showTitle` = `true` |
| `legend.fontSize` | Size | Taille | num | numeric | `9` | 6 to 24 |  |
| `legend.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |
| `legend.interactive` | Click to filter ridges ★ | Clic pour filtrer les crêtes ★ | toggle | bool | `false` | true / false |  |

### Sort / Tri (`sort`, Format pane)

**Order and limit / Ordre et limite**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `sort.order` | Ridge order | Ordre des crêtes | dropdown | enumeration | `natural` | `natural` Oldest on top; `reverse` Newest on top; `alpha` Alphabetical; `sortAsc` By 'Order' field ↑; `sortDesc` By 'Order' field ↓; `maxDesc` By maximum ↓; `meanDesc` By mean ↓ |  |
| `sort.topN` | Keep N ridges (0 = all) ★ | Garder N crêtes (0 = toutes) ★ | num | numeric | `0` | 0 to 500 |  |
| `sort.topNFrom` | Keep | Garder | dropdown | enumeration | `last` | `first` First N; `last` Last N; `top` Top N by 'Order' | Visible when `sort.topN` = any non-zero / non-empty value |

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

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

**Ridges in color / Crêtes en couleur**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `comparison.highlight` | Ridges in color (names) | Crêtes en couleur (noms) | text | text | (empty) |  | Comparison mode: every ridge is drawn on the same axes; the ridges listed here (and those selected with Ctrl+click) are in color. |
| `comparison.highlightLast` | Last ridge in color | Dernière crête en couleur | toggle | bool | `false` | true / false |  |
| `comparison.highlightWidth` | Width of the colored ridges | Épaisseur des crêtes en couleur | num | numeric | `2.8` | 0.5 to 10 |  |

**Other ridges / Autres crêtes**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `comparison.othersGray` | In gray (spaghetti) | En gris (spaghetti) | toggle | bool | `false` | true / false | Off: each ridge keeps its color. |
| `comparison.othersColor` | Color (empty = soft gray) | Couleur (vide = gris doux) | color | fill | (empty) | hex color | Visible when `comparison.othersGray` = `true` |
| `comparison.othersOpacity` | Opacity (%) | Opacité (%) | slider | numeric | `50` | 5 to 100 |  |
| `comparison.othersWidth` | Width | Épaisseur | num | numeric | `1.5` | 0.3 to 6 |  |

**Reference / Référence**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `comparison.reference` | Reference curve | Courbe de référence | dropdown | enumeration | `none` | `none` None; `field` Reference field; `mean` Mean of all ridges; `median` Median of all ridges; `first` First ridge |  |
| `comparison.referenceColor` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color | Visible when `comparison.reference` = `field` or `mean` or `median` or `first` |
| `comparison.gapFill` | Color the gap to the reference | Colorer l'écart à la référence | toggle | bool | `false` | true / false | Visible when `comparison.reference` = `field` or `mean` or `median` or `first`. Areas between each colored ridge and the reference, above / below colors of the Analytics pane. |

### Focus mode ★ / Mode focus ★ (`focus`, 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 `focus.enabled`.

**Focus**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `focus.enabled` | Enable | Activer | toggle | bool | `true` | true / false |  |
| `focus.trigger` | Open focus with | Ouvrir le focus par | dropdown | enumeration | `dblclick` | `click` Click; `dblclick` Double-click; `button` Button on hover |  |
| `focus.duration` | Animation duration (ms) | Durée de l'animation (ms) | num | numeric | `700` | 0 to 5000 |  |
| `focus.transition` | Transition | Transition | dropdown | enumeration | `zoom` | `fade` Fade; `slide` Slide; `zoom` Zoom |  |
| `focus.ghosts` | Keep other ridges as ghosts | Garder les autres en fantôme | toggle | bool | `false` | true / false |  |
| `focus.ghostOpacity` | Ghost opacity (%) | Opacité des fantômes (%) | slider | numeric | `12` | 2 to 60 | Visible when `focus.ghosts` = `true` |
| `focus.filterReport` | Focus also filters the report | Le focus filtre aussi le rapport | toggle | bool | `true` | true / false |  |

**Back button / Bouton Retour**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `focus.backText` | Text | Texte | text | text | (empty) |  | Empty = '← Back' |
| `focus.backPosition` | Position | Position | dropdown | enumeration | `topRight` | `topLeft` Top left; `topRight` Top right; `bottomLeft` Bottom left; `bottomRight` Bottom right |  |
| `focus.backStyle` | Style | Style | dropdown | enumeration | `pill` | `pill` Pill button; `text` Text link; `icon` Icon only |  |
| `focus.backColor` | Color | Couleur | color | fill | `#1d3557` | hex color |  |

**Navigation**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `focus.prevNext` | ◀ ▶ previous / next | ◀ ▶ précédente / suivante | toggle | bool | `true` | true / false |  |
| `focus.breadcrumb` | Breadcrumb | Fil d'Ariane | toggle | bool | `true` | true / false |  |
| `focus.breadcrumbRoot` | Breadcrumb root text | Texte racine du fil | text | text | (empty) |  | Empty = 'All' |

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

**Annotations**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `annotations.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `annotations.style` | Style | Style | dropdown | enumeration | `line` | `line` Callout line; `bubble` Bubble; `dot` Dot + text |  |
| `annotations.color` | Color | Couleur | color | fill | `#1F1E1C` | hex color |  |
| `annotations.fontSize` | Size | Taille | num | numeric | `9` | 6 to 24 |  |

### Playback ★ / Lecture ★ (`play`, 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 `play.enabled`.

**Playback / Lecture**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `play.enabled` | Show ▶ play button | Afficher le bouton ▶ | toggle | bool | `true` | true / false |  |
| `play.playMode` | Animation | Animation | dropdown | enumeration | `draw` | `draw` Each ridge is drawn; `reveal` Ridges appear one by one |  |
| `play.startFrom` | Playback starts from | La lecture part de | dropdown | enumeration | `empty` | `empty` An empty chart; `final` The final state (all ridges, redrawn one by one) | Final state: the chart stays complete and each ridge is redrawn in turn, so readers never see an empty visual. |
| `play.speed` | Time per ridge (ms) | Durée par crête (ms) | num | numeric | `600` | 30 to 10000 |  |
| `play.accelerate` | Accelerate progressively | Accélérer progressivement | toggle | bool | `false` | true / false |  |
| `play.loop` | Repeat | Répétition | dropdown | enumeration | `once` | `once` Once; `loop` Loop; `bounce` Back and forth |  |
| `play.autoplay` | Autoplay on load | Lecture automatique | toggle | bool | `false` | true / false |  |
| `play.filterReport` | Current ridge filters the report | La crête courante filtre le rapport | toggle | bool | `false` | true / false |  |
| `play.respectReducedMotion` | Respect 'reduce motion' | Respecter « réduire les animations » | toggle | bool | `true` | true / false |  |

**Counter / Compteur**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `play.counterShow` | Big counter in background | Grand compteur en fond | toggle | bool | `false` | true / false |  |
| `play.counterSize` | Size (% of height) | Taille (% de la hauteur) | slider | numeric | `28` | 5 to 80 |  |
| `play.counterOpacity` | Opacity (%) | Opacité (%) | slider | numeric | `14` | 2 to 100 |  |
| `play.counterPosition` | Position | Position | dropdown | enumeration | `center` | `center` Center; `topRight` Top right; `bottomRight` Bottom right |  |

**Progress and trail / Progression et traînée**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `play.progressShow` | Progress bar (draggable) | Barre de progression (déplaçable) | toggle | bool | `true` | true / false |  |
| `play.trail` | Keep past ridges in gray | Garder les crêtes passées en gris | toggle | bool | `true` | true / false |  |
| `play.pauseOnAnnotations` | Pause on annotated ridges | Pause sur les crêtes annotées | toggle | bool | `false` | true / false |  |
| `play.pauseMs` | Pause duration (ms) | Durée de pause (ms) | num | numeric | `1500` | 0 to 20000 | Visible when `play.pauseOnAnnotations` = `true` |

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

**Selection and filtering / Sélection et filtrage**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `interaction.crossFilter` | Click filters other visuals | Le clic filtre les autres visuels | toggle | bool | `true` | true / false | Persistent slicer-like filter on the Ridge field. Ctrl+click = several ridges. |

**Hover / Survol**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `interaction.hoverEmphasis` | Emphasize hovered ridge | Mettre en avant la crête survolée | toggle | bool | `true` | true / false |  |
| `interaction.crosshair` | Crosshair across ridges ★ | Réticule sur toutes les crêtes ★ | toggle | bool | `false` | true / false |  |

**When the report is filtered / Quand le rapport est filtré**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `interaction.highlightMode` | Highlighted ridges | Crêtes en surbrillance | dropdown | enumeration | `dim` | `dim` Dim the others; `hide` Hide the others ★; `cursor` Cursor only ★; `autoFocus` Open focus automatically ★ |  |
| `interaction.cursorStyle` | Cursor style ★ | Style du curseur ★ | dropdown | enumeration | `halo` | `halo` Halo on ridge; `arrow` Arrow on label; `line` Vertical line (X cursor); `grayOthers` Color it, gray the others |  |
| `interaction.cursorLabel` | Cursor label | Libellé du curseur | text | text | (empty) |  | Empty = 'You are here' |
| `interaction.cursorColor` | Cursor color | Couleur du curseur | color | fill | `#e63946` | hex color |  |

**Keyboard / Clavier**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `interaction.keyboard` | Keyboard navigation | Navigation au clavier | toggle | bool | `true` | true / false |  |

### 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 | `false` | true / false |  |
| `title.text` | Text | Texte | text | text | (empty) |  | Leave empty for an automatic title built from the fields. Variables ★: {first} {last} {count} {min} {max} {focus} {playing} |
| `title.fontSize` | Size | Taille | num | numeric | `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 | num | numeric | `11` | 7 to 30 | Visible when `title.subtitle` = any non-zero / non-empty value |
| `title.subColor` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color | Visible when `title.subtitle` = any non-zero / non-empty value |
| `title.subItalic` | Italic | Italique | toggle | bool | `false` | true / false | Visible when `title.subtitle` = any non-zero / non-empty value |

**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 | num | numeric | `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) | num | numeric | `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 | num | numeric | `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 | num | numeric | `1` | 0 to 6 | Visible when `container.border` = `true` |
| `container.radius` | Rounded corners | Coins arrondis | num | numeric | `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) | num | numeric | `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 | num | numeric | `0` | 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. |

### Reference & analytics ★ / Référence et analytique ★ (`analytics`, Analytics pane)

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

**Reference curve / Courbe de référence**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `analytics.refShow` | Show reference (field) | Afficher la référence (champ) | toggle | bool | `true` | true / false |  |
| `analytics.refStyle` | Line style | Style de ligne | dropdown | enumeration | `dashed` | `dashed` Dashed; `dotted` Dotted; `solid` Solid |  |
| `analytics.refColor` | Color | Couleur | color | fill | `#333333` | hex color |  |
| `analytics.refWidth` | Width | Épaisseur | num | numeric | `1` | 0.5 to 6 |  |
| `analytics.anomaly` | Color the gap to reference | Colorer l'écart à la référence | toggle | bool | `false` | true / false |  |
| `analytics.anomalyAbove` | Above | Au-dessus | color | fill | `#d62828` | hex color | Visible when `analytics.anomaly` = `true` |
| `analytics.anomalyBelow` | Below | En dessous | color | fill | `#1d4e89` | hex color | Visible when `analytics.anomaly` = `true` |

**Mean of all ridges / Moyenne de toutes les crêtes**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `analytics.meanShow` | Overlay mean curve | Superposer la courbe moyenne | toggle | bool | `false` | true / false |  |
| `analytics.meanColor` | Color | Couleur | color | fill | `#111111` | hex color | Visible when `analytics.meanShow` = `true` |

**Min–max band (fields) / Bande min–max (champs)**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `analytics.bandShow` | Show band | Afficher la bande | toggle | bool | `true` | true / false |  |
| `analytics.bandColor` | Color | Couleur | color | fill | `#8d99ae` | hex color |  |
| `analytics.bandOpacity` | Opacity (%) | Opacité (%) | slider | numeric | `25` | 0 to 100 |  |

**Threshold / Seuil**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `analytics.thresholdShow` | Show threshold | Afficher un seuil | toggle | bool | `false` | true / false |  |
| `analytics.thresholdValue` | Value | Valeur | num | numeric | `0` |  | Visible when `analytics.thresholdShow` = `true` |
| `analytics.thresholdColor` | Color | Couleur | color | fill | `#d62828` | hex color | Visible when `analytics.thresholdShow` = `true` |
| `analytics.thresholdFill` | Color parts above | Colorer les parties au-dessus | toggle | bool | `true` | true / false | Visible when `analytics.thresholdShow` = `true` |

**Markers / Marqueurs**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `analytics.markersMaxMin` | Max / min of each ridge | Max / min de chaque crête | toggle | bool | `false` | true / false |  |
| `analytics.recordMarker` | Absolute record | Record absolu | toggle | bool | `false` | true / false |  |
| `analytics.markerColor` | Color | Couleur | color | fill | `#111111` | hex color |  |

**Emphasize extremes / Mettre en avant les extrêmes**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `analytics.extremesN` | N extreme ridges (0 = off) | N crêtes extrêmes (0 = désactivé) | num | numeric | `0` | 0 to 50 |  |
| `analytics.extremesBy` | Ranked by | Classées selon | dropdown | enumeration | `mean` | `mean` Mean; `max` Maximum; `color` Mean of Color |  |

**Trend / Tendance**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `analytics.trendShow` | Sparkline of ridge means in margin | Sparkline des moyennes en marge | toggle | bool | `false` | true / false |  |
| `analytics.trendColor` | Color | Couleur | color | fill | `#e63946` | hex color | Visible when `analytics.trendShow` = `true` |

### State / État (`state`, internal, not shown in Power BI)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `state.focusKey` | Focused ridge | Crête en focus | text | text | (empty) |  |  |
| `state.modeOverride` | Mode override | Mode choisi | text | text | (empty) |  |  |

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

- `animation` (animation): `animation.transitionMs` (numeric), `animation.enabled` (bool), `animation.playMode` (enumeration), `animation.speed` (numeric), `animation.accelerate` (bool), `animation.loop` (enumeration), `animation.autoplay` (bool), `animation.filterReport` (bool), `animation.respectReducedMotion` (bool), `animation.counterShow` (bool), `animation.counterSize` (numeric), `animation.counterOpacity` (numeric), `animation.counterPosition` (enumeration), `animation.progressShow` (bool), `animation.trail` (bool), `animation.pauseOnAnnotations` (bool), `animation.pauseMs` (numeric).
- `display` (display): `display.mode` (enumeration), `display.modeSwitcher` (bool), `display.orientation` (enumeration), `display.perspectiveTilt` (numeric), `display.marginTop` (numeric), `display.marginRight` (numeric), `display.marginBottom` (numeric), `display.marginLeft` (numeric), `display.scrollable` (bool), `display.minRidgeHeight` (numeric), `display.autoHide` (bool).
- `colors` (colors): `colors.colorMode` (enumeration), `colors.colorTarget` (enumeration), `colors.singleColor` (fill), `colors.fillOpacity` (numeric), `colors.fillStyle` (enumeration), `colors.strokeColor` (fill), `colors.strokeWidth` (numeric), `colors.strokeTopOnly` (bool), `colors.lineWidth` (numeric), `colors.hideBehind` (bool), `colors.underColor` (fill), `colors.shadow` (enumeration), one color per data point (per ridge), shown in the Format pane when the corresponding color mode is selected.
- `ridgeColors` (Ridge colors): `ridgeColors.fill` (fill), one color per data point (per ridge), shown in the Format pane when the corresponding color mode is selected.
- `general` (General): `general.filter` (filter), used by Power BI to store the filter applied by the visual.