# Image Plume: technical reference for AI assistants

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

Use it to help someone build a report with Image 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/image (French: https://plumevisuals.com/fr/visuels/image)
- Summary: Your base64 images, finally shown well: even beyond 32,766 characters, placed, sized, clipped into circles or shapes, and filtering the report on click.
- Power BI visual GUID (`visualType`): `plumeImageF765EB2CC018408786BADCD7A1C0464F`
- 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

Image Plume (identifier `image`) is a Power BI custom visual (version 1.1.0.0, installed from its `.pbiviz` file; not yet on AppSource) that shows **images stored in the report as base64 text or data URIs**. It never loads a web address.

**New in version 1.1.0.0 (30/10/2026):** Free native-parity additions: cross-filtering without an "Image key" field, **link opened on click** (web URL action), "Brighter" hover state.

- **Sources**: a column or a measure in the `image` role (raw base64, `data:image/png|jpeg|gif|webp|bmp;base64,…`, `data:image/svg+xml` or SVG markup), or an image pasted in **Format › Pasted image and fallback** (`fallback.pasted`), shown when no field is set (a logo) or as a fallback for empty images (`fallback.whenEmpty` = `fallback`).
- **Images over 32,766 characters** (the limit of Power BI column texts): split them into rows (one chunk per row) and drop the chunk number in **Chunk index** (`chunkIndex`): the visual sorts the chunks numerically (2 before 10), keeps a repeated index once, joins them, one image per **Image key**, and reports missing indexes in edit mode. A DAX measure with `CONCATENATEX` works too (a measure is not limited to 32,766 characters).
- **Web addresses refused**: `http(s)://`, `//`, `www.`, `file:`, `ftp:`, `blob:`, `C:\…`, `\\server` are never loaded (Microsoft certification); a message explains it in edit mode ("Embedded images only: web addresses are never loaded (convert the image to base64)"). SVGs are cleaned (whitelist: scripts, `foreignObject`, external links, event handlers, `<text>` and `<image>` removed) and re-encoded.
- **Displays** (`layout.mode`): `single` (first or last row, a highlighted image first), `grid` (gallery: automatic or fixed columns, spacing, cell shape, maximum number of images, vertical scrolling), `carousel` ★ (arrows, dots, auto-advance with pause, fade or slide), `compare` ★ (before / after slider: first two images), `stack` ★ (layers: the first image opaque, the others at `layout.layerOpacity`).
- **Position and size**: 9-point `position.align` + `offsetX` / `offsetY`, `padding`; `sizeMode` `fit` (whole image), `fill` (frame full, cropped; the position picks the visible part), `stretch`, `original` (pixels), `fixed` (`width` × `height`, `keepRatio`), `percent` (share of the frame); premium `rotate` ★ `90` | `180` | `270` (default `0`), `flipH` ★, `flipV` ★.
- **Masks** (`mask.kind`): `rounded` (`radius` px), `ellipse` (`circle` = perfect circle), `shape` (153 shapes of the Plume library, 22 free), `svg` ★ (`mask.svg`: markup, SVG data URI or a path "d"); `fit` `contain` | `stretch`, `scale` (10–100 %). The outline and the drop shadow ★ follow the mask.
- **Adjustments**: opacity, brightness, contrast, grayscale; ★ saturation (0–300 %), ★ blur, ★ sepia, vintage, warm, cool, duotone (style colors or `duoDark` / `duoLight`), negative, hue.
- **Image by value ★** (`conditional`): with the `value` role, `pick` shows the 1st image below `t1`, the 2nd between `t1` and `t2`, the 3rd from `t2` (traffic lights, conditional logos, no DAX); `fade` greys images below `t1` and rings images from `t2` (in a gallery).
- **Play axis ★** (`play` role, premium since the 22/10/2026 rebalancing: watermark as soon as the field holds data): slideshow, one image (or one gallery) per date / year with the shared Plume player (play, slider, speed, loop, cross-fade).
- Selection and cross-filtering by **Image key**, highlighting from other visuals, tooltips (key, caption, value, Tooltips measures, image size in pixels), magnifier ★ on hover.

## 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 are **free**; every other `style.preset`, the other gradient palettes and `style.themeJson` ("Theme JSON ★") are **premium**.
- Free in Image Plume: every source (column, measure, pasted image, chunks), single image and grid, every position and size option (without rotation and flips), masks `rounded`, `ellipse` and the 22 free shapes (`circle`, `square`, `roundedSquare`, `rectangle`, `triangle`, `diamond`, `hexagon`, `star`, `heart`, `cloud`, `drop`, `bubble`, `arrow`, `person`, `house`, `barrel`, `bottle`, `glass`, `wineGlass`, `thermometer`, `battery`, `batteryVertical`), outline, opacity, brightness, contrast, grayscale, captions, selection, tooltips, "Slight zoom" hover.
- Premium features of Image Plume: `layout.mode` = `carousel`, `compare` or `stack` (with at least two images); `mask.kind` = `svg`; any other `mask.shape` (131 shapes); `adjust.preset` = `sepia`, `vintage`, `warm`, `cool`, `duotone`, `invert`; `adjust.hue` ≠ 0; `conditional.show` with the Value field; `interaction.hover` = `loupe`; and since 22/10/2026: a filled **Play axis** field, `outline.shadow`, `adjust.saturation` ≠ 100, `adjust.blur` > 0, `position.rotate` ≠ `0`, `position.flipH`, `position.flipV`.
- Without a valid key, a premium feature in use shows, in edit mode, a "Premium preview" note in the footer; in reading view, **"Plume Visuals · Premium preview"** (French « Plume Visuals · Aperçu premium ») is repeated lightly across the whole visual, without catching the mouse. It disappears once a key is pasted in **Format › Plume Studio License › License key** (`license.key`), the **first card** of the Format pane. Premium options and list values have " ★" appended to their label.
- Accepted keys: only keys starting with `PLUM1.` shown in the buyer's account on plumevisuals.com, checked offline (Ed25519 signature), covering `image` or the whole catalog. In edit mode, a wrong key shows "Invalid license key", "License expired (date)" or "This key does not cover this visual".
- Licenses last one year (one-time payment, no automatic renewal). Prices: 39 € personal, 99 € SME, 299 € enterprise per year, or the catalog pack.

## Expected data shape

One row per image, or one row per chunk of an image.

| Image key (`category`) | Chunk index (`chunkIndex`) | Image (`image`) | Caption (`label`) |
|---|---|---|---|
| Arcachon | 1 | `iVBORw0KGgo…` (30,000 characters) | Bay and stilt huts |
| Arcachon | 2 | `…` | Bay and stilt huts |
| Sarlat | 1 | `iVBORw0KGgo…` | Medieval town |

- **Image (base64)** (`image`, « Image (base64) », one column **or** measure, required unless an image is pasted in the pane): the image text. As a column it is used as is (no aggregation).
- **Image key (category)** (`category`, « Clé de l'image (catégorie) », one column): one image per value; selection and cross-filtering.
- **Chunk index** (`chunkIndex`, « Index du morceau », one column of numbers): order of the chunks.
- **Caption** (`label`, « Légende », one column or measure): text with the image; in a grid or carousel, the key is shown when it is empty.
- **Value (thresholds) ★** (`value`, « Valeur (seuils) ★ », one measure) for Image by value.
- **Play axis** (`play`, « Axe de lecture », one column), **Tooltips** (`tooltips`), **Dynamic format** (`format`).
- Volume: windows of 30,000 rows, more fetched with `fetchMoreData`; only displayed images are decoded (at most `layout.maxImages`, default 100, max 500).

## Power Query and DAX recipes

```m
// A folder of images → one row per 30,000-character chunk (Name, Chunk index, Chunk)
let
    Source = Folder.Files("C:\Images"),
    Bin    = Table.AddColumn(Source, "B64", each Binary.ToText([Content], BinaryEncoding.Base64), type text),
    Chunks = Table.AddColumn(Bin, "Chunks", each let t = [B64], n = Number.RoundUp(Text.Length(t) / 30000)
             in Table.FromColumns({ {1..n}, List.Transform({0..n - 1}, (i) => Text.Middle(t, i * 30000, 30000)) }, { "Chunk index", "Chunk" })),
    Rows   = Table.ExpandTableColumn(Table.SelectColumns(Chunks, { "Name", "Chunks" }), "Chunks", { "Chunk index", "Chunk" })
in
    Rows
```

```dax
// One image per filter context, joined in DAX (alternative to the Chunk index field)
Full image = "data:image/png;base64," & CONCATENATEX ( Images, Images[Chunk], "", Images[Chunk index], ASC )

// Default logo when nothing is selected: return BLANK and set fallback.whenEmpty = fallback with a pasted logo
Logo shown = IF ( HASONEVALUE ( Companies[Company] ), SELECTEDVALUE ( Companies[Logo] ), BLANK () )
```

## Interactions with the report

- Click an image (with an Image key): select and cross-filter; Ctrl + click for several; click the background to clear. Other images fade (`interaction.dim`, 30 %). Highlighting from other visuals fades non-highlighted images (single mode: the highlighted image is shown).
- Context menu everywhere (images, captions, carousel controls, slider, empty area, landing page).
- Keyboard: Tab to the visual; arrows move between images (grid), change image (carousel), move the before / after slider (Shift = 10 %, Home, End) or the play axis; Enter selects; Esc clears. Screen readers: role img with the alternative text (`fallback.alt`, else caption, else key), slider role for the before / after handle, announcements in French and English.
- Nothing is saved with persistProperties: carousel position, slider and magnifier are session state.

## Dynamic formats

- **fx button** on colors and texts (e.g. `outline.color`, `caption.color`, `fallback.pasted`).
- **"Dynamic format" well** (`format`): measures renamed `card.setting` (e.g. `adjust.brightness`, `mask.kind`, `title.text`) drive any setting. Driving a ★ setting by DAX still shows the watermark without a key.

```dax
// renamed title.text
Featured title = "Featured: " & SELECTEDVALUE ( Places[Place], "Nouvelle-Aquitaine" )
// renamed adjust.brightness
Brightness by filter = IF ( HASONEVALUE ( Places[Place] ), 100, 90 )
```

## Format pane: option IDs

- Card order: `license`, `style`, `layout`, `position`, `mask`, `outline`, `adjust`, `caption`, `conditional`, `interaction`, `fallback`, `play` (only with a Play axis field), then `title`, `source`, `container`, `texts`. Format pane in version 1.1.0.0 (30/10/2026), top to bottom: `license`, `style`, `layout`, `layers`, `position`, `mask`, `outline`, `adjust`, `caption`, `conditional`, `fallback`, `play`, `interaction`, `tooltip`, `title`, `source`, `container`, `texts`. Settings moved or renamed in this version keep working in older reports (the old names are still read).
- `layout`: `mode` (`single` | `grid` | `carousel` ★ | `compare` ★ | `stack` ★), `pick` (`first` | `last`), `columns` (0 = auto, 0–24), `gap` (0–60, 8), `cellRatio` (`auto` | `square` | `landscape` | `wide` | `portrait`), `maxImages` (1–500, 100), `interval` (1,000–30,000 ms, 4,000), `autoAdvance`, `effect` (`fade` | `slide` | `none`), `arrows`, `dots`, `split` (0–100, 50), `compareLabels`, `layerOpacity` (0–100, 60).
- `position`: `align` (`topLeft` | `top` | `topRight` | `left` | `center` | `right` | `bottomLeft` | `bottom` | `bottomRight`), `sizeMode` (`fit` | `fill` | `stretch` | `original` | `fixed` | `percent`), `width`, `height` (160), `keepRatio`, `percent` (80), `offsetX`, `offsetY`, `padding`, `rotate` (`0` | `90` ★ | `180` ★ | `270` ★), `flipH` ★, `flipV` ★.
- `mask`: `kind` (`none` | `rounded` | `ellipse` | `shape` | `svg` ★), `radius` (16), `circle` (on), `shape` (153 shape IDs, default `hexagon`), `svg` ★, `fit` (`contain` | `stretch`), `scale` (10–100, 100).
- `outline`: `show`, `width` (2), `color` (empty = accent), `shadow` ★, `shadowColor`, `shadowOpacity` (30), `shadowBlur` (10), `shadowOffset` (4).
- `adjust`: `opacity`, `brightness`, `contrast`, `saturation` ★ (100), `blur` ★ (0), `preset` (`none` | `grayscale` | `sepia` ★ | `vintage` ★ | `warm` ★ | `cool` ★ | `duotone` ★ | `invert` ★), `duoDark`, `duoLight`, `hue` ★ (−180–180).
- `caption`: `show`, `position` (`below` | `above` | `overlayBottom` | `overlayTop`), `fontSize` (12), `bold`, `color`, `align`, `lines` (2), `band`.
- `conditional` ★: `show`, `mode` (`pick` | `fade`), `t1`, `t2`. `interaction`: `select`, `dim` (30), `hover` (`none` | `lift` | `loupe` ★), `loupeZoom` (250), `loupeSize` (140). `fallback`: `pasted`, `whenEmpty` (`placeholder` | `fallback` | `hide`), `alt`.
- `play` ★ (card "Playback ★"): shared player (`start`, `speed`, `loop`, `autoPlay`, `transition`, `controls`, `position`, `ticks`, `tickLabels`, `stepButtons`, `speedButton`, `showLabel`, `labelSize`, `labelPosition`).

## Editing a PBIP report (visual.json)

```json
{
  "visualType": "plumeImageF765EB2CC018408786BADCD7A1C0464F",
  "query": {
    "queryState": {
      "category":   { "projections": [ { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Places" } }, "Property": "Place" } }, "queryRef": "Places.Place", "nativeQueryRef": "Place" } ] },
      "chunkIndex": { "projections": [ { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Places" } }, "Property": "Chunk index" } }, "queryRef": "Places.Chunk index", "nativeQueryRef": "Chunk index" } ] },
      "image":      { "projections": [ { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Places" } }, "Property": "Image" } }, "queryRef": "Places.Image", "nativeQueryRef": "Image" } ] }
    }
  },
  "objects": {
    "layout":   [ { "properties": { "mode": { "expr": { "Literal": { "Value": "'grid'" } } } } } ],
    "position": [ { "properties": { "sizeMode": { "expr": { "Literal": { "Value": "'fill'" } } } } } ],
    "mask":     [ { "properties": { "kind": { "expr": { "Literal": { "Value": "'ellipse'" } } } } } ]
  }
}
```

## Common pitfalls

- Image cut or a gray placeholder: text truncated at 32,766 characters; split into chunks and add Chunk index.
- "Embedded images only…": the column holds web addresses; convert to base64.
- All chunks mixed into one image: several images without an Image key.
- One image instead of a gallery: `layout.mode` is `single`.
- Watermark visible: a filled play axis, drop shadow, saturation or blur, rotation or flips, carousel, before / after or layers with two images or more, a ★ shape or SVG mask, a ★ filter or hue, Image by value with the Value field, magnifier, a ★ style or a theme JSON, without a valid key.
- Text inside an SVG used as a mask or as an image is removed by the cleaning (draw logos with shapes).

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

Loading images from a URL, SharePoint or OneLake; opening a web link or a report page on click; interactive cropping saved in the report; per-layer settings (each layer has the same position, size and mask); playback control of animated GIFs; exporting or downloading the image.

## 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 |
|---|---|---|---|---|---|
| `image` | Image (base64) | Image (base64) | GroupingOrMeasure | 1 | Column or measure with base64 text or a data URI (PNG, JPEG, GIF, WebP, BMP, SVG). With “Chunk index”: one piece of the image per row. |
| `category` | Image key (category) | Clé de l'image (catégorie) | column | 1 | One image per value (product, person, site): gallery, carousel, selection and cross-filtering. |
| `chunkIndex` | Chunk index | Index du morceau | column | 1 | Order of the pieces of an image split into rows (beyond the 32,766-character limit of Power BI texts): the visual joins them back. |
| `label` | Caption | Légende | GroupingOrMeasure | 1 | Text shown with the image (and read by screen readers). |
| `value` | Value (thresholds) ★ | Valeur (seuils) ★ | measure | 1 | Number compared with the thresholds of “Image by value ★”: picks the image (traffic lights, conditional logos) or fades the images below the threshold. |
| `play` | Play axis ★ | Axe de lecture ★ | column | 1 | A date, a year or an ordered category: the visual moves from one value to the next (play button) |
| `tooltips` | Tooltips | Infobulles | measure | several |  |
| `format` | Dynamic format | Format dynamique | measure | several | Measures named card.setting (e.g. title.fontSize): drive any Format option with DAX |

Data view: categorical, categories = `category` + `play` + `chunkIndex` + `image` + `label` (one row per combination), 30,000 rows per data window (more fetched automatically); measures = `image`, `label`, `value`, `tooltips`, `format`.
Capabilities: supportsHighlight, supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).

## Format pane options (156)

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

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

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

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

**Style**

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

**Custom colors / Couleurs personnalisées**

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

**Text / Texte**

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

**Animations**

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

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `layout.mode` | Display | Affichage | dropdown | enumeration | `single` | `single` Single image; `grid` Grid (gallery); `carousel` Carousel ★; `compare` Before / after (slider) ★; `stack` Stacked layers ★ | One image (the first row, or the highlighted one), a gallery grid, a carousel, a before / after slider or stacked layers. |
| `layout.pick` | Image shown | Image affichée | dropdown | enumeration | `first` | `first` The first one; `last` The last one | Visible when `layout.mode` = `single`. With several rows: the first or the last one (a highlighted or selected image comes first). |
| `layout.columns` | Columns (0 = automatic) | Colonnes (0 = automatique) | number | integer | `0` | 0 to 24 | Visible when `layout.mode` = `grid` |
| `layout.gap` | Spacing (px) | Espacement (px) | number | integer | `8` | 0 to 60 | Visible when `layout.mode` = `grid` |
| `layout.cellRatio` | Cell shape | Format des cases | dropdown | enumeration | `auto` | `auto` Automatic (fill the visual); `square` Square; `landscape` Landscape 4:3; `wide` Wide 16:9; `portrait` Portrait 3:4 | Visible when `layout.mode` = `grid` |
| `layout.maxImages` | Maximum number of images | Nombre maximal d'images | number | integer | `100` | 1 to 500 | Visible when `layout.mode` = `grid` or `carousel` or `stack` |
| `layout.interval` | Duration of an image (ms) | Durée d'une image (ms) | number | integer | `4000` | 1000 to 30000 | Visible when `layout.mode` = `carousel` |
| `layout.autoAdvance` | Auto-advance | Défilement automatique | toggle | bool | `true` | true / false | Visible when `layout.mode` = `carousel`. Pauses on hover and keyboard focus; the pause button stops it. Never on a dashboard tile. |
| `layout.effect` | Transition | Transition | dropdown | enumeration | `fade` | `fade` Fade; `slide` Slide; `none` None | Visible when `layout.mode` = `carousel` |
| `layout.arrows` | Arrows | Flèches | toggle | bool | `true` | true / false | Visible when `layout.mode` = `carousel` |
| `layout.dots` | Navigation dots | Points de navigation | toggle | bool | `true` | true / false | Visible when `layout.mode` = `carousel` |
| `layout.split` | Initial slider position (%) | Position du curseur au départ (%) | number | integer | `50` | 0 to 100 | Visible when `layout.mode` = `compare` |
| `layout.compareLabels` | Before / after labels | Libellés avant / après | toggle | bool | `true` | true / false | Visible when `layout.mode` = `compare` |
| `layout.layerOpacity` | Opacity of upper layers (%) | Opacité des calques du dessus (%) | number | integer | `60` | 0 to 100 | Visible when `layout.mode` = `stack` |

### Per-layer settings ★ / Réglages par calque ★ (`layers`, Format pane)

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

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `layers.show` | Show the layer | Afficher le calque | toggle | bool | `true` | true / false |  |
| `layers.opacity` | Layer opacity (%, -1 = shared) | Opacité du calque (%, -1 = commune) | number | integer | `-1` | -1 to 100 | -1: the opacity of upper layers set in Layout. The first layer stays opaque unless you set it here. |

### Position and size / Position et taille (`position`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `position.align` | Position | Position | dropdown | enumeration | `center` | `topLeft` Top left; `top` Top; `topRight` Top right; `left` Left; `center` Center; `right` Right; `bottomLeft` Bottom left; `bottom` Bottom; `bottomRight` Bottom right | Where the image sits in its frame; with “Fill”, the part of the image that stays visible. |
| `position.sizeMode` | Size | Taille | dropdown | enumeration | `fit` | `fit` Fit (whole image); `fill` Fill (crop); `stretch` Stretch; `original` Original size; `fixed` Fixed size (px); `percent` Share of the frame (%) |  |
| `position.width` | Width (px) | Largeur (px) | number | integer | `160` | 1 to 4000 | Visible when `position.sizeMode` = `fixed` |
| `position.height` | Height (px) | Hauteur (px) | number | integer | `160` | 1 to 4000 | Visible when `position.sizeMode` = `fixed` |
| `position.keepRatio` | Keep proportions | Garder les proportions | toggle | bool | `true` | true / false | Visible when `position.sizeMode` = `fixed` |
| `position.percent` | Share (%) | Proportion (%) | number | integer | `80` | 1 to 100 | Visible when `position.sizeMode` = `percent` |
| `position.offsetX` | Horizontal offset (px) | Décalage horizontal (px) | number | integer | `0` | -2000 to 2000 |  |
| `position.offsetY` | Vertical offset (px) | Décalage vertical (px) | number | integer | `0` | -2000 to 2000 |  |
| `position.padding` | Margin around the image (px) | Marge autour de l'image (px) | number | integer | `0` | 0 to 200 |  |
| `position.rotate` | Rotation | Rotation | dropdown | enumeration | `0` | `0` None; `90` 90° (clockwise) ★; `180` 180° ★; `270` 90° (counterclockwise) ★ |  |
| `position.flipH` | Flip horizontally ★ | Miroir horizontal ★ | toggle | bool | `false` | true / false |  |
| `position.flipV` | Flip vertically ★ | Miroir vertical ★ | toggle | bool | `false` | true / false |  |

### Mask (clipping) / Masque (découpe) (`mask`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `mask.kind` | Clip the image | Découper l'image | dropdown | enumeration | `none` | `none` No; `rounded` Rounded corners; `ellipse` Ellipse or circle; `shape` Shape from the library; `svg` Custom SVG ★ | Rounded corners, ellipse or circle, one of the 153 shapes of the library (22 free) or your own SVG ★. |
| `mask.radius` | Corner radius (px) | Rayon des angles (px) | number | integer | `16` | 0 to 1000 | Visible when `mask.kind` = `rounded` |
| `mask.circle` | Perfect circle | Cercle parfait | toggle | bool | `true` | true / false | Visible when `mask.kind` = `ellipse`. Off: an ellipse that fills the frame of the image. |
| `mask.shape` | Shape | Forme | dropdown | enumeration | `hexagon` | `circle` Basic · Circle; `square` Basic · Square; `roundedSquare` Basic · Rounded square; `rectangle` Basic · Rectangle; `triangle` Basic · Triangle; `diamond` Basic · Diamond; `hexagon` Basic · Hexagon; `star` Basic · Star; `heart` Basic · Heart; `ellipse` Basic · Ellipse ★; `pentagon` Basic · Pentagon ★; `octagon` Basic · Octagon ★; `rightTriangle` Basic · Right triangle ★; `parallelogram` Basic · Parallelogram ★; `trapezoid` Basic · Trapezoid ★; `ring` Basic · Ring ★; `semicircle` Basic · Semicircle ★; `arch` Basic · Arch ★; `capsule` Basic · Pill ★; `star6` Basic · Six-pointed star ★; `seal` Basic · Seal ★; `cross` Basic · Cross ★; `arrow` Arrows and symbols · Arrow; `arrowUp` Arrows and symbols · Arrow up ★; `arrowDown` Arrows and symbols · Arrow down ★; `arrowLeft` Arrows and symbols · Arrow left ★; `doubleArrow` Arrows and symbols · Double arrow ★; `chevron` Arrows and symbols · Chevron ★; `check` Arrows and symbols · Check mark ★; `close` Arrows and symbols · Close (X) ★; `plus` Arrows and symbols · Plus ★; `minus` Arrows and symbols · Minus ★; `warning` Arrows and symbols · Warning ★; `info` Arrows and symbols · Information ★; `playButton` Arrows and symbols · Play button ★; `bubble` Arrows and symbols · Speech bubble; `thought` Arrows and symbols · Thought bubble ★; `flag` Arrows and symbols · Flag ★; `bookmark` Arrows and symbols · Bookmark ★; `tag` Arrows and symbols · Tag ★; `bolt` Arrows and symbols · Lightning bolt ★; `shield` Arrows and symbols · Shield ★; `award` Arrows and symbols · Award ★; `puzzle` Arrows and symbols · Puzzle piece ★; `gear` Arrows and symbols · Gear ★; `lock` Arrows and symbols · Lock ★; `key` Arrows and symbols · Key ★; `bell` Arrows and symbols · Bell ★; `eye` Arrows and symbols · Eye ★; `cloud` Nature and weather · Cloud; `drop` Nature and weather · Drop; `sun` Nature and weather · Sun ★; `moon` Nature and weather · Moon ★; `snowflake` Nature and weather · Snowflake ★; `leaf` Nature and weather · Leaf ★; `pine` Nature and weather · Pine tree ★; `tree` Nature and weather · Tree ★; `flower` Nature and weather · Flower ★; `mountain` Nature and weather · Mountain ★; `wave` Nature and weather · Wave ★; `flame` Nature and weather · Flame ★; `umbrella` Nature and weather · Umbrella ★; `apple` Nature and weather · Apple ★; `fish` Nature and weather · Fish ★; `paw` Nature and weather · Paw print ★; `rain` Nature and weather · Rain ★; `sprout` Nature and weather · Sprout ★; `person` People · Person; `man` People · Man ★; `woman` People · Woman ★; `child` People · Child ★; `people` People · Group of people ★; `bust` People · User bust ★; `house` Objects and buildings · House; `building` Objects and buildings · Office building ★; `factory` Objects and buildings · Factory ★; `castle` Objects and buildings · Castle ★; `shop` Objects and buildings · Shop ★; `bank` Objects and buildings · Bank ★; `hospital` Objects and buildings · Hospital ★; `book` Objects and buildings · Book ★; `envelope` Objects and buildings · Envelope ★; `phone` Objects and buildings · Phone ★; `laptop` Objects and buildings · Laptop ★; `monitor` Objects and buildings · Monitor ★; `gift` Objects and buildings · Gift ★; `clock` Objects and buildings · Clock ★; `calendar` Objects and buildings · Calendar ★; `pencil` Objects and buildings · Pencil ★; `lightbulb` Objects and buildings · Light bulb ★; `cup` Objects and buildings · Trophy ★; `crown` Objects and buildings · Crown ★; `trashCan` Objects and buildings · Trash can ★; `barrel` Containers and gauges · Barrel; `bottle` Containers and gauges · Bottle; `wineGlass` Containers and gauges · Wine glass; `glass` Containers and gauges · Glass; `mug` Containers and gauges · Mug ★; `jar` Containers and gauges · Jar ★; `bucket` Containers and gauges · Bucket ★; `battery` Containers and gauges · Battery; `batteryVertical` Containers and gauges · Vertical battery; `thermometer` Containers and gauges · Thermometer; `testTube` Containers and gauges · Test tube ★; `tank` Containers and gauges · Tank ★; `funnel` Containers and gauges · Funnel ★; `hourglass` Containers and gauges · Hourglass ★; `bag` Containers and gauges · Bag ★; `piggyBank` Containers and gauges · Piggy bank ★; `flask` Containers and gauges · Flask ★; `beaker` Containers and gauges · Beaker ★; `can` Containers and gauges · Can ★; `coffeeCup` Containers and gauges · Coffee cup ★; `vase` Containers and gauges · Vase ★; `milkCarton` Containers and gauges · Milk carton ★; `france` Maps and places · Metropolitan France ★; `africa` Maps and places · Africa ★; `australia` Maps and places · Australia ★; `southAmerica` Maps and places · South America ★; `pin` Maps and places · Map pin ★; `globe` Maps and places · Globe ★; `foldedMap` Maps and places · Folded map ★; `compass` Maps and places · Compass ★; `city` Maps and places · City skyline ★; `target` Business · Target ★; `barChart` Business · Bar chart ★; `pieChart` Business · Pie chart ★; `trendUp` Business · Trend up ★; `coin` Business · Coin ★; `banknote` Business · Banknote ★; `wallet` Business · Wallet ★; `creditCard` Business · Credit card ★; `cart` Business · Shopping cart ★; `briefcase` Business · Briefcase ★; `percent` Business · Percent ★; `podium` Business · Podium ★; `megaphone` Business · Megaphone ★; `gem` Business · Gem ★; `medal` Business · Medal ★; `clipboard` Business · Clipboard ★; `handshake` Business · Handshake ★; `car` Transport · Car ★; `truck` Transport · Truck ★; `bus` Transport · Bus ★; `bicycle` Transport · Bicycle ★; `plane` Transport · Plane ★; `boat` Transport · Sailboat ★; `train` Transport · Train ★; `rocket` Transport · Rocket ★; `helicopter` Transport · Helicopter ★; `ship` Transport · Cargo ship ★; `fuel` Transport · Fuel pump ★; `scooter` Transport · Scooter ★ | 153 shapes in 9 families; 22 of them are free, the others ★. |
| `mask.svg` | Clipping SVG ★ | SVG de la découpe ★ | textarea | text | (empty) |  | Visible when `mask.kind` = `svg`. Paste an SVG (markup, data URI or a path “d”): its filled shapes cut the image. Cleaned, nothing is ever loaded. |
| `mask.fit` | Shape fit | Ajustement de la forme | dropdown | enumeration | `contain` | `contain` Keep proportions; `stretch` Fill the frame (distorted) | Visible when `mask.kind` = `shape` or `svg` |
| `mask.scale` | Shape size (%) | Taille de la forme (%) | number | integer | `100` | 10 to 100 | Visible when `mask.kind` = `ellipse` or `shape` or `svg` |

### Outline and shadow / Contour et ombre (`outline`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `outline.show` | Outline | Contour | toggle | bool | `false` | true / false | Follows the mask. |
| `outline.width` | Width (px) | Épaisseur (px) | number | integer | `2` | 1 to 30 | Visible when `outline.show` = `true` |
| `outline.color` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color | Visible when `outline.show` = `true` |
| `outline.shadow` | Drop shadow ★ | Ombre portée ★ | toggle | bool | `false` | true / false | Follows the mask and the transparent parts of the image. |
| `outline.shadowColor` | Shadow color | Couleur de l'ombre | color | fill | `#000000` | hex color | Visible when `outline.shadow` = `true` |
| `outline.shadowOpacity` | Shadow opacity (%) | Opacité de l'ombre (%) | number | integer | `30` | 0 to 100 | Visible when `outline.shadow` = `true` |
| `outline.shadowBlur` | Shadow blur (px) | Flou de l'ombre (px) | number | integer | `10` | 0 to 60 | Visible when `outline.shadow` = `true` |
| `outline.shadowOffset` | Shadow offset (px) | Décalage de l'ombre (px) | number | integer | `4` | 0 to 40 | Visible when `outline.shadow` = `true` |

### Image adjustments / Réglages de l'image (`adjust`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `adjust.opacity` | Opacity (%) | Opacité (%) | number | integer | `100` | 0 to 100 |  |
| `adjust.brightness` | Brightness (%) | Luminosité (%) | number | integer | `100` | 0 to 300 |  |
| `adjust.contrast` | Contrast (%) | Contraste (%) | number | integer | `100` | 0 to 300 |  |
| `adjust.saturation` | Saturation (%) ★ | Saturation (%) ★ | number | integer | `100` | 0 to 300 |  |
| `adjust.blur` | Blur (px) ★ | Flou (px) ★ | number | integer | `0` | 0 to 40 |  |
| `adjust.preset` | Filter | Filtre | dropdown | enumeration | `none` | `none` None; `grayscale` Grayscale; `sepia` Sepia ★; `vintage` Vintage ★; `warm` Warm ★; `cool` Cool ★; `duotone` Duotone (style colors) ★; `invert` Negative ★ |  |
| `adjust.duoDark` | Duotone: shadows (empty = style) | Duotone : ombres (vide = style) | color | fill | (empty) | hex color | Visible when `adjust.preset` = `duotone` |
| `adjust.duoLight` | Duotone: highlights (empty = style) | Duotone : lumières (vide = style) | color | fill | (empty) | hex color | Visible when `adjust.preset` = `duotone` |
| `adjust.hue` | Hue (degrees) ★ | Teinte (degrés) ★ | number | integer | `0` | -180 to 180 |  |

### Caption / Légende de l'image (`caption`, Format pane)

The card header toggle is `caption.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `caption.show` | Show | Afficher | toggle | bool | `true` | true / false | Text of the “Caption” field; in a gallery or a carousel, the image key when the field is empty. |
| `caption.position` | Position | Position | dropdown | enumeration | `below` | `below` Below the image; `above` Above the image; `overlayBottom` On the image, bottom; `overlayTop` On the image, top |  |
| `caption.fontSize` | Size | Taille | number | formatting | `12` | 6 to 40 |  |
| `caption.bold` | Bold | Gras | toggle | bool | `false` | true / false |  |
| `caption.color` | Color (empty = text) | Couleur (vide = texte) | color | fill | (empty) | hex color |  |
| `caption.align` | Alignment | Alignement | dropdown | enumeration | `center` | `left` Left; `center` Center; `right` Right |  |
| `caption.lines` | Maximum lines | Lignes au plus | number | integer | `2` | 1 to 6 |  |
| `caption.band` | Band behind the text (on the image) | Bandeau sous le texte (sur l'image) | toggle | bool | `true` | true / false |  |

### Image by value ★ / Image selon la valeur ★ (`conditional`, 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 `conditional.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `conditional.show` | Enable ★ | Activer ★ | toggle | bool | `false` | true / false | Needs the “Value (thresholds)” field. No DAX needed: traffic lights, conditional logos, status pictures. |
| `conditional.mode` | Effect | Effet | dropdown | enumeration | `pick` | `pick` Pick the image (1st, 2nd or 3rd row) by threshold; `fade` Fade below threshold 1, ring above threshold 2 |  |
| `conditional.t1` | Threshold 1 | Seuil 1 | number | numeric | `0` |  |  |
| `conditional.t2` | Threshold 2 (ignored unless above threshold 1) | Seuil 2 (ignoré s'il n'est pas au-dessus du seuil 1) | number | numeric | `0` |  |  |

### Pasted image and fallback / Image collée et repli (`fallback`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `fallback.pasted` | Pasted image (base64, data URI or SVG) | Image collée (base64, data URI ou SVG) | textarea | text | (empty) |  | Shown without any field (a logo), or when an image of the data is empty. Web addresses are refused. |
| `fallback.whenEmpty` | Empty or unreadable image | Image vide ou illisible | dropdown | enumeration | `placeholder` | `placeholder` Discreet placeholder; `fallback` Pasted image; `hide` Nothing |  |
| `fallback.alt` | Alternative text (accessibility) | Texte de remplacement (accessibilité) | text | text | (empty) |  | Read by screen readers. Empty: the caption, then the image key. |

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

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

**Playback / Lecture**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `play.start` | Frame shown on opening | Image affichée à l'ouverture | dropdown | enumeration | `last` | `last` The last one (most recent); `first` The first one |  |
| `play.speed` | Duration of a frame (ms) | Durée d'une image (ms) | number | integer | `1000` | 100 to 10000 | At speed ×1; the speed button of the play bar multiplies it (×0.5 to ×4) for the session. |
| `play.loop` | Loop | Lecture en boucle | toggle | bool | `false` | true / false |  |
| `play.autoPlay` | Play automatically on opening | Lecture automatique à l'ouverture | toggle | bool | `false` | true / false | Once, from the first frame. Not when animations are reduced (Style › Animations or the system) nor on a dashboard tile. |
| `play.transition` | Animated transitions | Transitions animées | toggle | bool | `true` | true / false | Values, positions and colors move smoothly from one frame to the next. |

**Play bar / Barre de lecture**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `play.controls` | Play bar | Barre de lecture | toggle | bool | `true` | true / false |  |
| `play.position` | Bar position | Position de la barre | dropdown | enumeration | `bottom` | `bottom` Bottom; `top` Top | Visible when `play.controls` = `true` |
| `play.ticks` | Tick marks | Graduations | dropdown | enumeration | `auto` | `auto` Automatic; `all` Every frame; `none` None | Visible when `play.controls` = `true` |
| `play.tickLabels` | Tick labels | Étiquettes des graduations | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |
| `play.stepButtons` | Start and end buttons | Boutons début et fin | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |
| `play.speedButton` | Speed button | Bouton de vitesse | toggle | bool | `true` | true / false | Visible when `play.controls` = `true` |

**Large value / Valeur en grand**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `play.showLabel` | Current value in large type | Valeur en cours en grand | toggle | bool | `true` | true / false |  |
| `play.labelSize` | Large value size | Taille de la valeur en grand | number | formatting | `44` | 12 to 160 | Visible when `play.showLabel` = `true` |
| `play.labelPosition` | Large value position | Position de la valeur en grand | dropdown | enumeration | `bottomRight` | `bottomRight` Bottom right; `topRight` Top right; `topLeft` Top left; `bottomLeft` Bottom left; `center` Center | Visible when `play.showLabel` = `true` |

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `interaction.select` | Click = filter the report | Clic = filtrer le rapport | toggle | bool | `true` | true / false | A click selects the image and filters the other visuals (Ctrl + click: several). Identity: the “Image key” field, otherwise the “Caption” or “Image” column. |
| `interaction.link` | Link opened on click (https://…) | Lien ouvert au clic (https://…) | text | text | (empty) |  | Like the Web URL action of the native Image visual: Power BI asks before opening it. With a link, Ctrl + click still selects. Can come from a measure (fx). |
| `interaction.dim` | Opacity of unselected images (%) | Opacité des images non sélectionnées (%) | number | integer | `30` | 5 to 90 |  |
| `interaction.hover` | Hover | Survol | dropdown | enumeration | `lift` | `none` No effect; `lift` Slight zoom; `brighten` Brighter; `loupe` Magnifier ★ |  |
| `interaction.loupeZoom` | Magnifier zoom (%) | Grossissement de la loupe (%) | number | integer | `250` | 150 to 800 | Visible when `interaction.hover` = `loupe` |
| `interaction.loupeSize` | Magnifier diameter (px) | Diamètre de la loupe (px) | number | integer | `140` | 60 to 400 | Visible when `interaction.hover` = `loupe` |

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

The card header toggle is `tooltip.show`.

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

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

The card header toggle is `title.show`.

**Title / Titre**

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

**Subtitle / Sous-titre**

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

**Divider / Séparateur**

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

**Spacing / Espacement**

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

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

The card header toggle is `source.show`.

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

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

**Background / Arrière-plan**

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

**Border / Bordure**

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

**Shadow / Ombre**

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

**Spacing / Marges**

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

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

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