@joewinke/jatui 0.37.0 → 0.38.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/artifact-blocks/AttachmentChip.svelte +66 -0
- package/dist/artifact-blocks/AttachmentChip.svelte.d.ts +7 -0
- package/dist/artifact-blocks/BlockComments.svelte +309 -0
- package/dist/artifact-blocks/BlockComments.svelte.d.ts +33 -0
- package/dist/artifact-blocks/BlockRenderer.svelte +674 -0
- package/dist/artifact-blocks/BlockRenderer.svelte.d.ts +55 -0
- package/dist/artifact-blocks/BlockVerdict.svelte +151 -0
- package/dist/artifact-blocks/BlockVerdict.svelte.d.ts +13 -0
- package/dist/artifact-blocks/BlocksArtifactView.svelte +1616 -0
- package/dist/artifact-blocks/BlocksArtifactView.svelte.d.ts +113 -0
- package/dist/artifact-blocks/CONTRACT.md +225 -0
- package/dist/artifact-blocks/CommentPill.svelte +49 -0
- package/dist/artifact-blocks/CommentPill.svelte.d.ts +16 -0
- package/dist/artifact-blocks/FoldedRounds.svelte +95 -0
- package/dist/artifact-blocks/FoldedRounds.svelte.d.ts +9 -0
- package/dist/artifact-blocks/Glyph.svelte +54 -0
- package/dist/artifact-blocks/Glyph.svelte.d.ts +10 -0
- package/dist/artifact-blocks/HistoryScrubber.svelte +500 -0
- package/dist/artifact-blocks/HistoryScrubber.svelte.d.ts +15 -0
- package/dist/artifact-blocks/Markdown.svelte +186 -0
- package/dist/artifact-blocks/Markdown.svelte.d.ts +30 -0
- package/dist/artifact-blocks/NoteComposer.svelte +31 -0
- package/dist/artifact-blocks/NoteComposer.svelte.d.ts +8 -0
- package/dist/artifact-blocks/PlainComposer.svelte +200 -0
- package/dist/artifact-blocks/PlainComposer.svelte.d.ts +15 -0
- package/dist/artifact-blocks/SectionTools.svelte +102 -0
- package/dist/artifact-blocks/SectionTools.svelte.d.ts +19 -0
- package/dist/artifact-blocks/adapter.d.ts +13 -0
- package/dist/artifact-blocks/adapter.js +31 -0
- package/dist/artifact-blocks/autoSend.d.ts +49 -0
- package/dist/artifact-blocks/autoSend.js +103 -0
- package/dist/artifact-blocks/blocks/actions/ActionsBlock.svelte +557 -0
- package/dist/artifact-blocks/blocks/actions/ActionsBlock.svelte.d.ts +48 -0
- package/dist/artifact-blocks/blocks/actions/block.d.ts +8 -0
- package/dist/artifact-blocks/blocks/actions/block.js +74 -0
- package/dist/artifact-blocks/blocks/actions/requests.d.ts +62 -0
- package/dist/artifact-blocks/blocks/actions/requests.js +26 -0
- package/dist/artifact-blocks/blocks/actions/schema.d.ts +168 -0
- package/dist/artifact-blocks/blocks/actions/schema.js +253 -0
- package/dist/artifact-blocks/blocks/callout/CalloutBlock.svelte +779 -0
- package/dist/artifact-blocks/blocks/callout/CalloutBlock.svelte.d.ts +40 -0
- package/dist/artifact-blocks/blocks/callout/block.d.ts +7 -0
- package/dist/artifact-blocks/blocks/callout/block.js +39 -0
- package/dist/artifact-blocks/blocks/callout/schema.d.ts +72 -0
- package/dist/artifact-blocks/blocks/callout/schema.js +115 -0
- package/dist/artifact-blocks/blocks/chart/ChartBlock.svelte +875 -0
- package/dist/artifact-blocks/blocks/chart/ChartBlock.svelte.d.ts +59 -0
- package/dist/artifact-blocks/blocks/chart/block.d.ts +9 -0
- package/dist/artifact-blocks/blocks/chart/block.js +70 -0
- package/dist/artifact-blocks/blocks/chart/schema.d.ts +171 -0
- package/dist/artifact-blocks/blocks/chart/schema.js +498 -0
- package/dist/artifact-blocks/blocks/chart/thumb.d.ts +2 -0
- package/dist/artifact-blocks/blocks/chart/thumb.js +201 -0
- package/dist/artifact-blocks/blocks/checklist/ChecklistBlock.svelte +1048 -0
- package/dist/artifact-blocks/blocks/checklist/ChecklistBlock.svelte.d.ts +16 -0
- package/dist/artifact-blocks/blocks/checklist/Icon.svelte +105 -0
- package/dist/artifact-blocks/blocks/checklist/Icon.svelte.d.ts +17 -0
- package/dist/artifact-blocks/blocks/checklist/block.d.ts +10 -0
- package/dist/artifact-blocks/blocks/checklist/block.js +63 -0
- package/dist/artifact-blocks/blocks/checklist/itemReview.d.ts +16 -0
- package/dist/artifact-blocks/blocks/checklist/itemReview.js +63 -0
- package/dist/artifact-blocks/blocks/checklist/labels.d.ts +62 -0
- package/dist/artifact-blocks/blocks/checklist/labels.js +96 -0
- package/dist/artifact-blocks/blocks/checklist/retest.d.ts +43 -0
- package/dist/artifact-blocks/blocks/checklist/retest.js +68 -0
- package/dist/artifact-blocks/blocks/checklist/schema.d.ts +84 -0
- package/dist/artifact-blocks/blocks/checklist/schema.js +91 -0
- package/dist/artifact-blocks/blocks/code/CodeBlock.svelte +128 -0
- package/dist/artifact-blocks/blocks/code/CodeBlock.svelte.d.ts +12 -0
- package/dist/artifact-blocks/blocks/code/block.d.ts +8 -0
- package/dist/artifact-blocks/blocks/code/block.js +31 -0
- package/dist/artifact-blocks/blocks/code/highlight.d.ts +34 -0
- package/dist/artifact-blocks/blocks/code/highlight.js +280 -0
- package/dist/artifact-blocks/blocks/code/schema.d.ts +32 -0
- package/dist/artifact-blocks/blocks/code/schema.js +39 -0
- package/dist/artifact-blocks/blocks/collage/CollageBlock.svelte +290 -0
- package/dist/artifact-blocks/blocks/collage/CollageBlock.svelte.d.ts +29 -0
- package/dist/artifact-blocks/blocks/collage/block.d.ts +9 -0
- package/dist/artifact-blocks/blocks/collage/block.js +29 -0
- package/dist/artifact-blocks/blocks/collage/schema.d.ts +52 -0
- package/dist/artifact-blocks/blocks/collage/schema.js +86 -0
- package/dist/artifact-blocks/blocks/compare/CompareBlock.svelte +484 -0
- package/dist/artifact-blocks/blocks/compare/CompareBlock.svelte.d.ts +25 -0
- package/dist/artifact-blocks/blocks/compare/block.d.ts +9 -0
- package/dist/artifact-blocks/blocks/compare/block.js +32 -0
- package/dist/artifact-blocks/blocks/compare/schema.d.ts +74 -0
- package/dist/artifact-blocks/blocks/compare/schema.js +148 -0
- package/dist/artifact-blocks/blocks/diagram/DiagramBlock.svelte +392 -0
- package/dist/artifact-blocks/blocks/diagram/DiagramBlock.svelte.d.ts +30 -0
- package/dist/artifact-blocks/blocks/diagram/block.d.ts +9 -0
- package/dist/artifact-blocks/blocks/diagram/block.js +50 -0
- package/dist/artifact-blocks/blocks/diagram/constants.d.ts +48 -0
- package/dist/artifact-blocks/blocks/diagram/constants.js +53 -0
- package/dist/artifact-blocks/blocks/diagram/schema.d.ts +161 -0
- package/dist/artifact-blocks/blocks/diagram/schema.js +621 -0
- package/dist/artifact-blocks/blocks/diagram/thumb.d.ts +2 -0
- package/dist/artifact-blocks/blocks/diagram/thumb.js +157 -0
- package/dist/artifact-blocks/blocks/diagram/types.d.ts +74 -0
- package/dist/artifact-blocks/blocks/diagram/types.js +1 -0
- package/dist/artifact-blocks/blocks/diff/DiffBlock.svelte +81 -0
- package/dist/artifact-blocks/blocks/diff/DiffBlock.svelte.d.ts +10 -0
- package/dist/artifact-blocks/blocks/diff/block.d.ts +7 -0
- package/dist/artifact-blocks/blocks/diff/block.js +36 -0
- package/dist/artifact-blocks/blocks/diff/schema.d.ts +18 -0
- package/dist/artifact-blocks/blocks/diff/schema.js +35 -0
- package/dist/artifact-blocks/blocks/diff-review/DiffReviewBlock.svelte +1055 -0
- package/dist/artifact-blocks/blocks/diff-review/DiffReviewBlock.svelte.d.ts +5 -0
- package/dist/artifact-blocks/blocks/diff-review/block.d.ts +15 -0
- package/dist/artifact-blocks/blocks/diff-review/block.js +64 -0
- package/dist/artifact-blocks/blocks/diff-review/decisions.d.ts +57 -0
- package/dist/artifact-blocks/blocks/diff-review/decisions.js +80 -0
- package/dist/artifact-blocks/blocks/diff-review/schema.d.ts +13 -0
- package/dist/artifact-blocks/blocks/diff-review/schema.js +84 -0
- package/dist/artifact-blocks/blocks/diff-review/types.d.ts +35 -0
- package/dist/artifact-blocks/blocks/diff-review/types.js +1 -0
- package/dist/artifact-blocks/blocks/explainer/ExplainerBlock.svelte +145 -0
- package/dist/artifact-blocks/blocks/explainer/ExplainerBlock.svelte.d.ts +5 -0
- package/dist/artifact-blocks/blocks/explainer/block.d.ts +8 -0
- package/dist/artifact-blocks/blocks/explainer/block.js +21 -0
- package/dist/artifact-blocks/blocks/explainer/schema.d.ts +26 -0
- package/dist/artifact-blocks/blocks/explainer/schema.js +69 -0
- package/dist/artifact-blocks/blocks/group-content.d.ts +10 -0
- package/dist/artifact-blocks/blocks/group-content.js +16 -0
- package/dist/artifact-blocks/blocks/group-data.d.ts +10 -0
- package/dist/artifact-blocks/blocks/group-data.js +7 -0
- package/dist/artifact-blocks/blocks/group-review.d.ts +10 -0
- package/dist/artifact-blocks/blocks/group-review.js +12 -0
- package/dist/artifact-blocks/blocks/group-visual.d.ts +17 -0
- package/dist/artifact-blocks/blocks/group-visual.js +14 -0
- package/dist/artifact-blocks/blocks/map/MapBlock.svelte +413 -0
- package/dist/artifact-blocks/blocks/map/MapBlock.svelte.d.ts +53 -0
- package/dist/artifact-blocks/blocks/map/block.d.ts +9 -0
- package/dist/artifact-blocks/blocks/map/block.js +62 -0
- package/dist/artifact-blocks/blocks/map/schema.d.ts +123 -0
- package/dist/artifact-blocks/blocks/map/schema.js +113 -0
- package/dist/artifact-blocks/blocks/map/thumb.d.ts +2 -0
- package/dist/artifact-blocks/blocks/map/thumb.js +69 -0
- package/dist/artifact-blocks/blocks/markdown/MarkdownBlock.svelte +33 -0
- package/dist/artifact-blocks/blocks/markdown/MarkdownBlock.svelte.d.ts +15 -0
- package/dist/artifact-blocks/blocks/markdown/block.d.ts +7 -0
- package/dist/artifact-blocks/blocks/markdown/block.js +28 -0
- package/dist/artifact-blocks/blocks/markdown/render.d.ts +17 -0
- package/dist/artifact-blocks/blocks/markdown/render.js +115 -0
- package/dist/artifact-blocks/blocks/markdown/schema.d.ts +10 -0
- package/dist/artifact-blocks/blocks/markdown/schema.js +23 -0
- package/dist/artifact-blocks/blocks/media-picker/MediaPickerBlock.svelte +2112 -0
- package/dist/artifact-blocks/blocks/media-picker/MediaPickerBlock.svelte.d.ts +5 -0
- package/dist/artifact-blocks/blocks/media-picker/block.d.ts +24 -0
- package/dist/artifact-blocks/blocks/media-picker/block.js +137 -0
- package/dist/artifact-blocks/blocks/media-picker/choices.d.ts +28 -0
- package/dist/artifact-blocks/blocks/media-picker/choices.js +35 -0
- package/dist/artifact-blocks/blocks/media-picker/decisions.d.ts +51 -0
- package/dist/artifact-blocks/blocks/media-picker/decisions.js +75 -0
- package/dist/artifact-blocks/blocks/media-picker/schema.d.ts +7 -0
- package/dist/artifact-blocks/blocks/media-picker/schema.js +199 -0
- package/dist/artifact-blocks/blocks/media-picker/types.d.ts +92 -0
- package/dist/artifact-blocks/blocks/media-picker/types.js +1 -0
- package/dist/artifact-blocks/blocks/media-picker/versions.d.ts +51 -0
- package/dist/artifact-blocks/blocks/media-picker/versions.js +118 -0
- package/dist/artifact-blocks/blocks/mockup/MockupBlock.svelte +213 -0
- package/dist/artifact-blocks/blocks/mockup/MockupBlock.svelte.d.ts +5 -0
- package/dist/artifact-blocks/blocks/mockup/block.d.ts +26 -0
- package/dist/artifact-blocks/blocks/mockup/block.js +52 -0
- package/dist/artifact-blocks/blocks/mockup/doc.d.ts +24 -0
- package/dist/artifact-blocks/blocks/mockup/doc.js +44 -0
- package/dist/artifact-blocks/blocks/mockup/sandbox.d.ts +21 -0
- package/dist/artifact-blocks/blocks/mockup/sandbox.js +27 -0
- package/dist/artifact-blocks/blocks/mockup/schema.d.ts +7 -0
- package/dist/artifact-blocks/blocks/mockup/schema.js +90 -0
- package/dist/artifact-blocks/blocks/mockup/types.d.ts +36 -0
- package/dist/artifact-blocks/blocks/mockup/types.js +17 -0
- package/dist/artifact-blocks/blocks/program/ProgramBlock.svelte +359 -0
- package/dist/artifact-blocks/blocks/program/ProgramBlock.svelte.d.ts +32 -0
- package/dist/artifact-blocks/blocks/program/block.d.ts +35 -0
- package/dist/artifact-blocks/blocks/program/block.js +68 -0
- package/dist/artifact-blocks/blocks/program/schema.d.ts +132 -0
- package/dist/artifact-blocks/blocks/program/schema.js +268 -0
- package/dist/artifact-blocks/blocks/stats/StatsBlock.svelte +315 -0
- package/dist/artifact-blocks/blocks/stats/StatsBlock.svelte.d.ts +24 -0
- package/dist/artifact-blocks/blocks/stats/block.d.ts +7 -0
- package/dist/artifact-blocks/blocks/stats/block.js +49 -0
- package/dist/artifact-blocks/blocks/stats/schema.d.ts +82 -0
- package/dist/artifact-blocks/blocks/stats/schema.js +43 -0
- package/dist/artifact-blocks/blocks/stats/thumb.d.ts +2 -0
- package/dist/artifact-blocks/blocks/stats/thumb.js +102 -0
- package/dist/artifact-blocks/blocks/table/TableBlock.svelte +490 -0
- package/dist/artifact-blocks/blocks/table/TableBlock.svelte.d.ts +28 -0
- package/dist/artifact-blocks/blocks/table/block.d.ts +9 -0
- package/dist/artifact-blocks/blocks/table/block.js +100 -0
- package/dist/artifact-blocks/blocks/table/schema.d.ts +143 -0
- package/dist/artifact-blocks/blocks/table/schema.js +278 -0
- package/dist/artifact-blocks/blocks/timeline/TimelineBlock.svelte +347 -0
- package/dist/artifact-blocks/blocks/timeline/TimelineBlock.svelte.d.ts +42 -0
- package/dist/artifact-blocks/blocks/timeline/block.d.ts +9 -0
- package/dist/artifact-blocks/blocks/timeline/block.js +96 -0
- package/dist/artifact-blocks/blocks/timeline/constants.d.ts +26 -0
- package/dist/artifact-blocks/blocks/timeline/constants.js +27 -0
- package/dist/artifact-blocks/blocks/timeline/schema.d.ts +102 -0
- package/dist/artifact-blocks/blocks/timeline/schema.js +405 -0
- package/dist/artifact-blocks/blocks/timeline/thumb.d.ts +2 -0
- package/dist/artifact-blocks/blocks/timeline/thumb.js +117 -0
- package/dist/artifact-blocks/blocks/timeline/types.d.ts +66 -0
- package/dist/artifact-blocks/blocks/timeline/types.js +1 -0
- package/dist/artifact-blocks/blocks/transcript/TranscriptBlock.svelte +169 -0
- package/dist/artifact-blocks/blocks/transcript/TranscriptBlock.svelte.d.ts +26 -0
- package/dist/artifact-blocks/blocks/transcript/block.d.ts +9 -0
- package/dist/artifact-blocks/blocks/transcript/block.js +86 -0
- package/dist/artifact-blocks/blocks/transcript/schema.d.ts +114 -0
- package/dist/artifact-blocks/blocks/transcript/schema.js +126 -0
- package/dist/artifact-blocks/builtins.d.ts +40 -0
- package/dist/artifact-blocks/builtins.js +22 -0
- package/dist/artifact-blocks/contractBlocks.d.ts +92 -0
- package/dist/artifact-blocks/contractBlocks.js +279 -0
- package/dist/artifact-blocks/history.d.ts +140 -0
- package/dist/artifact-blocks/history.js +363 -0
- package/dist/artifact-blocks/index.d.ts +40 -0
- package/dist/artifact-blocks/index.js +46 -0
- package/dist/artifact-blocks/listen/context.d.ts +30 -0
- package/dist/artifact-blocks/listen/context.js +30 -0
- package/dist/artifact-blocks/liveData.d.ts +78 -0
- package/dist/artifact-blocks/liveData.js +137 -0
- package/dist/artifact-blocks/liveDataPoller.d.ts +41 -0
- package/dist/artifact-blocks/liveDataPoller.js +140 -0
- package/dist/artifact-blocks/openNav.d.ts +46 -0
- package/dist/artifact-blocks/openNav.js +106 -0
- package/dist/artifact-blocks/pageReviewKeys.d.ts +17 -0
- package/dist/artifact-blocks/pageReviewKeys.js +115 -0
- package/dist/artifact-blocks/params.d.ts +98 -0
- package/dist/artifact-blocks/params.js +159 -0
- package/dist/artifact-blocks/registry.d.ts +27 -0
- package/dist/artifact-blocks/registry.js +83 -0
- package/dist/artifact-blocks/review/BlockIcon.svelte +99 -0
- package/dist/artifact-blocks/review/BlockIcon.svelte.d.ts +17 -0
- package/dist/artifact-blocks/review/BulkRejectForm.svelte +94 -0
- package/dist/artifact-blocks/review/BulkRejectForm.svelte.d.ts +11 -0
- package/dist/artifact-blocks/review/BulkUndoBar.svelte +40 -0
- package/dist/artifact-blocks/review/BulkUndoBar.svelte.d.ts +9 -0
- package/dist/artifact-blocks/review/ItemNote.svelte +193 -0
- package/dist/artifact-blocks/review/ItemNote.svelte.d.ts +33 -0
- package/dist/artifact-blocks/review/NoteToggle.svelte +52 -0
- package/dist/artifact-blocks/review/NoteToggle.svelte.d.ts +12 -0
- package/dist/artifact-blocks/review/TeamChip.svelte +71 -0
- package/dist/artifact-blocks/review/TeamChip.svelte.d.ts +8 -0
- package/dist/artifact-blocks/review/attachments.d.ts +10 -0
- package/dist/artifact-blocks/review/attachments.js +37 -0
- package/dist/artifact-blocks/review/bulk.d.ts +52 -0
- package/dist/artifact-blocks/review/bulk.js +61 -0
- package/dist/artifact-blocks/review/itemReview.d.ts +33 -0
- package/dist/artifact-blocks/review/itemReview.js +112 -0
- package/dist/artifact-blocks/review/roundLines.d.ts +14 -0
- package/dist/artifact-blocks/review/roundLines.js +20 -0
- package/dist/artifact-blocks/review/rounds.d.ts +86 -0
- package/dist/artifact-blocks/review/rounds.js +302 -0
- package/dist/artifact-blocks/review/saver.d.ts +23 -0
- package/dist/artifact-blocks/review/saver.js +48 -0
- package/dist/artifact-blocks/review/team.d.ts +31 -0
- package/dist/artifact-blocks/review/team.js +42 -0
- package/dist/artifact-blocks/review/visualOrder.d.ts +29 -0
- package/dist/artifact-blocks/review/visualOrder.js +66 -0
- package/dist/artifact-blocks/review.d.ts +180 -0
- package/dist/artifact-blocks/review.js +716 -0
- package/dist/artifact-blocks/thumb-kit.d.ts +80 -0
- package/dist/artifact-blocks/thumb-kit.js +149 -0
- package/dist/artifact-blocks/types.d.ts +513 -0
- package/dist/artifact-blocks/types.js +1 -0
- package/package.json +11 -2
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chart block thumbnail composer (mos-qkpva) — the simplified static SVG the
|
|
3
|
+
* /admin/artifacts list shows when a chart is the artifact's first visual
|
|
4
|
+
* block.
|
|
5
|
+
*
|
|
6
|
+
* Same geometry source as ChartBlock.svelte — normalizeChart, linearTicks,
|
|
7
|
+
* valueDomain and stackByX live in ./schema.ts (pure, unit-tested), and this
|
|
8
|
+
* composer consumes them exactly like the component does — but the DRAWING
|
|
9
|
+
* is a silhouette: recessive grid, honest zero baseline, series marks, y-tick
|
|
10
|
+
* labels and goal lines. No title, legend, end labels, annotations or
|
|
11
|
+
* tooltips: at ~64×40 a thumbnail communicates "this row is a chart", and
|
|
12
|
+
* every line of output is paid for again by the list payload cap.
|
|
13
|
+
*
|
|
14
|
+
* Colors arrive as the resolved ThumbPalette (concrete values); series ride
|
|
15
|
+
* the --chart-series-1..6 contract via palette.series. Output is XML-clean
|
|
16
|
+
* (every element closed, attributes quoted) so it parses as a standalone
|
|
17
|
+
* data:image/svg+xml document; sanitizeSvg runs on it afterwards regardless.
|
|
18
|
+
*/
|
|
19
|
+
import { chartSchema, normalizeChart, linearTicks, valueDomain, stackByX, } from "./schema.js";
|
|
20
|
+
import { r1, thumbText, thumbTruncate, } from "../../thumb-kit.js";
|
|
21
|
+
const W = 640;
|
|
22
|
+
const H = 280;
|
|
23
|
+
const PAD_T = 16;
|
|
24
|
+
const PAD_B = 26;
|
|
25
|
+
const PAD_L = 52;
|
|
26
|
+
const PAD_R = 14;
|
|
27
|
+
const PLOT_W = W - PAD_L - PAD_R;
|
|
28
|
+
const PLOT_H = H - PAD_T - PAD_B;
|
|
29
|
+
export function drawChartThumb(raw, palette) {
|
|
30
|
+
const parsed = chartSchema.safeParse(raw);
|
|
31
|
+
if (!parsed.success)
|
|
32
|
+
return null;
|
|
33
|
+
const params = parsed.data;
|
|
34
|
+
const norm = normalizeChart(params);
|
|
35
|
+
if (norm.series.length === 0 || norm.xNums.length === 0)
|
|
36
|
+
return null;
|
|
37
|
+
const stacked = params.stacked &&
|
|
38
|
+
(params.chartType === "bar" || params.chartType === "area");
|
|
39
|
+
// ── value domain (mirrors the component: stacked sums + goal lines) ──
|
|
40
|
+
const vals = [];
|
|
41
|
+
if (stacked) {
|
|
42
|
+
// stackByX over the left-axis series (dual-axis stacks are rare and the
|
|
43
|
+
// thumbnail keeps one scale — the component draws per-axis; the silhouette
|
|
44
|
+
// does not need the second).
|
|
45
|
+
const leftIdx = norm.series
|
|
46
|
+
.map((s, i) => (s.axis === "left" ? i : -1))
|
|
47
|
+
.filter((i) => i >= 0);
|
|
48
|
+
for (const segs of stackByX(leftIdx.map((i) => norm.series[i].points)))
|
|
49
|
+
for (const seg of segs) {
|
|
50
|
+
vals.push(seg.y0, seg.y1);
|
|
51
|
+
}
|
|
52
|
+
for (const s of norm.series)
|
|
53
|
+
if (s.axis === "right")
|
|
54
|
+
for (const p of s.points)
|
|
55
|
+
vals.push(p.y);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
for (const s of norm.series)
|
|
59
|
+
for (const p of s.points)
|
|
60
|
+
vals.push(p.y);
|
|
61
|
+
}
|
|
62
|
+
for (const g of params.goalLines)
|
|
63
|
+
vals.push(g.value);
|
|
64
|
+
const scale = linearTicks(...valueDomain(vals, params.chartType, {
|
|
65
|
+
yMin: params.yMin,
|
|
66
|
+
yMax: params.yMax,
|
|
67
|
+
}), 4);
|
|
68
|
+
const [d0, d1] = scale.domain;
|
|
69
|
+
const yPx = (v) => PAD_T + PLOT_H - ((v - d0) / (d1 - d0 || 1)) * PLOT_H;
|
|
70
|
+
// ── x scale ──
|
|
71
|
+
const usesSlots = params.chartType === "bar" || norm.xType === "category";
|
|
72
|
+
const slotW = PLOT_W / Math.max(1, norm.xNums.length);
|
|
73
|
+
const catPos = new Map(norm.xNums.map((x, i) => [x, i]));
|
|
74
|
+
const xLinear = (() => {
|
|
75
|
+
if (usesSlots || norm.xNums.length === 0)
|
|
76
|
+
return null;
|
|
77
|
+
const xs = norm.xNums;
|
|
78
|
+
const min = xs[0];
|
|
79
|
+
const max = xs[xs.length - 1];
|
|
80
|
+
if (min === max) {
|
|
81
|
+
const pad = norm.xType === "time" ? 86.4e6 : 1;
|
|
82
|
+
return { d0: min - pad, d1: max + pad };
|
|
83
|
+
}
|
|
84
|
+
const pad = (max - min) * 0.02;
|
|
85
|
+
return { d0: min - pad, d1: max + pad };
|
|
86
|
+
})();
|
|
87
|
+
const xPx = (xNum) => {
|
|
88
|
+
if (usesSlots) {
|
|
89
|
+
const i = catPos.get(xNum) ?? 0;
|
|
90
|
+
return PAD_L + (i + 0.5) * slotW;
|
|
91
|
+
}
|
|
92
|
+
if (!xLinear)
|
|
93
|
+
return PAD_L + PLOT_W / 2;
|
|
94
|
+
return PAD_L + ((xNum - xLinear.d0) / (xLinear.d1 - xLinear.d0)) * PLOT_W;
|
|
95
|
+
};
|
|
96
|
+
const out = [];
|
|
97
|
+
// ── recessive horizontal grid + y tick labels (left scale) ──
|
|
98
|
+
for (const t of scale.ticks) {
|
|
99
|
+
const y = yPx(t);
|
|
100
|
+
out.push(`<line x1="${PAD_L}" x2="${r1(PAD_L + PLOT_W)}" y1="${r1(y)}" y2="${r1(y)}" stroke="${palette.ink}" stroke-opacity="0.1" stroke-width="1"/>`);
|
|
101
|
+
out.push(thumbText(PAD_L - 6, y + 3, thumbTruncate(formatNum(t), 7), {
|
|
102
|
+
size: 10,
|
|
103
|
+
fill: palette.ink,
|
|
104
|
+
opacity: 0.45,
|
|
105
|
+
anchor: "end",
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
// honest baseline (0 or domain floor)
|
|
109
|
+
const baselineY = yPx(Math.max(d0, Math.min(0, d1)));
|
|
110
|
+
out.push(`<line x1="${PAD_L}" x2="${r1(PAD_L + PLOT_W)}" y1="${r1(baselineY)}" y2="${r1(baselineY)}" stroke="${palette.ink}" stroke-opacity="0.25" stroke-width="1"/>`);
|
|
111
|
+
// ── goal lines ──
|
|
112
|
+
for (const g of params.goalLines) {
|
|
113
|
+
const y = yPx(g.value);
|
|
114
|
+
out.push(`<line x1="${PAD_L}" x2="${r1(PAD_L + PLOT_W)}" y1="${r1(y)}" y2="${r1(y)}" stroke="${palette.ink}" stroke-opacity="0.5" stroke-width="1" stroke-dasharray="4 4"/>`);
|
|
115
|
+
}
|
|
116
|
+
// ── marks ──
|
|
117
|
+
const seriesColor = (i) => palette.series[i % palette.series.length];
|
|
118
|
+
if (params.chartType === "bar") {
|
|
119
|
+
// Bars rise from zero (or below zero when negatives exist). Stacked
|
|
120
|
+
// mirrors the component's stackedSegMaps: per axis group, cumulative
|
|
121
|
+
// segments drawn bottom-up at the slot center. Grouped: one sub-bar per
|
|
122
|
+
// series inside the slot.
|
|
123
|
+
const zeroY = yPx(Math.max(d0, Math.min(0, d1)));
|
|
124
|
+
const segMaps = stacked
|
|
125
|
+
? norm.series.map((_, si) => {
|
|
126
|
+
const axis = norm.series[si].axis;
|
|
127
|
+
const idxs = norm.series
|
|
128
|
+
.map((st, i) => (st.axis === axis ? i : -1))
|
|
129
|
+
.filter((i) => i >= 0);
|
|
130
|
+
const stacks = stackByX(idxs.map((i) => norm.series[i].points));
|
|
131
|
+
const k = idxs.indexOf(si);
|
|
132
|
+
return new Map((stacks[k] ?? []).map((seg) => [seg.xNum, seg]));
|
|
133
|
+
})
|
|
134
|
+
: null;
|
|
135
|
+
const groupW = Math.max(2, Math.min((slotW * 0.78) / Math.max(1, norm.series.length), 36));
|
|
136
|
+
norm.series.forEach((s, si) => {
|
|
137
|
+
const color = seriesColor(si);
|
|
138
|
+
for (const p of s.points) {
|
|
139
|
+
if (segMaps) {
|
|
140
|
+
const seg = segMaps[si].get(p.xNum);
|
|
141
|
+
if (!seg)
|
|
142
|
+
continue;
|
|
143
|
+
const top = yPx(seg.y1);
|
|
144
|
+
const bottom = yPx(seg.y0);
|
|
145
|
+
out.push(`<rect x="${r1(xPx(p.xNum) - groupW / 2)}" y="${r1(top)}" width="${r1(groupW)}" height="${r1(Math.max(1, bottom - top))}" fill="${color}" fill-opacity="0.85"/>`);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
const x = xPx(p.xNum) - (groupW * norm.series.length) / 2 + groupW * si;
|
|
149
|
+
const y = yPx(p.y);
|
|
150
|
+
const top = Math.min(y, zeroY);
|
|
151
|
+
const h = Math.max(1, Math.abs(zeroY - y));
|
|
152
|
+
out.push(`<rect x="${r1(x)}" y="${r1(top)}" width="${r1(groupW)}" height="${r1(h)}" fill="${color}" fill-opacity="0.85"/>`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
norm.series.forEach((s, si) => {
|
|
159
|
+
const color = seriesColor(si);
|
|
160
|
+
if (params.chartType === "scatter") {
|
|
161
|
+
for (const p of s.points)
|
|
162
|
+
out.push(`<circle cx="${r1(xPx(p.xNum))}" cy="${r1(yPx(p.y))}" r="3" fill="${color}" fill-opacity="0.9"/>`);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
// line / area share the polyline geometry
|
|
166
|
+
const pts = s.points.map((p) => `${r1(xPx(p.xNum))},${r1(yPx(p.y))}`);
|
|
167
|
+
if (!pts.length)
|
|
168
|
+
return;
|
|
169
|
+
if (params.chartType === "area") {
|
|
170
|
+
const first = s.points[0];
|
|
171
|
+
const last = s.points[s.points.length - 1];
|
|
172
|
+
const areaD = `M ${r1(xPx(first.xNum))},${r1(yPx(0))} L ${pts.join(" L ")} L ${r1(xPx(last.xNum))},${r1(yPx(0))} Z`;
|
|
173
|
+
out.push(`<path d="${areaD}" fill="${color}" fill-opacity="${stacked ? 0.45 : 0.22}" stroke="none"/>`);
|
|
174
|
+
}
|
|
175
|
+
out.push(`<path d="M ${pts.join(" L ")}" fill="none" stroke="${color}" stroke-width="2"/>`);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
// ── category x labels (few enough to read; every 2nd when crowded) ──
|
|
179
|
+
if (norm.xType === "category" && norm.categories.length) {
|
|
180
|
+
const maxLabels = Math.max(2, Math.floor(PLOT_W / 56));
|
|
181
|
+
const step = Math.max(1, Math.ceil(norm.categories.length / maxLabels));
|
|
182
|
+
for (let i = 0; i < norm.categories.length; i += step) {
|
|
183
|
+
const cx = PAD_L + (i + 0.5) * slotW;
|
|
184
|
+
out.push(thumbText(cx, PAD_T + PLOT_H + 16, thumbTruncate(norm.categories[i], 8), {
|
|
185
|
+
size: 10,
|
|
186
|
+
fill: palette.ink,
|
|
187
|
+
opacity: 0.45,
|
|
188
|
+
anchor: "middle",
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return `<svg viewBox="0 0 ${W} ${H}">${out.join("")}</svg>`;
|
|
193
|
+
}
|
|
194
|
+
/** Compact numeric formatting for y tick labels (the component's
|
|
195
|
+
* formatYTick is richer; the silhouette wants plain numbers). */
|
|
196
|
+
function formatNum(v) {
|
|
197
|
+
if (Number.isInteger(v))
|
|
198
|
+
return String(v);
|
|
199
|
+
const s = v.toFixed(1);
|
|
200
|
+
return s.endsWith(".0") ? String(Math.round(v)) : s;
|
|
201
|
+
}
|