From 1f3db386d890fc9d776ea73964685e89a69d968c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franc=CC=A7ois-Guillaume=20Ribreau?= Date: Thu, 13 Aug 2026 13:38:34 +0200 Subject: [PATCH 1/6] feat(backend): add Image-Charts hosted-image-URL backend Add an `image-charts` backend that compiles the shared core semantic layer into a single Image-Charts URL. Unlike the JS-spec backends it emits a permanent hosted-image URL that renders server-side and embeds anywhere an works (email, PDF, Slack, no-code) with no runtime JavaScript. The assembler is pure: it builds a string with no network I/O, no crypto, and no dependencies, and emits unsigned free-tier URLs only. It reuses the Phase 0 semantic resolution and banded-axis overflow filtering, then serializes into the Image-Charts query grammar (cht, chd=a:, chs, chxt/chxl, chco, chdl, chm, chtt). Coverage is partial by design, like the Excel backend: bar/line/area/pie/doughnut/radar/ scatter map to a faithful cht; unsupported types throw. Wire the backend into the src barrel, tsup entries, package exports, the public-API smoke test, and the test-data generators. --- packages/flint-js/package.json | 5 + .../flint-js/src/image-charts/assemble.ts | 362 ++++++++++++++++++ .../flint-js/src/image-charts/chart-types.ts | 49 +++ packages/flint-js/src/image-charts/index.ts | 28 ++ packages/flint-js/src/index.ts | 3 + .../src/test-data/image-charts-tests.ts | 123 ++++++ packages/flint-js/src/test-data/index.ts | 3 + packages/flint-js/tests/smoke.test.ts | 36 ++ packages/flint-js/tsup.config.ts | 1 + 9 files changed, 610 insertions(+) create mode 100644 packages/flint-js/src/image-charts/assemble.ts create mode 100644 packages/flint-js/src/image-charts/chart-types.ts create mode 100644 packages/flint-js/src/image-charts/index.ts create mode 100644 packages/flint-js/src/test-data/image-charts-tests.ts diff --git a/packages/flint-js/package.json b/packages/flint-js/package.json index 167841f7..e1bb0876 100644 --- a/packages/flint-js/package.json +++ b/packages/flint-js/package.json @@ -65,6 +65,11 @@ "import": "./dist/excel/index.js", "require": "./dist/excel/index.cjs" }, + "./image-charts": { + "types": "./dist/image-charts/index.d.ts", + "import": "./dist/image-charts/index.js", + "require": "./dist/image-charts/index.cjs" + }, "./test-data": { "types": "./dist/test-data/index.d.ts", "import": "./dist/test-data/index.js", diff --git a/packages/flint-js/src/image-charts/assemble.ts b/packages/flint-js/src/image-charts/assemble.ts new file mode 100644 index 00000000..740ffb73 --- /dev/null +++ b/packages/flint-js/src/image-charts/assemble.ts @@ -0,0 +1,362 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * Image-Charts chart assembly — a hosted-image-URL backend. + * + * Unlike the other backends, Image-Charts does not emit a spec object that a + * local renderer draws: it emits a single permanent `https://image-charts.com` + * URL that renders the chart server-side. That URL is embeddable anywhere an + * `` works (email, PDF, Slack, no-code tools) with no runtime JavaScript. + * + * Contract: + * - PURE. No network I/O, no crypto, no npm dependencies. `assembleImageCharts` + * only builds a string; the data reaches Image-Charts only if something later + * loads the `` — an explicit choice by the caller, exactly as choosing + * the Excel backend chooses Office.js. + * - FREE TIER ONLY. Unsigned URLs (no `icac`/`ichm` account/HMAC pair, no + * `chof` output override). Signed enterprise URLs need a server-side secret + * that has no place in a pure, offline compiler function. + * + * Reuses the SAME core analysis pipeline as the other backends (Phase 0 semantic + * resolution + banded-axis overflow filtering), then serializes the resolved + * channel semantics, category/series roles, and values into the Image-Charts + * query grammar (`cht`, `chd=a:`, `chs`, `chxt`/`chxl`, `chco`, `chdl`, `chm`, + * `chtt`). Like the Excel backend it does the work inline rather than through a + * template registry, and it gates chart types to the ones with a faithful `cht`. + */ + +import type { ChartAssemblyInput, ChartEncoding, SemanticResult } from '../core/types'; +import { resolveChannelSemantics, convertTemporalData } from '../core/resolve-semantics'; +import { detectBandedAxisFromSemantics } from '../core/axis-detection'; +import { computeChannelBudgets, deriveStretchCaps, resolveBaseSize } from '../core/compute-layout'; +import { filterOverflow } from '../core/filter-overflow'; +import type { LayoutDeclaration } from '../core/types'; +import { IMAGE_CHARTS_TYPE_MAP } from './chart-types'; + +/** A backend-native Image-Charts artifact: a permanent hosted-image URL. */ +export interface ImageChartsArtifact { + type: 'image-charts'; + url: string; +} + +type Cell = string | number; + +/** Image-Charts base endpoint (public free tier). */ +const IMAGE_CHARTS_ENDPOINT = 'https://image-charts.com/chart?'; + +/** Free-tier size ceilings: each side ≤ 999px and area ≤ 998001px². */ +const MAX_SIDE = 999; +const MAX_AREA = 998001; + +/** Default target size when the spec provides no `baseSize`. */ +const DEFAULT_SIZE = { width: 700, height: 400 }; + +/** + * Categorical palette (hex, no `#`) used for `chco`. Emitted only when color is + * meaningful (multiple series, pie slices, area fill, scatter markers); a single + * plain series keeps Image-Charts' own default color. + */ +const SERIES_COLORS = [ + '4472C4', 'ED7D31', '70AD47', 'FFC000', '5B9BD5', + 'A5A5A5', '264478', '9E480E', '636363', '997300', +]; + +/** Normalize shorthand (`"x": "field"`) to `{ field }`. */ +function normalizeEncodings(raw: Record): Record { + const out: Record = {}; + for (const [ch, v] of Object.entries(raw ?? {})) { + if (v == null) continue; + out[ch] = typeof v === 'string' ? { field: v } : (v as ChartEncoding); + } + return out; +} + +/** Clamp a target size to the free-tier ceilings (side ≤ 999, area ≤ 998001). */ +function clampChartSize(width: number, height: number): { width: number; height: number } { + let w = Math.min(MAX_SIDE, Math.max(1, Math.round(width))); + let h = Math.min(MAX_SIDE, Math.max(1, Math.round(height))); + if (w * h > MAX_AREA) { + const scale = Math.sqrt(MAX_AREA / (w * h)); + w = Math.max(1, Math.floor(w * scale)); + h = Math.max(1, Math.floor(h * scale)); + } + return { width: w, height: h }; +} + +/** + * Encode one label/title/legend segment: keep ASCII alphanumerics, map spaces to + * `+`, percent-encode everything else (UTF-8). Structural separators (`|`, `,`, + * `:`) are added by the caller between segments and never pass through here, so + * a label that literally contains them stays escaped and cannot break parsing. + */ +function encodeSegment(text: string): string { + let out = ''; + for (const ch of text) { + if (/[0-9A-Za-z]/.test(ch)) out += ch; + else if (ch === ' ') out += '+'; + else out += encodeURIComponent(ch); + } + return out; +} + +/** Format one datum for the `a:` (awesome) encoding; `_` marks a gap/null. */ +function formatValue(value: number | null): string { + if (value == null || !Number.isFinite(value)) return '_'; + if (Number.isInteger(value)) return String(value); + return String(Number(value.toFixed(4))); +} + +/** Distinct values of a field in first-seen order (nulls skipped). */ +function distinct(rows: any[], field: string): Cell[] { + const seen = new Set(); + const out: Cell[] = []; + for (const r of rows) { + const v = r[field]; + if (v == null) continue; + if (!seen.has(v)) { seen.add(v); out.push(v as Cell); } + } + return out; +} + +/** + * Aggregate the long/tidy rows into a per-series × per-category value matrix, + * summing (or averaging) duplicates. `seriesField` undefined ⇒ one implicit + * series holding the whole measure column. + */ +function pivotValues( + rows: any[], + catField: string, + measField: string, + seriesField: string | undefined, + categories: Cell[], + seriesKeys: Cell[], + aggregate: 'sum' | 'average', +): (number | null)[][] { + const SINGLE = '__single__'; + const acc = new Map(); + for (const r of rows) { + const cv = r[catField]; + if (cv == null) continue; + const sv = seriesField ? r[seriesField] : SINGLE; + const num = Number(r[measField]); + if (!Number.isFinite(num)) continue; + const key = JSON.stringify([String(cv), String(sv)]); + const e = acc.get(key) ?? { sum: 0, count: 0 }; + e.sum += num; e.count += 1; acc.set(key, e); + } + const valueAt = (cv: Cell, sv: Cell): number | null => { + const e = acc.get(JSON.stringify([String(cv), String(seriesField ? sv : SINGLE)])); + if (!e) return null; + return aggregate === 'average' ? e.sum / e.count : e.sum; + }; + return seriesKeys.map((sv) => categories.map((cv) => valueAt(cv, sv))); +} + +/** + * Assemble an {@link ImageChartsArtifact} (a permanent hosted-image URL) from a + * {@link ChartAssemblyInput}. + * + * @throws if the chart type has no faithful Image-Charts `cht` equivalent + * (e.g. Boxplot, Sankey, Heatmap) or its roles cannot be resolved. + */ +export function assembleImageCharts(input: ChartAssemblyInput): ImageChartsArtifact { + const flintType = input.chart_spec.chartType; + const mapping = IMAGE_CHARTS_TYPE_MAP[flintType]; + if (!mapping) { + throw new Error(`Image-Charts backend does not support chart type "${flintType}".`); + } + + const semanticTypes = input.semantic_types ?? {}; + const rawData: any[] = input.data.values ?? []; + const encodings = normalizeEncodings(input.chart_spec.encodings); + + if (encodings.column?.field || encodings.row?.field) { + throw new Error(`Image-Charts backend does not support faceting in one chart: "${flintType}".`); + } + + // ── Phase 0 (reused core): resolve per-channel semantics ──────────────── + let table = convertTemporalData(rawData, semanticTypes); + const sem: SemanticResult = resolveChannelSemantics(encodings, rawData, semanticTypes, table); + const typeOf = (ch: string) => sem[ch]?.type; + const isMeasure = (ch: string) => typeOf(ch) === 'quantitative'; + const fieldOf = (ch: string) => encodings[ch]?.field; + + // A categorical color/group binding becomes the series (legend) dimension; + // a quantitative color is not a series and is ignored on this tier. + const seriesCh = encodings.group?.field + ? 'group' + : encodings.color?.field && !isMeasure('color') + ? 'color' + : undefined; + const seriesField = seriesCh ? fieldOf(seriesCh) : undefined; + + // ── Overflow filtering for banded (bar) families, so URLs stay bounded ── + const keptCategoryOrder = new Map(); + if (mapping.cht === 'bvg' || mapping.cht === 'bhg' || mapping.cht === 'bvs' || mapping.cht === 'bhs') { + const detected = detectBandedAxisFromSemantics(sem, table, { preferAxis: 'x' }); + const declaration: LayoutDeclaration = { + axisFlags: detected ? { [detected.axis]: { banded: true } } : { x: { banded: true } }, + resolvedTypes: detected?.resolvedTypes, + }; + const baseSize = resolveBaseSize(input.chart_spec.baseSize, input.chart_spec.canvasSize); + const options = { + facetFixedPadding: { width: 50, height: 40 }, + facetGap: 10, + targetBandAR: 10, + ...deriveStretchCaps(baseSize, input.chart_spec.canvasSize, {}), + }; + const budgets = computeChannelBudgets(sem, declaration, table, baseSize, options); + const overflow = filterOverflow(sem, declaration, encodings, table, budgets, new Set(['bar'])); + table = overflow.filteredData; + overflow.truncations.forEach((t) => keptCategoryOrder.set(t.field, t.keptValues as Cell[])); + } + + const params: string[] = []; + const size = clampChartSize( + input.chart_spec.baseSize?.width ?? DEFAULT_SIZE.width, + input.chart_spec.baseSize?.height ?? DEFAULT_SIZE.height, + ); + + if (mapping.noAxes) { + buildPartToWhole(params, mapping.cht, sem, table, fieldOf); + } else if (mapping.xy) { + buildScatter(params, table, fieldOf, isMeasure, seriesField, flintType); + } else { + buildAxes( + params, mapping, flintType, sem, table, + fieldOf, typeOf, isMeasure, seriesField, keptCategoryOrder, + ); + } + + params.push(`chs=${size.width}x${size.height}`); + const title = input.chart_spec.title?.trim(); + if (title) params.push(`chtt=${encodeSegment(title)}`); + + return { type: 'image-charts', url: IMAGE_CHARTS_ENDPOINT + params.join('&') }; +} + +/** Pie / doughnut: one series of slices, each with its own label and color. */ +function buildPartToWhole( + params: string[], + cht: string, + sem: SemanticResult, + table: any[], + fieldOf: (ch: string) => string | undefined, +): void { + const catField = fieldOf('color') ?? fieldOf('x'); + const measField = fieldOf('size') ?? fieldOf('theta') ?? fieldOf('y'); + if (!catField || !measField) { + throw new Error(`Image-Charts backend could not resolve slice/value fields for a part-to-whole chart (category=${catField}, value=${measField}).`); + } + const slices = distinct(table, catField); + const measCh = fieldOf('size') === measField ? 'size' : fieldOf('theta') === measField ? 'theta' : 'y'; + const aggregate = sem[measCh]?.aggregationDefault ?? 'sum'; + const [values] = pivotValues(table, catField, measField, undefined, slices, ['__single__'], aggregate); + + params.push(`cht=${cht}`); + params.push(`chd=a:${values.map(formatValue).join(',')}`); + params.push(`chl=${slices.map((s) => encodeSegment(String(s))).join('|')}`); + params.push(`chco=${slices.map((_s, i) => SERIES_COLORS[i % SERIES_COLORS.length]).join('|')}`); +} + +/** Scatter: `lxy` with one (x-set, y-set) pair per series, drawn as markers. */ +function buildScatter( + params: string[], + table: any[], + fieldOf: (ch: string) => string | undefined, + isMeasure: (ch: string) => boolean, + seriesField: string | undefined, + flintType: string, +): void { + const xField = fieldOf('x'); + const yField = fieldOf('y'); + if (!xField || !yField || !isMeasure('x') || !isMeasure('y')) { + throw new Error(`Image-Charts backend requires quantitative x and y fields for "${flintType}".`); + } + const seriesKeys = seriesField ? distinct(table, seriesField) : ['__single__']; + const datasets: string[] = []; + const markers: string[] = []; + const colors: string[] = []; + seriesKeys.forEach((key, index) => { + const rows = seriesField ? table.filter((r) => r[seriesField] === key) : table; + const xs = rows.map((r) => Number(r[xField])); + const ys = rows.map((r) => Number(r[yField])); + datasets.push(xs.map(formatValue).join(',')); + datasets.push(ys.map(formatValue).join(',')); + const color = SERIES_COLORS[index % SERIES_COLORS.length]; + colors.push(color); + markers.push(`s,${color},${index},-1,6`); + }); + + params.push('cht=lxy'); + params.push(`chd=a:${datasets.join('|')}`); + params.push(`chco=${colors.join(',')}`); + params.push(`chm=${markers.join('|')}`); + if (seriesField && seriesKeys.length > 1) { + params.push(`chdl=${seriesKeys.map((s) => encodeSegment(String(s))).join('|')}`); + } +} + +/** Bar / line / area / radar: a category axis plus one measure per series. */ +function buildAxes( + params: string[], + mapping: { cht: string; horizontal?: string; radar?: boolean; area?: boolean }, + flintType: string, + sem: SemanticResult, + table: any[], + fieldOf: (ch: string) => string | undefined, + typeOf: (ch: string) => string | undefined, + isMeasure: (ch: string) => boolean, + seriesField: string | undefined, + keptCategoryOrder: Map, +): void { + // Horizontal bar when the measure sits on x and the category on y. + const horizontal = Boolean(mapping.horizontal) && isMeasure('x') && !isMeasure('y'); + const catCh = horizontal ? 'y' : 'x'; + const measCh = horizontal ? 'x' : 'y'; + const catField = fieldOf(catCh); + const measField = fieldOf(measCh); + if (!catField || !measField) { + throw new Error(`Image-Charts backend could not resolve category/measure for "${flintType}" (category=${catField}, measure=${measField}).`); + } + + let categories = keptCategoryOrder.get(catField) ?? distinct(table, catField); + // Ordered domains (line / area over time or a numeric axis) sort ascending. + if (!mapping.radar && (flintType === 'Line Chart' || flintType === 'Area Chart' || flintType === 'Sparkline')) { + if (typeOf(catCh) === 'temporal') { + categories = [...categories].sort((a, b) => new Date(String(a)).getTime() - new Date(String(b)).getTime()); + } else if (typeOf(catCh) === 'quantitative') { + categories = [...categories].sort((a, b) => Number(a) - Number(b)); + } + } + + const seriesKeys = seriesField ? distinct(table, seriesField) : [measField]; + const aggregate = sem[measCh]?.aggregationDefault ?? 'sum'; + const seriesValues = pivotValues(table, catField, measField, seriesField, categories, seriesKeys, aggregate); + + const cht = horizontal ? (mapping.horizontal as string) : mapping.cht; + params.push(`cht=${cht}`); + params.push(`chd=a:${seriesValues.map((vals) => vals.map(formatValue).join(',')).join('|')}`); + + // Category axis: index 0 (x) for vertical/radar, index 1 (y) for horizontal. + const categoryLabels = categories.map((c) => encodeSegment(String(c))).join('|'); + if (mapping.radar) { + params.push('chxt=r'); + params.push(`chxl=0:|${categoryLabels}`); + } else { + params.push('chxt=x,y'); + params.push(`chxl=${horizontal ? 1 : 0}:|${categoryLabels}`); + } + + const seriesColors = seriesKeys.map((_k, i) => SERIES_COLORS[i % SERIES_COLORS.length]); + if (seriesKeys.length > 1 || mapping.area) { + params.push(`chco=${seriesColors.join(',')}`); + } + if (mapping.area) { + params.push(`chm=${seriesColors.map((c, i) => `B,${c},${i},0,0`).join('|')}`); + } + if (seriesField && seriesKeys.length > 1) { + params.push(`chdl=${seriesKeys.map((s) => encodeSegment(String(s))).join('|')}`); + } +} diff --git a/packages/flint-js/src/image-charts/chart-types.ts b/packages/flint-js/src/image-charts/chart-types.ts new file mode 100644 index 00000000..7a66a373 --- /dev/null +++ b/packages/flint-js/src/image-charts/chart-types.ts @@ -0,0 +1,49 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * Image-Charts chart-type mapping. + * + * Image-Charts renders through a fixed set of `cht` chart codes (the Google + * Image Charts / Image-Charts query grammar), so a Flint chart type maps to the + * closest native `cht`. Orientation (vertical vs horizontal) is decided by the + * assembler from channel semantics and selects the `bv*` vs `bh*` family. + * + * Coverage is partial by design (like the Excel backend): only chart types with + * a faithful `cht` equivalent are mapped. Everything else throws in `assemble`. + */ + +/** Which Image-Charts `cht` family a Flint chart type maps to. */ +export interface ImageChartsTypeMapping { + /** Base Image-Charts `cht` value (vertical / category-on-x orientation). */ + cht: string; + /** `cht` for the horizontal (category-on-y) variant, when supported. */ + horizontal?: string; + /** True for pie/doughnut charts: slice labels, no value/category axes. */ + noAxes?: boolean; + /** True for XY (both-measure) scatter charts rendered as `lxy`. */ + xy?: boolean; + /** True for radar charts, which use the `chxt=r` polar axis. */ + radar?: boolean; + /** True for area charts: a line (`lc`) plus a `chm=B` fill to the baseline. */ + area?: boolean; +} + +/** Flint chart type (display name) → Image-Charts `cht` family. */ +export const IMAGE_CHARTS_TYPE_MAP: Record = { + 'Bar Chart': { cht: 'bvg', horizontal: 'bhg' }, + 'Grouped Bar Chart': { cht: 'bvg', horizontal: 'bhg' }, + 'Stacked Bar Chart': { cht: 'bvs', horizontal: 'bhs' }, + 'Line Chart': { cht: 'lc' }, + 'Sparkline': { cht: 'ls' }, + 'Area Chart': { cht: 'lc', area: true }, + 'Scatter Plot': { cht: 'lxy', xy: true }, + 'Pie Chart': { cht: 'p', noAxes: true }, + 'Donut Chart': { cht: 'pd', noAxes: true }, + 'Radar Chart': { cht: 'r', radar: true }, +}; + +/** Chart types this backend can render as an Image-Charts URL. */ +export function isImageChartsSupported(flintChartType: string): boolean { + return flintChartType in IMAGE_CHARTS_TYPE_MAP; +} diff --git a/packages/flint-js/src/image-charts/index.ts b/packages/flint-js/src/image-charts/index.ts new file mode 100644 index 00000000..ddc4957c --- /dev/null +++ b/packages/flint-js/src/image-charts/index.ts @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * @module flint-chart/image-charts + * + * Image-Charts backend for flint-chart. + * + * Compiles the core semantic layer into a single permanent + * `https://image-charts.com` chart URL (the Google Image Charts / Image-Charts + * query grammar). The URL renders server-side and embeds anywhere an `` + * works — email, PDF, Slack, no-code tools — with no runtime JavaScript. + * + * Architecture contrast with the other backends: + * VL: encoding-channel spec — { encoding: { x, y }, mark } + * EC: series-based option — { series: [...], xAxis, yAxis } + * CJS: dataset-based config — { type, data: { labels, datasets } } + * Excel: range/matrix spec — { chartType, data: [[...]], axes } + * Image-Charts: hosted-image URL — { type: 'image-charts', url } + * + * `assembleImageCharts` is PURE: it builds a string, performs no network I/O and + * no signing, and emits unsigned free-tier URLs only. + */ + +export { assembleImageCharts } from './assemble'; +export type { ImageChartsArtifact } from './assemble'; +export { IMAGE_CHARTS_TYPE_MAP, isImageChartsSupported } from './chart-types'; +export type { ImageChartsTypeMapping } from './chart-types'; diff --git a/packages/flint-js/src/index.ts b/packages/flint-js/src/index.ts index 824f9746..eeb753d1 100644 --- a/packages/flint-js/src/index.ts +++ b/packages/flint-js/src/index.ts @@ -57,3 +57,6 @@ export * from './plotly'; // Excel backend: assembleExcel + Excel chart spec types export * from './excel'; + +// Image-Charts backend: assembleImageCharts + hosted-image-URL artifact type +export * from './image-charts'; diff --git a/packages/flint-js/src/test-data/image-charts-tests.ts b/packages/flint-js/src/test-data/image-charts-tests.ts new file mode 100644 index 00000000..abd64f6a --- /dev/null +++ b/packages/flint-js/src/test-data/image-charts-tests.ts @@ -0,0 +1,123 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +/** + * Gallery generators for the Image-Charts backend. + * + * These cases exercise the URL-grammar paths the backend builds: a plain bar + * (`cht=bvg`, `chxl` categories), a multi-series grouped bar (`chco` + `chdl` + * legend), a line, a filled area (`chm=B`), a pie (per-slice `chl` + `chco`), + * and a scatter (`cht=lxy` + `chm=s` markers). The data is backend-agnostic — + * the gallery renders it through `assembleImageCharts`. + */ + +import { Type } from './df-types'; +import { TestCase, makeField, makeEncodingItem } from './types'; + +const CATEGORY_META = { type: Type.String, semanticType: 'Category', levels: [] as any[] }; +const QUANTITY_META = { type: Type.Number, semanticType: 'Quantity', levels: [] as any[] }; + +export function genImageChartsTests(): TestCase[] { + return [ + { + title: 'Bar — sales by region', + description: 'A single-series vertical bar, category labels on the x axis.', + tags: ['bar', 'nominal', 'quantitative', 'image-charts'], + chartType: 'Bar Chart', + data: [ + { Region: 'North', Sales: 42 }, + { Region: 'South', Sales: 35 }, + { Region: 'East', Sales: 58 }, + { Region: 'West', Sales: 27 }, + ], + fields: [makeField('Region'), makeField('Sales')], + metadata: { Region: CATEGORY_META, Sales: QUANTITY_META }, + encodingMap: { x: makeEncodingItem('Region'), y: makeEncodingItem('Sales') }, + }, + { + title: 'Grouped bar — sales by region and channel', + description: 'Two series dodge per category, driving a per-series palette and a legend.', + tags: ['bar', 'grouped', 'series', 'legend', 'image-charts'], + chartType: 'Grouped Bar Chart', + data: [ + { Region: 'North', Sales: 42, Channel: 'Retail' }, + { Region: 'North', Sales: 20, Channel: 'Online' }, + { Region: 'South', Sales: 35, Channel: 'Retail' }, + { Region: 'South', Sales: 31, Channel: 'Online' }, + ], + fields: [makeField('Region'), makeField('Sales'), makeField('Channel')], + metadata: { Region: CATEGORY_META, Sales: QUANTITY_META, Channel: CATEGORY_META }, + encodingMap: { + x: makeEncodingItem('Region'), + y: makeEncodingItem('Sales'), + group: makeEncodingItem('Channel'), + }, + }, + { + title: 'Line — monthly signups', + description: 'An ordered category axis with a single quantitative series.', + tags: ['line', 'temporal', 'quantitative', 'image-charts'], + chartType: 'Line Chart', + data: [ + { Month: '2026-01', Signups: 120 }, + { Month: '2026-02', Signups: 150 }, + { Month: '2026-03', Signups: 138 }, + { Month: '2026-04', Signups: 176 }, + ], + fields: [makeField('Month'), makeField('Signups')], + metadata: { + Month: { type: Type.String, semanticType: 'YearMonth', levels: [] }, + Signups: QUANTITY_META, + }, + encodingMap: { x: makeEncodingItem('Month'), y: makeEncodingItem('Signups') }, + }, + { + title: 'Area — traffic over time', + description: 'A line filled to the baseline via a chm=B marker.', + tags: ['area', 'temporal', 'quantitative', 'image-charts'], + chartType: 'Area Chart', + data: [ + { Day: '2026-01-01', Visits: 30 }, + { Day: '2026-01-02', Visits: 52 }, + { Day: '2026-01-03', Visits: 41 }, + { Day: '2026-01-04', Visits: 66 }, + ], + fields: [makeField('Day'), makeField('Visits')], + metadata: { + Day: { type: Type.Date, semanticType: 'Date', levels: [] }, + Visits: QUANTITY_META, + }, + encodingMap: { x: makeEncodingItem('Day'), y: makeEncodingItem('Visits') }, + }, + { + title: 'Pie — market share', + description: 'Slice labels and a per-slice palette.', + tags: ['pie', 'part-to-whole', 'image-charts'], + chartType: 'Pie Chart', + data: [ + { Vendor: 'Acme', Share: 45 }, + { Vendor: 'Globex', Share: 30 }, + { Vendor: 'Initech', Share: 15 }, + { Vendor: 'Umbrella', Share: 10 }, + ], + fields: [makeField('Vendor'), makeField('Share')], + metadata: { Vendor: CATEGORY_META, Share: QUANTITY_META }, + encodingMap: { color: makeEncodingItem('Vendor'), size: makeEncodingItem('Share') }, + }, + { + title: 'Scatter — weight vs mpg', + description: 'Two measures on lxy, drawn as chm=s point markers.', + tags: ['scatter', 'quantitative', 'image-charts'], + chartType: 'Scatter Plot', + data: [ + { Weight: 1.6, Mpg: 32 }, + { Weight: 2.1, Mpg: 27 }, + { Weight: 1.9, Mpg: 29 }, + { Weight: 2.4, Mpg: 24 }, + ], + fields: [makeField('Weight'), makeField('Mpg')], + metadata: { Weight: QUANTITY_META, Mpg: QUANTITY_META }, + encodingMap: { x: makeEncodingItem('Weight'), y: makeEncodingItem('Mpg') }, + }, + ]; +} diff --git a/packages/flint-js/src/test-data/index.ts b/packages/flint-js/src/test-data/index.ts index e59fc3ad..34c54324 100644 --- a/packages/flint-js/src/test-data/index.ts +++ b/packages/flint-js/src/test-data/index.ts @@ -41,6 +41,7 @@ export { genLineAreaStretchTests } from './line-area-stretch-tests'; export { genEChartsScatterTests, genEChartsLineTests, genEChartsBarTests, genEChartsStackedBarTests, genEChartsGroupedBarTests, genEChartsStressTests, genEChartsAreaTests, genEChartsPieTests, genEChartsHeatmapTests, genEChartsHistogramTests, genEChartsBoxplotTests, genEChartsRadarTests, genEChartsCandlestickTests, genEChartsStreamgraphTests, genEChartsFacetSmallTests, genEChartsFacetWrapTests, genEChartsFacetClipTests, genEChartsRoseTests, genEChartsGaugeTests, genEChartsFunnelTests, genEChartsTreemapTests, genEChartsSunburstTests, genEChartsSankeyTests, genEChartsUniqueStressTests, genEChartsCalendarTests, genEChartsParallelTests, genEChartsGraphTests, genEChartsTreeTests } from './echarts-tests'; export { genChartJsScatterTests, genChartJsLineTests, genChartJsBarTests, genChartJsStackedBarTests, genChartJsGroupedBarTests, genChartJsAreaTests, genChartJsPieTests, genChartJsHistogramTests, genChartJsRadarTests, genChartJsStressTests, genChartJsRoseTests, genChartJsBubbleTests, genChartJsDoughnutTests, genChartJsComboTests } from './chartjs-tests'; export { genPlotlyCoreTests, genPlotlyFacetTests } from './plotly-tests'; +export { genImageChartsTests } from './image-charts-tests'; export { genDiscreteAxisTests } from './discrete-axis-tests'; export { genDateTests, genDateYearTests, genDateMonthTests, genDateYearMonthTests, genDateDecadeTests, genDateDateTimeTests, genDateHoursTests } from './date-tests'; export { genSemanticContextTests, genSnapToBoundTests } from './semantic-tests'; @@ -116,6 +117,7 @@ import { genSemanticContextTests, genSnapToBoundTests } from './semantic-tests'; import { genEChartsScatterTests, genEChartsLineTests, genEChartsBarTests, genEChartsStackedBarTests, genEChartsGroupedBarTests, genEChartsStressTests, genEChartsAreaTests, genEChartsPieTests, genEChartsHeatmapTests, genEChartsHistogramTests, genEChartsBoxplotTests, genEChartsRadarTests, genEChartsCandlestickTests, genEChartsStreamgraphTests, genEChartsFacetSmallTests, genEChartsFacetWrapTests, genEChartsFacetClipTests, genEChartsRoseTests, genEChartsGaugeTests, genEChartsFunnelTests, genEChartsTreemapTests, genEChartsSunburstTests, genEChartsSankeyTests, genEChartsUniqueStressTests, genEChartsCalendarTests, genEChartsParallelTests, genEChartsGraphTests, genEChartsTreeTests } from './echarts-tests'; import { genChartJsScatterTests, genChartJsLineTests, genChartJsBarTests, genChartJsStackedBarTests, genChartJsGroupedBarTests, genChartJsAreaTests, genChartJsPieTests, genChartJsHistogramTests, genChartJsRadarTests, genChartJsStressTests, genChartJsRoseTests, genChartJsBubbleTests, genChartJsDoughnutTests, genChartJsComboTests } from './chartjs-tests'; import { genPlotlyCoreTests, genPlotlyFacetTests } from './plotly-tests'; +import { genImageChartsTests } from './image-charts-tests'; import { genGalleryRegionalSurveyScatterTests, genGalleryRegionalSurveyLineTests, @@ -256,6 +258,7 @@ export const TEST_GENERATORS: Record TestCase[]> = { 'Chart.js: Stress Tests': genChartJsStressTests, 'Plotly: Core Templates': genPlotlyCoreTests, 'Plotly: Facets': genPlotlyFacetTests, + 'Image-Charts: Core Templates': genImageChartsTests, 'Gallery: Scatter': genGalleryRegionalSurveyScatterTests, 'Gallery: Line': genGalleryRegionalSurveyLineTests, 'Gallery: Bar': genGalleryRegionalSurveyBarTests, diff --git a/packages/flint-js/tests/smoke.test.ts b/packages/flint-js/tests/smoke.test.ts index 0b0bdb5f..c6aaad15 100644 --- a/packages/flint-js/tests/smoke.test.ts +++ b/packages/flint-js/tests/smoke.test.ts @@ -8,6 +8,7 @@ import { assembleChartjs, assemblePlotly, assembleExcel, + assembleImageCharts, } from '../src'; const DATA = [ @@ -98,6 +99,41 @@ describe('public API smoke', () => { expect(spec.seriesBy).toBe('Columns'); }); + it('assembleImageCharts returns a permanent free-tier Image-Charts URL', () => { + const artifact = assembleImageCharts({ + data: { values: [ + { Category: 'A', Value: 10 }, + { Category: 'B', Value: 20 }, + { Category: 'C', Value: 15 }, + ] }, + semantic_types: { Category: 'Category', Value: 'Quantity' }, + chart_spec: { + chartType: 'Bar Chart', + encodings: { x: 'Category', y: 'Value' }, + title: 'Sales by region', + }, + }); + + expect(artifact.type).toBe('image-charts'); + expect(artifact.url.startsWith('https://image-charts.com/chart?')).toBe(true); + expect(artifact.url).toContain('cht=bvg'); + expect(artifact.url).toContain('chd=a:10,20,15'); + expect(artifact.url).toContain('chxl=0:|A|B|C'); + expect(artifact.url).toContain('chtt=Sales+by+region'); + // Free tier only: never signed, never an output override. + expect(artifact.url).not.toContain('icac'); + expect(artifact.url).not.toContain('ichm'); + expect(artifact.url).not.toContain('chof'); + }); + + it('assembleImageCharts throws on chart types with no faithful cht', () => { + expect(() => assembleImageCharts({ + data: { values: [{ Group: 'A', Value: 1 }, { Group: 'A', Value: 5 }] }, + semantic_types: { Group: 'Category', Value: 'Quantity' }, + chart_spec: { chartType: 'Boxplot', encodings: { x: 'Group', y: 'Value' } }, + })).toThrow('does not support chart type "Boxplot"'); + }); + it('assembleExcel uses field display names for native axis titles', () => { const spec = assembleExcel({ data: { values: [ diff --git a/packages/flint-js/tsup.config.ts b/packages/flint-js/tsup.config.ts index 519b97fa..8d27d220 100644 --- a/packages/flint-js/tsup.config.ts +++ b/packages/flint-js/tsup.config.ts @@ -9,6 +9,7 @@ export default defineConfig({ 'chartjs/index': 'src/chartjs/index.ts', 'plotly/index': 'src/plotly/index.ts', 'excel/index': 'src/excel/index.ts', + 'image-charts/index': 'src/image-charts/index.ts', 'test-data/index': 'src/test-data/index.ts', 'gallery/index': 'src/gallery/index.ts', }, From 2f81939ba54f8ef7168694b35c9b9e8216e0b2f4 Mon Sep 17 00:00:00 2001 From: Chenglong Wang Date: Fri, 14 Aug 2026 20:28:17 -0700 Subject: [PATCH 2/6] improves labeling --- CHANGELOG.md | 16 ++ agent-skills/flint-chart-author/SKILL.md | 15 +- docs/design-semantics.md | 5 +- docs/reference-vegalite.md | 4 +- packages/flint-js/src/core/field-semantics.ts | 38 +++ packages/flint-js/src/core/theme/ground.ts | 43 ++-- packages/flint-js/src/core/theme/types.ts | 8 +- packages/flint-js/src/core/types.ts | 6 + .../flint-js/src/docs/design-semantics.md | 9 +- packages/flint-js/src/plotly/theme.ts | 4 +- packages/flint-js/src/vegalite/assemble.ts | 21 +- .../flint-js/src/vegalite/instantiate-spec.ts | 62 ++++- .../src/vegalite/templates/bar-table.ts | 29 ++- packages/flint-js/src/vegalite/theme.ts | 217 ++++++++++++++++-- .../flint-js/tests/bar-table-labels.test.ts | 57 +++++ .../tests/series-end-collision.test.ts | 106 +++++++++ .../flint-js/tests/theme-axis-labels.test.ts | 86 +++++++ packages/flint-js/tests/theme-titles.test.ts | 24 ++ packages/flint-js/tests/unit-display.test.ts | 64 ++++++ .../flint-js/tests/value-label-format.test.ts | 25 ++ site/src/main.tsx | 2 + site/src/playground/LabelExperimentLab.tsx | 209 +++++++++++++++++ site/src/playground/PlaygroundShell.tsx | 1 + site/src/playground/label-experiment-lab.css | 134 +++++++++++ 24 files changed, 1102 insertions(+), 83 deletions(-) create mode 100644 packages/flint-js/tests/bar-table-labels.test.ts create mode 100644 packages/flint-js/tests/series-end-collision.test.ts create mode 100644 packages/flint-js/tests/unit-display.test.ts create mode 100644 site/src/playground/LabelExperimentLab.tsx create mode 100644 site/src/playground/label-experiment-lab.css diff --git a/CHANGELOG.md b/CHANGELOG.md index a87c26c3..9ea1af0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- Visible units now require an explicit `unit` in the field's semantic + annotation. Conventional compact units may accompany values, while lexical + units such as `years` are stated once as part of the field title. Bar Tables + also no longer repeat their value column as annotations on the bars. +- A raw sum-stacked chart whose total lands exactly on a clean axis tick now + keeps that edge flush instead of adding an empty interval above it, including + machine-scale residue from calculated shares. Totals meaningfully beyond the + clean endpoint still advance to the next tick; the rule is derived from the + plotted stack and does not special-case percentages or 100. +- Series-end labels now use a bounded screen-space packing pass when endpoints + form one readable column. Small adjustments keep labels attached by proximity; + crowded or horizontally staggered sets fall back together to the next legend + placement instead of leaving a partial or overlapping direct-label system. + ## [0.5.1] - 2026-08-13 ### Added diff --git a/agent-skills/flint-chart-author/SKILL.md b/agent-skills/flint-chart-author/SKILL.md index af1a890f..f7326fb1 100644 --- a/agent-skills/flint-chart-author/SKILL.md +++ b/agent-skills/flint-chart-author/SKILL.md @@ -421,7 +421,20 @@ understates what you know: } ``` -- `unit` — the unit or currency code: `"USD"`, `"°C"`, `"kg"`. +- `unit` — an optional assertion that authorizes Flint to display a unit. Add + it only when the data or surrounding context establishes the measurement + and seeing it materially changes how a reader interprets the number. A type + such as `Duration`, a field name such as `life_expectancy`, or values that + merely look plausible are not enough evidence by themselves. + - Prefer canonical codes: `"USD"`, `"°C"`, `"kg"`, `"km/h"`, `"min"`. + - Conventional compact units are normalized and may appear beside values + (`USD` → `$`, `hours` → `hr`). + - Lexical units such as `"years"` are stated once beside the field name as + `field (years)`, not repeated after every value. + - Do not put explanatory phrases in `unit`. Put qualifications such as + `"per working-age resident"` or `"constant 2024 prices"` in the subtitle. + - Omit `unit` when its meaning, scale, or denominator is uncertain. Flint + does not infer a visible unit from the semantic type or field name. - `intrinsicDomain` — the field's own bounds, for bounded scales only: `[1, 5]` for a five-star rating, `[0, 100]` for a percentage score. Not for open-ended measures. diff --git a/docs/design-semantics.md b/docs/design-semantics.md index 0836a96a..b607a26e 100644 --- a/docs/design-semantics.md +++ b/docs/design-semantics.md @@ -656,7 +656,10 @@ Only override native formatting when semantic context adds value: prefix/suffix, | **Sentiment / Correlation** | `+` + data-driven | — | — | — | Signed decimal | | **Latitude / Longitude** | — (empty) | — | — | — | VL native | -Unit/currency priority is `annotation.unit` > column-name heuristics > data-value scanning > type defaults. +Visible unit text requires `annotation.unit`; semantic types, column names, and +data values do not authorize display by themselves. Conventional compact units +such as `$`, `%`, `°C`, `kg`, or `min` may accompany values. Lexical units such +as `years` are stated once with the field title (`field (years)`). **Parsing** is the compiler's job, guided by semantic type rather than stored on context: diff --git a/docs/reference-vegalite.md b/docs/reference-vegalite.md index a65a9836..1bbfdd3d 100644 --- a/docs/reference-vegalite.md +++ b/docs/reference-vegalite.md @@ -415,7 +415,9 @@ The **Availability** column shows whether a parameter is `always` available or ` **Encoding channels:** `x`, `color` -_No template-specific parameters._ +| Parameter | Control | Domain | Default | Availability | Description | +|---|---|---|---|---|---| +| `cornerRadius` | number | 0 – 8 (step 1) | `2` | always | Corner radius for supported marks. | ### ![](chart-icon-bar-table.svg) Bar Table diff --git a/packages/flint-js/src/core/field-semantics.ts b/packages/flint-js/src/core/field-semantics.ts index 91e8b76c..5120d50a 100644 --- a/packages/flint-js/src/core/field-semantics.ts +++ b/packages/flint-js/src/core/field-semantics.ts @@ -261,6 +261,44 @@ const UNIT_SUFFIX_MAP: Record = { '%': '%', }; +export interface DisplayUnit { + /** Normalized display text, e.g. `USD` becomes `$` and `hours` becomes `hr`. */ + text: string; + /** Compact conventional tags may accompany values; lexical units belong once beside the field name. */ + placement: 'value' | 'field'; + /** Currency symbols precede values; other compact units follow them. */ + position: 'prefix' | 'suffix'; +} + +/** + * Resolve display intent only from a unit explicitly declared in the semantic + * annotation. A semantic type or suggestive field name is not permission to + * print a unit. + */ +export function resolveDisplayUnit(annotation?: SemanticAnnotation): DisplayUnit | undefined { + const declared = annotation?.unit?.trim(); + if (!declared) return undefined; + + const currency = CURRENCY_MAP[declared.toUpperCase()] ?? CURRENCY_MAP[declared]; + if (currency) return { text: currency, placement: 'value', position: 'prefix' }; + + const compact = UNIT_SUFFIX_MAP[declared] ?? UNIT_SUFFIX_MAP[declared.toLowerCase()]; + if (compact) return { text: compact.trim(), placement: 'value', position: 'suffix' }; + + // Field-level units are labels, not prose. Reject control characters, + // parenthetical fragments, and long descriptions; those belong in a + // subtitle supplied by the authoring agent. + if (declared.length > 24 || /[\r\n()]/.test(declared)) return undefined; + return { text: declared, placement: 'field', position: 'suffix' }; +} + +/** Append a field-level unit once, preserving labels that already name it. */ +export function titleWithDisplayUnit(title: string, unit?: DisplayUnit): string { + if (unit?.placement !== 'field') return title; + if (title.toLocaleLowerCase().includes(`(${unit.text.toLocaleLowerCase()})`)) return title; + return `${title} (${unit.text})`; +} + /** * Detect whether percentage data uses 0–1 (fractional) or 0–100 (whole-number) * representation. diff --git a/packages/flint-js/src/core/theme/ground.ts b/packages/flint-js/src/core/theme/ground.ts index 6cdbd7ae..ad4e7315 100644 --- a/packages/flint-js/src/core/theme/ground.ts +++ b/packages/flint-js/src/core/theme/ground.ts @@ -42,7 +42,7 @@ import { resolvePresenceInk, sampleRamp, } from './presence.js'; -import { CURRENCY_MAP } from '../field-semantics.js'; +import { resolveDisplayUnit } from '../field-semantics.js'; import { getRegistryEntry } from '../type-registry.js'; import { inferValueLabelFormat, longestLabelChars } from './value-label-format.js'; import { deepMerge } from './merge.js'; @@ -581,26 +581,9 @@ function percentOfWhole(ctx: GroundingContext, channel: string): string | undefi return n >= 3 && Math.abs(sum - 100) < 0.5 ? '%' : undefined; } -/** - * The unit a measure is counted in, when the chart already knows it. - * - * Either the annotation says so outright, or the field names it the way a - * person does — `CO₂ (ppm)`, `Unemployment (%)`. Anything longer than a short - * tag is a phrase, not a unit, and belongs in the subtitle. - */ -const UNIT_IN_FIELD_NAME = /\(([^()]{1,6})\)\s*$/; - -function unitText(ctx: GroundingContext, channel: string): string | undefined { +function displayUnit(ctx: GroundingContext, channel: string) { const sem = ctx.channelSemantics?.[channel]; - const declared = sem?.semanticAnnotation?.unit; - const field = sem?.field ?? (ctx.positional as any)?.[channel]?.field; - const named = typeof field === 'string' ? field.match(UNIT_IN_FIELD_NAME) : null; - const raw = (typeof declared === 'string' && declared.length > 0 && declared.length <= 6) - ? declared - : named?.[1]; - if (!raw) return undefined; - // A currency is written with its sign, not its ISO code: `$8`, not `8 USD`. - return CURRENCY_MAP[raw.toUpperCase()] ?? raw; + return resolveDisplayUnit(sem?.semanticAnnotation); } /** @@ -923,12 +906,14 @@ export function groundTheme(themeIn: ThemeSpec, ctx: GroundingContext): DesignDe // reads in shares, whatever the field was measured in. const unitPolicy = theme.annotation?.unit ?? 'never'; const inFieldUnits = ctx.stacked !== 'normalize' && !ctx.partToWhole; - const unit = role === 'measure' && inFieldUnits ? unitText(ctx, channel) : undefined; - const unitTag = unitPolicy !== 'never' ? unit : undefined; + const unit = role === 'measure' && inFieldUnits ? displayUnit(ctx, channel) : undefined; + const unitTag = unitPolicy !== 'never' && unit?.placement === 'value' ? unit.text : undefined; // Where the house keeps its axis titles, the title is the natural place // for the unit — `Weight (lb)` — and the ticks stay bare numbers. - const titleUnit = showTitle && theme.annotation?.unitsInAxisTitle === true ? unit : undefined; + const titleUnit = showTitle && unit && ( + unit.placement === 'field' || theme.annotation?.unitsInAxisTitle === true + ) ? unit.text : undefined; // The gap between a label and the plot is the same gap whether or not a // tick is drawn in it. Where there is one, the tick spans the first part @@ -1460,22 +1445,20 @@ export function groundTheme(themeIn: ThemeSpec, ctx: GroundingContext): DesignDe const shareUnit = signals.isPartToWhole && !axisStatesUnit ? percentOfWhole(ctx, valueUnitChannel ?? '') : undefined; + const valueDisplayUnit = displayUnit(ctx, valueUnitChannel ?? ''); const valueUnit = houseStatesUnit - ? (unitText(ctx, valueUnitChannel ?? '') ?? shareUnit) + ? (valueDisplayUnit?.placement === 'value' ? valueDisplayUnit.text : shareUnit) : shareUnit; // A label placed at the mark sits *inside* it, which only works while the // mark is longer than the label. Below that length the label has to move - // out, and above the point where the mark reaches the end of the scale an - // outside label has nowhere left to go. Grounding is the stage that can - // say where those two lines are. + // out. Outside placement is chart-wide: the backend reserves room instead + // of flipping only the longest mark inward. let insideMinValue: number | undefined; - let outsideMaxValue: number | undefined; if (dlShow && measureChannel) { const span = measureChannel === 'x' ? ctx.layout.subplotWidth : ctx.layout.subplotHeight; if (valueMaxAbs > 0 && span > 0) { insideMinValue = (valueLabelWidthPx / span) * valueMaxAbs; - outsideMaxValue = valueMaxAbs - insideMinValue; } } @@ -1754,7 +1737,6 @@ export function groundTheme(themeIn: ThemeSpec, ctx: GroundingContext): DesignDe format: numberFormat, ...(valueUnit ? { unit: valueUnit } : {}), insideMinValue, - outsideMaxValue, ...(segmentMinShare !== undefined ? { segmentMinShare } : {}), }, // A house that dots the end of a line is saying where the story stops. @@ -1773,6 +1755,7 @@ export function groundTheme(themeIn: ThemeSpec, ctx: GroundingContext): DesignDe padding, density, plotWidth: ctx.layout.subplotWidth, + plotHeight: ctx.layout.subplotHeight, xStep: ctx.layout.xStep, canvasWidth: ctx.canvasSize?.width, }, diff --git a/packages/flint-js/src/core/theme/types.ts b/packages/flint-js/src/core/theme/types.ts index dafa0f78..a3b80912 100644 --- a/packages/flint-js/src/core/theme/types.ts +++ b/packages/flint-js/src/core/theme/types.ts @@ -802,11 +802,6 @@ export interface ResolvedDataLabels { * question about space, not about style. */ insideMinValue?: number; - /** - * Above this magnitude the mark reaches the end of the scale, so an - * outside label would fall off the plot. The mirror of `insideMinValue`. - */ - outsideMaxValue?: number; /** * The smallest share of the measure axis a stacked segment may occupy and * still be labelled — a line of text over the plot's extent along that @@ -928,11 +923,12 @@ export interface DesignDecisions { spacing?: number; preferredColumns?: number; }; - /** `plotWidth`/`xStep` are what the layout settled, so an axis can ask whether its names still fit. */ + /** Plot dimensions and step are what layout settled, so realization can test whether annotations fit. */ layout: { padding: number; density: 'compact' | 'normal' | 'airy'; plotWidth?: number; + plotHeight?: number; xStep?: number; /** The graphic the caller asked for. Wider than `plotWidth` by the axis gutter. */ canvasWidth?: number; diff --git a/packages/flint-js/src/core/types.ts b/packages/flint-js/src/core/types.ts index b2fc03b7..00b065b7 100644 --- a/packages/flint-js/src/core/types.ts +++ b/packages/flint-js/src/core/types.ts @@ -972,6 +972,12 @@ export interface ChartTemplateDef { */ ownsValueLabels?: boolean; + /** + * The template already presents values in a dedicated table column, so a + * generic label layer would repeat the same number on the data mark. + */ + suppressValueLabels?: boolean; + /** * Opt out of a backend's *generic* column/row facet-splitting pass, even * though the template declares `x`/`y` (so the axis-less `hasAxes` gate diff --git a/packages/flint-js/src/docs/design-semantics.md b/packages/flint-js/src/docs/design-semantics.md index c2800eab..d6b80637 100644 --- a/packages/flint-js/src/docs/design-semantics.md +++ b/packages/flint-js/src/docs/design-semantics.md @@ -1162,7 +1162,10 @@ For generic decimal types (Number, Score, Rating, Ratio, Latitude, Longitude), t **Unit and currency from annotation metadata:** When the LLM provides `unit` in the annotation (e.g., `"unit": "EUR"` for Price, `"unit": "kg"` for Weight), the format spec uses that directly. See §3 for the full annotation schema. -**Fallback priority for units:** annotation.unit > column-name heuristics ("Weight (kg)") > data-value scanning ("$1,234") > type-specific defaults ("$" for Price). +**Visible-unit policy:** only `annotation.unit` authorizes unit text. Semantic +types, column names, and data scanning may inform parsing or other semantic +decisions, but do not cause a unit to be printed. Conventional compact units +may accompany values; lexical units are stated once with the field title. ### 5.1.1 Parsing @@ -2070,9 +2073,9 @@ After this phase, all semantic-type-driven decisions flow through the flat `Chan 1. **Unit/domain annotation reliability.** How reliably will the LLM provide `domain` and `unit`? Mitigation strategies: - (a) Require domain/unit for a small set of types (Rating, Score, Temperature, Price) — reject annotations without them - - (b) Treat domain/unit as best-effort hints — fall back gracefully to data-inferred or type-intrinsic defaults (current proposal) + - (b) Treat domain/unit as best-effort hints, but require an explicit unit annotation before displaying unit text (current policy) - (c) Prompt the user to confirm/correct LLM-provided annotations in certain cases - - Fallback priority: annotation.unit > column-name heuristics ("Weight (kg)") > data scan ("$1,234") > type defaults + - Visible unit text has no fallback: it requires `annotation.unit` - Note: `intrinsicDomain` replaces the old `domain` property for clarity 2. **Scale type auto-detection.** Should we auto-switch to log scale when data spans >2 orders of magnitude? This is powerful but can surprise users. Options: diff --git a/packages/flint-js/src/plotly/theme.ts b/packages/flint-js/src/plotly/theme.ts index 3e930e34..cd4809c2 100644 --- a/packages/flint-js/src/plotly/theme.ts +++ b/packages/flint-js/src/plotly/theme.ts @@ -23,7 +23,7 @@ * is one number for the whole figure rather than per mark. * - Text on marks is a trace property (`text` + `textposition`), and Plotly * places inside/outside labels itself — the geometry stage 2 computed - * (`insideMinValue`/`outsideMaxValue`) is handed over as `textposition: + * (`insideMinValue`) is handed over as `textposition: * 'auto'` rather than realized as two filtered layers. * - A figure may hold several subplot axis pairs (`xaxis2`, `yaxis3`, …) for * facets and composites. Every axis pass walks all of them. @@ -2472,7 +2472,7 @@ function applyDataLabels(figure: any, d: DesignDecisions, table: any[], say: Say } // Plotly places the label inside where it fits and outside where it // does not, which is exactly the geometry stage 2 computed with - // `insideMinValue`/`outsideMaxValue`. `auto` hands that decision to + // `insideMinValue`. `auto` hands that decision to // the renderer, which can measure the drawn bar; `outside` is // honoured literally because it is a house habit, not a fit. // A segment of a stack has no outside — "outside" is the middle of diff --git a/packages/flint-js/src/vegalite/assemble.ts b/packages/flint-js/src/vegalite/assemble.ts index 4ef2a977..2ee4f14f 100644 --- a/packages/flint-js/src/vegalite/assemble.ts +++ b/packages/flint-js/src/vegalite/assemble.ts @@ -60,7 +60,7 @@ import { applyPivot, applyTransform, type PivotSurface, type TransformSurface } import { vlGetTemplateDef } from './templates'; import { inferVisCategory, computeZeroDecision } from '../core/semantic-types'; import { resolveChannelSemantics, convertTemporalData } from '../core/resolve-semantics'; -import { toTypeString, type SemanticAnnotation } from '../core/field-semantics'; +import { resolveDisplayUnit, titleWithDisplayUnit, toTypeString, type SemanticAnnotation } from '../core/field-semantics'; import { filterOverflow } from '../core/filter-overflow'; import { computeLayout, computeChannelBudgets, computeMinSubplotDimensions, deriveStretchCaps, resolveBaseSize, resolveFacetColumnsOption } from '../core/compute-layout'; import { vlApplyLayoutToSpec, vlApplyTooltips } from './instantiate-spec'; @@ -842,7 +842,9 @@ export function assembleVegaLite(input: ChartAssemblyInput): any { titled: Boolean(vgObj.title), headline: headlineText(vgObj.title), hostSurface: (input.options as any)?.background, - valueLabels: resolveValueLabelChoice(chartProperties), + valueLabels: chartTemplate.suppressValueLabels + ? 'off' + : resolveValueLabelChoice(chartProperties), geometryKinds: chartTemplate.geometryKinds, }); @@ -916,8 +918,8 @@ export function assembleVegaLite(input: ChartAssemblyInput): any { // whose template already writes its own text. Templates that print labels // *on request* are the exception: they answer to the toggle themselves. const designCoupledApplicability: Record = { - showValueLabels: ownsLabels - || (design?.dataLabels?.possible === true && !templateDrawsOwnText), + showValueLabels: !chartTemplate.suppressValueLabels && (ownsLabels + || (design?.dataLabels?.possible === true && !templateDrawsOwnText)), // The older spelling stays an accepted *input* for compatibility, but a // host should be shown one switch, not two that fight. showTextLabels: false, @@ -1312,6 +1314,17 @@ function buildVLEncodings( encodingObj.title = fieldDisplayNames[fieldName]; } + // A lexical unit explicitly declared by the author belongs once with + // the field name, independent of whether a visual theme is applied. + const displayUnit = resolveDisplayUnit(cs?.semanticAnnotation); + if ((channel === 'x' || channel === 'y') && cs?.type === 'quantitative' + && displayUnit?.placement === 'field' && encodingObj.title !== null) { + const currentTitle = typeof encodingObj.title === 'string' + ? encodingObj.title + : fieldName; + if (currentTitle) encodingObj.title = titleWithDisplayUnit(currentTitle, displayUnit); + } + // --- Collect resolved encoding --- if (Object.keys(encodingObj).length !== 0) { resolvedEncodings[channel] = encodingObj; diff --git a/packages/flint-js/src/vegalite/instantiate-spec.ts b/packages/flint-js/src/vegalite/instantiate-spec.ts index d89ce135..6e70a9f5 100644 --- a/packages/flint-js/src/vegalite/instantiate-spec.ts +++ b/packages/flint-js/src/vegalite/instantiate-spec.ts @@ -553,6 +553,54 @@ function computeStackedExtremes( return { maxPos, minNeg }; } +const NICE_E10 = Math.sqrt(50); +const NICE_E5 = Math.sqrt(10); +const NICE_E2 = Math.SQRT2; + +function niceStackSpan(start: number, stop: number, count: number): [number, number] { + let lo = start; + let hi = stop; + let previousStep: number | undefined; + for (let index = 0; index < 32; index += 1) { + const rawStep = (hi - lo) / Math.max(1, count); + const power = Math.floor(Math.log10(rawStep)); + const error = rawStep / 10 ** power; + const factor = error >= NICE_E10 ? 10 : error >= NICE_E5 ? 5 : error >= NICE_E2 ? 2 : 1; + const step = power >= 0 ? factor * 10 ** power : -(10 ** -power) / factor; + if (step === previousStep || step === 0 || !Number.isFinite(step)) break; + if (step > 0) { + lo = Math.floor(lo / step) * step; + hi = Math.ceil(hi / step) * step; + } else { + lo = Math.ceil(lo * step) / step; + hi = Math.floor(hi * step) / step; + } + previousStep = step; + } + return [lo, hi]; +} + +/** + * Pin a positive sum stack that already ends on the clean tick `nice` would + * choose. Stored calculated shares can total 99.9999999999; leaving that to + * Vega's post-stack arithmetic may cross the tick by a rounding bit and add a + * whole empty interval. A meaningful excess remains on automatic nice. + */ +function pinCleanStackEndpoint(enc: any, extremes: { maxPos: number; minNeg: number }): void { + if (extremes.minNeg < 0 || !(extremes.maxPos > 0)) return; + if (enc.scale?.domain != null || enc.scale?.domainMax != null || enc.scale?.nice === false) return; + const count = typeof enc.scale?.nice === 'number' ? enc.scale.nice : 10; + const tolerance = Math.max(1, Math.abs(extremes.maxPos)) * 1e-9; + const [, cleanMax] = niceStackSpan(0, extremes.maxPos - tolerance, count); + if (Math.abs(cleanMax - extremes.maxPos) > tolerance) return; + enc.scale = { + ...(enc.scale ?? {}), + domainMin: enc.scale?.domainMin ?? 0, + domainMax: cleanMax, + nice: false, + }; +} + /** * Detect whether a discrete category repeats across rows — i.e., multiple rows * share the same category value, which makes Vega-Lite stack the measure even @@ -745,11 +793,15 @@ function vlApplyFieldContext( const otherChannel = ch === 'y' ? 'x' : 'y'; const otherCS = channelSemantics[otherChannel]; const otherIsDiscrete = otherCS?.type === 'nominal' || otherCS?.type === 'ordinal'; - const isImplicitlyStacked = isBarLike && otherIsDiscrete && enc.stack !== null - && (hasColorEncoding || hasRepeatedCategory(context.table, otherCS?.field, enc.field)); + const isImplicitlyStacked = isBarLike && enc.stack !== null + && (hasColorEncoding + || (otherIsDiscrete && hasRepeatedCategory(context.table, otherCS?.field, enc.field))); const isStacked = isExplicitlyStacked || isImplicitlyStacked; const isNormalizeStacked = enc.stack === 'normalize'; const isSumStacked = isStacked && !isNormalizeStacked; + const stackedExtremes = isSumStacked + ? computeStackedExtremes(context.table, enc.field, ch, channelSemantics) + : undefined; // For sum-stacked charts, check if stacked totals exceed the // intrinsic domain. If they do, skip the domain constraint. @@ -770,9 +822,7 @@ function vlApplyFieldContext( // can't find the intrinsic bounds to snap totals against. const intrinsic = getEffectiveIntrinsicDomain(cs, context.table, enc.field); if (intrinsic) { - const extremes = computeStackedExtremes( - context.table, enc.field, ch, channelSemantics, - ); + const extremes = stackedExtremes; if (extremes !== undefined) { // VL stacks positive and negative contributions @@ -866,6 +916,8 @@ function vlApplyFieldContext( } } + if (stackedExtremes) pinCleanStackEndpoint(enc, stackedExtremes); + // ── 4. Tick constraint (axis.tickMinStep + axis.values) ── // Skip binned encodings — VL handles bin ticks natively. // Without this: Rating 1-5 and Count axes show fractional ticks diff --git a/packages/flint-js/src/vegalite/templates/bar-table.ts b/packages/flint-js/src/vegalite/templates/bar-table.ts index eaab140a..cd807eae 100644 --- a/packages/flint-js/src/vegalite/templates/bar-table.ts +++ b/packages/flint-js/src/vegalite/templates/bar-table.ts @@ -3,7 +3,7 @@ import { ChartTemplateDef, ChartPropertyDef, ChannelSemantics } from '../../core/types'; import { getRegistryEntry } from '../../core/type-registry'; -import type { FormatSpec } from '../../core/field-semantics'; +import { resolveDisplayUnit, titleWithDisplayUnit, type FormatSpec } from '../../core/field-semantics'; import { formatSpecToVegaExpr } from '../format'; /** @@ -36,6 +36,7 @@ export const barTableDef: ChartTemplateDef = { }, channels: ["y", "x", "color", "column", "row"], markCognitiveChannel: 'length', + suppressValueLabels: true, declareLayoutMode: (cs, table, chartProperties) => { // Bar tables split the plot width into 3 horizontal panels // (bar | % | value), so they need a wider canvas than a basic @@ -268,7 +269,6 @@ export const barTableDef: ChartTemplateDef = { // Derived directly from field names; no override knobs. const categoryHeader = yField; const percentHeader = '%'; - const valueHeader = xField; // headerStyle.fontSize is set below once the responsive // `fontSize` constant is available. @@ -284,7 +284,19 @@ export const barTableDef: ChartTemplateDef = { // The %-share column (panel 1) is a different story: it's a // *derived* 0..1 ratio computed by us, so it always needs `%` // formatting. That's `pctPattern` below. - const valueFmt: FormatSpec | undefined = xCS?.format; + const displayUnit = resolveDisplayUnit(xCS?.semanticAnnotation); + const valueFmt: FormatSpec | undefined = displayUnit?.placement === 'value' + ? { + ...(xCS?.format ?? {}), + ...(displayUnit.position === 'prefix' && !xCS?.format?.prefix + ? { prefix: displayUnit.text } + : {}), + ...(displayUnit.position === 'suffix' && !xCS?.format?.suffix + ? { suffix: /^[A-Za-z]/.test(displayUnit.text) ? ` ${displayUnit.text}` : displayUnit.text } + : {}), + } + : xCS?.format; + const valueHeader = titleWithDisplayUnit(xField, displayUnit); const pctPattern = '.1%'; // ── Text-panel transforms ──────────────────────────────────── @@ -616,13 +628,14 @@ export const barTableDef: ChartTemplateDef = { outFieldHint: string, ): any => { if (!fmt || (!fmt.pattern && !fmt.prefix && !fmt.suffix)) { - return { field: sourceField, type: 'quantitative' }; - } - if (!fmt.abbreviate && fmt.pattern && !fmt.prefix && !fmt.suffix) { - return { field: sourceField, type: 'quantitative', format: fmt.pattern }; + transformsOut.push({ calculate: `datum[${JSON.stringify(sourceField)}] + ''`, as: outFieldHint }); + return { field: outFieldHint, type: 'nominal' }; } const formatExpr = formatSpecToVegaExpr(fmt, `datum[${JSON.stringify(sourceField)}]`); - if (!formatExpr) return { field: sourceField, type: 'quantitative' }; + if (!formatExpr) { + transformsOut.push({ calculate: `datum[${JSON.stringify(sourceField)}] + ''`, as: outFieldHint }); + return { field: outFieldHint, type: 'nominal' }; + } transformsOut.push({ calculate: formatExpr, as: outFieldHint, diff --git a/packages/flint-js/src/vegalite/theme.ts b/packages/flint-js/src/vegalite/theme.ts index 21a32be1..7cdea15d 100644 --- a/packages/flint-js/src/vegalite/theme.ts +++ b/packages/flint-js/src/vegalite/theme.ts @@ -275,12 +275,12 @@ export function realizeThemeVegaLite(spec: any, d: DesignDecisions, table: any[] harmonizeLinePoints(spec, d, table, say); applyConnectors(spec, d, say); applyRedundantChannels(spec, d, say); - demoteSeriesEnd(spec, d, say); + const seriesEndLayout = demoteSeriesEnd(spec, d, table, say); applyLegend(spec, config, d, table, say); applyFacetChrome(config, d); applyPanelTitles(spec, d, say); const valueLayer = applyDataLabels(spec, d, table, say); - applySeriesEndLabels(spec, d, valueLayer, table, say); + applySeriesEndLabels(spec, d, valueLayer, table, say, seriesEndLayout); applyPointEmphasis(spec, d, say); applyPrintedUnits(spec, d, say); applyStatistics(spec, d, table, say); @@ -738,9 +738,15 @@ function applyAxes(spec: any, config: any, d: DesignDecisions, table: any[], say const rightSeated = side === 'right'; // The title clears the topmost value instead of sitting on // it, so the lift carries a line of the label's own size. + // A column facet owns the next line above the plot; clear + // that header too instead of laying the shared y title on + // the final panel's name. const labelSize = axis.label.fontSize ?? 11; const gap = axis.title.gap ?? (axis.title.fontSize ?? 11) + 6; - const lift = gap + Math.round(labelSize * 0.75); + const headerClearance = d.facets.header.show && hasTopFacetHeader(spec) + ? Math.round((d.facets.header.fontSize ?? 11) * 1.7) + : 0; + const lift = gap + Math.round(labelSize * 0.75) + headerClearance; enc.axis = { ...(enc.axis ?? {}), titleAngle: 0, @@ -1441,6 +1447,15 @@ function panelCount(spec: any, table: any[]): number { return panels; } +function hasTopFacetHeader(spec: any): boolean { + let found = false; + walk(spec, (node) => { + if (node.encoding?.facet?.field || node.encoding?.column?.field + || node.facet?.field || node.facet?.column?.field) found = true; + }); + return found; +} + /** * Whether the spec draws a dot per row — a scatter, a strip, a dot plot. Only * then does the crowding budget below have a claim on the plot's area: a @@ -4594,9 +4609,9 @@ function labelOneBody(spec: any, body: any, d: DesignDecisions, table: any[], sa delete labelEncoding.theta; } - // A label goes where there is room. A mark shorter than its own label - // cannot hold it, and a mark that reaches the end of the scale has no room - // past its end — so each case sends those few labels the other way. + // Inside placement has one legibility exception: a mark shorter than its + // own label cannot hold it, so that label moves outside. Outside placement + // is chart-wide and never flips only the longest mark inward. // Vega-Lite has no conditional `align`, so this is two layers with // complementary filters. const flipInk = (within: boolean): string | undefined => { @@ -4620,13 +4635,6 @@ function labelOneBody(spec: any, body: any, d: DesignDecisions, table: any[], sa say('dataLabels.placement', message); }; - // A vertical bar's outside label is cleared by giving the measure scale - // headroom (below); a horizontal one by reserving right margin. The - // scale-end flip — printing the tallest bars' labels inside instead — - // solves the same "no room past the end" problem, so it is only needed - // where headroom is not the remedy: on horizontal bars. - const headroomClears = !inside && onMarkBody && !horizontal && !radial && !cells; - // A stacked segment is exempt: "outside" a segment is the top of the // stack, a different quantity. Segments too short for their number drop it // instead, which the keep test above already arranges. @@ -4634,8 +4642,6 @@ function labelOneBody(spec: any, body: any, d: DesignDecisions, table: any[], sa if (inside && d.dataLabels.insideMinValue != null) { split(d.dataLabels.insideMinValue, '<', 'marks shorter than their own label print it outside instead'); growPadding(spec, horizontal ? 'right' : 'top', (t.fontSize ?? 10) * 2); - } else if (!inside && d.dataLabels.outsideMaxValue != null && !headroomClears) { - split(d.dataLabels.outsideMaxValue, '>', 'marks that reach the end of the scale print their label inside instead'); } } @@ -4778,9 +4784,19 @@ function addMeasureHeadroom( * *before* the legend is drawn — once the colour legends have been suppressed * in favour of end labels there is nothing to fall back to. */ -function demoteSeriesEnd(spec: any, d: DesignDecisions, say: (p: string, m: string) => void): void { - if (d.legend.placement !== 'seriesEnd' && d.legend.placement !== 'inline') return; - if (!d.legend.show) return; +interface SeriesEndLayout { + adjustedValues: Map; + maxDisplacement: number; +} + +function demoteSeriesEnd( + spec: any, + d: DesignDecisions, + table: any[], + say: (p: string, m: string) => void, +): SeriesEndLayout | undefined { + if (d.legend.placement !== 'seriesEnd' && d.legend.placement !== 'inline') return undefined; + if (!d.legend.show) return undefined; const body = plotBody(spec); // A band carries its own end label inside itself, so it counts as a run // with an end just as much as a line does. @@ -4816,14 +4832,158 @@ function demoteSeriesEnd(spec: any, d: DesignDecisions, say: (p: string, m: stri : marginTaken ? `the ${runsAlongX ? 'right' : 'top'} margin holds the value axis, so a name too big for its band has nowhere to stand` : null)); - if (!reason) return; + const collision = !reason && !bands + ? planSeriesEndLayout(spec, d, table, enc, field) + : undefined; + const finalReason = reason ?? collision?.reason; + if (!finalReason) return collision?.layout; // The house ranked its placements; a demotion should land on the next one // it named, not on whatever this function happens to prefer. const next = d.legend.fallbacks?.find((p) => p !== 'seriesEnd' && p !== 'inline') ?? 'right'; - say('legend.placement', `${reason} — the key is drawn \`${next}\` instead`); + say('legend.placement', `${finalReason} — the key is drawn \`${next}\` instead`); d.legend.placement = next; d.legend.orient = next === 'inside' ? 'top-right' : next as any; d.legend.direction = next === 'top' || next === 'bottom' ? 'horizontal' : 'vertical'; + return undefined; +} + +function planSeriesEndLayout( + spec: any, + d: DesignDecisions, + table: any[], + enc: any, + seriesField: string | undefined, +): { layout?: SeriesEndLayout; reason?: string } { + if (!seriesField || runChannel(d) !== 'x') return {}; + if (d.bound.isFaceted) return { reason: '`seriesEnd` collision checks do not guess across facet scales' }; + if (d.bound.seriesCount > 8) return { reason: '`seriesEnd` is limited to eight series so the margin stays readable' }; + + const domain = enc.x; + const value = enc.y; + if (!domain?.field || !value?.field || value.type !== 'quantitative') return {}; + if (value.scale?.type && value.scale.type !== 'linear') { + return { reason: '`seriesEnd` collision checks need a linear value scale' }; + } + + const orderedDomain = domain.type === 'quantitative' || domain.type === 'temporal' || domain.type === 'ordinal'; + const explicitOrder: Map | undefined = Array.isArray(domain.sort) + ? new Map(domain.sort.map((entry: unknown, index: number): [unknown, number] => [entry, index])) + : undefined; + const comparable = (raw: unknown): number | undefined => { + if (explicitOrder) return explicitOrder.get(raw); + if (domain.type === 'temporal') { + const time = raw instanceof Date ? raw.getTime() : Date.parse(String(raw)); + return Number.isFinite(time) ? time : undefined; + } + const number = Number(raw); + return Number.isFinite(number) ? number : undefined; + }; + + const endpoints = new Map(); + const allDomain: number[] = []; + const allValues: number[] = []; + table.forEach((row, order) => { + const series = row?.[seriesField]; + const domainValue = comparable(row?.[domain.field]); + const valueNumber = Number(row?.[value.field]); + if (series == null || domainValue == null || !Number.isFinite(valueNumber)) return; + allDomain.push(domainValue); + allValues.push(valueNumber); + const previous = endpoints.get(series); + const takesEnd = !previous || (orderedDomain + ? (domain.sort === 'descending' ? domainValue < previous.domain : domainValue > previous.domain) + : order > previous.order); + if (takesEnd) endpoints.set(series, { domain: domainValue, value: valueNumber, order }); + }); + if (endpoints.size < 2 || allDomain.length < 2 || allValues.length < 2) return {}; + + const plotWidth = Number(d.layout.plotWidth ?? spec.width); + const plotHeight = Number(d.layout.plotHeight ?? plotBody(spec).height ?? spec.height); + if (!(plotWidth > 0) || !(plotHeight > 0)) return { reason: '`seriesEnd` could not measure the plot for collision checks' }; + + const domainMin = Math.min(...allDomain); + const domainMax = Math.max(...allDomain); + const domainSpan = domainMax - domainMin; + if (!(domainSpan > 0)) return {}; + const endDomain = Array.from(endpoints.values(), (endpoint) => endpoint.domain); + const endSpreadPx = (Math.max(...endDomain) - Math.min(...endDomain)) / domainSpan * plotWidth; + const uniqueDomain = [...new Set(allDomain)].sort((a, b) => a - b); + const steps = uniqueDomain.slice(1).map((entry, index) => entry - uniqueDomain[index]).filter((step) => step > 0); + const medianStep = steps.length + ? steps.sort((a, b) => a - b)[Math.floor(steps.length / 2)] / domainSpan * plotWidth + : 0; + const alignmentTolerance = Math.max(8, medianStep * 0.25); + + let valueMin = value.scale?.domainMin ?? Math.min(...allValues); + let valueMax = value.scale?.domainMax ?? Math.max(...allValues); + if (Array.isArray(value.scale?.domain) && value.scale.domain.length >= 2) { + valueMin = Number(value.scale.domain[0]); + valueMax = Number(value.scale.domain[1]); + } + if (value.scale?.zero !== false) { + valueMin = Math.min(0, valueMin); + valueMax = Math.max(0, valueMax); + } + const valueSpan = valueMax - valueMin; + if (!(valueSpan > 0)) return {}; + + const reversed = value.scale?.reverse === true; + const toPixel = (number: number) => reversed + ? (number - valueMin) / valueSpan * plotHeight + : (valueMax - number) / valueSpan * plotHeight; + const fromPixel = (pixel: number) => reversed + ? valueMin + pixel / plotHeight * valueSpan + : valueMax - pixel / plotHeight * valueSpan; + const fontSize = Math.max(9, (d.legend.label.fontSize ?? 11) - 1); + const separation = fontSize + 2; + const naturalRows = Array.from(endpoints.values(), (endpoint) => toPixel(endpoint.value)) + .sort((a, b) => a - b); + const naturallyCollides = naturalRows.some((pixel, index) => + index > 0 && pixel - naturalRows[index - 1] < separation); + if (!naturallyCollides) return {}; + if (endSpreadPx > alignmentTolerance) { + return { reason: `series-end labels overlap and their endpoints span ${Math.round(endSpreadPx)}px horizontally, so they cannot be dodged as one column` }; + } + if (endpoints.size * separation > plotHeight) { + return { reason: '`seriesEnd` labels cannot fit vertically without overlap' }; + } + + const packed = Array.from(endpoints, ([series, endpoint]) => ({ + series, + value: endpoint.value, + desired: toPixel(endpoint.value), + placed: toPixel(endpoint.value), + })).sort((a, b) => a.desired - b.desired); + // A label centred on the top or bottom endpoint may straddle the plot + // boundary; Vega includes that text in the figure bounds. Pulling it half + // a line inward creates a needless dodge and disconnects it from the + // endpoint. Keep boundary labels pinned and pack only their neighbours. + const minCenter = 0; + const maxCenter = plotHeight; + packed[0].placed = Math.max(minCenter, packed[0].desired); + for (let index = 1; index < packed.length; index += 1) { + packed[index].placed = Math.max(packed[index].desired, packed[index - 1].placed + separation); + } + const overflow = packed[packed.length - 1].placed - maxCenter; + if (overflow > 0) packed.forEach((entry) => { entry.placed -= overflow; }); + for (let index = packed.length - 2; index >= 0; index -= 1) { + packed[index].placed = Math.min(packed[index].placed, packed[index + 1].placed - separation); + } + if (packed[0].placed < minCenter) { + const shift = minCenter - packed[0].placed; + packed.forEach((entry) => { entry.placed += shift; }); + } + + const maxDisplacement = Math.max(...packed.map((entry) => Math.abs(entry.placed - entry.desired))); + if (maxDisplacement > fontSize) { + return { reason: `series-end labels need ${Math.round(maxDisplacement)}px of dodge, more than one line of text` }; + } + return { + layout: { + adjustedValues: new Map(packed.map((entry) => [entry.series, fromPixel(entry.placed)])), + maxDisplacement, + }, + }; } /** @@ -4846,6 +5006,7 @@ function applySeriesEndLabels( valueLayer: any, table: any[], say: (p: string, m: string) => void, + layout?: SeriesEndLayout, ): void { if (d.legend.placement !== 'seriesEnd' && d.legend.placement !== 'inline') return; if (!d.legend.show) return; @@ -4964,6 +5125,18 @@ function applySeriesEndLabels( 'series name and final value merged into one label — they compete for the same space'); } + let labelValue = value; + if (layout?.maxDisplacement && layout.maxDisplacement > 0.5) { + const series = `datum[${JSON.stringify(seriesField)}]`; + let adjusted = `datum[${JSON.stringify(value.field)}]`; + for (const [name, number] of layout.adjustedValues) { + adjusted = `${series} === ${JSON.stringify(name)} ? ${number} : (${adjusted})`; + } + transform.push({ calculate: adjusted, as: '__seriesEndLabelValue' }); + labelValue = { ...value, field: '__seriesEndLabelValue' }; + say('legend.placement', `series-end labels dodged by at most ${Math.round(layout.maxDisplacement)}px to avoid overlap`); + } + const labelLayer: any = { __themeSynthetic: true, transform, @@ -4974,13 +5147,13 @@ function applySeriesEndLabels( dx: domainChannel === 'x' ? 5 : 0, dy: domainChannel === 'x' ? 0 : -5, font: t.font, - fontSize: t.fontSize, + fontSize: Math.max(9, (t.fontSize ?? 11) - 1), ...(t.fontWeight ? { fontWeight: t.fontWeight } : {}), ...(t.fontStyle ? { fontStyle: t.fontStyle } : {}), }, encoding: { [domainChannel]: stripAxis(domain), - [valueChannel]: stripAxis(value), + [valueChannel]: layout ? { ...stripAxis(labelValue), title: null } : stripAxis(labelValue), text: { field: textField, type: 'nominal' }, ...(colourEnc?.field ? { color: { ...colourEnc, legend: null } } : {}), }, diff --git a/packages/flint-js/tests/bar-table-labels.test.ts b/packages/flint-js/tests/bar-table-labels.test.ts new file mode 100644 index 00000000..0d06e9ad --- /dev/null +++ b/packages/flint-js/tests/bar-table-labels.test.ts @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { describe, expect, it } from 'vitest'; +import { assembleVegaLite } from '../src'; + +describe('Bar Table labels', () => { + const titleText = (title: string | string[]) => Array.isArray(title) ? title.join(' ') : title; + + function barTable(unit?: string, field = 'life_expect_gain'): any { + return assembleVegaLite({ + data: { values: [ + { country: 'Peru', [field]: 33.49 }, + { country: 'Iran', [field]: 32.34 }, + ] }, + semantic_types: { + country: 'Country', + [field]: unit ? { semanticType: 'Duration', unit } : 'Duration', + }, + chart_spec: { + chartType: 'Bar Table', + encodings: { y: 'country', x: field }, + baseSize: { width: 600, height: 300 }, + }, + theme_spec: 'nyt', + } as any) as any; + } + + it('does not repeat the value as a generic annotation on each bar', () => { + const spec = barTable('years'); + + expect(spec.hconcat[0].mark.type).toBe('bar'); + expect(spec.hconcat[0].layer).toBeUndefined(); + const valuePanel = spec.hconcat.at(-1); + expect(valuePanel.mark.type).toBe('text'); + expect(titleText(valuePanel.title.text)).toBe('life_expect_gain (years)'); + expect(valuePanel.encoding.text.type).toBe('nominal'); + expect(JSON.stringify(valuePanel.transform)).not.toContain('years'); + }); + + it('prints a declared compact unit beside values', () => { + const valuePanel = barTable('kg').hconcat.at(-1); + expect(titleText(valuePanel.title.text)).toBe('life_expect_gain'); + expect(JSON.stringify(valuePanel.transform)).toContain(' kg'); + }); + + it('does not display an undeclared unit', () => { + const valuePanel = barTable().hconcat.at(-1); + expect(titleText(valuePanel.title.text)).toBe('life_expect_gain'); + expect(JSON.stringify(valuePanel.transform)).not.toMatch(/years| kg/); + }); + + it('does not duplicate a lexical unit already present in the field name', () => { + const valuePanel = barTable('years', 'life_expect_gain (years)').hconcat.at(-1); + expect(titleText(valuePanel.title.text)).toBe('life_expect_gain (years)'); + }); +}); \ No newline at end of file diff --git a/packages/flint-js/tests/series-end-collision.test.ts b/packages/flint-js/tests/series-end-collision.test.ts new file mode 100644 index 00000000..a4b3029d --- /dev/null +++ b/packages/flint-js/tests/series-end-collision.test.ts @@ -0,0 +1,106 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { describe, expect, it } from 'vitest'; +import { assembleVegaLite } from '../src'; +import type { ThemeSpec } from '../src/core/theme/types'; + +const theme: ThemeSpec = { + id: 'series-end-test', + label: 'Series end test', + ink: { + surface: { canvas: '#fff', plot: '#fff' }, + text: { primary: '#111' }, + series: { single: '#333', categorical: ['#1261a0', '#d1495b', '#2a9d8f', '#725ac1'] }, + }, + legend: { show: 'always', placement: ['seriesEnd', 'right'] }, +} as ThemeSpec; + +function rows(endValues: number[], endYears?: number[]): any[] { + return endValues.flatMap((endValue, seriesIndex) => { + const endYear = endYears?.[seriesIndex] ?? 2020; + return [1950, 1980, endYear].map((year, index) => ({ + year, + series: `S${seriesIndex + 1}`, + value: index === 2 ? endValue : 70 - seriesIndex * 4 - index * 5, + })); + }); +} + +function build(endValues: number[], endYears?: number[]): any { + return assembleVegaLite({ + data: { values: rows(endValues, endYears) }, + semantic_types: { year: 'Year', series: 'Category', value: 'Quantity' }, + chart_spec: { + chartType: 'Line Chart', + encodings: { x: 'year', y: 'value', color: 'series' }, + baseSize: { width: 480, height: 300 }, + }, + theme_spec: theme, + } as any) as any; +} + +function layers(spec: any): any[] { + const body = spec.layer ?? []; + return Array.isArray(body) ? body : []; +} + +function endLabel(spec: any): any | undefined { + return layers(spec).find((layer) => { + const mark = typeof layer.mark === 'string' ? layer.mark : layer.mark?.type; + return mark === 'text' && ['series', '__seriesEndLabel'].includes(layer.encoding?.text?.field); + }); +} + +function messages(spec: any): string { + return (spec._theme?.report ?? []) + .filter((entry: any) => entry.path === 'legend.placement') + .map((entry: any) => entry.message) + .join(' '); +} + +describe('series-end collision policy', () => { + it('keeps aligned, separated endpoints directly labelled', () => { + const spec = build([20, 40, 60]); + expect(endLabel(spec)?.encoding.y.field).toBe('value'); + expect(endLabel(spec)?.mark.fontSize).toBe(10); + expect(messages(spec)).toContain('synthesized text layer'); + }); + + it('slightly dodges close labels without adding connector ticks', () => { + const spec = build([50, 52]); + expect(endLabel(spec)?.encoding.y.field).toBe('__seriesEndLabelValue'); + expect(layers(spec).some((layer) => { + const mark = typeof layer.mark === 'string' ? layer.mark : layer.mark?.type; + return mark === 'rule' && layer.encoding?.y2?.field === '__seriesEndLabelValue'; + })).toBe(false); + expect(messages(spec)).toMatch(/dodged by at most \d+px/); + }); + + it.each([ + { edge: 'top', values: [25, 48, 72] }, + { edge: 'bottom', values: [0, 25, 48] }, + ])('keeps a label on the $edge boundary anchored to its endpoint', ({ values }) => { + const spec = build(values); + expect(endLabel(spec)?.encoding.y.field).toBe('value'); + expect(messages(spec)).not.toContain('dodged by at most'); + }); + + it('falls back as a set when dense labels need too much displacement', () => { + const spec = build([50, 51, 52, 53]); + expect(endLabel(spec)).toBeUndefined(); + expect(messages(spec)).toMatch(/more than one line of text/); + }); + + it('keeps staggered endpoints direct when their labels do not collide', () => { + const spec = build([20, 45, 70], [2020, 2010, 2000]); + expect(endLabel(spec)?.encoding.y.field).toBe('value'); + expect(messages(spec)).not.toContain('key is drawn'); + }); + + it('falls back when staggered endpoint labels actually collide', () => { + const spec = build([50, 52], [2020, 2000]); + expect(endLabel(spec)).toBeUndefined(); + expect(messages(spec)).toMatch(/labels overlap.*cannot be dodged as one column/); + }); +}); diff --git a/packages/flint-js/tests/theme-axis-labels.test.ts b/packages/flint-js/tests/theme-axis-labels.test.ts index 6b1408b3..5aa5f8da 100644 --- a/packages/flint-js/tests/theme-axis-labels.test.ts +++ b/packages/flint-js/tests/theme-axis-labels.test.ts @@ -2,6 +2,7 @@ // Licensed under the MIT License. import { describe, it, expect } from 'vitest'; +import { compile } from 'vega-lite'; import { assembleVegaLite } from '../src'; /** @@ -114,3 +115,88 @@ describe('an axis is ticked at observations only where they are a step', () => { expect(enc.axis?.values).toEqual([2012, 2016, 2020, 2024]); }); }); + +describe('stacked measure endpoints', () => { + function stackedArea(total: number): any { + const values = [ + { year: 2000, cluster: 'A', share: 40 }, + { year: 2000, cluster: 'B', share: total - 40 }, + { year: 2001, cluster: 'A', share: 35 }, + { year: 2001, cluster: 'B', share: total - 35 }, + ]; + const out: any = assembleVegaLite({ + data: { values }, + semantic_types: { year: 'Year', cluster: 'Category', share: 'Quantity' }, + chart_spec: { + chartType: 'Area Chart', + encodings: { x: 'year', y: 'share', color: 'cluster' }, + baseSize: { width: 400, height: 300 }, + }, + theme_spec: 'swiss', + } as any); + return out.spec ?? out; + } + + it('keeps a clean stacked maximum flush with the axis', () => { + const spec = stackedArea(100); + expect(spec.encoding.y.scale).toMatchObject({ domainMin: 0, domainMax: 100, nice: false }); + }); + + it('treats floating-point residue from calculated shares as flush', () => { + const yearlyShares = [ + ['1955', 22.7131238639, 16.6700124857, 2.9797012748, 16.2510873496, 38.8083620953, 2.5777129306], + ['1960', 23.1673306654, 15.8887417506, 3.0347038067, 16.6089891163, 38.6352683699, 2.6649662911], + ['1965', 23.5800548972, 15.0968881093, 3.1139372122, 16.7420827415, 38.6837925492, 2.7832444907], + ['1970', 23.8122264795, 14.1851153816, 3.1965034231, 16.5995289954, 39.3139453013, 2.8926804191], + ['1975', 24.1962723441, 13.3226671714, 3.3192782807, 16.5053852188, 39.6345427027, 3.0218542823], + ['1980', 24.9156312003, 12.5591286953, 3.5311844524, 16.5577898534, 39.2200529277, 3.2162128709], + ['1985', 25.6874049251, 11.8031165523, 3.7351451602, 16.4680484502, 38.8244431604, 3.4818417517], + ['1990', 26.3861262603, 11.0895550616, 3.9583434243, 16.3135719813, 38.5452173843, 3.7071858881], + ['1995', 27.3018090463, 10.5337539377, 4.0952183708, 16.374040122, 37.8327450169, 3.8624335062], + ['2000', 28.247815136, 10.0455245409, 4.3245615068, 16.4175767489, 36.9529066531, 4.0116154143], + ['2005', 29.121162734, 9.7053050731, 4.5674750342, 16.3698617817, 36.0714490806, 4.1647462963], + ] as const; + const values = yearlyShares.flatMap(([year, ...shares]) => + shares.map((population_share, cluster) => ({ year, cluster: String(cluster), population_share })) + ); + const out: any = assembleVegaLite({ + data: { values }, + semantic_types: { year: 'Year', cluster: 'Category', population_share: 'Quantity' }, + chart_spec: { + chartType: 'Area Chart', + encodings: { x: 'year', y: 'population_share', color: 'cluster' }, + baseSize: { width: 300, height: 300 }, + title: 'Population share by cluster over time', + subtitle: 'Shares are calculated within each year', + }, + } as any); + const spec = out.spec ?? out; + const totals = yearlyShares.map(([, ...shares]) => shares.reduce((sum, share) => sum + share, 0)); + expect(Math.max(...totals)).toBeGreaterThan(100); + expect(Math.max(...totals)).toBeCloseTo(100, 8); + expect(spec.encoding.y.scale).toMatchObject({ domainMin: 0, domainMax: 100, nice: false }); + + const compiled = compile(spec).spec as any; + const yScale = compiled.scales.find((scale: any) => scale.name === 'y'); + expect(yScale).toMatchObject({ domainMin: 0, domainMax: 100, nice: false }); + }); + + it('leaves a meaningful stacked excess eligible for outward nice rounding', () => { + const out: any = assembleVegaLite({ + data: { values: [ + { year: 2000, cluster: 'A', share: 40 }, + { year: 2000, cluster: 'B', share: 60.3 }, + ] }, + semantic_types: { year: 'Year', cluster: 'Category', share: 'Quantity' }, + chart_spec: { + chartType: 'Area Chart', + encodings: { x: 'year', y: 'share', color: 'cluster' }, + baseSize: { width: 400, height: 300 }, + }, + } as any); + const spec = out.spec ?? out; + expect(spec.encoding.y.scale.domainMax).toBeUndefined(); + expect(spec.encoding.y.scale.nice).not.toBe(false); + }); + +}); diff --git a/packages/flint-js/tests/theme-titles.test.ts b/packages/flint-js/tests/theme-titles.test.ts index 731dc598..83c00906 100644 --- a/packages/flint-js/tests/theme-titles.test.ts +++ b/packages/flint-js/tests/theme-titles.test.ts @@ -129,6 +129,30 @@ describe('axis titles', () => { expect(bare.title).toBeUndefined(); }); + it('lifts a flat y title above column facet headers', () => { + const spec = assembleVegaLite({ + data: { values: [ + { Year: 2000, Country: 'Germany', Rate: 8 }, + { Year: 2020, Country: 'Germany', Rate: 4 }, + { Year: 2000, Country: 'United States', Rate: 4 }, + { Year: 2020, Country: 'United States', Rate: 8 }, + ] }, + semantic_types: { Year: 'Year', Country: 'Country', Rate: 'Quantity' }, + chart_spec: { + chartType: 'Line Chart', + title: 'Out of work', + encodings: { x: 'Year', y: 'Rate', column: 'Country' }, + }, + theme_spec: { + ...house({ axisTitles: 'whenAmbiguous', axisTitlePlacement: 'flatAboveAxis', axisTitleGap: 8 }), + structure: { axis: { measure: { placement: 'opposite' } } }, + }, + } as any) as any; + const y = spec.encoding?.y ?? spec.spec?.encoding?.y; + expect(y.axis.orient).toBe('right'); + expect(y.axis.titleY).toBeLessThanOrEqual(-30); + }); + it('leaves an authored subtitle untouched and keeps the measure named', () => { const spec = assembleVegaLite({ data: { values: MONTHLY }, diff --git a/packages/flint-js/tests/unit-display.test.ts b/packages/flint-js/tests/unit-display.test.ts new file mode 100644 index 00000000..a3484622 --- /dev/null +++ b/packages/flint-js/tests/unit-display.test.ts @@ -0,0 +1,64 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { describe, expect, it } from 'vitest'; +import { assembleVegaLite } from '../src'; +import { resolveDisplayUnit } from '../src/core/field-semantics'; + +const values = [ + { country: 'Peru', gain: 33.49 }, + { country: 'Iran', gain: 32.34 }, +]; + +function bars(unit?: string, themed = true): any { + return assembleVegaLite({ + data: { values }, + semantic_types: { + country: 'Country', + gain: unit ? { semanticType: 'Duration', unit } : 'Duration', + }, + chart_spec: { + chartType: 'Bar Chart', + encodings: { x: 'country', y: 'gain' }, + baseSize: { width: 400, height: 300 }, + }, + ...(themed ? { theme_spec: 'economist' } : {}), + } as any) as any; +} + +describe('explicit unit display policy', () => { + it('does not infer a visible unit from the semantic type', () => { + const axis = bars()._theme.decisions.axes.y; + expect(axis.unit).toBeUndefined(); + expect(axis.title.unit).toBeUndefined(); + }); + + it('places a declared compact unit beside values', () => { + const axis = bars('kg')._theme.decisions.axes.y; + expect(axis.unit).toMatchObject({ text: 'kg' }); + expect(axis.title.unit).toBeUndefined(); + }); + + it('normalizes conventional compact unit names', () => { + expect(resolveDisplayUnit({ semanticType: 'Duration', unit: 'hours' })) + .toEqual({ text: 'hr', placement: 'value', position: 'suffix' }); + expect(resolveDisplayUnit({ semanticType: 'Amount', unit: 'USD' })) + .toEqual({ text: '$', placement: 'value', position: 'prefix' }); + }); + + it('places a declared lexical unit beside the field name', () => { + const axis = bars('years')._theme.decisions.axes.y; + expect(axis.unit).toBeUndefined(); + expect(axis.title.unit).toBe('years'); + + const unthemed = bars('years', false); + expect(unthemed.encoding.y.title).toBe('gain (years)'); + }); + + it('does not display prose as a unit', () => { + expect(resolveDisplayUnit({ + semanticType: 'Quantity', + unit: 'per working-age resident in constant prices', + })).toBeUndefined(); + }); +}); diff --git a/packages/flint-js/tests/value-label-format.test.ts b/packages/flint-js/tests/value-label-format.test.ts index a57b1831..0d445abe 100644 --- a/packages/flint-js/tests/value-label-format.test.ts +++ b/packages/flint-js/tests/value-label-format.test.ts @@ -231,6 +231,31 @@ describe('value label precision', () => { const labelMark = (spec: any) => (spec.layer ?? []).find((l: any) => (l.mark?.type ?? l.mark) === 'text')?.mark; + it('keeps every label outside when the chart chooses outside placement', () => { + const spec: any = assembleVegaLite({ + data: { + values: [703, 608, 227, 165, 148, 120, 102, 58, 55, 49] + .map((value, index) => ({ cause: `Cause ${index + 1}`, value })), + }, + semantic_types: { cause: 'Category', value: 'Quantity' }, + chart_spec: { + chartType: 'Bar Chart', + encodings: { y: 'cause', x: 'value' }, + baseSize: { width: 420, height: 320 }, + chartProperties: { showValueLabels: true }, + }, + theme_spec: 'datawrapper', + } as any); + const body = spec.layer ? spec : spec.vconcat?.[0]; + const labels = (body?.layer ?? []) + .filter((layer: any) => (layer.mark?.type ?? layer.mark) === 'text'); + expect(spec._theme.decisions.dataLabels.placement).toBe('outsideMark'); + expect(labels).toHaveLength(1); + expect(labels[0].mark.align).toBe('left'); + expect(labels[0].mark.dx).toBeGreaterThan(0); + expect(labels[0].transform).toBeUndefined(); + }); + it('sends the label below a bar that runs down from zero', () => { // A bar drawn downwards ends at the bottom, so "outside" is below it. // Placed above, the number lands on top of the bar it labels. A narrow diff --git a/site/src/main.tsx b/site/src/main.tsx index fb8c034f..003d6a7c 100644 --- a/site/src/main.tsx +++ b/site/src/main.tsx @@ -22,6 +22,7 @@ import { ThemeLab } from './playground/ThemeLab'; import { ThemeLabR2 } from './playground/ThemeLabR2'; import { ThemeLabReal } from './playground/ThemeLabReal'; import { BandStretchingLab } from './playground/BandStretchingLab'; +import { LabelExperimentLab } from './playground/LabelExperimentLab'; import { StyleReferences } from './playground/StyleReferences'; import { FullTestCases } from './playground/FullTestCases'; import { LocaleProvider, useLocale } from './i18n/LocaleContext'; @@ -70,6 +71,7 @@ function AppRoutes({ locale }: { locale: Locale }) { } /> } /> } /> + } /> } /> {/* The Swiss and cartoon labs were the same page twice; keep the links they were reached by working. */} diff --git a/site/src/playground/LabelExperimentLab.tsx b/site/src/playground/LabelExperimentLab.tsx new file mode 100644 index 00000000..eb20a05e --- /dev/null +++ b/site/src/playground/LabelExperimentLab.tsx @@ -0,0 +1,209 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { useMemo } from 'react'; +import { assembleVegaLite, THEME_PRESETS, type ChartAssemblyInput } from 'flint-chart'; +import { ScaleToFit } from '../components/ScaleToFit'; +import { VegaLiteView } from '../components/VegaLiteView'; +import './label-experiment-lab.css'; + +type Outcome = 'direct' | 'dodge' | 'fallback'; + +interface ExperimentCase { + id: string; + title: string; + note: string; + expected: Outcome; + input: ChartAssemblyInput; +} + +const baseTheme = (THEME_PRESETS as any).datawrapper.spec; +const labelTheme = { + ...baseTheme, + id: 'label-experiment', + label: 'Label experiment', + legend: { + ...baseTheme.legend, + show: 'always', + placement: ['seriesEnd', 'right'], + }, +}; + +function lineRows(endValues: number[], endYears?: number[]): any[] { + return endValues.flatMap((endValue, seriesIndex) => { + const endYear = endYears?.[seriesIndex] ?? 2020; + return [1950, 1980, endYear].map((year, index) => ({ + year, + series: `S${seriesIndex + 1}`, + value: index === 2 ? endValue : 72 - seriesIndex * 4 - index * 5, + })); + }); +} + +function lineInput(endValues: number[], endYears?: number[]): ChartAssemblyInput { + return { + data: { values: lineRows(endValues, endYears) }, + semantic_types: { year: 'Year', series: 'Category', value: 'Quantity' }, + chart_spec: { + chartType: 'Line Chart', + encodings: { x: 'year', y: 'value', color: 'series' }, + baseSize: { width: 420, height: 280 }, + }, + theme_spec: labelTheme, + } as ChartAssemblyInput; +} + +const connectedRows = [ + ['0', 1955, 4.3, 37], ['0', 1980, 5.5, 55], ['0', 2005, 6.1, 58], + ['1', 1955, 1.8, 79], ['1', 1980, 2.8, 69], ['1', 2005, 6.5, 54], + ['2', 1955, 1.6, 77], ['2', 1980, 2.7, 68], ['2', 2005, 6.7, 55], + ['3', 1955, 1.9, 75], ['3', 1980, 3.2, 66], ['3', 2005, 4.9, 63], + ['4', 1955, 1.7, 73], ['4', 1980, 3.0, 67], ['4', 2005, 5.9, 60], + ['5', 1955, 2.8, 71], ['5', 1980, 4.1, 68], ['5', 2005, 6.7, 47], +].map(([cluster, year, fertility, longevity]) => ({ cluster, year, fertility, longevity })); + +const CASES: ExperimentCase[] = [ + { + id: 'separated', + title: 'Aligned and separated', + note: 'One endpoint column; labels already have enough vertical air.', + expected: 'direct', + input: lineInput([18, 38, 58]), + }, + { + id: 'small-dodge', + title: 'Two close endpoints', + note: 'A sub-line-height adjustment is accepted and connected back to each point.', + expected: 'dodge', + input: lineInput([50, 52]), + }, + { + id: 'dense', + title: 'Dense endpoint cluster', + note: 'The required movement exceeds one line of text, so the whole set returns to a legend.', + expected: 'fallback', + input: lineInput([50, 51, 52, 53]), + }, + { + id: 'staggered', + title: 'Staggered final x positions', + note: 'Different final years are harmless when the natural label rows do not overlap.', + expected: 'direct', + input: lineInput([20, 42, 64], [2020, 2010, 2000]), + }, + { + id: 'boundary', + title: 'Top boundary endpoint', + note: 'The highest label stays centred on its endpoint; the figure bounds carry the overhang.', + expected: 'direct', + input: lineInput([25, 48, 72]), + }, + { + id: 'connected', + title: 'Connected scatter trajectories', + note: 'Rightmost points occupy a broad x range, matching the difficult real-world pattern.', + expected: 'fallback', + input: { + data: { values: connectedRows }, + semantic_types: { + cluster: 'Category', + year: 'Year', + fertility: { semanticType: 'Quantity', unit: 'children per woman' }, + longevity: { semanticType: 'Duration', unit: 'years' }, + }, + chart_spec: { + chartType: 'Connected Scatter Plot', + title: 'Cluster development trajectories', + subtitle: 'Synthetic endpoints modeled after the reported collision', + encodings: { x: 'fertility', y: 'longevity', color: 'cluster', order: 'year' }, + baseSize: { width: 420, height: 280 }, + }, + theme_spec: labelTheme, + } as ChartAssemblyInput, + }, +]; + +function stripInternal(node: any): void { + if (!node || typeof node !== 'object') return; + if (Array.isArray(node)) { + node.forEach(stripInternal); + return; + } + for (const key of Object.keys(node)) { + if (/^_[^_]/.test(key)) delete node[key]; + else stripInternal(node[key]); + } +} + +function buildCase(testCase: ExperimentCase): { spec?: any; outcome: Outcome; message: string; error?: string } { + try { + const spec = assembleVegaLite(testCase.input as any) as any; + const messages = (spec._theme?.report ?? []) + .filter((entry: any) => entry.path === 'legend.placement') + .map((entry: any) => entry.message); + const message = messages.find((entry: string) => + entry.includes('dodged by at most') + || entry.includes('key is drawn') + || entry.includes('do not form one readable label column') + || entry.includes('more than one line of text') + ) ?? messages.at(-1) ?? 'No placement report'; + const outcome: Outcome = messages.some((entry: string) => entry.includes('dodged by at most')) + ? 'dodge' + : messages.some((entry: string) => entry.includes('key is drawn')) + ? 'fallback' + : 'direct'; + stripInternal(spec); + return { spec, outcome, message }; + } catch (error) { + return { outcome: 'fallback', message: 'Assembly failed', error: String((error as Error)?.message ?? error) }; + } +} + +function CaseTile({ testCase }: { testCase: ExperimentCase }) { + const built = useMemo(() => buildCase(testCase), [testCase]); + const matches = built.outcome === testCase.expected; + + return ( +
+
+
+

{testCase.title}

+

{testCase.note}

+
+ + {built.outcome} + +
+
+ {built.error || !built.spec + ?
{built.error}
+ : ( + + + + )} +
+
+ {built.message} + {!matches && Expected {testCase.expected}} +
+
+ ); +} + +export function LabelExperimentLab() { + return ( +
+
+

Series-end label experiment

+

+ Direct labels stay when no more than eight endpoints form one column and need at most one + line of vertical adjustment. Otherwise, the complete set falls back to a legend. +

+
+
+ {CASES.map((testCase) => )} +
+
+ ); +} diff --git a/site/src/playground/PlaygroundShell.tsx b/site/src/playground/PlaygroundShell.tsx index 3c0cc16d..6be6b7b2 100644 --- a/site/src/playground/PlaygroundShell.tsx +++ b/site/src/playground/PlaygroundShell.tsx @@ -17,6 +17,7 @@ const pages: NavEntry[] = [ { to: 'theme-lab-r2', label: 'Theme lab R2' }, { to: 'theme-lab-real', label: 'Theme lab real' }, { to: 'band-stretching', label: 'Band stretching' }, + { to: 'label-experiment', label: 'Label experiment' }, { to: 'style-references', label: 'Style references' }, ], }, diff --git a/site/src/playground/label-experiment-lab.css b/site/src/playground/label-experiment-lab.css new file mode 100644 index 00000000..c89cd6c3 --- /dev/null +++ b/site/src/playground/label-experiment-lab.css @@ -0,0 +1,134 @@ +.label-lab { + max-width: 960px; + margin: 0 auto; + padding: 10px 4px 56px; + color: #16202a; +} + +.label-lab-intro { + margin-bottom: 18px; +} + +.label-lab-intro h1 { + margin: 0 0 5px; + font-size: 20px; + font-weight: 650; + letter-spacing: 0; +} + +.label-lab-intro p { + max-width: 820px; + margin: 0; + color: #5d6872; + font-size: 13px; + line-height: 1.55; +} + +.label-case-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px; +} + +.label-case { + display: grid; + grid-template-rows: auto 300px auto; + min-width: 0; + border-top: 1px solid #d8dde2; + background: #fff; +} + +.label-case-header { + display: flex; + justify-content: space-between; + gap: 20px; + align-items: flex-start; + padding: 12px 0 10px; +} + +.label-case-header h2 { + margin: 0; + font-size: 15px; + line-height: 1.25; + letter-spacing: 0; +} + +.label-case-header p { + max-width: 520px; + margin: 5px 0 0; + color: #6a747d; + font-size: 12px; + line-height: 1.4; +} + +.label-outcome { + flex: 0 0 auto; + padding-top: 2px; + color: #737d86; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 10px; + text-transform: uppercase; +} + +.label-chart-frame { + position: relative; + min-width: 0; + overflow: hidden; + border-top: 1px solid #edf0f2; + border-bottom: 1px solid #edf0f2; + background: #fff; +} + +.label-error { + display: grid; + height: 100%; + place-items: center; + color: #a52c24; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 12px; +} + +.label-case-footer { + display: flex; + justify-content: space-between; + gap: 10px; + padding: 8px 0 12px; +} + +.label-case-footer > span { + font-size: 10px; + font-weight: 700; + text-transform: uppercase; + white-space: nowrap; +} + +.label-mismatch { color: #a52c24; } + +.label-case-footer code { + min-width: 0; + color: #5d6872; + font-size: 10px; + line-height: 1.45; + white-space: normal; + overflow-wrap: anywhere; +} + +@media (max-width: 980px) { + .label-lab { + padding: 10px 0 40px; + } + + .label-case-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 560px) { + .label-case { + grid-template-rows: auto 300px auto; + } + + .label-case-footer { + grid-template-columns: 1fr; + } +} From b3aec98c2284442332d32691f003ac50beb68479 Mon Sep 17 00:00:00 2001 From: Chenglong Wang Date: Fri, 14 Aug 2026 21:09:50 -0700 Subject: [PATCH 3/6] update --- docs/community-backends.md | 63 +++++++++++++++++++ .../flint-js/src/image-charts/assemble.ts | 26 ++++++-- site/src/shared/docs-catalog.ts | 6 ++ 3 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 docs/community-backends.md diff --git a/docs/community-backends.md b/docs/community-backends.md new file mode 100644 index 00000000..ffc539af --- /dev/null +++ b/docs/community-backends.md @@ -0,0 +1,63 @@ +# Community backends + +Community backends extend Flint to additional renderers and delivery surfaces. +They use the same `ChartAssemblyInput`, but may have different chart coverage, +release cadence, and gallery, editor, MCP, or ThemeSpec integration from Flint's +core backends. + +## Image-Charts + +> Originally contributed by +> [François-Guillaume Ribreau](https://github.com/FGRibreau). + +The Image-Charts backend compiles a Flint input into an unsigned URL for the +third-party [Image-Charts](https://www.image-charts.com/) service. It is useful +when the output must work as an ordinary image URL, including email, generated +documents, chat messages, and other no-JavaScript environments. + +```ts +import { + assembleImageCharts, + isImageChartsSupported, +} from 'flint-chart/image-charts'; + +if (isImageChartsSupported(input.chart_spec.chartType)) { + const artifact = assembleImageCharts(input); + // { type: 'image-charts', url: 'https://image-charts.com/chart?...' } +} +``` + +Assembly is pure: it creates the URL without making a network request. Loading +the returned URL sends the encoded chart data to Image-Charts, so do not use it +with confidential data unless sending that data to the service is acceptable +under your privacy and deployment requirements. + +### Supported charts + +- Bar Chart, Grouped Bar Chart, and Stacked Bar Chart +- Line Chart, Sparkline, and Area Chart +- Scatter Plot +- Pie Chart and Donut Chart +- Radar Chart + +Unsupported chart types and faceted inputs throw an error rather than silently +falling back to another representation. + +### Current scope + +- Output is an unsigned `https://image-charts.com/chart?...` GET URL. Account + identifiers, HMAC signatures, and secrets are outside this pure compiler. +- Width and height are clamped to 999 pixels, and total area is clamped to + 998,001 pixels, matching the service's documented chart-size limits. +- Data, labels, legends, colors, and titles are carried in the query string. + Large or label-heavy charts can produce long URLs; Flint does not currently + convert them to Image-Charts POST requests or enforce a maximum URL length. +- Banded bar charts use Flint's overflow filtering before URL serialization. +- The backend uses a fixed categorical palette. ThemeSpec and most + `chartProperties` are not applied. +- Flint does not currently render this artifact in its gallery, editor, or MCP + server. Availability, caching, retention, quotas, and subscription behavior + are controlled by Image-Charts. + +See the [Image-Charts API documentation](https://documentation.image-charts.com/) +for the hosted service's current request grammar and limits. diff --git a/packages/flint-js/src/image-charts/assemble.ts b/packages/flint-js/src/image-charts/assemble.ts index 740ffb73..8ab7822d 100644 --- a/packages/flint-js/src/image-charts/assemble.ts +++ b/packages/flint-js/src/image-charts/assemble.ts @@ -107,6 +107,20 @@ function formatValue(value: number | null): string { return String(Number(value.toFixed(4))); } +function finiteNumber(value: unknown): number | null { + if (value == null || (typeof value === 'string' && value.trim() === '')) return null; + const number = Number(value); + return Number.isFinite(number) ? number : null; +} + +function cellKey(value: unknown): string { + return `${typeof value}:${String(value)}`; +} + +function pairKey(first: unknown, second: unknown): string { + return JSON.stringify([cellKey(first), cellKey(second)]); +} + /** Distinct values of a field in first-seen order (nulls skipped). */ function distinct(rows: any[], field: string): Cell[] { const seen = new Set(); @@ -139,14 +153,14 @@ function pivotValues( const cv = r[catField]; if (cv == null) continue; const sv = seriesField ? r[seriesField] : SINGLE; - const num = Number(r[measField]); - if (!Number.isFinite(num)) continue; - const key = JSON.stringify([String(cv), String(sv)]); + const num = finiteNumber(r[measField]); + if (num == null) continue; + const key = pairKey(cv, sv); const e = acc.get(key) ?? { sum: 0, count: 0 }; e.sum += num; e.count += 1; acc.set(key, e); } const valueAt = (cv: Cell, sv: Cell): number | null => { - const e = acc.get(JSON.stringify([String(cv), String(seriesField ? sv : SINGLE)])); + const e = acc.get(pairKey(cv, seriesField ? sv : SINGLE)); if (!e) return null; return aggregate === 'average' ? e.sum / e.count : e.sum; }; @@ -280,8 +294,8 @@ function buildScatter( const colors: string[] = []; seriesKeys.forEach((key, index) => { const rows = seriesField ? table.filter((r) => r[seriesField] === key) : table; - const xs = rows.map((r) => Number(r[xField])); - const ys = rows.map((r) => Number(r[yField])); + const xs = rows.map((r) => finiteNumber(r[xField])); + const ys = rows.map((r) => finiteNumber(r[yField])); datasets.push(xs.map(formatValue).join(',')); datasets.push(ys.map(formatValue).join(',')); const color = SERIES_COLORS[index % SERIES_COLORS.length]; diff --git a/site/src/shared/docs-catalog.ts b/site/src/shared/docs-catalog.ts index 2cb735fd..5069074f 100644 --- a/site/src/shared/docs-catalog.ts +++ b/site/src/shared/docs-catalog.ts @@ -136,6 +136,12 @@ export const DOCUMENTATION_GROUPS: DocGroup[] = [ description: 'Every native Excel chart type, its channels, and Office.js mapping.', file: '../../../docs/reference-excel.md', }, + { + slug: 'community-backends', + title: 'Community backends', + description: 'Community-contributed renderers and delivery targets, their coverage, and integration notes.', + file: '../../../docs/community-backends.md', + }, ], }, { From 758e89b13536cb8ace0994b27c3441bfccdbdbcc Mon Sep 17 00:00:00 2001 From: Chenglong Wang Date: Fri, 14 Aug 2026 21:21:54 -0700 Subject: [PATCH 4/6] fix --- .../flint-mcp/assets/flint-chart-author.SKILL.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/flint-mcp/assets/flint-chart-author.SKILL.md b/packages/flint-mcp/assets/flint-chart-author.SKILL.md index af1a890f..f7326fb1 100644 --- a/packages/flint-mcp/assets/flint-chart-author.SKILL.md +++ b/packages/flint-mcp/assets/flint-chart-author.SKILL.md @@ -421,7 +421,20 @@ understates what you know: } ``` -- `unit` — the unit or currency code: `"USD"`, `"°C"`, `"kg"`. +- `unit` — an optional assertion that authorizes Flint to display a unit. Add + it only when the data or surrounding context establishes the measurement + and seeing it materially changes how a reader interprets the number. A type + such as `Duration`, a field name such as `life_expectancy`, or values that + merely look plausible are not enough evidence by themselves. + - Prefer canonical codes: `"USD"`, `"°C"`, `"kg"`, `"km/h"`, `"min"`. + - Conventional compact units are normalized and may appear beside values + (`USD` → `$`, `hours` → `hr`). + - Lexical units such as `"years"` are stated once beside the field name as + `field (years)`, not repeated after every value. + - Do not put explanatory phrases in `unit`. Put qualifications such as + `"per working-age resident"` or `"constant 2024 prices"` in the subtitle. + - Omit `unit` when its meaning, scale, or denominator is uncertain. Flint + does not infer a visible unit from the semantic type or field name. - `intrinsicDomain` — the field's own bounds, for bounded scales only: `[1, 5]` for a five-star rating, `[0, 100]` for a percentage score. Not for open-ended measures. From 20fa7f698b3504d70ea16c15f7b8babf1a3b6c96 Mon Sep 17 00:00:00 2001 From: zhnd Date: Sat, 15 Aug 2026 22:59:41 +0800 Subject: [PATCH 5/6] fix(echarts): pin categorical legend with right instead of design-canvas left legend.left was `_width - gutter`, so chart.resize() overlapped the plot or clipped the legend. Anchor the legend and its title graphic with right: 16. At `_width` the gutter is unchanged; only fluid hosts change. Fixes #98. --- CHANGELOG.md | 5 + docs/figs/issue-98-slope-534.png | Bin 0 -> 69152 bytes docs/figs/issue-98-slope-800-before.png | Bin 0 -> 79596 bytes docs/figs/issue-98-slope-800.png | Bin 0 -> 79864 bytes packages/flint-js/src/echarts/facet.ts | 14 +- .../flint-js/src/echarts/instantiate-spec.ts | 38 ++--- .../src/echarts/templates/streamgraph.ts | 14 +- packages/flint-js/tests/slope.test.ts | 15 ++ scripts/issue-98-slope-shots.mjs | 145 ++++++++++++++++++ site/src/components/EChartsView.tsx | 10 +- 10 files changed, 194 insertions(+), 47 deletions(-) create mode 100644 docs/figs/issue-98-slope-534.png create mode 100644 docs/figs/issue-98-slope-800-before.png create mode 100644 docs/figs/issue-98-slope-800.png create mode 100644 scripts/issue-98-slope-shots.mjs diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ea1af0e..4919a6f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- ECharts categorical legends (and their title graphics) are pinned with + `legend.right` instead of a design-canvas `left` pixel. Hosts that size the + container independently of `_width` and call `chart.resize()` keep the + reserved gutter instead of overlapping the plot or clipping the legend + ([#98](https://github.com/microsoft/flint-chart/issues/98)). - Visible units now require an explicit `unit` in the field's semantic annotation. Conventional compact units may accompany values, while lexical units such as `years` are stated once as part of the field title. Bar Tables diff --git a/docs/figs/issue-98-slope-534.png b/docs/figs/issue-98-slope-534.png new file mode 100644 index 0000000000000000000000000000000000000000..77518fd906c8241c7c6c83deb130914f2f6269d8 GIT binary patch literal 69152 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

A@ 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

~Iv6u7!U;&v>U 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 (g.left ?? 0) + (g.width ?? 0))); + const { left: _ignoredLeft, ...legendRest } = combined.legend; + void _ignoredLeft; combined.legend = { - ...combined.legend, - left: rightMost + GAP, + ...legendRest, + right: BUFFER, top: combined.legend.top ?? 20, orient: combined.legend.orient || 'vertical', align: 'left', - right: undefined, textStyle: { fontSize: highCardinality ? 8 : 11, ...(combined.legend.textStyle || {}), @@ -565,13 +566,14 @@ function repositionFacetedPolarLegend(combined: any): void { const r = Number(p?.radius) || 0; return cx + r; })); + const { left: _ignoredLeft, ...legendRest } = combined.legend; + void _ignoredLeft; combined.legend = { - ...combined.legend, - left: rightMost + GAP, + ...legendRest, + right: BUFFER, top: combined.legend.top ?? 20, orient: combined.legend.orient || 'vertical', align: 'left', - right: undefined, textStyle: { fontSize: highCardinality ? 8 : 11, ...(combined.legend.textStyle || {}), diff --git a/packages/flint-js/src/echarts/instantiate-spec.ts b/packages/flint-js/src/echarts/instantiate-spec.ts index b4474d4c..0299005f 100644 --- a/packages/flint-js/src/echarts/instantiate-spec.ts +++ b/packages/flint-js/src/echarts/instantiate-spec.ts @@ -495,41 +495,24 @@ export function ecApplyLayoutToSpec( option.graphic = Array.isArray(existing) ? [...existing, titleGraphic] : (existing ? [existing, titleGraphic] : [titleGraphic]); } } else { - // Single legend: use left positioning so title and legend circles share the same left edge + // Single legend: pin to the canvas right edge (not a design-width + // `left` px). Hosts that call chart.resize() keep the gutter; + // `right = designW - left` is wrong — ECharts `right` is the inset + // to the legend's *right* edge, which would grow into the plot. + // See https://github.com/microsoft/flint-chart/issues/98 const maxLabelLen = Math.max(...legendLabels.map((l: string) => l.length), 3); const highCardinality = legendLabels.length >= 16; const legendSymbolWidth = highCardinality ? 12 : 14; const legendItemGap = 5; const estimatedTextWidth = Math.min(120, maxLabelLen * 7 + 30); option._legendWidth = legendSymbolWidth + legendItemGap + estimatedTextWidth; - const LEGEND_GAP = 12; const CANVAS_BUFFER = 16; - const rightMarginPx = option._legendWidth + LEGEND_GAP + CANVAS_BUFFER; - const hasYTitle = !!option.yAxis?.name; - const gridLeft = (hasYTitle ? 70 : 50) + CANVAS_BUFFER; - // Use same effective plot width as canvas block (grouped bar/boxplot widen the plot) so legend does not overlap chart - let plotW = layout?.subplotWidth ?? canvasSize?.width ?? 400; - const xIsDiscreteForLegend = layout.xNominalCount > 0 || layout.xContinuousAsDiscrete > 0; - if (xIsDiscreteForLegend) { - let xItemCount = layout.xNominalCount || layout.xContinuousAsDiscrete || 0; - if (layout.xStepUnit === 'group' && option.series && Array.isArray(option.series) && layout.xNominalCount > 0) { - const barSeriesCount = option.series.filter((s: any) => s.type === 'bar').length || option.series.length; - if (barSeriesCount > 0) { - xItemCount = Math.max(1, Math.round(layout.xNominalCount / barSeriesCount)); - } - } - plotW = xItemCount > 0 ? layout.xStep * xItemCount : plotW; - } - const boxplotMinWForLegend = estimateGroupedBoxplotMinPlotWidth(option, layout); - if (boxplotMinWForLegend > 0) { - plotW = Math.max(plotW, boxplotMinWForLegend); - } - const effectiveChartWidth = plotW + gridLeft + rightMarginPx; - const legendLeftPx = Math.max(0, effectiveChartWidth - rightMarginPx); + const { left: _ignoredLeft, ...legendRest } = option.legend; + void _ignoredLeft; option.legend = { - ...option.legend, + ...legendRest, top: legendTitle != null ? 20 : 0, - left: legendLeftPx, + right: CANVAS_BUFFER, orient: option.legend.orient || 'vertical', align: 'left', // icon on left, text on right textStyle: { @@ -542,7 +525,7 @@ export function ecApplyLayoutToSpec( if (legendTitle != null) { const titleGraphic = { type: 'text' as const, - left: legendLeftPx, + right: CANVAS_BUFFER, top: 4, z: 100, style: { @@ -551,6 +534,7 @@ export function ecApplyLayoutToSpec( fontWeight: 'bold', fill: '#333', textAlign: 'left', + width: option._legendWidth, }, }; const existing = option.graphic; diff --git a/packages/flint-js/src/echarts/templates/streamgraph.ts b/packages/flint-js/src/echarts/templates/streamgraph.ts index ef8135c7..a414558b 100644 --- a/packages/flint-js/src/echarts/templates/streamgraph.ts +++ b/packages/flint-js/src/echarts/templates/streamgraph.ts @@ -200,22 +200,20 @@ export const ecStreamgraphDef: ChartTemplateDef = { option.singleAxis.left = option.singleAxis.left || 50; option.singleAxis.right = Math.max(option.singleAxis.right || 0, rightMargin); - // Position legend in the right margin so it doesn't overlap the stream + // Pin legend to the right gutter (not design-canvas `left`) so resize() + // does not drop it into the stream. See microsoft/flint-chart#98. if (hasLegend && option.legend) { - const legendLeft = option._width - rightMargin + BUFFER; - option.legend.left = legendLeft; - delete option.legend.right; // Use left to align with graphic titles + delete option.legend.left; + option.legend.right = BUFFER; option.legend.top = 20; option.legend.orient = option.legend.orient || 'vertical'; option.legend.align = 'left'; - // Also update any custom graphic legend titles if (Array.isArray(option.graphic)) { for (const g of option.graphic) { - // The legend title added in instantiate-spec.ts typically has top: 4 and type: 'text' if (g.type === 'text' && (g.top === 4 || g.top === 20) && g.style && g.style.fontWeight === 'bold') { - g.left = legendLeft; - delete g.right; + delete g.left; + g.right = BUFFER; } } } diff --git a/packages/flint-js/tests/slope.test.ts b/packages/flint-js/tests/slope.test.ts index 3490ea8e..375fd83d 100644 --- a/packages/flint-js/tests/slope.test.ts +++ b/packages/flint-js/tests/slope.test.ts @@ -144,6 +144,21 @@ describe('ECharts Slope chart', () => { expect(option.yAxis.type).toBe('value'); }); + it('anchors the color legend from the right so chart.resize() keeps the gutter', () => { + // Design-canvas `left` (e.g. 422 of 534) overlaps the plot once the host + // is wider than `_width`. `right` is the inset to the legend box edge. + expect(option.legend.right).toBe(16); + expect(option.legend.left).toBeUndefined(); + expect(option.legend.orient).toBe('vertical'); + expect(option.grid.right).toBeGreaterThan(option.legend.right); + const title = (option.graphic ?? []).find( + (g: { type?: string; style?: { fontWeight?: string } }) => + g.type === 'text' && g.style?.fontWeight === 'bold', + ); + expect(title?.right).toBe(16); + expect(title?.left).toBeUndefined(); + }); + it('orders temporal year periods as two ordered categories', () => { const temporal = byTitle( cases, diff --git a/scripts/issue-98-slope-shots.mjs b/scripts/issue-98-slope-shots.mjs new file mode 100644 index 00000000..34325487 --- /dev/null +++ b/scripts/issue-98-slope-shots.mjs @@ -0,0 +1,145 @@ +#!/usr/bin/env node +/** + * One-off shots for microsoft/flint-chart#98. Not part of the test suite. + * Usage: node scripts/issue-98-slope-shots.mjs + */ +import { writeFileSync, mkdirSync, readFileSync } from 'node:fs'; +import { createServer } from 'node:http'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import puppeteer from 'puppeteer-core'; +import { assembleECharts } from '../packages/flint-js/dist/echarts/index.js'; + +const root = join(dirname(fileURLToPath(import.meta.url)), '..'); +const outDir = join(root, 'docs/figs'); + +const assembled = assembleECharts({ + data: { + values: [ + { period: '2024', team: 'Alpha', nps: 32 }, + { period: '2025', team: 'Alpha', nps: 48 }, + { period: '2024', team: 'Beta', nps: 41 }, + { period: '2025', team: 'Beta', nps: 39 }, + { period: '2024', team: 'Gamma', nps: 28 }, + { period: '2025', team: 'Gamma', nps: 52 }, + { period: '2024', team: 'Delta', nps: 55 }, + { period: '2025', team: 'Delta', nps: 61 }, + ], + }, + semantic_types: { period: 'Year', team: 'Name', nps: 'Score' }, + chart_spec: { + chartType: 'Slope Chart', + encodings: { + x: { field: 'period' }, + y: { field: 'nps' }, + color: { field: 'team' }, + }, + baseSize: { width: 420, height: 280 }, + }, +}); + +const { _width: designW, _height: designH, _warnings, _dataLength, _pivot, ...option } = + assembled; +void _warnings; +void _dataLength; +void _pivot; + +const cloneOpt = (o) => + JSON.parse(JSON.stringify(o, (_k, v) => (typeof v === 'function' ? undefined : v))); +const before = cloneOpt(option); +const gutter = designW - (option.grid?.right ?? 112); +before.legend = { ...before.legend, left: gutter }; +delete before.legend.right; +if (Array.isArray(before.graphic)) { + before.graphic = before.graphic.map((g) => { + if (g?.type === 'text' && g.style?.fontWeight === 'bold') { + const { right: _r, ...rest } = g; + void _r; + return { ...rest, left: gutter }; + } + return g; + }); +} + +const payload = { after: cloneOpt(option), before, designW, designH }; + +const html = ` + + + + + + +

+ + +`; + +mkdirSync(outDir, { recursive: true }); +const htmlPath = join(outDir, '.issue-98-host.html'); +writeFileSync(htmlPath, html); + +const echartsFile = join(root, 'node_modules/echarts/dist/echarts.esm.min.js'); +const server = createServer((req, res) => { + if (req.url === '/echarts.js') { + res.writeHead(200, { 'content-type': 'text/javascript' }); + res.end(readFileSync(echartsFile)); + return; + } + res.writeHead(200, { 'content-type': 'text/html' }); + res.end(html); +}); + +await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)); +const { port } = server.address(); +const chrome = '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'; +const browser = await puppeteer.launch({ + executablePath: chrome, + headless: true, + args: ['--hide-scrollbars'], +}); +const page = await browser.newPage(); +await page.goto(`http://127.0.0.1:${port}/`, { waitUntil: 'networkidle0' }); +await page.waitForFunction(() => window.__ready === true); + +async function shot(name, width, which) { + await page.setViewport({ width, height: designH, deviceScaleFactor: 2 }); + await page.evaluate( + async ({ width: w, height, which: key }) => { + const echarts = window.__echarts; + const payload = window.__payload; + const el = document.getElementById('c'); + el.style.width = `${w}px`; + el.style.height = `${height}px`; + echarts.dispose(el); + const chart = echarts.init(el, undefined, { renderer: 'canvas', width: w, height }); + const opt = { ...payload[key], animation: false }; + chart.setOption(opt, { notMerge: true }); + if (w !== payload.designW) chart.resize({ width: w, height }); + await new Promise((r) => requestAnimationFrame(() => requestAnimationFrame(r))); + await new Promise((r) => setTimeout(r, 50)); + }, + { width, height: designH, which }, + ); + const path = join(outDir, name); + await page.screenshot({ path, type: 'png', clip: { x: 0, y: 0, width, height: designH } }); + console.log('wrote', path); +} + +await shot('issue-98-slope-534.png', designW, 'after'); +await shot('issue-98-slope-800.png', 800, 'after'); +await shot('issue-98-slope-800-before.png', 800, 'before'); + +await browser.close(); +server.close(); +try { + const { unlinkSync } = await import('node:fs'); + unlinkSync(htmlPath); +} catch { + /* ignore */ +} diff --git a/site/src/components/EChartsView.tsx b/site/src/components/EChartsView.tsx index 3836c1da..ffaea6ed 100644 --- a/site/src/components/EChartsView.tsx +++ b/site/src/components/EChartsView.tsx @@ -20,12 +20,10 @@ export function EChartsView({ const chartRef = useRef(null); const [error, setError] = useState(null); - // The flint ECharts assembler computes a designed canvas size (`_width`/`_height`) - // and positions legends / visualMaps with absolute pixels relative to it — the same - // way Vega-Lite sizes its plot area and lets the SVG wrap around it. Render at those - // dimensions so the legend lands where it was designed, instead of snapping to the - // live container's bounding box (which made rose legends drift far right, streamgraph - // legends overlap the plot, and heatmap colour bars float below a stretched plot). + // The assembler still designs a canvas (`_width`/`_height`). Categorical legends + // are now `right`-anchored (issue #98) and survive container resize(); other + // chrome (visualMap, rose, some radii) is still design-px. Render at the + // designed size so those leftovers land where they were laid out. const designedWidth = asFinite(option?._width); const designedHeight = asFinite(option?._height); const renderHeight = designedHeight ?? height ?? 320; From 5ae05d030270d1e28576d3273fed956d39531c4c Mon Sep 17 00:00:00 2001 From: zhnd Date: Sat, 15 Aug 2026 23:03:16 +0800 Subject: [PATCH 6/6] docs: add design-width before shot for #98 Show that at `_width` the right-anchored legend matches the old left pixel layout; only the resized canvas changes. --- docs/figs/issue-98-slope-534-before.png | Bin 0 -> 68737 bytes scripts/issue-98-slope-shots.mjs | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 docs/figs/issue-98-slope-534-before.png diff --git a/docs/figs/issue-98-slope-534-before.png b/docs/figs/issue-98-slope-534-before.png new file mode 100644 index 0000000000000000000000000000000000000000..5a63b302dfebbf8921fadc06ec29f2aa3c018fdd GIT binary patch literal 68737 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

6lvAz~ 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