# Gantt Plume: technical reference for AI assistants

> Power BI custom visual by Plume Studio (Plume Visuals). Visual version **1.3.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 Gantt 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/gantt-chart (French: https://plumevisuals.com/fr/visuels/gantt-chart)
- Summary: The Gantt chart for Power BI: a task grid, a timeline you zoom from hours to years, a collapsible hierarchy, milestones and the critical path.
- Power BI visual GUID (`visualType`): `plumeGanttChartB2FEC518BC294539ACD7EE04DBA8CFE8`
- 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

Gantt Plume is a Power BI custom visual that turns a task table into a project plan: a **task grid** on the left (owner, start, end, duration, progress, outline numbers and up to 8 extra columns) and a **timeline** on the right that the reader zooms from hours to years (toolbar, Ctrl + mouse wheel centered on the pointer) and drags to scroll. Tasks sit in a **collapsible hierarchy** of up to 6 group levels (portfolio › project › phase…), with summary bars (min / max dates, progress weighted by duration) and numeric grid columns summed per group. Milestones (4 shapes), several bars on one row (absences, machines, split tasks), weekends and holidays shaded, durations in business days, calendar days or hours, a today line or a fixed status date, a custom sort order, bar labels and colors from your fields. Premium features: **dependencies** in MS Project format with the **critical path**, **baseline versus actual** with the variance in business days, **computed status** (done, on track, at risk, late, upcoming), **bar color from a DAX measure**, **rollup of collapsed groups** (a collapsed project shows its tasks' bars and named milestones on its row), **resource view** (one row per owner, overlaps in red), **whole plan in the frame** for PDF / PowerPoint export, and date markers in the Analytics pane. Version 1.2.0.0 (name "Gantt Plume" since that version, formerly "Plume Gantt") added the Sort order and Bar label fields, the bar color measure, the rollup of collapsed groups, outline numbers, long names on two lines, month / hour / quarter / year formats and new initial positions (end of the plan, chosen date). Version 1.2.1.0 made dependency arrows always read left to right (an arrow to a successor that starts before the elbow drops onto its bar or milestone), placed bar labels after the outgoing arrow, kept right-hand labels inside "Fit" and added a Task column width setting with wrapping on up to 6 lines. The visual makes no network request.

**New in version 1.3.0.0 (30/10/2026):** Format pane reorganized (`view.*` → `layout.*`, `timeline.*` → `timeAxis.*`, row sort in **Sort**, labels in **Labels**); free parity with Microsoft's Gantt: vertical and horizontal gridlines, milestone lines, bar border, "Progress complete at", non-working day color, header background, axis start / end (fixed or `timeAxis.min` / `timeAxis.max` measures); opens framed on the whole plan.

## Free vs premium (★)

- Every feature works without a key and nothing is ever blocked. Free features never show a watermark.
- Shared Style card (the same in every Plume visual): the styles `none`, `minimal` and `blackWhite`, the two Plume gradient palettes (`crest`, `crestDiverging`), "Follow report theme" and all custom colors (`style.customColors` and the colors under it) are **free**; every other `style.preset`, the other gradient palettes (`style.palette`) and `style.themeJson` ("Theme JSON ★") are **premium** (watermark without a key). See "Styles and theme JSON" below.
- Using a premium feature without a valid key shows **"Plume Visuals · Premium preview"** (French: « Plume Visuals · Aperçu premium ») in the footer of the visual, with an "Unlock →" link to the pricing page. It disappears once a key is pasted in **Format › Plume Studio License › License key** (`license.key`; French: « Licence Plume Studio › Clé de licence »), the **first card** of the Format pane.
- Premium features of Gantt Plume (the watermark shows only when one of them is actually in use):
  - the **Predecessors ★** field with `dependencies.show` or `critical.show` on (cards "Dependencies ★" and "Critical path ★"); `critical.show` is off by default, `dependencies.show` on;
  - the **Baseline start ★ / Baseline end ★** fields with `baseline.show` on (card "Baseline ★");
  - the **Bar color (measure) ★** field, as soon as it returns a color for a bar;
  - `dataColors.mode` = `status` ("Computed status (late, at risk…) ★");
  - `layout.mode` = `resources` ("Resources (one row per owner) ★") and `layout.fit` ("Whole plan in the frame (PDF export) ★");
  - `rows.rollup` = `milestones` or `all` ("Collapsed group: detail on its row ★") when there are groups;
  - a date marker or the shaded period of the Analytics pane card "Date markers ★" (`markers.show1`… with a date, `markers.band` with both dates).
- Premium options and list values have " ★" appended to their label and 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 `gantt-chart` or the whole catalog. In edit mode, a wrong key shows "Invalid license key", "License expired (date)" or "This key does not cover this visual". `license.showOwner` displays "Licensed to <holder>".
- Licenses last one year (one-time payment, no automatic renewal, key accepted for 30 more days, reminders 30 and 7 days before the end), for this visual: 39 € personal, 99 € SME, 299 € enterprise per year, or the catalog packs (199 € / 399 € / 1,199 € per year; tiers by number of users, designers and viewers included: personal 1–10, SME 11–200, enterprise more than 200).
- Status: Available, version 1.2.1.0, installed from the `.pbiviz` file (AppSource submission in progress). The License card starts with a read-only line "Get a license: plumevisuals.com" (`license.buy`, never read by the visual).

## Expected data shape

A **categorical** data view: one category per task field (all text and date fields are categories, combined row by row), measures for duration, progress, bar color, tooltips and dynamic format. One row of the source table = one task (or one bar).

| ID | Project | Phase | Task | Start | Finish | Baseline start | Baseline finish | Owner | Team | Milestone | Predecessors | % complete |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A2 | Bordeaux store | Studies | Lease signed | 2026-05-18 | 2026-05-18 | 2026-05-18 | 2026-05-18 | Hugo Lambert | Management | Yes | A1 | 1.00 |
| A3 | Bordeaux store | Studies | Building permit | 2026-05-19 | 2026-07-30 | 2026-05-19 | 2026-07-14 | Paul Martin | Works | | A2 | 1.00 |
| A6 | Bordeaux store | Works | Electrics and lighting | 2026-08-26 | 2026-09-11 | 2026-08-10 | 2026-08-25 | Karim Haddad | Works | | A4SS+18 | 1.00 |

- **Groups (project, phase…)** (`groups`, « Groupes (projet, phase…) », columns, up to 6, from the widest to the narrowest): the hierarchy; no parent-ID column is needed.
- **Task** (`task`, « Tâche », column, required).
- **Start** (`start`, « Début », column, required): a date column (choose the field itself, not its Date Hierarchy). ISO text dates with time, time zone or "Z", and `dd/mm/yyyy hh:mm:ss` are read too; dates outside 1900–2200 (e.g. 12/31/9999 for "no end") are ignored and reported in edit mode.
- **End** (`end`, « Fin », column) or **Duration (when there is no end)** (`duration`, « Durée (s'il n'y a pas de fin) », measure, added to the start in `timeAxis.durationUnit`, business days by default). A task with no end and no duration is a milestone.
- **Progress (%)** (`progress`, « Avancement (%) », measure): 0–1 or 0–100.
- **Owner / resource** (`resource`, « Responsable / ressource », column): grid column, coloring by owner, resource view.
- **Color (team, type…)** (`legend`, « Couleur (équipe, type…) », column): one color per value, chosen in Data colors and remembered per value (hidden `state.colors`).
- **Bar label** (`label`, « Étiquette », column): the text on the bar; replaces "Task and owner" when filled (`labels.content` = `field` forces it).
- **Bar color (measure) ★** (`barColor`, « Couleur des barres (mesure) ★ », measure): `#RRGGBB` or a color name; it wins over every coloring mode; a blank value keeps the usual color.
- **Milestone (yes / no)** (`milestone`, « Jalon (oui / non) », column): Yes / No, Oui / Non, True / False, 1 / 0 or "x"; any other non-empty text also makes a milestone and is shown as its type.
- **Task ID (for dependencies)** (`id`, « Identifiant (pour les dépendances) », column): referenced by Predecessors; also the "Data order (ID)" sort.
- **Sort order** (`sort`, « Ordre de tri », column): number, date or text (natural sort: "Lot 2" before "Lot 10"; ISO dates as text; blanks last); ranks tasks and groups, `sort.by` only breaks ties.
- **Predecessors ★** (`predecessors`, « Prédécesseurs ★ », column): see below.
- **Baseline start ★ / Baseline end ★** (`baselineStart`, `baselineEnd`, « Début / Fin de référence ★ », columns).
- **Grid columns** (`columns`, « Colonnes du tableau », columns, up to 8): extra grid columns, numeric ones summed on group rows when `grid.sumColumns` is on.
- **Tooltips** (`tooltips`, « Infobulles », measures) and **Dynamic format** (`format`, « Format dynamique », measures, never drawn).
- Volume: 30,000 rows per data window, more fetched automatically up to 100,000 rows; beyond, filter the page. Thousands of rows scroll virtually.

## DAX recipes

```dax
Progress = AVERAGE ( Tasks[% complete] )                   // 0–1, or 0–100

// Bar color ★: red for a task whose end has passed while it is not complete, blank = usual color
Alert color =
IF (
    MAX ( Tasks[% complete] ) < 1 && MAX ( Tasks[Finish] ) < DATE ( 2026, 10, 15 ),
    "#C0392B"
)

// Duration from a number of business days (when there is no End column)
Duration (days) = SUM ( Tasks[Days] )
```

## Dependencies and critical path ★

- **Predecessors** syntax (MS Project): IDs separated by `;` or `,`, each optionally followed by a link type and a lag: `3;5SS+2;8FF-1d` (English types FS, SS, FF, SF) or `3;5DD+2;8FF-1j` (French types FD, DD, FF, DF). No type = FS (finish → start). Lag units: days (`d`, `j`; business or calendar days following `timeAxis.durationUnit`), calendar days (`ed`, `ej`), hours (`h`), weeks (`w`, `sem`), months (`mo`, `mois`), `%` of the predecessor's duration; a decimal comma is accepted (`+1,5j`).
- The visual never moves tasks: dates always come from the data. Arrows are elbow lines; a successor that starts too early is a **conflict** (`dependencies.conflicts`, red by default, also in the tooltip). Hovering a bar highlights its whole upstream and downstream chain (`dependencies.hover`).
- **Critical path** (`critical.show`, off by default): CPM computed on the business-day calendar (weekends, `timeAxis.holidays`), network by network (independent projects each get their own critical path), total float per task (grid column "Float", `grid.colFloat`), `critical.tolerance` = maximum float in days still shown as critical. Circular links are left out of the calculation without breaking the rest.
- Edit-mode warnings: unknown predecessor (an ID absent from the Task ID field, or a task filtered off the page), unknown lag unit (counted in days), circular dependencies, critical path without the Predecessors field.

## Baseline, computed status and bar color ★

- **Baseline** (`baseline.show`, on by default once the baseline fields are filled): a gray bar under each bar (`baseline.color`), the variance in business days at the bar end (`baseline.variance`: ▲ late, ▼ early) and in the grid column "Variance" (`grid.colVariance`); `baseline.tolerance` = accepted variance in days.
- **Computed status** (`dataColors.mode` = `status`): done (progress 100 %), late (end passed and not done, hatched), at risk (expected progress, i.e. elapsed time, minus actual progress greater than `dataColors.tolerance` points, default 10, dashed), on track, upcoming; computed at `layout.statusDate` (empty = today). Without a Progress field: done once the end has passed, upcoming before the start, on track in between; a group takes the most worrying status of its tasks. Colors `dataColors.done`, `onTrack`, `risk`, `late`, `upcoming`; grid column "Status" (`grid.colStatus`). The status is always written in words and with a pill, never by color alone.
- **Bar color (measure)**: see the `barColor` field above; it wins over `dataColors.mode`.

## Collapsed groups, resource view and one-page plan ★

- `rows.rollup` ("Collapsed group: detail on its row ★"): `none` (summary bar only, default), `milestones` (task milestones with their names on a pill), `all` (task bars and milestones). Like the MS Project rollup; labels never overlap; hover and click act on the task itself.
- `layout.mode` = `resources`: one row per owner, tasks stacked in lanes, overlaps in red, task count; requires the Owner field (warning otherwise); more than 40 simultaneous tasks for one owner overlap.
- `layout.fit`: no scrolling, every row and the whole period fit in the visual, for printing, PDF / PowerPoint export and subscriptions.
- Analytics pane, card **Date markers ★** (`markers`): 3 markers (`show1`, `date1`, `label1`, `color1`, `style1` `solid` / `dashed` / `dotted`, same for 2 and 3) and one shaded period (`band`, `bandFrom`, `bandTo`, `bandLabel`, `bandColor`, `bandOpacity`). Dates as `yyyy-mm-dd`.

## Interactions with the report

- Click a bar or a row = select that task (cross-filters other visuals); Ctrl / Shift + click adds to the selection; click a legend value selects the series (`legend.interactive`); context menu; Power BI tooltips with dates, duration, progress, owner and the Tooltips measures (★ extras: status and expected progress, predecessors, successors, float, conflict, variance).
- Toolbar (`toolbar.show`): search a task (keeps its groups), scales and "Fit", expand / collapse all, "Today" button. Ctrl + wheel zooms around the pointer, dragging the background scrolls.
- Keyboard: ↑ ↓ Home End Page Up / Down to move, ← → to collapse or expand, Enter / Space to select, Esc to clear, + / − for the scale. ARIA labels for screen readers, high contrast supported, reduced motion respected.
- Saved in the report in edit mode only (persistProperties): expanded groups (hidden `state.expanded`, when `rows.remember` is on), per-value colors (`state.colors`), the grid width after dragging the splitter (`grid.width`, double-click = automatic) and the scale picked in the toolbar (`timeAxis.scale`). In reading mode these are kept in memory only.
- Other visuals cross-filter Gantt Plume (it does not support highlighting).

## Dynamic formats

- **fx button** (Power BI conditional formatting) on every color and every text of the Format pane: *Field value*, *Rules*, *Gradient*, e.g. `layout.statusDate` or `timeAxis.todayColor`.
- **Dynamic format** field (role `format`, several measures): a measure renamed for this visual as `card.setting` (right-click › Rename for this visual) drives **any** setting, e.g. `layout.statusDate`, `layout.startDate` (with `layout.startAt` = `date`), `timeAxis.scale`, `critical.show`, `rows.startLevel`. It wins over the fixed value, the style and an fx rule; its measures are never drawn. Names ignore case, accents and separator.
- Value used: the common value of all rows, else the total, else the first row. Wrap with `CALCULATE ( …, ALLSELECTED () )` for a whole-visual value. Examples: `IF ( HASONEVALUE ( Tasks[Project] ), "week", "month" )` renamed `timeAxis.scale`; `FORMAT ( MAX ( Tasks[Start] ), "yyyy-mm-dd" )` renamed `layout.startDate`.
- Driving a setting with DAX is free; a ★ value set by DAX still shows the watermark without a key.

## Format pane: how to read the tables below

- Each option has an ID `card.option` (for example `timeAxis.scale`). The card is the capabilities.json **object name**, the option is the **property name**.
- Card order: `license` (always first), `style` (shared Style card), `dataColors`, `view` (Display), `timeline`, `grid` (Task grid), `rows` (Rows and hierarchy), `bars`, `milestones`, `dependencies`, `critical`, `baseline`, `legend`, `toolbar`, `interaction`, then `title`, `source`, `container` and `texts`; `markers` is in the **Analytics** pane. `state` is hidden. Format pane in version 1.3.0.0 (30/10/2026), top to bottom: `license`, `style`, `layout`, `dataColors`, `grid`, `rows`, `bars`, `milestones`, `dependencies`, `critical`, `baseline`, `labels`, `timeAxis`, `gridlines`, `legend`, `sort`, `toolbar`, `interaction`, `tooltip`, `title`, `source`, `container`, `texts`; Analytics pane: `markers`. 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.
- "Visible when" means the option only appears when another option has one of the listed values.

## 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": "plumeGanttChartB2FEC518BC294539ACD7EE04DBA8CFE8",
  "query": {
    "queryState": {
      "groups": { "projections": [
        { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Tasks" } }, "Property": "Project" } }, "queryRef": "Tasks.Project", "nativeQueryRef": "Project" },
        { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Tasks" } }, "Property": "Phase" } }, "queryRef": "Tasks.Phase", "nativeQueryRef": "Phase" } ] },
      "task": { "projections": [
        { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Tasks" } }, "Property": "Task" } }, "queryRef": "Tasks.Task", "nativeQueryRef": "Task" } ] },
      "start": { "projections": [
        { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Tasks" } }, "Property": "Start" } }, "queryRef": "Tasks.Start", "nativeQueryRef": "Start" } ] },
      "end": { "projections": [
        { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Tasks" } }, "Property": "Finish" } }, "queryRef": "Tasks.Finish", "nativeQueryRef": "Finish" } ] },
      "progress": { "projections": [
        { "field": { "Measure": { "Expression": { "SourceRef": { "Entity": "Tasks" } }, "Property": "Progress" } }, "queryRef": "Tasks.Progress", "nativeQueryRef": "Progress" } ] },
      "id": { "projections": [
        { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Tasks" } }, "Property": "ID" } }, "queryRef": "Tasks.ID", "nativeQueryRef": "ID" } ] },
      "predecessors": { "projections": [
        { "field": { "Column": { "Expression": { "SourceRef": { "Entity": "Tasks" } }, "Property": "Predecessors" } }, "queryRef": "Tasks.Predecessors", "nativeQueryRef": "Predecessors" } ] }
    }
  },
  "objects": {
    "view":       [ { "properties": { "statusDate": { "expr": { "Literal": { "Value": "'2026-10-15'" } } } } } ],
    "timeline":   [ { "properties": { "scale": { "expr": { "Literal": { "Value": "'month'" } } },
                                      "holidays": { "expr": { "Literal": { "Value": "'2026-12-25; 2027-01-01'" } } } } } ],
    "rows":       [ { "properties": { "startLevel": { "expr": { "Literal": { "Value": "1D" } } } } } ],
    "dataColors": [ { "properties": { "mode": { "expr": { "Literal": { "Value": "'status'" } } } } } ],
    "critical":   [ { "properties": { "show": { "expr": { "Literal": { "Value": "true" } } } } } ],
    "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 the `.pbiviz` file). Do not write the hidden `state` properties by hand.

## 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`. Gantt-specific touches: *Minimal* drops banded rows and vertical lines, *Unknown Pleasures* drops banded rows, *Neon* makes the bars glow.
- `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

- No bars and a message about a date hierarchy: the date field arrived as Power BI's "Date Hierarchy"; in the field well, pick the column itself.
- Tasks shown as milestones: no End and no Duration, or the Milestone field says yes.
- Durations look too long: `timeAxis.durationUnit` is `workdays` by default (weekends and `timeAxis.holidays` are skipped); `timeAxis.endInclusive` (on by default) counts the end date as a full day for dates without time.
- "Unknown predecessor": the ID is not in the Task ID field (IDs are matched case-insensitively), or that task is filtered off the page, which also cuts the critical path.
- No critical path: `critical.show` is off by default, or the Predecessors field is empty.
- The plan ignores `rows.startLevel`: `rows.remember` kept groups expanded by hand in edit mode; change the level or turn `rows.remember` off.
- The timeline opens on today instead of the plan: `layout.startAt` is `today` by default; use `start`, `end` or `date` with `layout.startDate`.
- Resource view empty: the Owner / resource field is missing.
- Watermark visible: dependencies or critical path with the Predecessors field, the baseline fields, the bar color measure, the computed status, the resource view, "Whole plan in the frame", a rollup of collapsed groups, a date marker, a ★ style or palette, or a Theme JSON is in use without a valid key.
- More than 100,000 rows: the visual stops loading and says so in edit mode; filter the page (project, period).

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

Moving or resizing bars with the mouse (no write-back to the source), automatic rescheduling of tasks from their dependencies (dates always come from the data), several date columns per row turned into automatic phases, export split over several pages, resource leveling, costs or earned value calculations, drill-down / drill-through buttons, highlighting from other visuals, an fx button on non-color, non-text options (use the Dynamic format field).

## 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 |
|---|---|---|---|---|---|
| `groups` | Groups (project, phase…) | Groupes (projet, phase…) | column | 6 | One field per hierarchy level, from the widest to the narrowest |
| `task` | Task | Tâche | column | 1 |  |
| `start` | Start | Début | column | 1 | A date column (choose the field itself, not its date hierarchy) |
| `end` | End | Fin | column | 1 |  |
| `duration` | Duration (when there is no end) | Durée (s'il n'y a pas de fin) | measure | 1 |  |
| `progress` | Progress (%) | Avancement (%) | measure | 1 |  |
| `resource` | Owner / resource | Responsable / ressource | column | 1 |  |
| `legend` | Color (team, type…) | Couleur (équipe, type…) | column | 1 |  |
| `label` | Bar label | Étiquette | column | 1 | Text shown on the bar (e.g. status, phase, short note) |
| `barColor` | Bar color (measure) ★ | Couleur des barres (mesure) ★ | measure | 1 | A measure returning a color (#RRGGBB or a name), e.g. red when late |
| `milestone` | Milestone (yes / no) | Jalon (oui / non) | column | 1 |  |
| `id` | Task ID (for dependencies) | Identifiant (pour les dépendances) | column | 1 |  |
| `sort` | Sort order | Ordre de tri | column | 1 | Number, date or text: tasks (and groups) are sorted by it |
| `predecessors` | Predecessors ★ | Prédécesseurs ★ | column | 1 | IDs separated by ; e.g. 3;5SS+2 |
| `baselineStart` | Baseline start ★ | Début de référence ★ | column | 1 |  |
| `baselineEnd` | Baseline end ★ | Fin de référence ★ | column | 1 |  |
| `columns` | Grid columns | Colonnes du tableau | column | 8 |  |
| `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 = `groups` + `task` + `start` + `end` + `resource` + `legend` + `label` + `milestone` + `id` + `sort` + `predecessors` + `baselineStart` + `baselineEnd` + `columns` (one row per combination), 30,000 rows per data window (more fetched automatically); measures = `duration`, `progress`, `barColor`, `tooltips`, `format`.
Capabilities: supportsKeyboardFocus, supportsMultiVisualSelection, supportsLandingPage, supportsEmptyDataView.
Network access: none (no privileges requested, no external request).

## Format pane options (210)

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` | View | Vue | dropdown | enumeration | `tasks` | `tasks` Tasks (hierarchy); `resources` Resources (one row per owner) ★ |  |
| `layout.fit` | Whole plan in the frame (PDF export) ★ | Tout le planning dans le cadre (export PDF) ★ | toggle | bool | `false` | true / false | No scrolling: every row and the whole timeline fit in the visual, for printing and PDF or PowerPoint export. |
| `layout.startAt` | Initial position | Position au départ | dropdown | enumeration | `start` | `start` Start of the plan; `today` Today (status date); `end` End of the plan; `date` Chosen date | With the automatic scale, the whole plan is framed when the visual opens. |
| `layout.startDate` | Initial date (yyyy-mm-dd) | Date de départ (aaaa-mm-jj) | text | text | (empty) |  | Visible when `layout.startAt` = `date`. The timeline opens at this date (it can come from a DAX measure with the Dynamic format field: layout.startDate). |
| `layout.statusDate` | Status date (empty = today) | Date d'état (vide = aujourd'hui) | text | text | (empty) |  | Date used for the today line, the computed status and the expected progress. |

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

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `dataColors.mode` | Coloring | Coloration | dropdown | enumeration | `auto` | `auto` Automatic (Color field, else first group); `legend` By the Color field; `group` By the first group; `resource` By owner; `single` Single color; `status` Computed status (late, at risk…) ★ |  |
| `dataColors.single` | Color | Couleur | color | fill | (empty) | hex color |  |
| `dataColors.fill` | Color | Couleur | color | fill | (empty) | hex color |  |
| `dataColors.summary` | Summary bars (empty = text) | Barres de synthèse (vide = texte) | color | fill | (empty) | hex color |  |
| `dataColors.done` | Status: done | Statut : terminé | color | fill | `#2E7D4F` | hex color |  |
| `dataColors.onTrack` | Status: on track | Statut : dans les temps | color | fill | `#2A6F97` | hex color |  |
| `dataColors.risk` | Status: at risk | Statut : à risque | color | fill | `#B26B00` | hex color |  |
| `dataColors.late` | Status: late | Statut : en retard | color | fill | `#C0392B` | hex color |  |
| `dataColors.upcoming` | Status: upcoming | Statut : à venir | color | fill | `#7C8190` | hex color |  |
| `dataColors.tolerance` | “At risk” beyond (points behind) | « À risque » au-delà de (points de retard) | number | integer | `10` | 0 to 50 | Expected progress (elapsed time) minus actual progress, in percentage points. |

### Task grid / Tableau des tâches (`grid`, Format pane)

The card header toggle is `grid.show`.

**Grid / Tableau**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `grid.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `grid.width` | Width (px, 0 = automatic) | Largeur (px, 0 = automatique) | number | integer | `0` | 0 to 3000 | Drag the separator between the grid and the timeline to change it. |
| `grid.fontSize` | Text size | Taille du texte | number | formatting | `12` | 7 to 20 |  |
| `grid.dateFormat` | Date format | Format des dates | text | text | (empty) |  |  |
| `grid.indent` | Indent per level (px) | Retrait par niveau (px) | number | integer | `14` | 4 to 40 |  |
| `grid.nameWidth` | Task column width (px, 0 = automatic) | Largeur de la colonne Tâche (px, 0 = automatique) | number | integer | `0` | 0 to 1200 | Width of the name column. The other columns keep their width; those that no longer fit are hidden. Turn on Wrap long names to keep long names readable. |
| `grid.wrap` | Wrap long names | Retour à la ligne des noms longs | toggle | bool | `false` | true / false | A name that does not fit goes on several lines (its row gets taller) instead of being cut. |
| `grid.wrapLines` | Maximum lines | Lignes au plus | number | integer | `3` | 2 to 6 | Visible when `grid.wrap` = `true`. Beyond this, the last line is cut with an ellipsis. |
| `grid.sumColumns` | Sum numeric columns in groups | Totaliser les colonnes numériques des groupes | toggle | bool | `true` | true / false |  |
| `grid.headerColor` | Column header color (empty = secondary text) | Couleur des en-têtes de colonnes (vide = texte secondaire) | color | fill | (empty) | hex color |  |

**Columns / Colonnes**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `grid.colWbs` | No. (1, 1.1, 1.1.1…) | N° (1, 1.1, 1.1.1…) | toggle | bool | `false` | true / false | Outline number of each row, as in Microsoft Project (WBS), following the displayed order. |
| `grid.colResource` | Owner | Responsable | toggle | bool | `true` | true / false |  |
| `grid.colStart` | Start | Début | toggle | bool | `true` | true / false |  |
| `grid.colEnd` | End | Fin | toggle | bool | `true` | true / false |  |
| `grid.colDuration` | Duration | Durée | toggle | bool | `false` | true / false |  |
| `grid.colProgress` | Progress | Avancement | toggle | bool | `true` | true / false |  |
| `grid.colStatus` | Status (computed status) | Statut (statut calculé) | toggle | bool | `true` | true / false |  |
| `grid.colFloat` | Float (critical path) | Marge (chemin critique) | toggle | bool | `true` | true / false |  |
| `grid.colVariance` | Variance (baseline) | Écart (planning de référence) | toggle | bool | `true` | true / false |  |

### Rows and hierarchy / Lignes et hiérarchie (`rows`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `rows.height` | Row height (px) | Hauteur des lignes (px) | number | integer | `28` | 14 to 72 |  |
| `rows.startLevel` | Levels expanded at start | Niveaux développés au départ | number | integer | `9` | 0 to 9 | 0: only the first level is shown. 1: its children are shown too… |
| `rows.remember` | Save the state in the report (edit mode) | Mémoriser l'état dans le rapport (mode édition) | toggle | bool | `true` | true / false |  |
| `rows.summary` | Group summary bars | Barres de synthèse des groupes | toggle | bool | `true` | true / false |  |
| `rows.rollup` | Collapsed group: detail on its row ★ | Groupe réduit : détail sur sa ligne ★ | dropdown | enumeration | `none` | `none` Summary bar only; `milestones` Task milestones; `all` Task bars and milestones | Like the Microsoft Project rollup: a collapsed project shows its milestones (with their names) and bars on one line, to compare many projects. |
| `rows.sameRow` | Same task = same row (several bars) | Même tâche = même ligne (plusieurs barres) | toggle | bool | `true` | true / false | Rows with the same task name in the same group share one line (absences, machines, split tasks). |

### Bars / Barres (`bars`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `bars.height` | Height (% of the row) | Hauteur (% de la ligne) | number | integer | `58` | 20 to 100 |  |
| `bars.radius` | Rounded corners | Coins arrondis | number | integer | `3` | 0 to 12 |  |
| `bars.progress` | Progress inside the bar | Avancement dans la barre | toggle | bool | `true` | true / false |  |
| `bars.maxProgress` | Progress complete at | Avancement terminé à | dropdown | enumeration | `auto` | `auto` Automatic (1 or 100); `1` 1 (100%); `100` 100 | Value of the Progress field that means “done”, as the Maximum completion of the Microsoft Gantt. |
| `bars.borderWidth` | Border width | Épaisseur de la bordure | number | numeric | `0` | 0 to 4 |  |
| `bars.borderColor` | Border color (empty = bar color) | Couleur de la bordure (vide = couleur de la barre) | color | fill | (empty) | hex color |  |

### Milestones / Jalons (`milestones`, Format pane)

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `milestones.shape` | Shape | Forme | dropdown | enumeration | `diamond` | `diamond` Diamond; `circle` Circle; `triangle` Triangle; `square` Square |  |
| `milestones.size` | Size (px) | Taille (px) | number | integer | `12` | 6 to 28 |  |
| `milestones.color` | Color (empty = task color) | Couleur (vide = couleur de la tâche) | color | fill | (empty) | hex color |  |
| `milestones.showDate` | Date in the label | Date dans l'étiquette | toggle | bool | `true` | true / false |  |
| `milestones.line` | Vertical line | Ligne verticale | toggle | bool | `false` | true / false | A line across the whole plan at each milestone date. |
| `milestones.lineColor` | Line color (empty = milestone color) | Couleur de la ligne (vide = couleur du jalon) | color | fill | (empty) | hex color | Visible when `milestones.line` = `true` |
| `milestones.lineStyle` | Line style | Style du trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted | Visible when `milestones.line` = `true` |
| `milestones.lineOpacity` | Opacity (%) | Opacité (%) | number | integer | `60` | 10 to 100 | Visible when `milestones.line` = `true` |

### Dependencies ★ / Dépendances ★ (`dependencies`, 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 `dependencies.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `dependencies.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `dependencies.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `dependencies.width` | Width | Épaisseur | number | numeric | `1.2` | 0.5 to 4 |  |
| `dependencies.conflicts` | Flag conflicts (successor too early) | Signaler les conflits (successeur trop tôt) | toggle | bool | `true` | true / false |  |
| `dependencies.conflictColor` | Conflict color | Couleur des conflits | color | fill | `#C0392B` | hex color | Visible when `dependencies.conflicts` = `true` |
| `dependencies.hover` | Follow the chain on hover | Suivre la chaîne au survol | toggle | bool | `true` | true / false |  |

### Critical path ★ / Chemin critique ★ (`critical`, 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 `critical.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `critical.show` | Show | Afficher | toggle | bool | `false` | true / false | Computed from the dependencies: tasks whose delay delays the end of the plan. |
| `critical.color` | Color | Couleur | color | fill | `#C0392B` | hex color |  |
| `critical.tolerance` | Maximum float (days) | Marge maximale (jours) | number | numeric | `0` | 0 to 30 |  |

### Baseline ★ / Planning de référence ★ (`baseline`, 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 `baseline.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `baseline.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `baseline.color` | Color (empty = gray) | Couleur (vide = gris) | color | fill | (empty) | hex color |  |
| `baseline.variance` | Variance in days at the bar end | Écart en jours en bout de barre | toggle | bool | `true` | true / false |  |
| `baseline.tolerance` | Accepted variance (days) | Écart toléré (jours) | number | integer | `0` | 0 to 30 |  |

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

The card header toggle is `labels.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `labels.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `labels.content` | Content | Contenu | dropdown | enumeration | `nameResource` | `nameResource` Task and owner; `name` Task; `resource` Owner; `progress` Progress; `dates` Dates; `field` “Bar label” field; `none` None | When the Bar label field is filled, it replaces “Task and owner”. |
| `labels.position` | Position | Position | dropdown | enumeration | `right` | `right` Right of the bar; `inside` Inside the bar when long enough; `left` Left of the bar |  |
| `labels.fontSize` | Size | Taille | number | formatting | `10` | 6 to 18 |  |
| `labels.bold` | Bold | Gras | toggle | bool | `false` | true / false |  |
| `labels.italic` | Italic | Italique | toggle | bool | `false` | true / false |  |
| `labels.color` | Color (empty = automatic) | Couleur (vide = automatique) | color | fill | (empty) | hex color |  |

### Time axis / Axe du temps (`timeAxis`, Format pane)

**Scale / Échelle**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `timeAxis.scale` | Initial scale | Échelle au départ | dropdown | enumeration | `auto` | `auto` Automatic (whole plan, adapted ticks); `fit` Fit all; `hour` Hours; `day` Days; `week` Weeks; `month` Months; `quarter` Quarters; `year` Years | The reader can change it with the toolbar or Ctrl + mouse wheel. |
| `timeAxis.weekStart` | First day of the week | Premier jour de la semaine | dropdown | enumeration | `monday` | `monday` Monday; `sunday` Sunday |  |
| `timeAxis.weekNumbers` | Week numbers | Numéros de semaine | toggle | bool | `true` | true / false |  |
| `timeAxis.fiscalStart` | Fiscal year start (quarters, years) | Début de l'exercice (trimestres, années) | dropdown | enumeration | `1` | `1` January; `2` February; `3` March; `4` April; `5` May; `6` June; `7` July; `8` August; `9` September; `10` October; `11` November; `12` December |  |
| `timeAxis.min` | Axis start (yyyy-mm-dd) | Début de l'axe (aaaa-mm-jj) | text | text | (empty) |  | Fixed start of the timeline. Keep the same frame under a filter with a DAX measure in the Dynamic format field named timeAxis.min, e.g. CALCULATE(MIN(Tasks[Start]), REMOVEFILTERS()). |
| `timeAxis.max` | Axis end (yyyy-mm-dd) | Fin de l'axe (aaaa-mm-jj) | text | text | (empty) |  | Fixed end of the timeline (DAX: a timeAxis.max measure). |

**Calendar / Calendrier**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `timeAxis.weekends` | Shade weekends | Griser les week-ends | toggle | bool | `true` | true / false |  |
| `timeAxis.weekendColor` | Days off color (empty = gray) | Couleur des jours non ouvrés (vide = grisé) | color | fill | (empty) | hex color | Visible when `timeAxis.weekends` = `true` |
| `timeAxis.holidays` | Holidays (yyyy-mm-dd; …) | Jours fériés (aaaa-mm-jj ; …) | text | text | (empty) |  |  |
| `timeAxis.endInclusive` | End date included | Date de fin incluse | toggle | bool | `true` | true / false | A task from the 3rd to the 5th lasts 3 days (dates without time). |
| `timeAxis.durationUnit` | Durations counted in | Durées comptées en | dropdown | enumeration | `workdays` | `workdays` Business days; `days` Calendar days; `hours` Hours | Also used to add the Duration field to the start date. |

**Labels / Étiquettes**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `timeAxis.fontSize` | Size | Taille | number | formatting | `9` | 6 to 18 |  |
| `timeAxis.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `timeAxis.headerBg` | Header background color | Couleur d'arrière-plan de l'en-tête | color | fill | (empty) | hex color | Background of the time header and of the grid column headers (empty = none). |
| `timeAxis.monthStyle` | Month names | Noms des mois | dropdown | enumeration | `auto` | `auto` Automatic (as space allows); `long` Full (January); `short` Short (Jan); `narrow` Initial (J); `numeric` Number (01) |  |
| `timeAxis.hourCycle` | Hours | Heures | dropdown | enumeration | `auto` | `auto` As the language; `h24` 24-hour (14:00); `h12` 12-hour (2:00 PM) | Timeline, grid dates and tooltips. |
| `timeAxis.quarterFormat` | Quarter format | Format des trimestres | text | text | (empty) |  | q = quarter, yyyy or yy = year (with a fiscal year: the year it ends), other Power BI date codes accepted. Empty: Q1, Q2… |
| `timeAxis.yearFormat` | Year format | Format des années | text | text | (empty) |  | yyyy or yy = year (with a fiscal year: the year it ends). Empty: 2026, or FY 2026-27 with a fiscal year. |

**Today / Aujourd'hui**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `timeAxis.todayLine` | “Today” line | Ligne « aujourd'hui » | toggle | bool | `true` | true / false |  |
| `timeAxis.todayColor` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color | Visible when `timeAxis.todayLine` = `true` |
| `timeAxis.todayLabel` | Line label | Texte du repère | text | text | (empty) |  | Visible when `timeAxis.todayLine` = `true` |

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `gridlines.vertical` | Vertical (ticks) | Verticales (graduations) | toggle | bool | `true` | true / false |  |
| `gridlines.verticalColor` | Color (empty = lines) | Couleur (vide = traits) | color | fill | (empty) | hex color | Visible when `gridlines.vertical` = `true` |
| `gridlines.verticalStyle` | Line style | Style du trait | dropdown | enumeration | `solid` | `solid` Solid; `dashed` Dashed; `dotted` Dotted | Visible when `gridlines.vertical` = `true` |
| `gridlines.horizontal` | Horizontal (between rows) | Horizontales (entre les lignes) | toggle | bool | `false` | true / false |  |
| `gridlines.horizontalColor` | Color (empty = lines) | Couleur (vide = traits) | color | fill | (empty) | hex color | Visible when `gridlines.horizontal` = `true` |
| `gridlines.width` | Width | Épaisseur | number | numeric | `1` | 0.5 to 4 |  |
| `gridlines.banding` | Banded rows | Lignes alternées | toggle | bool | `true` | true / false |  |

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

The card header toggle is `legend.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `legend.show` | Show | Afficher | toggle | bool | `true` | true / false | Shown when the chart has several series. |
| `legend.position` | Position | Position | dropdown | enumeration | `top` | `top` Top; `bottom` Bottom; `right` Right; `left` Left |  |
| `legend.align` | Alignment | Alignement | dropdown | enumeration | `left` | `left` Start; `center` Center; `right` End | Visible when `legend.position` = `top` or `bottom` |
| `legend.showTitle` | Legend title | Titre de la légende | toggle | bool | `false` | true / false |  |
| `legend.titleText` | Title text | Texte du titre | text | text | (empty) |  | Visible when `legend.showTitle` = `true` |
| `legend.fontSize` | Size | Taille | number | formatting | `9` | 6 to 24 |  |
| `legend.color` | Color (empty = secondary text) | Couleur (vide = texte secondaire) | color | fill | (empty) | hex color |  |
| `legend.interactive` | Click = select the series | Clic = sélectionner la série | toggle | bool | `true` | true / false |  |

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `sort.by` | Sort tasks by | Trier les tâches par | dropdown | enumeration | `start` | `start` Start date; `end` End date; `name` Name; `data` Data order (ID) | Applied inside each group. Data order follows the Task ID field when there is one. With the Sort order field, this order only breaks ties. |
| `sort.groupBy` | Sort groups by | Trier les groupes par | dropdown | enumeration | `same` | `same` Same as tasks; `start` Start date; `end` End date; `name` Name; `data` Data order (ID) | Projects and phases can follow their own order (e.g. by name) while tasks follow the plan. |
| `sort.desc` | Descending order | Ordre décroissant | toggle | bool | `false` | true / false |  |

### Toolbar / Barre d'outils (`toolbar`, Format pane)

The card header toggle is `toolbar.show`.

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `toolbar.show` | Show | Afficher | toggle | bool | `true` | true / false |  |
| `toolbar.search` | Search | Recherche | toggle | bool | `true` | true / false |  |
| `toolbar.zoom` | Scales and “Fit” | Échelles et « Tout voir » | toggle | bool | `true` | true / false |  |
| `toolbar.expand` | Expand / collapse all | Tout développer / réduire | toggle | bool | `true` | true / false |  |
| `toolbar.today` | “Today” button | Bouton « Aujourd'hui » | toggle | bool | `true` | true / false |  |

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

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `interaction.hover` | Highlight on hover | Mettre en avant au survol | toggle | bool | `true` | true / false |  |
| `interaction.dim` | Dimmed items opacity (%) | Opacité des éléments estompés (%) | number | integer | `25` | 5 to 80 |  |

### Date markers ★ / Repères de date ★ (`markers`, Analytics pane)

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

**Marker 1 / Repère 1**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `markers.show1` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `markers.date1` | Date (yyyy-mm-dd) | Date (aaaa-mm-jj) | text | text | (empty) |  |  |
| `markers.label1` | Label | Libellé | text | text | (empty) |  |  |
| `markers.color1` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `markers.style1` | Line style | Style du trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |

**Marker 2 / Repère 2**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `markers.show2` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `markers.date2` | Date (yyyy-mm-dd) | Date (aaaa-mm-jj) | text | text | (empty) |  |  |
| `markers.label2` | Label | Libellé | text | text | (empty) |  |  |
| `markers.color2` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `markers.style2` | Line style | Style du trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |

**Marker 3 / Repère 3**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `markers.show3` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `markers.date3` | Date (yyyy-mm-dd) | Date (aaaa-mm-jj) | text | text | (empty) |  |  |
| `markers.label3` | Label | Libellé | text | text | (empty) |  |  |
| `markers.color3` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `markers.style3` | Line style | Style du trait | dropdown | enumeration | `dashed` | `solid` Solid; `dashed` Dashed; `dotted` Dotted |  |

**Period / Période**

| Option ID | Label (EN) | Label (FR) | Control | Type | Default | Allowed values | Notes |
|---|---|---|---|---|---|---|---|
| `markers.band` | Show | Afficher | toggle | bool | `false` | true / false |  |
| `markers.bandFrom` | From (yyyy-mm-dd) | Du (aaaa-mm-jj) | text | text | (empty) |  |  |
| `markers.bandTo` | To (yyyy-mm-dd) | Au (aaaa-mm-jj) | text | text | (empty) |  |  |
| `markers.bandLabel` | Label | Libellé | text | text | (empty) |  |  |
| `markers.bandColor` | Color (empty = accent) | Couleur (vide = accent) | color | fill | (empty) | hex color |  |
| `markers.bandOpacity` | Opacity (%) | Opacité (%) | number | integer | `10` | 2 to 60 |  |

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

The card header toggle is `tooltip.show`.

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

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

The card header toggle is `title.show`.

**Title / Titre**

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

**Subtitle / Sous-titre**

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

**Divider / Séparateur**

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

**Spacing / Espacement**

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

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

The card header toggle is `source.show`.

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

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

**Background / Arrière-plan**

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

**Border / Bordure**

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

**Shadow / Ombre**

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

**Spacing / Marges**

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

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

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

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

- `state`: `state.expanded` (text), `state.colors` (text), internal state saved by the visual in edit mode (column widths, positions of dragged annotations); leave it alone.
- `view`: `view.mode` (enumeration), `view.fit` (bool), `view.startAt` (enumeration), `view.startDate` (text), `view.statusDate` (text), `view.todayLine` (bool), `view.todayColor` (fill).
- `timeline`: `timeline.scale` (enumeration), `timeline.weekStart` (enumeration), `timeline.weekNumbers` (bool), `timeline.fiscalStart` (enumeration), `timeline.weekends` (bool), `timeline.holidays` (text), `timeline.endInclusive` (bool), `timeline.durationUnit` (enumeration), `timeline.fontSize` (formatting), `timeline.color` (fill), `timeline.monthStyle` (enumeration), `timeline.hourCycle` (enumeration), `timeline.quarterFormat` (text), `timeline.yearFormat` (text), `timeline.gridLines` (bool).
