@aurum-grid/charts 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,563 @@
1
+ /**
2
+ * Integrated charts: a chart window that opens on top of the grid (modal), charts the selected
3
+ * rows or cell range, and stays linked to the grid as the selection, filters or values change.
4
+ *
5
+ * onChartRequest: ({ api, chartType }) => openIntegratedChart(api, { chartType })
6
+ *
7
+ * The right-hand panel (toggled with the arrow) has three tabs:
8
+ * Chart — every chart type, grouped (Column, Bar, Pie, Line & area, X Y, Polar, …)
9
+ * Set up — category, series, aggregation, data source, live link
10
+ * Customize — title, palette, legend, labels, trend, forecast, highlights
11
+ */
12
+ import { Chart, CHART_GROUPS, CHART_TYPES, PALETTES } from './chart.js';
13
+ import { aggregateBy, toNumber } from './transform.js';
14
+ import { chartTypeIcon } from './icons.js';
15
+ const RAW_TYPES = new Set(['boxPlot', 'rangeBar', 'histogram', 'scatter', 'bubble']);
16
+ let openHandle = null;
17
+ let seq = 0;
18
+ function el(tag, cls, text) {
19
+ const e = document.createElement(tag);
20
+ if (cls)
21
+ e.className = cls;
22
+ if (text != null)
23
+ e.textContent = text;
24
+ return e;
25
+ }
26
+ function headerOf(grid, colId) {
27
+ const c = grid.getColumn(colId);
28
+ return c?.colDef.headerName ?? c?.colDef.field ?? colId;
29
+ }
30
+ function isNumericCol(grid, colId, nodes) {
31
+ const t = grid.getColumn(colId)?.colDef.type;
32
+ if (t === 'numericColumn' || (Array.isArray(t) && t.includes('numericColumn')))
33
+ return true;
34
+ let nums = 0;
35
+ let seen = 0;
36
+ for (const n of nodes.slice(0, 40)) {
37
+ const v = grid.getCellValue(n, colId);
38
+ if (v == null || v === '')
39
+ continue;
40
+ seen++;
41
+ if (typeof v === 'number' && Number.isFinite(v))
42
+ nums++;
43
+ }
44
+ return seen > 0 && nums / seen > 0.9;
45
+ }
46
+ function downloadDefault(name, blob) {
47
+ const url = URL.createObjectURL(blob);
48
+ const a = el('a');
49
+ a.href = url;
50
+ a.download = name;
51
+ document.body.append(a);
52
+ a.click();
53
+ a.remove();
54
+ setTimeout(() => URL.revokeObjectURL(url), 1000);
55
+ }
56
+ /** Open (or replace) the integrated chart window over the grid. */
57
+ export function openIntegratedChart(grid, opts = {}) {
58
+ openHandle?.close();
59
+ const id = `agc-ic-${++seq}`;
60
+ let cfg = {
61
+ agg: 'sum', source: 'auto', linked: true, panelOpen: true, ...opts,
62
+ };
63
+ let type = opts.chartType ?? 'column';
64
+ const look = { title: opts.title ?? '', palette: 'theme', legend: true, labels: false, trend: false, forecast: false, highlights: false };
65
+ const gridRoot = grid.getRootElement();
66
+ const prevFocus = document.activeElement;
67
+ /* ---------- data ---------- */
68
+ const collect = () => {
69
+ const ranges = cfg.source === 'auto' || cfg.source === 'range' ? grid.getCellRanges?.() ?? [] : [];
70
+ const usableRange = ranges.find((r) => r.endRow > r.startRow || r.columns.length > 1);
71
+ let nodes = [];
72
+ let label = '';
73
+ let rangeCols = [];
74
+ if (usableRange && grid.getDisplayedRowAtIndex && (cfg.source === 'auto' || cfg.source === 'range')) {
75
+ const lo = Math.min(usableRange.startRow, usableRange.endRow);
76
+ const hi = Math.max(usableRange.startRow, usableRange.endRow);
77
+ for (let i = lo; i <= hi; i++) {
78
+ const n = grid.getDisplayedRowAtIndex(i);
79
+ if (n?.data)
80
+ nodes.push(n);
81
+ }
82
+ rangeCols = usableRange.columns;
83
+ label = `${nodes.length} rows in the selected range`;
84
+ }
85
+ if (!nodes.length && cfg.source !== 'filtered') {
86
+ nodes = grid.getSelectedNodes().filter((n) => n.data);
87
+ if (nodes.length)
88
+ label = `${nodes.length} selected row${nodes.length === 1 ? '' : 's'}`;
89
+ }
90
+ if (!nodes.length) {
91
+ grid.forEachNodeAfterFilterAndSort((n) => n.data && nodes.push(n));
92
+ label = `${nodes.length.toLocaleString()} rows in view (nothing selected)`;
93
+ }
94
+ return { nodes, label, rangeCols };
95
+ };
96
+ const columns = () => grid.getAllDisplayedColumns().filter((c) => !c.colDef.checkboxSelection || c.colDef.field);
97
+ const pickDefaults = (nodes, rangeCols) => {
98
+ const pool = (rangeCols.length ? rangeCols : columns().map((c) => c.colId)).filter((id) => grid.getColumn(id));
99
+ const numeric = pool.filter((id) => isNumericCol(grid, id, nodes));
100
+ const text = pool.filter((id) => !numeric.includes(id) && !Array.isArray(grid.getCellValue(nodes[0], id)));
101
+ if (!cfg.categoryColId || !grid.getColumn(cfg.categoryColId)) {
102
+ // prefer a column with repeated values (desk, region) over a unique id
103
+ const repeated = text.find((id) => new Set(nodes.slice(0, 200).map((n) => String(grid.getCellValue(n, id)))).size < Math.min(nodes.length, 200) * 0.6);
104
+ cfg.categoryColId = repeated ?? text[0] ?? pool[0];
105
+ }
106
+ if (!cfg.valueColIds?.length) {
107
+ const pnl = numeric.find((id) => /p&?n?l|profit/i.test(id));
108
+ cfg.valueColIds = rangeCols.length ? numeric.slice(0, 4) : [pnl ?? numeric[0]].filter(Boolean);
109
+ }
110
+ };
111
+ const build = () => {
112
+ const { nodes, label, rangeCols } = collect();
113
+ pickDefaults(nodes, rangeCols);
114
+ const cat = cfg.categoryColId;
115
+ const vals = (cfg.valueColIds ?? []).filter((v) => grid.getColumn(v));
116
+ const rows = nodes.map((n) => {
117
+ const r = { [cat]: String(grid.getCellValue(n, cat) ?? '(blank)') };
118
+ for (const v of vals)
119
+ r[v] = toNumber(grid.getCellValue(n, v));
120
+ return r;
121
+ });
122
+ const series = vals.map((v) => ({ key: v, name: headerOf(grid, v) }));
123
+ let data;
124
+ if (RAW_TYPES.has(type))
125
+ data = rows;
126
+ else if (cfg.agg === 'none')
127
+ data = rows.slice(0, 200);
128
+ else {
129
+ data = aggregateBy(rows, cat, vals.map((k) => ({ key: k, agg: cfg.agg === 'none' ? 'sum' : cfg.agg })));
130
+ if (!['line', 'area', 'stackedArea', 'normalizedArea', 'funnel'].includes(type))
131
+ data.sort((a, b) => toNumber(b[vals[0]]) - toNumber(a[vals[0]]));
132
+ if (['pie', 'donut', 'nightingale', 'radialBar', 'pyramid'].includes(type))
133
+ data = data.slice(0, 12);
134
+ if (type === 'gauge')
135
+ data = [{ [cat]: 'Total', ...Object.fromEntries(vals.map((v) => [v, data.reduce((s, d) => s + toNumber(d[v]), 0)])) }];
136
+ }
137
+ const aggLabel = cfg.agg === 'none' ? '' : `${cfg.agg === 'avg' ? 'Average ' : cfg.agg === 'count' ? 'Count of ' : cfg.agg === 'sum' ? '' : `${cfg.agg} `}`;
138
+ const autoTitle = `${aggLabel}${series.map((s) => s.name).join(', ')} by ${headerOf(grid, cat)}`;
139
+ const pal = PALETTES[look.palette] ?? null;
140
+ return {
141
+ label,
142
+ count: nodes.length,
143
+ titleText: look.title || autoTitle,
144
+ options: {
145
+ type, data, categoryKey: cat, series, height: 'fill', legend: look.legend, dataLabels: look.labels, trendline: look.trend,
146
+ forecast: look.forecast ? 3 : undefined, highlights: look.highlights, palette: pal, valueFormat: cfg.valueFormat,
147
+ xKey: type === 'scatter' || type === 'bubble' ? vals[0] : undefined, yKey: type === 'scatter' || type === 'bubble' ? vals[1] ?? vals[0] : undefined,
148
+ title: undefined, emptyText: vals.length ? 'No rows to chart' : 'Pick at least one numeric series in Set up',
149
+ ariaLabel: look.title || autoTitle,
150
+ },
151
+ };
152
+ };
153
+ /* ---------- DOM ---------- */
154
+ const backdrop = el('div', 'agc-ic-backdrop');
155
+ const dlg = el('div', 'agc-ic');
156
+ dlg.setAttribute('role', 'dialog');
157
+ dlg.setAttribute('aria-modal', 'true');
158
+ dlg.setAttribute('aria-labelledby', `${id}-title`);
159
+ dlg.tabIndex = -1;
160
+ // carry the grid's theme (CSS variables + theme name) into the dialog
161
+ const themed = gridRoot.closest('[data-agr-theme]') ?? gridRoot;
162
+ const themeName = themed.getAttribute('data-agr-theme');
163
+ if (themeName)
164
+ dlg.setAttribute('data-agr-theme', themeName);
165
+ for (const src of [document.documentElement, themed]) {
166
+ for (let i = 0; i < src.style.length; i++) {
167
+ const p = src.style[i];
168
+ if (p.startsWith('--agr-') || p.startsWith('--agc-'))
169
+ dlg.style.setProperty(p, src.style.getPropertyValue(p));
170
+ }
171
+ }
172
+ const head = el('div', 'agc-ic-head');
173
+ const titleEl = el('h2', 'agc-ic-title');
174
+ titleEl.id = `${id}-title`;
175
+ const subEl = el('span', 'agc-ic-sub');
176
+ subEl.setAttribute('role', 'status');
177
+ const titleWrap = el('div', 'agc-ic-titles');
178
+ titleWrap.append(titleEl, subEl);
179
+ const mkBtn = (label, text, cls = '') => {
180
+ const b = el('button', `agc-ic-btn ${cls}`, text);
181
+ b.type = 'button';
182
+ b.setAttribute('aria-label', label);
183
+ b.title = label;
184
+ return b;
185
+ };
186
+ const pngBtn = mkBtn('Download PNG', 'PNG', 'agc-ic-text');
187
+ const svgBtn = mkBtn('Download SVG', 'SVG', 'agc-ic-text');
188
+ const maxBtn = mkBtn('Maximise', '⤢');
189
+ const closeBtn = mkBtn('Close chart', '×', 'agc-ic-close');
190
+ const tools = el('div', 'agc-ic-tools');
191
+ tools.append(pngBtn, svgBtn, maxBtn, closeBtn);
192
+ head.append(titleWrap, tools);
193
+ const body = el('div', 'agc-ic-body');
194
+ const chartHost = el('div', 'agc-ic-chart');
195
+ const panel = el('aside', 'agc-ic-panel');
196
+ panel.id = `${id}-panel`;
197
+ panel.setAttribute('aria-label', 'Chart settings');
198
+ const toggle = el('button', 'agc-ic-toggle');
199
+ toggle.type = 'button';
200
+ toggle.setAttribute('aria-controls', panel.id);
201
+ body.append(chartHost, toggle, panel);
202
+ dlg.append(head, body);
203
+ backdrop.append(dlg);
204
+ /* tabs */
205
+ const tabs = el('div', 'agc-ic-tabs');
206
+ tabs.setAttribute('role', 'tablist');
207
+ tabs.setAttribute('aria-label', 'Chart settings');
208
+ const panes = {};
209
+ const tabBtns = {};
210
+ for (const [key, label] of [['chart', 'Chart'], ['setup', 'Set up'], ['customize', 'Customize']]) {
211
+ const b = el('button', 'agc-ic-tab', label);
212
+ b.type = 'button';
213
+ b.id = `${id}-tab-${key}`;
214
+ b.setAttribute('role', 'tab');
215
+ b.setAttribute('aria-controls', `${id}-pane-${key}`);
216
+ tabBtns[key] = b;
217
+ const pane = el('div', 'agc-ic-pane');
218
+ pane.id = `${id}-pane-${key}`;
219
+ pane.setAttribute('role', 'tabpanel');
220
+ pane.setAttribute('aria-labelledby', b.id);
221
+ panes[key] = pane;
222
+ tabs.append(b);
223
+ }
224
+ panel.append(tabs, panes.chart, panes.setup, panes.customize);
225
+ let activeTab = 'chart';
226
+ const showTab = (k, focus = false) => {
227
+ activeTab = k;
228
+ for (const [key, b] of Object.entries(tabBtns)) {
229
+ const on = key === k;
230
+ b.setAttribute('aria-selected', String(on));
231
+ b.tabIndex = on ? 0 : -1;
232
+ panes[key].hidden = !on;
233
+ }
234
+ if (focus)
235
+ tabBtns[k].focus();
236
+ };
237
+ tabs.addEventListener('keydown', (e) => {
238
+ const keys = Object.keys(tabBtns);
239
+ const i = keys.indexOf(activeTab);
240
+ if (e.key === 'ArrowRight' || e.key === 'ArrowLeft') {
241
+ e.preventDefault();
242
+ showTab(keys[(i + (e.key === 'ArrowRight' ? 1 : -1) + keys.length) % keys.length], true);
243
+ }
244
+ });
245
+ for (const [k, b] of Object.entries(tabBtns))
246
+ b.addEventListener('click', () => showTab(k));
247
+ /* Chart tab: grouped gallery */
248
+ const typeBtns = new Map();
249
+ for (const grp of CHART_GROUPS) {
250
+ const sec = el('section', 'agc-ic-group');
251
+ const h = el('h3', 'agc-ic-group-title', grp.group);
252
+ const list = el('div', 'agc-ic-types');
253
+ list.setAttribute('role', 'group');
254
+ list.setAttribute('aria-label', grp.group);
255
+ for (const t of grp.types) {
256
+ const label = CHART_TYPES.find((x) => x.value === t)?.label ?? t;
257
+ const b = el('button', 'agc-ic-type');
258
+ b.type = 'button';
259
+ b.title = label;
260
+ b.setAttribute('aria-label', label);
261
+ b.dataset.type = t;
262
+ b.append(chartTypeIcon(t), el('span', 'agc-ic-type-label', label));
263
+ b.addEventListener('click', () => handle.setChartType(t));
264
+ typeBtns.set(t, b);
265
+ list.append(b);
266
+ }
267
+ sec.append(h, list);
268
+ panes.chart.append(sec);
269
+ }
270
+ /* Set up tab */
271
+ const field = (labelText, control) => {
272
+ const l = el('label', 'agc-ic-field');
273
+ l.append(el('span', 'agc-ic-label', labelText), control);
274
+ return l;
275
+ };
276
+ const catSel = el('select', 'agc-control');
277
+ const aggSel = el('select', 'agc-control');
278
+ for (const [v, t] of [['sum', 'Sum'], ['avg', 'Average'], ['count', 'Count'], ['min', 'Minimum'], ['max', 'Maximum'], ['none', 'None (one point per row)']]) {
279
+ const op = el('option', '', t);
280
+ op.value = v;
281
+ aggSel.append(op);
282
+ }
283
+ const srcSel = el('select', 'agc-control');
284
+ for (const [v, t] of [['auto', 'Range, else selection, else rows in view'], ['selection', 'Selected rows'], ['filtered', 'All rows in view']]) {
285
+ const op = el('option', '', t);
286
+ op.value = v;
287
+ srcSel.append(op);
288
+ }
289
+ const seriesBox = el('fieldset', 'agc-ic-series');
290
+ seriesBox.append(el('legend', 'agc-ic-label', 'Series'));
291
+ const linkLbl = el('label', 'agc-check');
292
+ const linkChk = el('input');
293
+ linkChk.type = 'checkbox';
294
+ linkLbl.append(linkChk, document.createTextNode(' Link to grid (updates live)'));
295
+ const srcNote = el('p', 'agc-ic-note');
296
+ panes.setup.append(field('Category', catSel), seriesBox, field('Aggregation', aggSel), field('Rows', srcSel), linkLbl, srcNote);
297
+ /* Customize tab */
298
+ const titleIn = el('input', 'agc-control');
299
+ titleIn.placeholder = 'Automatic title';
300
+ titleIn.maxLength = 120;
301
+ const palSel = el('select', 'agc-control');
302
+ for (const p of Object.keys(PALETTES)) {
303
+ const op = el('option', '', p === 'theme' ? 'Theme colours' : p[0].toUpperCase() + p.slice(1));
304
+ op.value = p;
305
+ palSel.append(op);
306
+ }
307
+ const checks = {};
308
+ const checkWrap = el('div', 'agc-ic-checks');
309
+ for (const [k, t] of [['legend', 'Legend'], ['labels', 'Data labels'], ['trend', 'Trend line'], ['forecast', 'Forecast (3 periods)'], ['highlights', 'Highlight high / low']]) {
310
+ const l = el('label', 'agc-check');
311
+ const c = el('input');
312
+ c.type = 'checkbox';
313
+ c.checked = look[k];
314
+ c.addEventListener('change', () => {
315
+ look[k] = c.checked;
316
+ render();
317
+ });
318
+ checks[k] = c;
319
+ l.append(c, document.createTextNode(` ${t}`));
320
+ checkWrap.append(l);
321
+ }
322
+ panes.customize.append(field('Title', titleIn), field('Palette', palSel), checkWrap);
323
+ /* ---------- behaviour ---------- */
324
+ const chart = new Chart(chartHost, build().options);
325
+ const render = () => {
326
+ const b = build();
327
+ chart.update(b.options);
328
+ titleEl.textContent = b.titleText;
329
+ subEl.textContent = `${CHART_TYPES.find((t) => t.value === type)?.label ?? type} · ${b.label}${cfg.linked ? ' · live' : ''}`;
330
+ for (const [t, btn] of typeBtns)
331
+ btn.setAttribute('aria-pressed', String(t === type));
332
+ // set up controls reflect state
333
+ const cols = columns();
334
+ catSel.replaceChildren(...cols.map((c) => {
335
+ const op = el('option', '', c.colDef.headerName ?? c.colDef.field ?? c.colId);
336
+ op.value = c.colId;
337
+ return op;
338
+ }));
339
+ catSel.value = cfg.categoryColId ?? '';
340
+ const sample = collect().nodes;
341
+ const numericCols = cols.filter((c) => c.colId !== cfg.categoryColId && isNumericCol(grid, c.colId, sample));
342
+ seriesBox.querySelectorAll('label').forEach((l) => l.remove());
343
+ for (const c of numericCols) {
344
+ const l = el('label', 'agc-check');
345
+ const chk = el('input');
346
+ chk.type = 'checkbox';
347
+ chk.checked = cfg.valueColIds?.includes(c.colId) ?? false;
348
+ chk.addEventListener('change', () => {
349
+ const set = new Set(cfg.valueColIds);
350
+ if (chk.checked)
351
+ set.add(c.colId);
352
+ else
353
+ set.delete(c.colId);
354
+ cfg.valueColIds = numericCols.map((x) => x.colId).filter((x) => set.has(x));
355
+ render();
356
+ });
357
+ l.append(chk, document.createTextNode(` ${c.colDef.headerName ?? c.colDef.field ?? c.colId}`));
358
+ seriesBox.append(l);
359
+ }
360
+ if (!numericCols.length)
361
+ seriesBox.append(Object.assign(el('label', 'agc-ic-note'), { textContent: 'No numeric columns to plot.' }));
362
+ aggSel.value = cfg.agg;
363
+ aggSel.disabled = RAW_TYPES.has(type);
364
+ srcSel.value = cfg.source === 'range' ? 'auto' : cfg.source;
365
+ linkChk.checked = cfg.linked;
366
+ srcNote.textContent = RAW_TYPES.has(type)
367
+ ? `${CHART_TYPES.find((t) => t.value === type)?.label} uses every row individually, so aggregation is off.`
368
+ : `Charting ${b.label}.`;
369
+ };
370
+ catSel.addEventListener('change', () => {
371
+ cfg.categoryColId = catSel.value;
372
+ cfg.valueColIds = (cfg.valueColIds ?? []).filter((v) => v !== catSel.value);
373
+ render();
374
+ });
375
+ aggSel.addEventListener('change', () => {
376
+ cfg.agg = aggSel.value;
377
+ render();
378
+ });
379
+ srcSel.addEventListener('change', () => {
380
+ cfg.source = srcSel.value;
381
+ render();
382
+ });
383
+ linkChk.addEventListener('change', () => {
384
+ cfg.linked = linkChk.checked;
385
+ render();
386
+ });
387
+ let titleTimer;
388
+ titleIn.addEventListener('input', () => {
389
+ clearTimeout(titleTimer);
390
+ titleTimer = setTimeout(() => {
391
+ look.title = titleIn.value.trim();
392
+ render();
393
+ }, 200);
394
+ });
395
+ palSel.addEventListener('change', () => {
396
+ look.palette = palSel.value;
397
+ render();
398
+ });
399
+ let panelOpen = cfg.panelOpen !== false;
400
+ const setPanel = (open) => {
401
+ panelOpen = open;
402
+ dlg.classList.toggle('agc-ic-panel-closed', !open);
403
+ panel.hidden = !open;
404
+ toggle.textContent = open ? '›' : '‹';
405
+ toggle.setAttribute('aria-expanded', String(open));
406
+ toggle.setAttribute('aria-label', open ? 'Hide chart settings' : 'Show chart settings');
407
+ toggle.title = open ? 'Hide chart settings' : 'Show chart types and settings';
408
+ requestAnimationFrame(() => chart.render());
409
+ };
410
+ toggle.addEventListener('click', () => setPanel(!panelOpen));
411
+ // position over the grid, clamped to the viewport
412
+ const place = () => {
413
+ if (dlg.classList.contains('agc-ic-max')) {
414
+ dlg.style.cssText += ';left:12px;top:12px;width:calc(100vw - 24px);height:calc(100vh - 24px)';
415
+ return;
416
+ }
417
+ const r = gridRoot.getBoundingClientRect();
418
+ const vw = window.innerWidth;
419
+ const vh = window.innerHeight;
420
+ const w = Math.min(vw - 16, Math.max(Math.min(980, vw - 16), Math.min(r.width * 0.94, 1180)));
421
+ const h = Math.min(vh - 16, Math.max(460, Math.min(r.height * 0.94, 680)));
422
+ const visTop = Math.max(8, r.top);
423
+ const visBottom = Math.min(vh - 8, r.bottom);
424
+ let top = visBottom - visTop > h ? visTop + (visBottom - visTop - h) / 2 : (vh - h) / 2;
425
+ let left = r.left + (r.width - w) / 2;
426
+ left = Math.max(8, Math.min(vw - w - 8, left));
427
+ top = Math.max(8, Math.min(vh - h - 8, top));
428
+ dlg.style.left = `${left}px`;
429
+ dlg.style.top = `${top}px`;
430
+ dlg.style.width = `${w}px`;
431
+ dlg.style.height = `${h}px`;
432
+ };
433
+ // drag by header
434
+ head.addEventListener('pointerdown', (e) => {
435
+ if (e.target.closest('button') || e.button !== 0 || dlg.classList.contains('agc-ic-max'))
436
+ return;
437
+ const sx = e.clientX - dlg.offsetLeft;
438
+ const sy = e.clientY - dlg.offsetTop;
439
+ const move = (ev) => {
440
+ dlg.style.left = `${Math.max(0, Math.min(window.innerWidth - 120, ev.clientX - sx))}px`;
441
+ dlg.style.top = `${Math.max(0, Math.min(window.innerHeight - 40, ev.clientY - sy))}px`;
442
+ };
443
+ const up = () => {
444
+ document.removeEventListener('pointermove', move);
445
+ document.removeEventListener('pointerup', up);
446
+ };
447
+ document.addEventListener('pointermove', move);
448
+ document.addEventListener('pointerup', up);
449
+ });
450
+ maxBtn.addEventListener('click', () => {
451
+ const on = !dlg.classList.contains('agc-ic-max');
452
+ dlg.classList.toggle('agc-ic-max', on);
453
+ maxBtn.textContent = on ? '⤡' : '⤢';
454
+ maxBtn.setAttribute('aria-label', on ? 'Restore size' : 'Maximise');
455
+ maxBtn.title = maxBtn.getAttribute('aria-label');
456
+ place();
457
+ requestAnimationFrame(() => chart.render());
458
+ });
459
+ closeBtn.addEventListener('click', () => handle.close());
460
+ const save = (name, blob) => (cfg.download ?? downloadDefault)(name, blob);
461
+ const fileBase = () => (titleEl.textContent || 'chart').replace(/[^\w-]+/g, '-').replace(/^-|-$/g, '').toLowerCase().slice(0, 60) || 'chart';
462
+ svgBtn.addEventListener('click', () => save(`${fileBase()}.svg`, new Blob([chart.toSvgString()], { type: 'image/svg+xml' })));
463
+ pngBtn.addEventListener('click', async () => {
464
+ try {
465
+ save(`${fileBase()}.png`, await chart.toPngBlob(2));
466
+ }
467
+ catch {
468
+ subEl.textContent = 'PNG export is not available in this browser; use SVG.';
469
+ }
470
+ });
471
+ // live link
472
+ let raf = null;
473
+ const onGrid = () => {
474
+ if (!cfg.linked || raf != null)
475
+ return;
476
+ raf = requestAnimationFrame(() => {
477
+ raf = null;
478
+ render();
479
+ });
480
+ };
481
+ const offs = ['selectionChanged', 'modelUpdated', 'cellValueChanged', 'rangeSelectionChanged', 'rowDataUpdated'].map((t) => grid.addEventListener(t, onGrid));
482
+ // focus management: trap Tab, Escape closes
483
+ const focusables = () => [...dlg.querySelectorAll('button, select, input, [tabindex="0"]')].filter((x) => !x.hasAttribute('disabled') && x.offsetParent !== null);
484
+ dlg.addEventListener('keydown', (e) => {
485
+ if (e.key === 'Escape') {
486
+ e.preventDefault();
487
+ e.stopPropagation();
488
+ handle.close();
489
+ }
490
+ else if (e.key === 'Tab') {
491
+ const f = focusables();
492
+ if (!f.length)
493
+ return;
494
+ const first = f[0];
495
+ const last = f[f.length - 1];
496
+ if (e.shiftKey && document.activeElement === first) {
497
+ e.preventDefault();
498
+ last.focus();
499
+ }
500
+ else if (!e.shiftKey && document.activeElement === last) {
501
+ e.preventDefault();
502
+ first.focus();
503
+ }
504
+ }
505
+ });
506
+ backdrop.addEventListener('pointerdown', (e) => {
507
+ if (e.target === backdrop)
508
+ handle.close();
509
+ });
510
+ const onResize = () => {
511
+ place();
512
+ chart.render();
513
+ };
514
+ window.addEventListener('resize', onResize);
515
+ let closed = false;
516
+ const handle = {
517
+ chart,
518
+ element: dlg,
519
+ setChartType(t) {
520
+ type = t;
521
+ render();
522
+ },
523
+ update(o) {
524
+ cfg = { ...cfg, ...o };
525
+ if (o.chartType)
526
+ type = o.chartType;
527
+ if (o.title != null)
528
+ look.title = o.title;
529
+ render();
530
+ },
531
+ close() {
532
+ if (closed)
533
+ return;
534
+ closed = true;
535
+ offs.forEach((f) => f());
536
+ window.removeEventListener('resize', onResize);
537
+ if (raf != null)
538
+ cancelAnimationFrame(raf);
539
+ chart.destroy();
540
+ backdrop.remove();
541
+ if (openHandle === handle)
542
+ openHandle = null;
543
+ prevFocus?.focus?.({ preventScroll: true });
544
+ cfg.onClose?.();
545
+ },
546
+ };
547
+ openHandle = handle;
548
+ document.body.append(backdrop);
549
+ showTab('chart');
550
+ setPanel(panelOpen);
551
+ place();
552
+ render();
553
+ requestAnimationFrame(() => {
554
+ chart.render();
555
+ (typeBtns.get(type) ?? closeBtn).focus({ preventScroll: true });
556
+ });
557
+ return handle;
558
+ }
559
+ /** The integrated chart currently open, if any. */
560
+ export function getOpenIntegratedChart() {
561
+ return openHandle;
562
+ }
563
+ //# sourceMappingURL=integrated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrated.js","sourceRoot":"","sources":["../src/integrated.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type Datum } from './transform.js';
2
+ import { type ChartOptions, type ChartType } from './chart.js';
3
+ export interface ChartRecommendation {
4
+ type: ChartType;
5
+ label: string;
6
+ /** 0–100 */
7
+ score: number;
8
+ reason: string;
9
+ }
10
+ /**
11
+ * Rank chart types for a category × measures dataset. Scores are transparent heuristics:
12
+ * time axis, number of categories and series, negative values, scale difference between
13
+ * measures, and whether a part-to-whole reading makes sense.
14
+ */
15
+ export declare function recommendCharts(data: Datum[], categoryKey: string, seriesKeys: string[]): ChartRecommendation[];
16
+ /** Plain-language description of what a chart shows (deterministic). */
17
+ export declare function explainChart(o: ChartOptions, fmt?: (v: number) => string): string;