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