@sheetpane/charts 0.0.0-stage → 0.1.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.
package/dist/svg.js ADDED
@@ -0,0 +1,398 @@
1
+ /** Space at the top of the frame the title band (title, then type and series count) takes. */
2
+ export const HEAD = 42;
3
+ export const esc = (s) => s.replace(/[&<>"']/g, (c) => `&#${c.charCodeAt(0)};`);
4
+ const n2 = (v) => String(Math.round(v * 100) / 100);
5
+ const INK = 'fill:var(--sp-ink,#16171A)';
6
+ const INK3 = 'fill:var(--sp-ink-3,#63666E)';
7
+ const GRID = 'stroke:var(--sp-line,#E2E2DD)';
8
+ const AXIS = 'stroke:var(--sp-line-strong,#CBCBC5)';
9
+ const NEG = 'var(--sp-fail,#B42318)';
10
+ const nf = new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 });
11
+ /**
12
+ * A number for an axis or label: `-9180` → `−9,180` (a true minus), at most two decimals, in the page's locale.
13
+ *
14
+ * @param v - The number.
15
+ * @param percent - Show `v` as a percentage (`0.25` → `25%`).
16
+ * @returns The text.
17
+ */
18
+ export function formatNumber(v, percent = false) {
19
+ const x = percent ? v * 100 : v;
20
+ const s = nf.format(Math.abs(x)) + (percent ? '%' : '');
21
+ return x < 0 ? `−${s}` : s;
22
+ }
23
+ /** Cuts a label to `max` characters with an ellipsis. */
24
+ export const clip = (s, max) => (max <= 1 ? '' : s.length > max ? `${s.slice(0, Math.max(1, max - 1))}…` : s);
25
+ /**
26
+ * A "nice" axis: steps of 1, 2, 2.5 or 5 × 10ⁿ covering [lo, hi] in about `count` intervals.
27
+ *
28
+ * @param lo - The lowest value to cover.
29
+ * @param hi - The highest value to cover.
30
+ * @param count - About how many intervals.
31
+ * @returns The scale; at least two ticks.
32
+ */
33
+ export function niceScale(lo, hi, count) {
34
+ if (!Number.isFinite(lo) || !Number.isFinite(hi)) {
35
+ lo = 0;
36
+ hi = 1;
37
+ }
38
+ if (hi < lo)
39
+ [lo, hi] = [hi, lo];
40
+ if (hi === lo) {
41
+ if (lo === 0)
42
+ hi = 1;
43
+ else if (lo > 0)
44
+ lo = 0;
45
+ else
46
+ hi = 0;
47
+ }
48
+ const raw = (hi - lo) / Math.max(1, count);
49
+ const mag = 10 ** Math.floor(Math.log10(raw));
50
+ const norm = raw / mag;
51
+ const step = (norm <= 1 ? 1 : norm <= 2 ? 2 : norm <= 2.5 ? 2.5 : norm <= 5 ? 5 : 10) * mag;
52
+ const fix = (v) => Number(v.toPrecision(12));
53
+ const nlo = fix(Math.floor(lo / step + 1e-9) * step), nhi = fix(Math.ceil(hi / step - 1e-9) * step);
54
+ const ticks = [];
55
+ for (let i = 0; i <= Math.round((nhi - nlo) / step); i++)
56
+ ticks.push(fix(nlo + i * step));
57
+ return { lo: nlo, hi: nhi === nlo ? fix(nlo + step) : nhi, step, ticks: ticks.length > 1 ? ticks : [nlo, fix(nlo + step)] };
58
+ }
59
+ /**
60
+ * Excel's automatic axis range, roughly: it includes zero unless the data sit in a narrow band far from it.
61
+ *
62
+ * @param lo - The data's minimum.
63
+ * @param hi - The data's maximum.
64
+ * @returns `[lo, hi]` widened to zero, or unchanged.
65
+ */
66
+ export function withZero(lo, hi) {
67
+ if (lo > 0 && hi - lo < hi / 6)
68
+ return [lo, hi];
69
+ if (hi < 0 && hi - lo < -lo / 6)
70
+ return [lo, hi];
71
+ return [Math.min(0, lo), Math.max(0, hi)];
72
+ }
73
+ const finite = (v) => typeof v === 'number' && Number.isFinite(v);
74
+ /**
75
+ * Per category: the value each series contributes once stacking (or 100 % stacking) is applied.
76
+ *
77
+ * @param series - The series.
78
+ * @param cats - How many categories.
79
+ * @param grouping - The group's grouping; `clustered` and `standard` do not stack.
80
+ * @returns Per series, per category: `{ base, top, value }` (`value` `null` for a missing point).
81
+ */
82
+ export function stackedValues(series, cats, grouping) {
83
+ const out = series.map(() => []);
84
+ for (let j = 0; j < cats; j++) {
85
+ const total = grouping === 'percentStacked' ? series.reduce((t, s) => t + Math.abs(finite(s.values[j]) ? s.values[j] : 0), 0) : 1;
86
+ let pos = 0, neg = 0;
87
+ series.forEach((s, i) => {
88
+ const raw = s.values[j];
89
+ if (!finite(raw)) {
90
+ out[i].push({ base: 0, top: 0, value: null });
91
+ return;
92
+ }
93
+ const v = grouping === 'percentStacked' ? (total ? raw / total : 0) : raw;
94
+ if (grouping === 'stacked' || grouping === 'percentStacked') {
95
+ if (v >= 0) {
96
+ out[i].push({ base: pos, top: pos + v, value: raw });
97
+ pos += v;
98
+ }
99
+ else {
100
+ out[i].push({ base: neg, top: neg + v, value: raw });
101
+ neg += v;
102
+ }
103
+ }
104
+ else
105
+ out[i].push({ base: 0, top: v, value: raw });
106
+ });
107
+ }
108
+ return out;
109
+ }
110
+ const stacked = (g) => g === 'stacked' || g === 'percentStacked';
111
+ const catCount = (d) => Math.max(d.cats.length, ...d.series.map((s) => s.values.length), 0);
112
+ function legendItems(d) {
113
+ if (d.kind === 'pie' || d.kind === 'doughnut') {
114
+ const s = d.series[0];
115
+ if (!s)
116
+ return [];
117
+ return s.values.map((_, j) => ({ label: d.cats[j] ?? String(j + 1), color: s.pointColors[j] ?? s.color })).filter((_, j) => finite(s.values[j]));
118
+ }
119
+ return d.series.map((s) => ({ label: s.name, color: d.kind === 'line' ? s.lineColor : s.color, line: d.kind === 'line' }));
120
+ }
121
+ /** Lays out the legend and returns the plot box left for the chart. */
122
+ function legend(d, area, parts) {
123
+ const items = legendItems(d);
124
+ if (d.legend === 'none' || !items.length)
125
+ return area;
126
+ if (d.legend === 'right' && area.width >= 300) {
127
+ const longest = Math.max(...items.map((i) => i.label.length));
128
+ const w = Math.min(area.width * 0.32, 24 + longest * 6.2);
129
+ const rows = Math.max(1, Math.min(items.length, Math.floor(area.height / 16)));
130
+ const top = area.y + Math.max(0, (area.height - rows * 16) / 2);
131
+ const max = Math.floor((w - 20) / 6.2);
132
+ parts.push('<g class="sp-legend">');
133
+ items.slice(0, rows).forEach((it, i) => {
134
+ const y = top + i * 16, x = area.x + area.width - w + 6;
135
+ parts.push(`<rect x="${n2(x)}" y="${n2(y + 3)}" width="9" height="9" fill="${it.color}" rx="1"/><text x="${n2(x + 14)}" y="${n2(y + 11)}" font-size="11" style="${INK3}">${esc(clip(it.label, max))}</text>`);
136
+ });
137
+ parts.push('</g>');
138
+ return { x: area.x, y: area.y, width: area.width - w, height: area.height };
139
+ }
140
+ // bottom: one row, as many items as fit
141
+ const y = area.y + area.height - 14;
142
+ let x = area.x + 4;
143
+ parts.push('<g class="sp-legend">');
144
+ for (const it of items) {
145
+ const label = clip(it.label, 18), w = 20 + label.length * 6.2;
146
+ if (x + w > area.x + area.width)
147
+ break;
148
+ parts.push(`<rect x="${n2(x)}" y="${n2(y + 1)}" width="9" height="9" fill="${it.color}" rx="1"/><text x="${n2(x + 13)}" y="${n2(y + 9)}" font-size="11" style="${INK3}">${esc(label)}</text>`);
149
+ x += w + 8;
150
+ }
151
+ parts.push('</g>');
152
+ return { x: area.x, y: area.y, width: area.width, height: area.height - 20 };
153
+ }
154
+ /** Category labels along an axis, thinned so they do not overlap. */
155
+ function catLabels(cats, n, at, room, place) {
156
+ if (!n)
157
+ return '';
158
+ const longest = Math.max(1, ...cats.slice(0, n).map((c) => c.length));
159
+ const every = Math.max(1, Math.ceil((Math.min(longest, 14) * 6 + 6) / Math.max(1, room)));
160
+ const max = Math.max(3, Math.floor((room * every) / 6) - 1);
161
+ let out = '';
162
+ for (let j = 0; j < n; j += every)
163
+ out += place(at(j), clip(cats[j] ?? String(j + 1), max));
164
+ return out;
165
+ }
166
+ function valueLabelWidth(s, percent) {
167
+ return 10 + Math.max(...s.ticks.map((t) => formatNumber(t, percent).length)) * 6;
168
+ }
169
+ function barsAndLines(d, plot, parts) {
170
+ const n = catCount(d);
171
+ const st = d.kind !== 'line' || d.grouping !== 'standard' ? stacked(d.grouping) : false;
172
+ const vals = stackedValues(d.series, n, st ? d.grouping : 'clustered');
173
+ const flat = vals.flat().filter((v) => v.value !== null);
174
+ let lo = Math.min(0, ...flat.map((v) => Math.min(v.base, v.top))), hi = Math.max(0, ...flat.map((v) => Math.max(v.base, v.top)));
175
+ if (d.kind === 'line' && !st && flat.length)
176
+ [lo, hi] = withZero(Math.min(...flat.map((v) => v.top)), Math.max(...flat.map((v) => v.top)));
177
+ const percent = d.grouping === 'percentStacked' || d.percent;
178
+ const horizontal = d.kind === 'bar';
179
+ const len = horizontal ? plot.width : plot.height;
180
+ const sc = niceScale(lo, hi, Math.max(2, Math.min(10, Math.floor(len / 30))));
181
+ const left = horizontal ? plot.x + 4 + Math.min(plot.width * 0.35, 8 + Math.min(14, Math.max(1, ...d.cats.map((c) => c.length))) * 6) : plot.x + valueLabelWidth(sc, percent);
182
+ const bottom = plot.y + plot.height - 18;
183
+ const box = { x: left, y: plot.y + 4, width: Math.max(10, plot.x + plot.width - left - 8), height: Math.max(10, bottom - plot.y - 4) };
184
+ const v2p = (v) => horizontal ? box.x + ((v - sc.lo) / (sc.hi - sc.lo)) * box.width : box.y + box.height - ((v - sc.lo) / (sc.hi - sc.lo)) * box.height;
185
+ // value axis: gridlines and labels
186
+ parts.push(`<g class="sp-axis sp-axis-value" data-lo="${sc.lo}" data-hi="${sc.hi}">`);
187
+ for (const t of sc.ticks) {
188
+ const p = v2p(t);
189
+ if (horizontal)
190
+ parts.push(`<line class="sp-grid" x1="${n2(p)}" x2="${n2(p)}" y1="${n2(box.y)}" y2="${n2(box.y + box.height)}" style="${GRID}"/><text class="sp-tick" data-value="${t}" x="${n2(p)}" y="${n2(box.y + box.height + 13)}" font-size="10" text-anchor="middle" style="${INK3}">${esc(formatNumber(t, percent))}</text>`);
191
+ else
192
+ parts.push(`<line class="sp-grid" x1="${n2(box.x)}" x2="${n2(box.x + box.width)}" y1="${n2(p)}" y2="${n2(p)}" style="${GRID}"/><text class="sp-tick" data-value="${t}" x="${n2(box.x - 5)}" y="${n2(p + 3.5)}" font-size="10" text-anchor="end" style="${INK3}">${esc(formatNumber(t, percent))}</text>`);
193
+ }
194
+ parts.push('</g>');
195
+ // category axis
196
+ const catLen = (horizontal ? box.height : box.width) / Math.max(1, n);
197
+ const catMid = (j) => horizontal ? box.y + box.height - (j + 0.5) * catLen : box.x + (j + 0.5) * catLen;
198
+ const zero = v2p(Math.min(Math.max(0, sc.lo), sc.hi));
199
+ parts.push('<g class="sp-axis sp-axis-cat">');
200
+ parts.push(horizontal
201
+ ? `<line x1="${n2(zero)}" x2="${n2(zero)}" y1="${n2(box.y)}" y2="${n2(box.y + box.height)}" style="${AXIS}"/>`
202
+ : `<line x1="${n2(box.x)}" x2="${n2(box.x + box.width)}" y1="${n2(zero)}" y2="${n2(zero)}" style="${AXIS}"/>`);
203
+ parts.push(catLabels(d.cats, n, catMid, catLen, (pos, label) => horizontal
204
+ ? `<text class="sp-cat" x="${n2(box.x - 5)}" y="${n2(pos + 3.5)}" font-size="10" text-anchor="end" style="${INK3}">${esc(label)}</text>`
205
+ : `<text class="sp-cat" x="${n2(pos)}" y="${n2(box.y + box.height + 13)}" font-size="10" text-anchor="middle" style="${INK3}">${esc(label)}</text>`));
206
+ parts.push('</g>');
207
+ if (d.kind === 'line') {
208
+ d.series.forEach((s, i) => {
209
+ const pts = vals[i].map((v, j) => (v.value === null ? null : { x: catMid(j), y: v2p(v.top), v: v.value, j }));
210
+ let path = '', pen = false;
211
+ for (const p of pts) {
212
+ if (!p) {
213
+ pen = false;
214
+ continue;
215
+ }
216
+ path += `${pen ? 'L' : 'M'}${n2(p.x)} ${n2(p.y)}`;
217
+ pen = true;
218
+ }
219
+ parts.push(`<g class="sp-series" data-series="${i}">`);
220
+ if (path && !s.noLine)
221
+ parts.push(`<path class="sp-line" d="${path}" fill="none" stroke="${s.lineColor}" stroke-width="2" stroke-linejoin="round" stroke-linecap="round"/>`);
222
+ for (const p of pts)
223
+ if (p)
224
+ parts.push(`<circle class="sp-point" data-series="${i}" data-point="${p.j}" data-value="${p.v}" cx="${n2(p.x)}" cy="${n2(p.y)}" r="2.75" fill="${s.lineColor}"/>`);
225
+ parts.push('</g>');
226
+ });
227
+ return;
228
+ }
229
+ // bars
230
+ const gap = Math.max(0, d.gapWidth) / 100;
231
+ const k = st ? 1 : Math.max(1, d.series.length);
232
+ const thick = catLen / (k + gap);
233
+ d.series.forEach((s, i) => {
234
+ parts.push(`<g class="sp-series" data-series="${i}">`);
235
+ vals[i].forEach((v, j) => {
236
+ if (v.value === null)
237
+ return;
238
+ const a = v2p(v.base), b = v2p(v.top);
239
+ const offset = (thick * gap) / 2 + (st ? 0 : i * thick);
240
+ const fill = v.value < 0 ? `style="fill:${NEG}"` : `fill="${s.color}"`;
241
+ const common = `class="sp-bar" data-series="${i}" data-point="${j}" data-value="${v.value}" ${fill}`;
242
+ if (horizontal) {
243
+ const bandBottom = box.y + box.height - j * catLen;
244
+ parts.push(`<rect ${common} x="${n2(Math.min(a, b))}" y="${n2(bandBottom - offset - thick)}" width="${n2(Math.abs(b - a))}" height="${n2(thick)}"/>`);
245
+ }
246
+ else {
247
+ parts.push(`<rect ${common} x="${n2(box.x + j * catLen + offset)}" y="${n2(Math.min(a, b))}" width="${n2(thick)}" height="${n2(Math.abs(b - a))}"/>`);
248
+ }
249
+ });
250
+ parts.push('</g>');
251
+ });
252
+ }
253
+ /** A point on a circle: 0° at 12 o'clock, clockwise. */
254
+ const polar = (cx, cy, r, deg) => ({ x: cx + r * Math.sin((deg * Math.PI) / 180), y: cy - r * Math.cos((deg * Math.PI) / 180) });
255
+ function slicePath(cx, cy, r, inner, a0, a1) {
256
+ if (a1 - a0 >= 359.999) {
257
+ // a whole ring: two half arcs
258
+ const o = `M${n2(cx)} ${n2(cy - r)}A${n2(r)} ${n2(r)} 0 1 1 ${n2(cx)} ${n2(cy + r)}A${n2(r)} ${n2(r)} 0 1 1 ${n2(cx)} ${n2(cy - r)}Z`;
259
+ return inner > 0 ? `${o}M${n2(cx)} ${n2(cy - inner)}A${n2(inner)} ${n2(inner)} 0 1 0 ${n2(cx)} ${n2(cy + inner)}A${n2(inner)} ${n2(inner)} 0 1 0 ${n2(cx)} ${n2(cy - inner)}Z` : o;
260
+ }
261
+ const large = a1 - a0 > 180 ? 1 : 0;
262
+ const p0 = polar(cx, cy, r, a0), p1 = polar(cx, cy, r, a1);
263
+ if (inner <= 0)
264
+ return `M${n2(cx)} ${n2(cy)}L${n2(p0.x)} ${n2(p0.y)}A${n2(r)} ${n2(r)} 0 ${large} 1 ${n2(p1.x)} ${n2(p1.y)}Z`;
265
+ const q0 = polar(cx, cy, inner, a0), q1 = polar(cx, cy, inner, a1);
266
+ return `M${n2(p0.x)} ${n2(p0.y)}A${n2(r)} ${n2(r)} 0 ${large} 1 ${n2(p1.x)} ${n2(p1.y)}L${n2(q1.x)} ${n2(q1.y)}A${n2(inner)} ${n2(inner)} 0 ${large} 0 ${n2(q0.x)} ${n2(q0.y)}Z`;
267
+ }
268
+ function pie(d, plot, parts) {
269
+ const s = d.series[0];
270
+ if (!s)
271
+ return;
272
+ const total = s.values.reduce((t, v) => t + (finite(v) ? Math.abs(v) : 0), 0);
273
+ const cx = plot.x + plot.width / 2, cy = plot.y + plot.height / 2, r = Math.max(4, Math.min(plot.width, plot.height) / 2 - 6);
274
+ const inner = d.kind === 'doughnut' ? (r * Math.min(90, Math.max(10, d.holeSize))) / 100 : 0;
275
+ let a = d.firstSliceAng;
276
+ parts.push(`<g class="sp-series" data-series="0" data-cx="${n2(cx)}" data-cy="${n2(cy)}" data-r="${n2(r)}">`);
277
+ s.values.forEach((v, j) => {
278
+ if (!finite(v) || v === 0 || !total)
279
+ return;
280
+ const sweep = (Math.abs(v) / total) * 360;
281
+ parts.push(`<path class="sp-slice" data-series="0" data-point="${j}" data-value="${v}" data-start="${n2(a)}" data-end="${n2(a + sweep)}" d="${slicePath(cx, cy, r, inner, a, a + sweep)}" fill="${s.pointColors[j] ?? s.color}" fill-rule="evenodd" style="stroke:var(--sp-surface,#FFFFFF);stroke-width:1"/>`);
282
+ a += sweep;
283
+ });
284
+ parts.push('</g>');
285
+ }
286
+ function scatter(d, plot, parts) {
287
+ const pts = d.series.map((s) => s.values.map((y, j) => {
288
+ const x = s.xs ? s.xs[j] : j + 1;
289
+ return finite(y) && finite(x) ? { x, y, j } : null;
290
+ }));
291
+ const all = pts.flat().filter((p) => !!p);
292
+ const xs = all.map((p) => p.x), ys = all.map((p) => p.y);
293
+ const [xlo, xhi] = withZero(Math.min(...xs, Infinity), Math.max(...xs, -Infinity));
294
+ const [ylo, yhi] = withZero(Math.min(...ys, Infinity), Math.max(...ys, -Infinity));
295
+ const sy = niceScale(all.length ? ylo : 0, all.length ? yhi : 1, Math.max(2, Math.min(10, Math.floor(plot.height / 30))));
296
+ const left = plot.x + valueLabelWidth(sy, d.percent);
297
+ const box = { x: left, y: plot.y + 4, width: Math.max(10, plot.x + plot.width - left - 10), height: Math.max(10, plot.y + plot.height - 18 - plot.y - 4) };
298
+ const sx = niceScale(all.length ? xlo : 0, all.length ? xhi : 1, Math.max(2, Math.min(10, Math.floor(box.width / 60))));
299
+ const X = (v) => box.x + ((v - sx.lo) / (sx.hi - sx.lo)) * box.width;
300
+ const Y = (v) => box.y + box.height - ((v - sy.lo) / (sy.hi - sy.lo)) * box.height;
301
+ parts.push(`<g class="sp-axis sp-axis-value" data-lo="${sy.lo}" data-hi="${sy.hi}">`);
302
+ for (const t of sy.ticks)
303
+ parts.push(`<line class="sp-grid" x1="${n2(box.x)}" x2="${n2(box.x + box.width)}" y1="${n2(Y(t))}" y2="${n2(Y(t))}" style="${GRID}"/><text class="sp-tick" data-value="${t}" x="${n2(box.x - 5)}" y="${n2(Y(t) + 3.5)}" font-size="10" text-anchor="end" style="${INK3}">${esc(formatNumber(t, d.percent))}</text>`);
304
+ parts.push('</g>');
305
+ parts.push(`<g class="sp-axis sp-axis-x" data-lo="${sx.lo}" data-hi="${sx.hi}">`);
306
+ parts.push(`<line x1="${n2(box.x)}" x2="${n2(box.x + box.width)}" y1="${n2(box.y + box.height)}" y2="${n2(box.y + box.height)}" style="${AXIS}"/>`);
307
+ for (const t of sx.ticks)
308
+ parts.push(`<text class="sp-tick" data-value="${t}" x="${n2(X(t))}" y="${n2(box.y + box.height + 13)}" font-size="10" text-anchor="middle" style="${INK3}">${esc(formatNumber(t))}</text>`);
309
+ parts.push('</g>');
310
+ const lines = /line|smooth/i.test(d.scatterStyle);
311
+ const markers = !/^(line|smooth)$/i.test(d.scatterStyle);
312
+ d.series.forEach((s, i) => {
313
+ parts.push(`<g class="sp-series" data-series="${i}">`);
314
+ const ps = pts[i].filter((p) => !!p);
315
+ if (lines && !s.noLine && ps.length > 1)
316
+ parts.push(`<path class="sp-line" d="${ps.map((p, k) => `${k ? 'L' : 'M'}${n2(X(p.x))} ${n2(Y(p.y))}`).join('')}" fill="none" stroke="${s.lineColor}" stroke-width="2"/>`);
317
+ for (const p of ps)
318
+ parts.push(`<circle class="sp-point" data-series="${i}" data-point="${p.j}" data-value="${p.y}" data-x="${p.x}" cx="${n2(X(p.x))}" cy="${n2(Y(p.y))}" r="${markers ? 3 : 0}" fill="${s.color}"/>`);
319
+ parts.push('</g>');
320
+ });
321
+ }
322
+ /** The note a frame carries once a plotted cell was changed. */
323
+ export const CHANGED_TAG = 'data changed — Excel will redraw';
324
+ const TAG_W = 14 + CHANGED_TAG.length * 5.6;
325
+ /**
326
+ * The title band: the title in bold (the frame's HTML button sits to its right), the type and
327
+ * series count under it, then — once a plotted cell changed — the tag, on the same line when it
328
+ * fits, else on a line of its own. Returns the markup and where the plot may start.
329
+ */
330
+ export function titleBand(title, meta, width, changed = false) {
331
+ const t = clip(title, Math.max(8, Math.floor((width - 140) / 7.4)));
332
+ const m = clip(meta, Math.max(8, Math.floor((width - 16) / 6.2)));
333
+ let svg = `<text class="sp-chart-title" x="8" y="18" font-size="13" font-weight="600" style="${INK}">${esc(t)}</text>`
334
+ + `<text class="sp-chart-meta" x="8" y="34" font-size="11" style="${INK3}">${esc(m)}</text>`;
335
+ let bottom = HEAD;
336
+ if (changed) {
337
+ const after = 8 + m.length * 6.2 + 10;
338
+ const inline = after + TAG_W <= width - 6;
339
+ const x = inline ? after : 8, y = inline ? 23 : 41;
340
+ if (!inline)
341
+ bottom += 20;
342
+ svg += `<g class="sp-chart-tag"><rect x="${n2(x)}" y="${y}" width="${n2(TAG_W)}" height="16" rx="8" style="fill:var(--sp-changed-soft,#FDF1E3)"/>`
343
+ + `<text x="${n2(x + 7)}" y="${y + 11.5}" font-size="10" font-weight="500" style="fill:var(--sp-changed,#C46A00)">${esc(CHANGED_TAG)}</text></g>`;
344
+ }
345
+ return { svg, bottom };
346
+ }
347
+ const svgOpen = (w, h, label, attrs) => `<svg xmlns="http://www.w3.org/2000/svg" class="sp-chart-svg" viewBox="0 0 ${n2(w)} ${n2(h)}" width="100%" height="100%" preserveAspectRatio="xMidYMid meet" role="img" aria-label="${esc(label)}" ${attrs} style="display:block;overflow:hidden"><title>${esc(label)}</title>`;
348
+ /**
349
+ * Stage 2: the whole drawn chart as SVG markup, `width` × `height` in px at 100 % zoom. No font is named; every
350
+ * file string is escaped.
351
+ *
352
+ * @param d - What to draw.
353
+ * @param title - The chart's title.
354
+ * @param meta - The line under the title, e.g. `bar · 2 series`.
355
+ * @param width - Width in px.
356
+ * @param height - Height in px.
357
+ * @param attrs - Extra attributes for the `<svg>` element.
358
+ * @param changed - Show the "data changed — Excel will redraw" tag.
359
+ * @returns The `<svg>` markup.
360
+ */
361
+ export function drawChart(d, title, meta, width, height, attrs = '', changed = false) {
362
+ const band = titleBand(title, meta, width, changed);
363
+ const parts = [svgOpen(width, height, title, `data-kind="${d.kind}" data-stage="2" ${attrs}`), band.svg];
364
+ const area = { x: 4, y: band.bottom, width: Math.max(10, width - 8), height: Math.max(10, height - band.bottom - 4) };
365
+ const plot = legend(d, area, parts);
366
+ parts.push('<g class="sp-plot">');
367
+ if (d.kind === 'pie' || d.kind === 'doughnut')
368
+ pie(d, plot, parts);
369
+ else if (d.kind === 'scatter')
370
+ scatter(d, plot, parts);
371
+ else
372
+ barsAndLines(d, plot, parts);
373
+ parts.push('</g></svg>');
374
+ return parts.join('');
375
+ }
376
+ /**
377
+ * Stage 1: the frame's content as SVG markup — title, type and series count, and as many of `lines` as fit under it.
378
+ *
379
+ * @param title - The chart's title.
380
+ * @param meta - The line under the title, e.g. `bar · 2 series`.
381
+ * @param lines - The lines to list (why it is not drawn, each series and the cells it reads).
382
+ * @param width - Width in px.
383
+ * @param height - Height in px.
384
+ * @param attrs - Extra attributes for the `<svg>` element.
385
+ * @param changed - Show the "data changed — Excel will redraw" tag.
386
+ * @returns The `<svg>` markup.
387
+ */
388
+ export function frameSvg(title, meta, lines, width, height, attrs = '', changed = false) {
389
+ const band = titleBand(title, meta, width, changed);
390
+ const parts = [svgOpen(width, height, title, `data-stage="1" ${attrs}`), band.svg];
391
+ const max = Math.max(4, Math.floor((width - 16) / 6.3));
392
+ lines.slice(0, Math.max(0, Math.floor((height - band.bottom - 6) / 16))).forEach((l, i) => {
393
+ parts.push(`<text class="sp-chart-line" x="8" y="${n2(band.bottom + 14 + i * 16)}" font-size="11" style="${INK3}">${esc(clip(l, max))}</text>`);
394
+ });
395
+ parts.push('</svg>');
396
+ return parts.join('');
397
+ }
398
+ //# sourceMappingURL=svg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.js","sourceRoot":"","sources":["../src/svg.ts"],"names":[],"mappings":"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"}
package/dist/ui.d.ts ADDED
@@ -0,0 +1,69 @@
1
+ import { type Plugin, type Selection, type Snapshot, type WorkbookStore } from '@sheetpane/grid';
2
+ import { type ChartsOptions } from './index.js';
3
+ import { type SourceRange } from './refs.js';
4
+ import type { ChartModel } from './model.js';
5
+ /** The controls plugin's id. */
6
+ export declare const UI_ID = "charts-ui";
7
+ /** The keyboard shortcut for Show source cells. */
8
+ export declare const SHORTCUT = "Mod+Shift+U";
9
+ /**
10
+ * The ranges a chart reads, categories before values — the order the status line names them in.
11
+ *
12
+ * @param m - The chart model.
13
+ * @returns The ranges, without duplicates.
14
+ */
15
+ export declare function sourceList(m: ChartModel): SourceRange[];
16
+ /**
17
+ * The status line's text for a selection: `Chart source: Holdings!E3:E15, H3:H15` while it lies in a chart's plotted
18
+ * cells or under its frame, else `2 charts` on a sheet that has some. Charts not yet read count, but cannot be named.
19
+ *
20
+ * @param snap - A snapshot of the store.
21
+ * @param sel - The selection.
22
+ * @returns The text, or `''`.
23
+ */
24
+ export declare function statusText(snap: Snapshot, sel: Selection): string;
25
+ /**
26
+ * The chart the shortcut acts on: the one over the active cell, else the sheet's only chart.
27
+ *
28
+ * @param store - The workbook store.
29
+ * @param sel - The selection.
30
+ * @returns The chart part's path, or `undefined`.
31
+ */
32
+ export declare function targetChart(store: WorkbookStore, sel: Selection): string | undefined;
33
+ /**
34
+ * The charts controls: no hooks; a status line naming the source of the chart under the selection (or the sheet's
35
+ * chart count), and Mod+Shift+U for Show source cells — the keyboard route to each frame's button. Pair it with
36
+ * {@link charts}; importing this module makes `plugins="charts"` enable both.
37
+ *
38
+ * @returns The controls plugin (`id: 'charts-ui'`).
39
+ * @see https://github.com/arpitarya/sheetpane/blob/main/records/0113_CHARTS.md
40
+ * @example
41
+ * ```ts
42
+ * import { createWorkbook } from '@sheetpane/grid';
43
+ * import { charts } from '@sheetpane/charts';
44
+ * import { ui } from '@sheetpane/charts/ui';
45
+ *
46
+ * const book = createWorkbook({ plugins: [charts(), ui()] });
47
+ * ```
48
+ * @example
49
+ * ```ts
50
+ * import '@sheetpane/charts/ui'; // registers `charts` with its controls
51
+ * excel.setAttribute('plugins', 'charts');
52
+ * ```
53
+ */
54
+ export declare function ui(): Plugin;
55
+ /**
56
+ * The charts plugin and its controls together.
57
+ *
58
+ * @param o - The charts plugin's options.
59
+ * @returns `[charts(o), ui()]`.
60
+ * @example
61
+ * ```ts
62
+ * import { createWorkbook } from '@sheetpane/grid';
63
+ * import { chartsWithUi } from '@sheetpane/charts/ui';
64
+ *
65
+ * const book = createWorkbook({ plugins: chartsWithUi({ draw: false }) });
66
+ * ```
67
+ */
68
+ export declare function chartsWithUi(o?: ChartsOptions): Plugin[];
69
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAcA,OAAO,EAA0C,KAAK,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACzI,OAAO,EAAoE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAClH,OAAO,EAA6D,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACxG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,gCAAgC;AAChC,eAAO,MAAM,KAAK,cAAc,CAAC;AACjC,mDAAmD;AACnD,eAAO,MAAM,QAAQ,gBAAgB,CAAC;AAEtC;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,GAAG,WAAW,EAAE,CAEvD;AAiBD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,MAAM,CAcjE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAMpF;AAiBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,EAAE,IAAI,MAAM,CAE3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,CAAC,GAAE,aAAkB,GAAG,MAAM,EAAE,CAE5D"}