Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
152 commits
Select commit Hold shift + click to select a range
92eea70
excel stuff
Chenglong-MS Sep 20, 2026
aa492a5
Merge branch 'dev' of github.com:microsoft/flint-chart into dev
Chenglong-MS Sep 20, 2026
bad6ebd
Merge remote-tracking branch 'origin/main' into dev
Chenglong-MS Sep 20, 2026
e026e7d
wrapping labels
Chenglong-MS Sep 30, 2026
158f8ca
feat(skills): an interaction-author skill maps a gesture or an intent…
xavier-shaw Sep 30, 2026
5d36fdd
feat(interactions): a surface reports each committed selection, and t…
xavier-shaw Sep 30, 2026
c706422
fix(hosts): the interactive chart view fits its frame
xavier-shaw Sep 30, 2026
433cc0e
temporal
Chenglong-MS Sep 30, 2026
15a9840
accessible navigation
Chenglong-MS Sep 30, 2026
6ff6424
accessible navigation: fix readings, focus, and refresh; add design doc
invalid-email-address Sep 30, 2026
f08a598
ok
Chenglong-MS Sep 30, 2026
ca0cc86
fixes
Chenglong-MS Oct 1, 2026
28862c9
githu
Chenglong-MS Oct 5, 2026
fd866a0
interaction
Chenglong-MS Oct 6, 2026
3ddebad
interaction updates
Chenglong-MS Oct 6, 2026
bc03ecf
refactor(interactions): ChartState is the data half of the interactio…
xavier-shaw Oct 5, 2026
4041a38
feat(interactions): a surface exposes getState and onChange in place …
xavier-shaw Oct 5, 2026
0179f83
feat(hosts): the MCP view sends the chart state in field terms, and t…
xavier-shaw Oct 5, 2026
3b020a8
docs(interactions): host access to the chart state
xavier-shaw Oct 5, 2026
7a9ed7f
feat(skills): flint-interaction-author covers the mechanism, presets,…
xavier-shaw Oct 6, 2026
a183a4f
update
Chenglong-MS Oct 6, 2026
ae4ea4b
updates
Chenglong-MS Oct 6, 2026
e39d6f0
docs(interactions): the read side in the programming guide, the galle…
xavier-shaw Oct 7, 2026
7742e34
interactive application and source data
xavier-shaw Oct 7, 2026
24886d5
Merge branch 'dev' into feat/host-chart-state
xavier-shaw Oct 7, 2026
9db4eb6
Merge pull request #137 from microsoft/feat/host-chart-state
xavier-shaw Oct 7, 2026
729f96c
minor
Chenglong-MS Oct 7, 2026
4ccebcb
Merge branch 'dev' of github.com:microsoft/flint-chart into dev
Chenglong-MS Oct 7, 2026
727af10
fixes
Chenglong-MS Oct 7, 2026
44071cf
feat(mcp): updates argument on create_chart_view and validate_chart
xavier-shaw Oct 7, 2026
cb255f4
docs(skills): guide the agent to the right update op and value types
xavier-shaw Oct 7, 2026
5ef0a90
feat(site): temporal key values in the debug gym
xavier-shaw Oct 7, 2026
d2d092e
fix and update application examples
xavier-shaw Oct 7, 2026
83a89d2
update
Chenglong-MS Oct 8, 2026
070aa85
widget as an interaction
Chenglong-MS Oct 8, 2026
ffc9559
filter widget
Chenglong-MS Oct 8, 2026
12d3f0e
perf(interactions): share one path datum list across a line's segments
xavier-shaw Oct 8, 2026
bfefd9a
fix(interactions): resolve provenance by stamped source row when inli…
xavier-shaw Oct 8, 2026
bf757f4
fix(interactions): re-plan calendar ticks of a navigated time axis fr…
xavier-shaw Oct 8, 2026
6d21fde
update application and bespoke examples
xavier-shaw Oct 8, 2026
4d01ce9
fix demos
xavier-shaw Oct 8, 2026
38c9094
feat(echarts): strokeDash on the Line Chart
jaxor24 Oct 8, 2026
ff141e7
updates to the new API
Chenglong-MS Oct 8, 2026
aaa7ff8
plotly fix
Chenglong-MS Oct 8, 2026
9364cf2
updates
Chenglong-MS Oct 8, 2026
ac2743b
feat: apple theme and overlay fixes
xavier-shaw Oct 9, 2026
89a17c2
feat: list_interaction_presets and a rewritten interaction-author skill
xavier-shaw Oct 9, 2026
0173213
feat: live layout for navigated bar charts
xavier-shaw Oct 9, 2026
29671c3
feat: easier ChartUpdates
xavier-shaw Oct 9, 2026
0a7a1fa
feat(mcp): client roots, update context, clearer chart view
xavier-shaw Oct 9, 2026
34f3129
demo: handles and a curve on the Old Faithful sketch
xavier-shaw Oct 9, 2026
9dba970
feat(mcp): get_flint_skill tool serves the bundled skills
xavier-shaw Oct 9, 2026
9348ca5
feat: report each update op before and after the chart is drawn
xavier-shaw Oct 9, 2026
a6f4b45
updates
Chenglong-MS Oct 10, 2026
0358962
fixes
Chenglong-MS Oct 10, 2026
f2f2c7d
fix: clip only stack groups that place their bars, not a plot-filling…
xavier-shaw Oct 9, 2026
f34dcbb
fix: overlays follow the chart's clip when zoomed
xavier-shaw Oct 9, 2026
dd97baf
fix: pick only marks on screen when the chart is zoomed
xavier-shaw Oct 9, 2026
fad5641
feat(mcp): create_chart_view validates on its own, so agents skip the…
xavier-shaw Oct 9, 2026
df7a72b
demo: zoom clipping lab under Layout
xavier-shaw Oct 10, 2026
9138bf9
fixes
Chenglong-MS Oct 10, 2026
df67ccd
fix(echarts): keep a strokeDash legend entry apart from a colour valu…
jaxor24 Oct 10, 2026
eb061ac
refactor(plan): split the compile into analyze, plan and emit; the pl…
xavier-shaw Oct 12, 2026
228e1a8
feat(plan): the plan makes every room decision, measured, within the …
xavier-shaw Oct 12, 2026
7bce3d4
feat(session): a chart mounted for a room lays out again in place; th…
xavier-shaw Oct 12, 2026
d2f27e1
feat(plan): composite charts plan their views; facet gaps, closing ru…
xavier-shaw Oct 12, 2026
2cdcdde
fix(session): filters push every size their replan changes; a faceted…
xavier-shaw Oct 12, 2026
0e91b67
fix(plan): titles and MCP renders measure text as they are drawn; cos…
xavier-shaw Oct 12, 2026
827dc83
fix(plan): titles keep inside the theme's padding, sparkline colours …
xavier-shaw Oct 12, 2026
37873e8
chore(copilot): sync the bundled app with the layout plan
xavier-shaw Oct 12, 2026
35cc605
Merge pull request #139 from microsoft/feat/layout-plan-clean
Chenglong-MS Oct 12, 2026
561c08c
fix
Chenglong-MS Oct 12, 2026
8716493
add layout inspector
xavier-shaw Oct 13, 2026
7772ea7
updates
Chenglong-MS Oct 14, 2026
9247fe3
Merge origin/dev: layout inspector, alongside the label overflow rework
Chenglong-MS Oct 14, 2026
b20fd91
new layout algorithm
Chenglong-MS Oct 15, 2026
84e753a
minor
Chenglong-MS Oct 15, 2026
e44a053
updates
Chenglong-MS Oct 15, 2026
fbe8660
feat(interactive): where targets, and reset gestures reach onChange
xavier-shaw Oct 15, 2026
bdaeb38
feat(mcp): live boards of several charts the reader can arrange
xavier-shaw Oct 15, 2026
f67ef8b
feat(mcp): charts on a board connect by the fields they share
xavier-shaw Oct 15, 2026
4a12286
feat(mcp): board theme, bottom bar, export, and recovery
xavier-shaw Oct 15, 2026
37710ab
feat(mcp-app): selection chips and reopen recovery in the chart card
xavier-shaw Oct 15, 2026
2b66de6
feat(mcp-ui): edit layout moves a chart by a grip handle and resizes …
xavier-shaw Oct 15, 2026
0fda400
minor
Chenglong-MS Oct 15, 2026
0fad8d8
Merge branch 'dev' of github.com:microsoft/flint-chart into dev
Chenglong-MS Oct 15, 2026
83570c5
fixes
Chenglong-MS Oct 15, 2026
44bc351
feat(density): stack mode with a layered, translucent option
xavier-shaw Oct 13, 2026
ae1379a
feat(vegalite): Ridgeline Plot and Marginal Plot
xavier-shaw Oct 13, 2026
a353adf
docs(templates): the extending guide for composite and plan-tested te…
xavier-shaw Oct 13, 2026
f42d999
test-data: gallery tiles for the Ridgeline Plot and Marginal Plot
xavier-shaw Oct 13, 2026
fa81fbe
add layout plan demos
xavier-shaw Oct 13, 2026
c8f490b
feat(ridgeline): value axis, marked values and gradient key in perspe…
claude Oct 13, 2026
ef8ef96
fix(ridgeline): marked values stay in the plot, every ridge keeps its…
xavier-shaw Oct 15, 2026
ac21de1
feat(ridgeline): plan the perspective's depth, and give its labels wa…
xavier-shaw Oct 15, 2026
b95fa54
chore(copilot): sync the bundled app with the Ridgeline and Marginal …
xavier-shaw Oct 15, 2026
a9975d9
hover
Chenglong-MS Oct 15, 2026
6788bb0
feat(ridgeline): markAt toggles marks at the x ticks
xavier-shaw Oct 15, 2026
d02f4e6
Merge pull request #142 from microsoft/ridgeline-and-marginal-charts
xavier-shaw Oct 15, 2026
0ae103b
fix
Chenglong-MS Oct 15, 2026
905fd91
fix layout inspector
xavier-shaw Oct 16, 2026
0c89c15
feat(core): tables — a chart's drawn rows, and the Table chart type
xavier-shaw Oct 16, 2026
c99a4de
feat(mcp): tables in the chart card and on boards
xavier-shaw Oct 16, 2026
59ac14e
docs: Table and view in the skills and reference
xavier-shaw Oct 16, 2026
69abfc5
fix(theme): a compact unit belongs to every printed value
xavier-shaw Oct 17, 2026
da36126
feat(interactive): public event types, generated into the skill
xavier-shaw Oct 17, 2026
f920279
feat(interactive): linkCharts, validateLinks and useLinkedCharts
xavier-shaw Oct 17, 2026
1c07c43
refactor(mcp): board links come from flint-chart
xavier-shaw Oct 17, 2026
ba8fa53
chore: sync skill copies and the Copilot plugin
xavier-shaw Oct 17, 2026
aa55f43
new theme
Chenglong-MS Oct 17, 2026
5bf5e3e
Merge branch 'dev' of github.com:microsoft/flint-chart into dev
Chenglong-MS Oct 17, 2026
6703b07
ok
Chenglong-MS Oct 17, 2026
c9edca0
update advanced examples
Chenglong-MS Oct 17, 2026
eceb654
fixes
Chenglong-MS Oct 18, 2026
a1af441
updates
Chenglong-MS Oct 20, 2026
8caf5be
feat(mcp): boards build off screen; show_board opens the one card a turn
xavier-shaw Oct 19, 2026
ffc2057
feat(flint-js): KPI card shortens its value (k/M) with a shared forma…
xavier-shaw Oct 20, 2026
700bc8a
feat(mcp)!: charts build off screen like boards; show opens the one c…
xavier-shaw Oct 20, 2026
ca7be19
feat(site): MCP page tells a chart story and a board story with live …
xavier-shaw Oct 20, 2026
2d51661
fixes
Chenglong-MS Oct 20, 2026
f7a6c4a
updates
Chenglong-MS Oct 20, 2026
f61de75
Merge remote-tracking branch 'origin/main' into dev
Chenglong-MS Oct 20, 2026
e2d6ce8
fix(site): wrap the nav to two rows below 980px
Chenglong-MS Oct 20, 2026
384d085
chore: keep dev's package-lock after merging main
Chenglong-MS Oct 20, 2026
cecdbe5
Merge PR #138: feat(echarts): strokeDash on the Line Chart
Chenglong-MS Oct 20, 2026
5c051ca
fix(flint-js): close CodeQL ReDoS and URL-scheme alerts
Chenglong-MS Oct 20, 2026
d1d03da
test(flint-js): fix test typecheck errors and a cold-start timeout
Chenglong-MS Oct 20, 2026
5aec859
chore(flint-js): clear lint errors
Chenglong-MS Oct 20, 2026
e140711
fix(site): read overflowFit where the pins demo read straightRefused
Chenglong-MS Oct 20, 2026
cd2e39e
ci: give the site build an 8 GB heap
Chenglong-MS Oct 20, 2026
6522254
chore(deps): update vulnerable transitive dependencies
Chenglong-MS Oct 20, 2026
650745e
test(flint-js): give the filter re-layout test time for its cold import
Chenglong-MS Oct 20, 2026
a3c3c1a
chore(deps): patch vite and vitest for their dev-server advisories
Chenglong-MS Oct 20, 2026
8b76d82
fix(flint-js): keep idle dot opacity and rings when charts are intera…
Chenglong-MS Oct 21, 2026
0127316
feat(flint-js): clearer multi-key legends
Chenglong-MS Oct 21, 2026
f97b624
feat(site): video, menu icons and community section for 1.0
Chenglong-MS Oct 21, 2026
5f6b96b
docs: release 1.0.0 and rewrite the README after the project site
Chenglong-MS Oct 21, 2026
c4cfc5c
fixes
Chenglong-MS Oct 21, 2026
4b7f52d
uupdate image
Chenglong-MS Oct 21, 2026
6898b96
fix
Chenglong-MS Oct 21, 2026
7756ffb
readme
Chenglong-MS Oct 21, 2026
3c695fa
ok
Chenglong-MS Oct 21, 2026
90c9e1c
ok
Chenglong-MS Oct 21, 2026
9caad86
fixes
Chenglong-MS Oct 21, 2026
8afece0
fix(mcp-ui): boards draw the theme's furniture as charts do
xavier-shaw Oct 20, 2026
adddaf5
refactor(mcp-ui)!: each board cell is one whole Flint chart
xavier-shaw Oct 21, 2026
c3cb5f9
fix(mcp-ui): copying a chart or a board as PNG works in sandboxed hos…
xavier-shaw Oct 21, 2026
475eac3
docs(skills): board charts draw their own heading; Link charts and ch…
xavier-shaw Oct 21, 2026
3e99e1b
fix(vegalite): a dodge over years lanes each year, not each value (#147)
onmax Oct 21, 2026
c1a23e9
updates
Chenglong-MS Oct 21, 2026
9aa7e4e
Merge branch 'dev' of github.com:microsoft/flint-chart into dev
Chenglong-MS Oct 21, 2026
a02848e
add talk material
Chenglong-MS Oct 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 4 additions & 1 deletion .github/extensions/flint-chart/.mcp.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@
"mcpServers": {
"flint": {
"command": "npx",
"args": ["--yes", "flint-chart-mcp"],
"args": [
"--yes",
"flint-chart-mcp@1.0.0"
],
"cwd": "${PLUGIN_ROOT}"
}
}
Expand Down
10 changes: 8 additions & 2 deletions .github/extensions/flint-chart/.plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
{
"name": "flint-chart",
"description": "Flint chart authoring MCP, skill, and native interactive chart canvas for Copilot CLI.",
"version": "0.2.2",
"version": "1.0.0",
"author": {
"name": "Microsoft",
"url": "https://github.com/microsoft/flint-chart"
},
"license": "MIT",
"homepage": "https://github.com/microsoft/flint-chart",
"repository": "https://github.com/microsoft/flint-chart",
"keywords": ["charts", "visualization", "flint", "mcp", "canvas"],
"keywords": [
"charts",
"visualization",
"flint",
"mcp",
"canvas"
],
"skills": "./skills/",
"mcpServers": "./.mcp.json"
}
38 changes: 38 additions & 0 deletions .github/extensions/flint-chart/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Flint Chart Canvas

Copilot CLI plugin bundling Flint's native chart canvas, MCP server configuration,
and chart-authoring skill. The native canvas requires a Copilot CLI build that
supports the `@github/copilot-sdk/extension` Canvas API.

## Refresh the bundle

From the repository root:

```bash
npm run build:copilot-plugin
npm run check:copilot-plugin
npm run test:mcp -- tests/server.test.ts
```

The build compiles the current Flint library and MCP UI, then copies the
self-contained HTML and canonical authoring skill into this plugin. The skill
receives a Canvas-specific instruction to pass resolved inline data. The plugin
version and pinned MCP dependency are derived from the MCP package version;
that version must be published to npm before distributing the plugin.

Do not edit the generated HTML, bundled skill, or version metadata by hand.
Edit the sources and rerun the build command. The Canvas bridge reads the
manifest and MCP configuration so it uses the same version as the plugin.

## Smoke test

From the repository root, launch a Canvas-capable Copilot CLI host with:

```bash
copilot --plugin-dir .github/extensions/flint-chart
```

Ask it to open a
validated Flint chart with inline `data.values`. Check that the chart renders,
customization controls work, and closing and reopening the canvas works.
Also test a chart carrying a theme and `interaction_spec`.
200 changes: 168 additions & 32 deletions .github/extensions/flint-chart/assets/flint-app.html

Large diffs are not rendered by default.

16 changes: 11 additions & 5 deletions .github/extensions/flint-chart/extension.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import { createCanvas, joinSession } from "@github/copilot-sdk/extension";
const extensionDirectory = dirname(fileURLToPath(import.meta.url));
const chartAppPath = join(extensionDirectory, "assets", "flint-app.html");
const skillDirectory = join(extensionDirectory, "skills");
const manifest = JSON.parse(await readFile(join(extensionDirectory, ".plugin", "plugin.json"), "utf8"));
const { mcpServers } = JSON.parse(await readFile(join(extensionDirectory, ".mcp.json"), "utf8"));
const canvases = new Map();

function defaultInput() {
Expand Down Expand Up @@ -86,15 +88,18 @@ function renderBridgeHtml(instance) {
id: message.id,
result: {
protocolVersion: message.params.protocolVersion,
hostInfo: { name: "Copilot Flint plugin", version: "0.2.2" },
hostInfo: { name: "Copilot Flint plugin", version: ${scriptSafeJson(manifest.version)} },
hostCapabilities: { message: { text: {} } },
hostContext: { theme: "dark", displayMode: "inline" }
}
}, "*");
event.source.postMessage({
jsonrpc: "2.0",
method: "ui/notifications/tool-input",
params: { arguments: chartInput }
method: "ui/notifications/tool-result",
params: {
content: [],
_meta: { flint: { board: { id: "chart", kind: "chart", version: 1, charts: [{ id: "chart", input: chartInput }] } } }
}
}, "*");
return;
}
Expand Down Expand Up @@ -167,8 +172,9 @@ const session = await joinSession({
mcpServers: {
flint: {
type: "local",
command: "npx",
args: ["--yes", "flint-chart-mcp"],
command: mcpServers.flint.command,
args: mcpServers.flint.args,
cwd: extensionDirectory,
tools: ["*"],
},
},
Expand Down
353 changes: 323 additions & 30 deletions .github/extensions/flint-chart/skills/flint-chart-author/SKILL.md

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,6 @@ jobs:
- run: npm ci
- run: npm run build
- run: npm run site:build
env:
# The site bundle outgrows Node's default ~4 GB heap; the runner has 16 GB.
NODE_OPTIONS: --max-old-space-size=8192
3 changes: 3 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ jobs:
- run: npm ci
- run: npm run build
- run: npm run site:build
env:
# The site bundle outgrows Node's default ~4 GB heap; the runner has 16 GB.
NODE_OPTIONS: --max-old-space-size=8192
- name: Compose site
run: |
mkdir -p _site
Expand Down
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -97,4 +97,7 @@ scripts/.*.mjs

# Third-party theme research artifacts. Keep provenance and findings tracked;
# source PDFs/images remain local and are reproducible from the manifest.
theme-evidence/*
theme-evidence/*
# Third-party house logos for local review only (trademarks; see the README in the folder)
site/src/playground/new-theme-test/logos/*
!site/src/playground/new-theme-test/logos/README.md
93 changes: 92 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,46 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [1.0.0] - 2026-10-19

Released together for `flint-chart`, `flint-chart-mcp`, and the Copilot Canvas plugin.

### Added

- `validateChart(input, backend, { updates })` checks ChartUpdates against the
chart in the same pass: `result.updates` gives each op as applied or why not,
each op that will not apply is an `update_not_applied` warning, and a
malformed list is an `invalid_updates` error. It replaces the shape-only
`validateChartUpdates`. The MCP `validate_chart` and `create_chart_view`
return the same report the chart view later sends as its context: the chart,
its interactions, and one ✓/✗ line per update op. `create_chart_view` hands
the view its payload in `_meta.flint` instead of `structuredContent`, so the
model reads the report rather than the data rows.

- `filter-controls` (`filterControls`), a filter-only interaction preset. It
draws one row of muted controls per field under the chart (a segmented bar
to pick one of a few values, pills to pick several, a searchable dropdown for
many, a slider to pick one year or other ordered value, a range slider, or a
switch), and filters the rows (or mutes them with
`mode: "highlight"`); each filter re-lays the chart out for the rows left.
Values read as the chart writes them, from the field's semantic type
(`Aug 2015`, `$1.20`, `2007`).
`placement` is `auto` or `bottom` (under the chart) or `top`; under 280px
wide each label sits above its control. With `render: false` the host draws its own
controls and drives the preset through `dispatch`. The active filters appear
as `ChartState.filters`. Without `fields`, the preset skips fields that
`legend-toggle`, `navigate`, or `brush-zoom` already filter. A filtered chart
keeps its colors per category.
- A reproducible Copilot Canvas plugin build (`npm run build:copilot-plugin`)
bundles the current chart UI and authoring skill, aligns the plugin version
with the npm packages, and pins the MCP server to that release.
- `flint-interaction-author`, a third agent skill beside the chart and theme
skills. It maps a named gesture or an intent (explore, compare, analyse) to
interaction presets and returns one valid `interaction_spec`, at authoring
time or after the chart exists. The MCP server serves it as
`flint://interaction-skill` and the prompt `author_flint_interaction`. The
chart-author skill keeps a short `interaction_spec` section and points to it.
`npm run sync:skills` copies the three skills into the MCP assets.
- Viewport changes a gesture commits animate by default. A `navigate` or
`brush-zoom` reset flies home, and a brush zoom tweens into the brushed
region, over 400 ms on every Vega-Lite chart, not only on projected maps.
Expand Down Expand Up @@ -47,9 +85,61 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
`semantic_types` labels surface as `unknown_semantic_type` warnings, and
`isRegistered` / `getRegisteredTypes` are exported from `flint-chart/core`
([#104](https://github.com/microsoft/flint-chart/issues/104)).
- `<FlintChart>` from the new `flint-chart/react` subpath (React is an
optional peer dependency). `spec` takes the `ChartAssemblyInput` with its
`interaction_spec`; `interactions` takes preset factories, as an array added
to the spec's interactions or a function `(fromSpec) => definitions` that
returns the full list. A chart with no interactions renders static and
mounts no interaction runtime; pass `updates` (even `[]`) to drive it from
the host. The `updates` prop is diffed by id, and a dropped id is cleared only if the host
wrote it last. `width`, `height`, and `fit` (`shrink`, `contain`, `none`)
set the box, which scales the chart; the layout size stays in the spec. A
ref exposes `applyUpdate`, `clearUpdate`, `dispatch`, `getState`, and
`refresh`; `fallback` shows until the chart mounts.
- `mountChart()`, the new name of `buildInteractiveChart()`, which remains as
an alias. Its `semanticUpdates` option (default `true`) keeps host updates
on a chart without interactions; `false` skips the interaction runtime. `surface.onInteraction()` hears the raw gesture records.
- `renderSvg(input, { backend })` from the new `flint-chart/render` subpath
returns a static SVG string for Vega-Lite or ECharts without a DOM.
- `selectionUpdate()` and `viewportUpdate()` build the updates a selection or
navigation preset writes, for hosts that set the same state.
- `ChartState.annotations` lists reader-made annotations, so a host can
persist them.
- `strokeDash` on the ECharts Line Chart, as on the Vega-Lite, Plotly, and
Excel line charts. A colour value draws one line per dash value, all in its
palette colour, and its one legend entry toggles them all; the dash styles
(solid, dashed, dotted, dash-dot) follow the dash values' first appearance
in the data, so facet panels agree. The legend lists the colour values, then
a gray line sample per dash value, and the axis tooltip names each line by
both (`C1 · Limit: 8`). Without colour the lines share one colour under a
legend titled by the dash field; with a continuous colour the gray line
splits by dash value.

### Changed

- **Breaking (MCP):** charts and boards are built off screen and drawn by one
tool. `create_chart` and `create_board` return a report and an id;
`update_chart`, `add_chart`, `remove_chart` and `update_board` change it by
`id` (was `board_id`); `show` opens the one card a turn with the current
version, and earlier cards keep the version they showed. `create_chart_view`,
`restore_chart_view`, `show_board` and `read_board` are removed, and the UI
resource is `ui://flint-chart/view.html`. Charts now live in server memory
between calls, as boards did, so a scaled HTTP deployment needs one instance
or sticky sessions.

- `onChange` fires only when the chart's state changes, not after every
render. A `ChartChange` now carries `source` (`reader` for a gesture, `host`
for `applyUpdate`, `clearUpdate`, or `setUpdates`), `changed` (the facets
that moved), and `previous`. A gesture that changes nothing, such as an
inspected index, reaches the host only through `flint-interaction`.
- Interactive Vega-Lite mounts no longer turn tooltips on. Tooltips follow the
spec's `options.addTooltips` (default `false`), as in static rendering.
- A code definition with the id of an `interaction_spec` entry now replaces
that entry with an `interaction_overridden` info warning. Before, the mount
threw.
- A non-Vega-Lite backend asked for interactions now renders the chart static
with an `interactions_ignored` warning. Before, the mount threw when code
passed interactions.
- `CanvasInteractionDef.affordances` is now a required map from the kind of
hit (`mark`, `legend-item`, `axis-label`, `plot`) to its cursor and hover,
and it is the only dispatch gate: the runtime sends a hit to an interaction
Expand Down Expand Up @@ -402,7 +492,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Treated only lowercase `start` and `end` Waterfall Type values as total
anchors in Vega-Lite; other values now remain floating deltas colored by sign.

[Unreleased]: https://github.com/microsoft/flint-chart/compare/0.5.1...HEAD
[Unreleased]: https://github.com/microsoft/flint-chart/compare/1.0.0...HEAD
[1.0.0]: https://github.com/microsoft/flint-chart/compare/0.5.1...1.0.0
[0.5.1]: https://github.com/microsoft/flint-chart/compare/0.5...0.5.1
[0.5.0]: https://github.com/microsoft/flint-chart/compare/0.4.0...0.5.0
[0.4.1]: https://github.com/microsoft/flint-chart/compare/0.4.0...0.4.1
Expand Down
Loading
Loading