# Range Plume: technical reference for AI assistants

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

Use it to help someone build a report with Range 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/range-pulse (French: https://plumevisuals.com/fr/visuels/range-pulse)
- Summary: The numeric range slicer: pick a range on the column's histogram (price, age, lead time), with handles, exact input and impact.
- Power BI visual GUID (`visualType`): `plumeRangePulse4B8C2E7F19A04D6C8E3B5A7F2C91D0E3`
- 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

Range Plume is a Power BI custom visual that works as a numeric range slicer drawn over the distribution of the column: a histogram of the values (price, age, lead time, surface…), two handles, a brush to draw the range directly on the histogram, exact min / max inputs ("1.2k", "3.5M", "1 200 €"), presets (quartiles, "without outliers", top / bottom 10 %, above median, "Custom ranges ★") and an impact summary (rows kept, share of rows, measure kept and its share, median of the range). The chosen range filters the rest of the report.

**New in version 1.4.0.0 (30/10/2026):** Shared slicer cards (Preselection: measure "100;500" ★ or free shortcuts); **Between / Less than or equal to / Greater than or equal to** styles like the native numeric slicer; histogram hover moved to Tooltips (`tooltip.show`).

## Free vs premium (★)

- Every feature works without a key and nothing is ever blocked. Free features never show a watermark.
- Shared Style card (the same in every Plume visual): the styles `none`, `minimal` and `blackWhite`, the two Plume gradient palettes (`crest`, `crestDiverging`), "Follow report theme" and all custom colors (`style.customColors` and the colors under it) are **free**; every other `style.preset`, the other gradient palettes (`style.palette`) and `style.themeJson` ("Theme JSON ★") are **premium** (watermark without a key). See "Styles and theme JSON" below.
- The only premium feature of Range Plume is **custom named ranges** (`presets.custom`, label "Custom ranges ★" / « Plages personnalisées ★ »). When that text is not empty and no valid key is set, the footer shows **"Plume Visuals · Premium preview"** (French: « Plume Visuals · Aperçu premium ») with an "Unlock →" link to the pricing page.
- The watermark disappears once a key is pasted in **Format › Plume Studio License › License key** (`license.key`; French: « Licence Plume Studio › Clé de licence »), the **first card** of the Format pane. In the Format pane, premium options have " ★" appended to their label and carry the description "Premium feature: usable for free with a « Premium preview » watermark…".
- Accepted keys: only keys starting with `PLUM1.` shown in the buyer's account on plumevisuals.com, checked offline (Ed25519 signature), covering `range-pulse` or the whole catalog. In edit mode, a wrong key shows "Invalid license key", "License expired (date)" or "This key does not cover this visual". `license.showOwner` displays "Licensed to <holder>".
- Licenses last one year (one-time payment, no automatic renewal, key accepted for 30 more days, reminders 30 and 7 days before the end), per segment: 19 € personal, 49 € SME, 149 € enterprise per year, or the full catalog pack. Renewing gives a new key to paste instead of the old one.

## Expected data shape

The visual reads **one row per distinct value of the numeric column**, with the measures evaluated for that value.

| Numeric field (`value`) | Row count (weight) (`weight`) | Measure (impact) (`measure`) |
|---|---|---|
| 185 000 | 12 | 2 220 000 |
| 192 500 | 3 | 577 500 |
| … | … | … |

- **Numeric field** (`value`, label "Numeric field" / « Champ numérique », grouping, exactly one column, required): the column to filter. Only number / whole number columns are accepted (text and date columns are refused by the well).
- **Row count (weight)** (`weight`, « Nombre de lignes (poids) », one measure, optional but strongly recommended): how many rows have this value, normally `COUNTROWS`. It gives exact histogram heights and weighted quantiles (median, quartiles, deciles). Without it every distinct value counts 1 and an ⓘ is shown in the summary. Values whose weight is blank or 0 are ignored.
- **Measure (impact)** (`measure`, « Mesure (impact) », one measure, optional): an **additive** measure (revenue, volume…) whose kept amount and share are shown in the summary.
- There is no Tooltips well: the tooltip per histogram bin (bounds, rows and share, measure) is built in (`tooltip.show`).
- Volume: 30,000 distinct values per data window, more fetched automatically up to a **fixed limit of 100,000 distinct values**; beyond, a warning icon is shown ("Only the first n values are loaded"; details: "The visual loads at most 100,000 values. Filter the page or use a less detailed column."). There is no "Data" card any more since 1.0.1.0. Amounts with cents create many distinct values: round the column.

## DAX recipes

```dax
// Weight and impact
Listings = COUNTROWS ( Listings )
Total value = SUM ( Listings[Price] )

// Calculated column with fewer distinct values (use it in Numeric field)
Price rounded = ROUND ( Listings[Price], -3 )          // nearest thousand
Amount rounded = ROUND ( Orders[Amount], 0 )

// Measures that react to the range (cards next to the slicer)
Median price = MEDIAN ( Listings[Price] )
Share of listings = DIVIDE ( [Listings], CALCULATE ( [Listings], REMOVEFILTERS ( Listings[Price] ) ) )
```

## Filter sent to the report

An `AdvancedFilter` with logical operator `And` on the numeric column: `GreaterThanOrEqual` min and `LessThanOrEqual` max, for example `{ "target": { "table": "Listings", "column": "Price" }, "logicalOperator": "And", "conditions": [ { "operator": "GreaterThanOrEqual", "value": 150000 }, { "operator": "LessThanOrEqual", "value": 300000 } ] }`.

- With `behavior.clampOutside` (on by default), a handle left at the end of the scale drops that condition: the bound is open and values beyond it stay included. Both handles at the ends = filter removed.
- Presets (quartiles, deciles, "without outliers"…) are computed from the current data and sent as a fixed range: they are not re-evaluated when the data changes.
- `behavior.apply` = `release` filters when the mouse is released; `button` shows Apply / Cancel.

## Interactions with the report

- Drag a handle, drag the whole range (`slider.moveWindow`), draw a range on the histogram (`slider.brush`), type in the min / max boxes, or click a preset. Snapping: `slider.snap` = `step` (`slider.step`, 0 = auto), `bins`, `data` (existing values) or `none`.
- Keyboard on the handles (ARIA `slider`): ← → ↑ ↓ (Shift = ×10), Page Up / Page Down, Home / End. Enter validates a typed value, Esc in a min / max box restores the current value.
- "Clear" in the header (`header.showClear`) removes the filter. Context menu, high contrast, landing page, read-only on dashboards.
- **Bookmarks** and **Sync slicers** work: the visual declares `supportsSynchronizingFilterState` and restores the range from the filter.
- Other visuals cross-filter Range Plume (it does not support highlighting).

## Format pane: how to read the tables below

- Each option has an ID `card.option` (for example `histogram.style`). The card is the capabilities.json **object name**, the option is the **property name**.
- Card order: `license` (always first), `style` (Style card shared by every Plume visual: `preset`, `themeJson`, `followTheme`, then `customColors`, the colors, `palette` (Gradient palette), font, size, density, radius, animations), `header`, then `histogram`, `slider`, `inputs`, `presets`, `values` (number format), `summary` (range impact), `behavior`, then `container` and `texts`. Format pane in version 1.4.0.0 (30/10/2026), top to bottom: `license`, `style`, `header`, `histogram`, `slider`, `inputs`, `presets`, `values`, `summary`, `behavior`, `preselect`, `tooltip`, `container`, `texts`. Settings moved or renamed in this version keep working in older reports (the old names are still read).
- Labels follow the language of Power BI Desktop; `texts.language` can force French or English inside the visual, `texts.numberLocale` the number format (e.g. `en-GB`).
- "Visible when" means the option only appears when another option has one of the listed values.
- `general.filter` is where Power BI stores the filter applied by the visual: never write it by hand.

## Editing a PBIP report (visual.json)

`visualType` is the visual GUID, `queryState` keys are the data role names, `objects` keys are the option IDs. Literal syntax: booleans `true` / `false`, numbers suffixed with `D`, strings and enumeration values in single quotes, colors wrapped in `solid.color`.

```json
{
  "visualType": "plumeRangePulse4B8C2E7F19A04D6C8E3B5A7F2C91D0E3",
  "query": {
    "queryState": {
      "value":   { "projections": [ { "field": { "Column":  { "Expression": { "SourceRef": { "Entity": "Listings" } }, "Property": "Price" } }, "queryRef": "Listings.Price", "nativeQueryRef": "Price" } ] },
      "weight":  { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Listings" } }, "Property": "Listings" } }, "queryRef": "Listings.Listings", "nativeQueryRef": "Listings" } ] },
      "measure": { "projections": [ { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Listings" } }, "Property": "Total value" } }, "queryRef": "Listings.Total value", "nativeQueryRef": "Total value" } ] }
    }
  },
  "objects": {
    "histogram": [ { "properties": { "style": { "expr": { "Literal": { "Value": "'area'" } } },
                                      "mean": { "expr": { "Literal": { "Value": "true" } } },
                                      "colorIn": { "solid": { "color": { "expr": { "Literal": { "Value": "'#1d3557'" } } } } } } } ],
    "presets":   [ { "properties": { "custom": { "expr": { "Literal": { "Value": "'Small: -50; Medium: 50-200; Large: 200-'" } } },
                                      "trimPct": { "expr": { "Literal": { "Value": "10D" } } } } } ],
    "summary":   [ { "properties": { "rowsLabel": { "expr": { "Literal": { "Value": "'listings'" } } } } } ],
    "behavior":  [ { "properties": { "apply": { "expr": { "Literal": { "Value": "'button'" } } } } } ],
    "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.
- What this slicer uses from a theme JSON: `colors` (`background`, `foreground`, `muted`, `grid`, `accent`, `borderColor`, `glowColor`), `typography` (`fontFamily`, `titleFamily`, `headerCase`, `letterSpacing`), `shape` (`radius`, `border`, `borderWidth`, `borderStyle`, `shadow`) and `effects` (`glow`, `texture`). `fontFamily`, `radius`, `border`, `borderWidth` and `shadow` only apply while the matching Format pane options are left at their default. The `palettes`, `table` and `marks` groups and the other fields (`surface`, `background2`, `stroke`, `accent2`, `positive`, `negative`, `numberFamily`…) are accepted but have no visible effect on it.

## Common pitfalls

- The field is refused: the column is text or date. Change its data type, or create a numeric calculated column.
- Histogram heights all equal / ⓘ in the summary: no measure in Row count (weight).
- Slow, or warning "The visual loads at most 100,000 values. Filter the page or use a less detailed column.": too many distinct values (e.g. amounts with cents); round the column.
- Squeezed histogram: a long tail of large values. `histogram.xScale` = `auto` switches to a log scale when the distribution is very skewed (only for positive values); force `log`, or use `histogram.yScale` = `sqrt`.
- Custom ranges syntax: `Label: min-max`, one per line or separated by `;`, min or max left empty for an open range (`Large: 200-`). The `-` is the separator, so negative bounds cannot be written in this field.
- The scale does not start at 0: it follows the data; set `behavior.boundsMin` / `behavior.boundsMax` to impose bounds.
- Watermark visible: `presets.custom` is filled, or a ★ style, palette or theme JSON is used, without a valid key.
- The visual makes no network request: data and license key stay in the report.

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

Several ranges at once or a list of discrete values (use Bar Slicer Plume), date or time ranges (use Period Plume), more than one numeric field, a Tooltips well, a filter on a measure value (only columns are filtered), dynamic presets that move with each refresh, a histogram of a measure (the histogram counts rows per column value), two-dimensional brush, logarithmic scale for zero or negative values.

## 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 |
|---|---|---|---|---|---|
| `value` | Numeric field | Champ numérique | column | 1 |  |
| `weight` | Row count (weight) | Nombre de lignes (poids) | measure | 1 |  |
| `measure` | Measure (impact) | Mesure (impact) | measure | 1 |  |
| `preselect` | Preselection | Présélection | measure | 1 | Optional measure returning the value(s) selected when the report opens, e.g. "Paris;Lyon" or "2026-01-01;2026-03-31" |
| `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 = `value` (one row per combination), 30,000 rows per data window (more fetched automatically); measures = `weight`, `measure`, `preselect`, `format`.
Capabilities: supportsKeyboardFocus, supportsLandingPage, supportsEmptyDataView, supportsSynchronizingFilterState.
Network access: none (no privileges requested, no external request).

## Format pane options (118)

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

**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.colorTrack` | Bar track | Fond des barres | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorAccent` | Accent | Accent | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorPositive` | Favorable | Favorable | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.colorNegative` | Unfavorable | Défavorable | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series1` | Series 1 | Série 1 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series2` | Series 2 | Série 2 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series3` | Series 3 | Série 3 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series4` | Series 4 | Série 4 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series5` | Series 5 | Série 5 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series6` | Series 6 | Série 6 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series7` | Series 7 | Série 7 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.series8` | Series 8 | Série 8 | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.palette` | Gradient palette | Palette du dégradé | dropdown | enumeration | `auto` | `auto` Style or theme palette; `crest` Plume (sequential); `crestDiverging` Plume (diverging); `viridis` Viridis ★; `magma` Magma ★; `inferno` Inferno ★; `cividis` Cividis (colorblind-safe) ★; `warmingStripes` Warming stripes ★; `rdYlBu` Red–Yellow–Blue ★; `brBG` Brown–Teal (drought) ★; `spectral` Spectral ★; `blues` Blues ★; `reds` Reds ★; `grays` Grays ★; `press` Press (ink and paper) ★; `nordic` Nordic ★; `earth` Earth (ochre to umber) ★; `pastel` Pastel ★; `okabeIto` Okabe-Ito (colorblind-safe) ★ | Visible when `style.customColors` = `true`. Gradient from the catalog (Viridis, Magma…). The start, middle and end colors below replace it. |
| `style.scaleLow` | Gradient: start | Dégradé : début | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.scaleMid` | Gradient: middle (diverging) | Dégradé : milieu (écarts) | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |
| `style.scaleHigh` | Gradient: end | Dégradé : fin | color | fill | (empty) | hex color | Visible when `style.customColors` = `true` |

**Text / Texte**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `style.fontFamily` | Font | Police | font | formatting | `Segoe UI, wf_segoe-ui_normal, helvetica, arial, sans-serif` |  |  |
| `style.fontSize` | Text size | Taille du texte | number | formatting | `12` | 8 to 28 |  |
| `style.density` | Density | Densité | dropdown | enumeration | `normal` | `compact` Compact; `normal` Normal; `comfortable` Comfortable |  |

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

### Header / En-tête (`header`, Format pane)

The card header toggle is `header.show`.

**Title / Titre**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `header.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `header.title` | Text | Texte | text | text | (empty) |  | Leave empty to use the field name. |
| `header.fontSize` | Size | Taille | number | formatting | `14` | 7 to 36 |  |
| `header.bold` | Bold | Gras | toggle | bool | `true` | true / false |  |
| `header.italic` | Italic | Italique | toggle | bool | `false` | true / false |  |
| `header.underline` | Underline | Souligné | toggle | bool | `false` | true / false |  |
| `header.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |
| `header.bgColor` | Background color | Couleur d'arrière-plan | color | fill | (empty) | hex color |  |
| `header.align` | Horizontal alignment | Alignement horizontal | dropdown | enumeration | `left` | `left` Left; `center` Center; `right` Right |  |
| `header.wrap` | Text wrap | Retour automatique à la ligne | toggle | bool | `true` | true / false | A long title goes on two lines instead of being cut. |

**Divider / Séparateur**

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

**Count and Clear button / Décompte et bouton Effacer**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `header.showCount` | Show value / selection count | Afficher le nombre de valeurs / sélection | toggle | bool | `true` | true / false |  |
| `header.showClear` | "Clear" button | Bouton « Effacer » | toggle | bool | `true` | true / false |  |
| `header.clearLabel` | Clear button label | Libellé du bouton Effacer | text | text | (empty) |  | Visible when `header.showClear` = `true` |

### Histogram / Histogramme (`histogram`, Format pane)

The card header toggle is `histogram.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `histogram.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `histogram.bins` | Number of bins (0 = auto) | Nombre de classes (0 = auto) | number | integer | `0` | 0 to 200 |  |
| `histogram.xScale` | Horizontal scale | Échelle horizontale | dropdown | enumeration | `auto` | `auto` Auto (log when very skewed); `linear` Linear; `log` Logarithmic |  |
| `histogram.yScale` | Bar height | Hauteur des barres | dropdown | enumeration | `linear` | `linear` Linear; `sqrt` Square root (softens peaks) |  |
| `histogram.style` | Style | Style | dropdown | enumeration | `bars` | `bars` Bars; `area` Filled curve; `dots` Dots (units) |  |
| `histogram.gap` | Gap between bars (px) | Espace entre barres (px) | number | integer | `2` | 0 to 8 | Visible when `histogram.style` = `bars` |
| `histogram.colorIn` | In-range color (empty = accent) | Couleur dans la plage (vide = accent) | color | fill | (empty) | hex color |  |
| `histogram.colorOut` | Out-of-range color (empty = auto) | Couleur hors plage (vide = auto) | color | fill | (empty) | hex color |  |
| `histogram.median` | Median marker | Repère de la médiane | toggle | bool | `true` | true / false |  |
| `histogram.mean` | Mean marker | Repère de la moyenne | toggle | bool | `false` | true / false |  |
| `histogram.axis` | Axis | Axe gradué | toggle | bool | `true` | true / false |  |
| `histogram.ticks` | Tick count | Nombre de graduations | number | integer | `5` | 2 to 12 | Visible when `histogram.axis` = `true` |

### Slider / Curseur (`slider`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `slider.handle` | Handle shape | Forme des poignées | dropdown | enumeration | `circle` | `circle` Circle; `bar` Vertical bar; `pill` Pill |  |
| `slider.handleSize` | Handle size | Taille des poignées | number | integer | `16` | 10 to 30 |  |
| `slider.thickness` | Track thickness | Épaisseur du rail | number | integer | `4` | 2 to 12 |  |
| `slider.labels` | Handle values | Valeurs des poignées | dropdown | enumeration | `hover` | `always` Always; `hover` On hover and drag; `never` Never |  |
| `slider.step` | Step (0 = auto) | Pas (0 = auto) | number | numeric | `0` | 0 to … |  |
| `slider.snap` | Snap to | Accrocher aux | dropdown | enumeration | `step` | `step` Step; `bins` Bin edges; `data` Existing values; `none` Nothing |  |
| `slider.brush` | Draw range on the histogram | Dessiner la plage sur l'histogramme | toggle | bool | `true` | true / false |  |
| `slider.moveWindow` | Drag the whole range | Déplacer la plage d'un bloc | toggle | bool | `true` | true / false |  |

### Min / max inputs / Saisie min / max (`inputs`, Format pane)

The card header toggle is `inputs.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `inputs.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `inputs.position` | Position | Position | dropdown | enumeration | `below` | `below` Below the slider; `above` Above the histogram |  |
| `inputs.labels` | "Minimum / Maximum" labels | Étiquettes « Minimum / Maximum » | toggle | bool | `true` | true / false |  |
| `inputs.minLabel` | Minimum label | Libellé du minimum | text | text | (empty) |  |  |
| `inputs.maxLabel` | Maximum label | Libellé du maximum | text | text | (empty) |  |  |

### Presets / Préréglages (`presets`, Format pane)

The card header toggle is `presets.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `presets.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `presets.custom` | Custom ranges ★ | Plages personnalisées ★ | textarea | text | (empty) |  | One range per line or separated by ; — "Label: min-max". Leave min or max empty for an open range. |
| `presets.quartiles` | Quartiles (Q1 to Q4) | Quartiles (Q1 à Q4) | toggle | bool | `false` | true / false |  |
| `presets.trim` | "Without outliers" | « Sans les valeurs extrêmes » | toggle | bool | `true` | true / false |  |
| `presets.trimPct` | Share removed on each side (%) | Part retirée de chaque côté (%) | number | integer | `5` | 1 to 25 | Visible when `presets.trim` = `true` |
| `presets.aboveMedian` | "Above median" | « Au-dessus de la médiane » | toggle | bool | `false` | true / false |  |
| `presets.topDecile` | "Top 10%" | « 10 % les plus élevés » | toggle | bool | `true` | true / false |  |
| `presets.bottomDecile` | "Bottom 10%" | « 10 % les plus bas » | toggle | bool | `false` | true / false |  |
| `presets.position` | Position | Position | dropdown | enumeration | `bottom` | `top` Top; `bottom` Bottom |  |

### Number format / Format des nombres (`values`, Format pane)

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

### Range impact / Impact de la plage (`summary`, Format pane)

The card header toggle is `summary.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `summary.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `summary.count` | Rows kept | Nombre de lignes retenues | toggle | bool | `true` | true / false |  |
| `summary.share` | Share of rows | Part des lignes | toggle | bool | `true` | true / false |  |
| `summary.measure` | Measure kept and its share | Mesure retenue et sa part | toggle | bool | `true` | true / false |  |
| `summary.median` | Median of the range | Médiane de la plage | toggle | bool | `true` | true / false |  |
| `summary.rowsLabel` | Row name (e.g. orders) | Nom des lignes (ex. commandes) | text | text | (empty) |  |  |

### Behavior / Comportement (`behavior`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `behavior.operator` | Style | Style | dropdown | enumeration | `between` | `between` Between; `lessEq` Less than or equal to; `greaterEq` Greater than or equal to | Like the native numeric slicer styles: two handles (Between) or one (≤ or ≥). |
| `behavior.apply` | Apply the filter | Appliquer le filtre | dropdown | enumeration | `release` | `release` On mouse release; `button` With an "Apply" button |  |
| `behavior.boundsMin` | Fixed lower bound | Borne minimale imposée | text | text | (empty) |  |  |
| `behavior.boundsMax` | Fixed upper bound | Borne maximale imposée | text | text | (empty) |  |  |
| `behavior.clampOutside` | Open-ended at the extremes | Bornes ouvertes aux extrémités | toggle | bool | `true` | true / false | When a handle is at the end of the scale, values beyond it are kept. |

### Preselection / Présélection (`preselect`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `preselect.shortcut` | Shortcut (no DAX) | Raccourci (sans DAX) | dropdown | enumeration | `none` | `none` None (measure only); `trim` Without outliers; `iqr` Middle half (Q1 to Q3); `aboveMedian` Above median; `top10` Top 10%; `bottom10` Bottom 10% | Drop in "Preselection" a measure that returns a range ("100;500"), or pick a shortcut below (free). Measure: premium feature ★. |
| `preselect.when` | Apply | Appliquer | dropdown | enumeration | `session` | `session` Once per session; `always` Reapply on every display |  |
| `preselect.force` | Force | Forcer | toggle | bool | `false` | true / false | Replaces an existing selection: saved in the report, recalled by a bookmark or by persistent filters. Otherwise it is kept. |
| `preselect.separator` | Value separator | Séparateur des valeurs | text | text | `;` |  |  |
| `preselect.warn` | Report values not found (edit mode) | Signaler les valeurs introuvables (mode édition) | 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 for each histogram bin (row count, measure). |

### 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` |
| `container.transparent` | Transparent background | Fond transparent | toggle | bool | `false` | true / false | The visual lets what is behind it show through (useful for a dropdown placed over another visual). |

**Border / Bordure**

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

**Shadow / Ombre**

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

**Spacing / Marges**

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

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

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

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

- `general`: `general.filter` (filter), used by Power BI to store the filter applied by the visual.
