Skip to content

Insight API

js
import {
  Insight,
  clearPersistedChart,
  version,
} from '@chartbuddy.io/embed';

Constructor

js
const insight = new Insight(target, options?);

target

CSS selector string or HTMLElement.

options

OptionTypeDefaultDescription
chartDataobjectPartial or full chart config
instanceIdstringrandom UUIDStable id for getInsights() / persist. Must be unique on the page — duplicates throw.
editablebooleanfalseStart in editor mode
toolbarbooleanfalseShow formatting toolbar (edit mode)
persistbooleanfalsePersist to localStorage
assetBasestringOnly for multi-file loader; ignore with single-file

Instance

MemberDescription
readyPromise — resolves when mounted
mode'view' | 'edit'
chartEngine chart instance
instanceIdStable id for this mount
setChartData(cd)Merge a full or partial config and redraw (chartType optional)
setData(seriesData)Refresh only the data grid — keeps type and formatting
update(patch?)Partial patch + redraw; no argument = redraw only
getChartData()Full cd snapshot
on(event, handler)Subscribe to ready | mode | change (returns unsubscribe)
off(event, handler)Remove a handler
isDirty()true when the chart changed since boot / last Done
getRevision()Monotonic edit counter
toPngBlob() / toPngBase64()PNG without a Save dialog (agent-friendly)
downloadPng()Download PNG (human Save dialog)
exportConfig()Download current chartData as JSON
enterEditMode()View → edit
exitEditMode()Edit → view (checkpoints when persist: true)
focus()Focus the insight
destroy()Tear down

Partial updates

js
await insight.ready;

// Data only — Chart.js-shaped
insight.setData([
  ['', 'Q1', 'Q2'],
  ['Revenue', 100, 120],
]);

// Any partial patch
insight.update({ title: { text: 'FY26' } });

// Redraw without changing config
insight.update();

// setChartData also accepts partials — chartType is not required
insight.setChartData({ seriesData: [/* … */] });

Events

js
insight.on('ready', () => { /* booted */ });
insight.on('mode', (mode) => { /* 'view' | 'edit' */ });
insight.on('change', (cd) => { /* after meaningful edits */ });

insight.isDirty();     // since boot / last Done checkpoint
insight.getRevision(); // increments on every meaningful change

change fires after programmatic setChartData / setData / update, live edits in edit mode, and Done.

Validation

new Insight({ chartData }), setChartData, setData, and update validate input at the API boundary:

InputBehaviour
Unknown chartType (e.g. bubbleChart3D)Throws (with a did-you-mean hint)
Wrong field type / enum / rangeThrows (lists every path)
Foreign option bag (pie + bar: {…})Throws
Ragged seriesData (unequal row lengths)Warns, still accepts
Duplicate instanceId on the pageThrows
Unknown keysAlways allowed (forward-compatible)

Throws are ChartDataValidationError, which carries the problems as structured data — and the same checks are callable directly, so you can validate before you mount. See Validation.

js
import { validateChartData } from '@chartbuddy.io/embed';

const { valid, errors } = validateChartData(candidate);
if (!valid) console.log(errors[0].path, errors[0].code, errors[0].suggestion);

PNG / export

js
await insight.ready;
const png = await insight.toPngBase64(); // default background #ffffff
await insight.downloadPng();
insight.exportConfig();

PNG download and drag-to-slide are also available from the view-mode hover ball.

Developer & LLM documentation · Not the end-user Help Center · Help Center