Skip to content

Flint 1.0 release - #146

Merged
Chenglong Wang (Chenglong-MS) merged 152 commits into
mainfrom
dev
Oct 21, 2026
Merged

Chenglong Wang (Chenglong-MS) merged 152 commits into
mainfrom
dev

Conversation

@Chenglong-MS

Copy link
Copy Markdown
Contributor

No description provided.

… to presets

The chart-author skill hands behaviour to the new skill, which reads the chart
spec and the request and returns one interaction_spec from presets. The MCP
server ships the skill as a resource and a prompt. The Vega-Lite reference
drops its Interactions line per chart type, since the skill is where a chart's
presets are read. The skill text and its tests are trimmed to the request and
the spec.
…he MCP chart view hands it to the model

surface.onSelection calls back with a ChartSelection on every committed
gesture except a viewport move: the rows under the marks, from the traced
records or else the mark values, and the brushed range on the brushed axis,
named by its field. The dashboard lab subscribes through it instead of reading
the DOM event. The MCP chart view sends each selection to the host with
updateModelContext, as a text table and as structured content, and sends a
cleared note when the selection is cleared.
The surface root sizes itself to the compiled chart, so the frame's max-width
rule never reached the SVG and a chart with a legend, or with its own size,
scrolled. The app clamps the root to the frame, and the SVG scales down through
its viewBox as it does in the static path. The surface adds the rail row gap
only when it appends a rail, which removes the few px of vertical overflow.
- Readings: overflow placeholders, number precision, ECDF ties, full dates
  on time axes, untitled legends, stroke-dash series names, aggregate legend
  fields, per-panel mark grouping, unknown vs. empty membership.
- Controller: single tab stop with escape-reset presets, in-place focus on
  tab-in, activation announces the updated state.
- Rebuild the tree only when the scene signature changes.
- keyboardTargeting is ignored while accessible navigation is mounted.
- Radar: unique layer names per facet panel (panels drew the last panel's
  vertices).
- Add docs/design-accessible-navigation.md and regression tests.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…n context

The context a preset reads now extends a ChartState a host can read: the
emphasized marks per update, the hidden legend values, the shown viewport,
and the marks inside the plot area. The scene is scanned once for both
available and visible.
…of onSelection

ChartState is what the chart shows: the emphasized marks with their per-update entries, the hidden legend values, the viewport, and the rail windows. The runtime reports every change after the render with the state it produced; a click preset's hover cue reports as a preview, and a chart without navigation reports no viewport. A host reads each mark's value and the gesture's geometry and queries its own data, so there is no row helper and no scene scan for hosts.
…he site tabs read it

The MCP view replaces the model context on each commit with a sentence: which marks are emphasized and the range or the values they share, the hidden values, and the zoomed axes. The chart-to-external tab reads onChange, follows a pan and a zoom, and queries its own rows inside the viewport; the dashboard routes commit changes by their interaction id. The map stages stop the page overscroll.
The design doc, the interactive README and the architecture illustration
show the read side: the chart state leaves the update processor for the
application, in the same semantic terms the gestures enter with.
… ChartUpdate, surface code, and bespoke interactions

One skill for every output around a chart's behaviour: how an interaction
works, presets as one interaction_spec, the ChartUpdate an application or
an agent applies to a mounted chart, reading the state, linking charts, and
a bespoke definition from a trigger and a handler. The intent groups and the
scenario table give way to a chart-shape list. The preset option table is
generated by gen:reference from the factory option types, whose JSDoc now
carries the defaults. The MCP instructions, resource, and prompt name the
wider scope, and the skill copies are synced.
…ry, and the skill

The programming guide and the gallery's app section read the chart through
getState and onChange, with the flint-interaction event kept for the gesture
itself. The agent pointers name the skill's full scope, and the skill's event
shape carries the description accessible-navigation sets on focus-element.
Chart state for hosts, and one interaction-author skill
An agent with no handle on the mounted chart passes ChartUpdate layers
beside the input; the view applies them at mount. validateChartUpdates
checks the list shape, the surface warns about a layer the chart cannot
honour, and an overlay that does not project is reported as unsupported
instead of crashing the chart.
# Conflicts:
#	packages/flint-js/src/echarts/instantiate-spec.ts
Comment thread packages/flint-js/src/core/number-compact.ts Fixed
Comment thread packages/flint-js/src/core/number-compact.ts Fixed
Comment thread packages/flint-js/src/core/title-plan.ts Fixed
Comment thread packages/flint-js/src/core/title-plan.ts Fixed
Comment thread packages/flint-js/src/plotly/theme.ts Fixed
Comment thread packages/flint-js/src/vegalite/canvas-furniture.ts Fixed
Comment thread packages/flint-js/src/vegalite/canvas-furniture.ts Fixed
Comment thread packages/flint-js/src/vegalite/canvas-furniture.ts Fixed
Comment thread packages/flint-js/tests/theme-plotly.test.ts Fixed
Comment thread packages/flint-js/tests/theme-plotly.test.ts Fixed
- Read a trailing parenthetical with index scans (title-plan, number-compact)
  instead of patterns that backtrack on runs of brackets or spaces.
- Make SCALED_TEXT unambiguous: \(\s*(?:[$£€]\s*)? matches what it did.
- Find the root <svg> tag once in injectCanvasFurnitureSVG.
- Split Plotly markup on <[^<>]+> so a run of '<' cannot backtrack.
- Freeform overlay links also refuse vbscript: and data: URLs (raster data
  images stay allowed), after dropping control characters browsers ignore.
- Tests show each rewrite answers as the old pattern did, and runs fast.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The tests passed at runtime but their types had drifted from src, so CI failed
at typecheck before running them. Also give the renderSvg smoke test 30 s, as
its first render loads both backends cold.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Drop four unused imports. onLayoutChange stays a let: renderUpdates may read it
before the surface assigns it, which a const would turn into a TDZ error.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
AxisLabelPlan replaced straightRefused with overflowFit in 7772ea7.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
vite build runs out of Node's default ~4 GB heap on the site bundle.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
proxy-addr, fast-uri, @modelcontextprotocol/sdk, hono, qs, ip-address, js-yaml,
source-map-js, nanoid and brace-expansion, within their existing ranges.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
vite 7.3.7 (site) and 8.1.6 (MCP UI) fix the Windows launch-editor escaping;
vitest and @vitest/mocker 4.1.11 fix the mocker path traversal. Patch releases
within the existing majors; the workspace ranges now start at the fixed versions.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ctive

Interaction instrumentation reset a dot's resting opacity to 1 and its ring
to Vega's 1.5 px unless the chart set them on the mark. It now reads them from
the mark config, as Vega-Lite does, so a theme's fade, Vega-Lite's 0.7 default
and a theme's halo look the same with or without interactions.

The NYT preset rings its scatter dots with a 1 px white halo, as NYT's own
scatter plots do, instead of fading them.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Key titles get a theme role (type.keyTitle) and follow axisTitle's face and
  ink, never lighter than bold unless the theme says so; Plotly applies it too.
- Every key keeps its title when a chart draws several, and colour ramps are
  always titled, since their labels are numbers.
- Keys sharing a row seat their titles alike, prefer stacking over moving off
  the theme's anchor, and splitting keys across edges costs more.
- Keys side by side, or stacked beside the plot, stand 2.25 em apart.
- Add a Legend layout lab (playground/legend) covering one and several keys
  across canvas sizes and themes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Interactions page opens on the globe demo and adds a 'See it in action'
  video (YouTube; the Chinese cut for zh-CN readers).
- Header dropdowns get icons; WeChat and Discord move from the header to a
  side-by-side community section at the bottom of the landing page.
- Shorter Advanced Interactions case titles, so the rail fits on one line.
- The MCP setup prompt offers the local and hosted servers as equal options.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Date the 1.0.0 changelog entry and rewrite the README to follow the landing
page: the demo video, updates, getting started in an agent app (MCP) and in
your apps (npm), the four ideas behind Flint with a figure each, and the
community and contributors.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The board strips furniture from its cells and draws it once on its frame,
but matched only the earlier kind names, so the Economist tab, footer
rules, and text or image furniture were never drawn. planFrameFurniture
plans the frame with the chart's own header and closing-rule rules, and
headerFurnitureItems, shared with applyHeaderFurniture, places the pieces;
the board and its PNG export draw them.
A cell no longer lifts the chart's title and deck into HTML or strips the
theme's furniture: the chart draws its own heading, deck, tab and rules,
as it does on its own card. The chart/table switch and the edit handle
float over the cell; the table view shows the table alone. Plots in a row
no longer share a top line when headings wrap differently.

A board shown in a pane (fullscreen or picture-in-picture) scrolls, with
a stable gutter; inline it stays sized to the board.
…ts and keeps each chart's furniture

The board export loaded each chart's SVG from a blob URL, which an MCP
App sandbox's img-src blocks, so the board could not be exported in
hosts such as Claude Code; it now uses a data URL. A chart's furniture
is a 1px overlay layer, which the board export drew at 1px; it is drawn
at the chart's size. The chart card painted its furniture on a canvas
Vega had left scaled and offset, so the tab came out at the scale
squared; the transform is reset before painting.
The bar and box templates band a temporal x such as a run of years, but
the Grouped Bar Chart's local dodge picked its band axis from the
semantic type, which stays temporal. It grouped the lane window by the
y field, so bars sharing a value shared a lane group and the rest
collapsed to zero width. The axis now comes from the offset channel the
assembler chose from the banded types.

The dodge option's check, in the Grouped Bar Chart and the Boxplot,
made the same choice and offered or hid the control from the y field.
It now asks for the band axis as declareLayoutMode does.
@Chenglong-MS
Chenglong Wang (Chenglong-MS) merged commit 60324d2 into main Oct 21, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants