@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.
Files changed (266) hide show
  1. package/dist/artifact-blocks/AttachmentChip.svelte +66 -0
  2. package/dist/artifact-blocks/AttachmentChip.svelte.d.ts +7 -0
  3. package/dist/artifact-blocks/BlockComments.svelte +309 -0
  4. package/dist/artifact-blocks/BlockComments.svelte.d.ts +33 -0
  5. package/dist/artifact-blocks/BlockRenderer.svelte +674 -0
  6. package/dist/artifact-blocks/BlockRenderer.svelte.d.ts +55 -0
  7. package/dist/artifact-blocks/BlockVerdict.svelte +151 -0
  8. package/dist/artifact-blocks/BlockVerdict.svelte.d.ts +13 -0
  9. package/dist/artifact-blocks/BlocksArtifactView.svelte +1616 -0
  10. package/dist/artifact-blocks/BlocksArtifactView.svelte.d.ts +113 -0
  11. package/dist/artifact-blocks/CONTRACT.md +225 -0
  12. package/dist/artifact-blocks/CommentPill.svelte +49 -0
  13. package/dist/artifact-blocks/CommentPill.svelte.d.ts +16 -0
  14. package/dist/artifact-blocks/FoldedRounds.svelte +95 -0
  15. package/dist/artifact-blocks/FoldedRounds.svelte.d.ts +9 -0
  16. package/dist/artifact-blocks/Glyph.svelte +54 -0
  17. package/dist/artifact-blocks/Glyph.svelte.d.ts +10 -0
  18. package/dist/artifact-blocks/HistoryScrubber.svelte +500 -0
  19. package/dist/artifact-blocks/HistoryScrubber.svelte.d.ts +15 -0
  20. package/dist/artifact-blocks/Markdown.svelte +186 -0
  21. package/dist/artifact-blocks/Markdown.svelte.d.ts +30 -0
  22. package/dist/artifact-blocks/NoteComposer.svelte +31 -0
  23. package/dist/artifact-blocks/NoteComposer.svelte.d.ts +8 -0
  24. package/dist/artifact-blocks/PlainComposer.svelte +200 -0
  25. package/dist/artifact-blocks/PlainComposer.svelte.d.ts +15 -0
  26. package/dist/artifact-blocks/SectionTools.svelte +102 -0
  27. package/dist/artifact-blocks/SectionTools.svelte.d.ts +19 -0
  28. package/dist/artifact-blocks/adapter.d.ts +13 -0
  29. package/dist/artifact-blocks/adapter.js +31 -0
  30. package/dist/artifact-blocks/autoSend.d.ts +49 -0
  31. package/dist/artifact-blocks/autoSend.js +103 -0
  32. package/dist/artifact-blocks/blocks/actions/ActionsBlock.svelte +557 -0
  33. package/dist/artifact-blocks/blocks/actions/ActionsBlock.svelte.d.ts +48 -0
  34. package/dist/artifact-blocks/blocks/actions/block.d.ts +8 -0
  35. package/dist/artifact-blocks/blocks/actions/block.js +74 -0
  36. package/dist/artifact-blocks/blocks/actions/requests.d.ts +62 -0
  37. package/dist/artifact-blocks/blocks/actions/requests.js +26 -0
  38. package/dist/artifact-blocks/blocks/actions/schema.d.ts +168 -0
  39. package/dist/artifact-blocks/blocks/actions/schema.js +253 -0
  40. package/dist/artifact-blocks/blocks/callout/CalloutBlock.svelte +779 -0
  41. package/dist/artifact-blocks/blocks/callout/CalloutBlock.svelte.d.ts +40 -0
  42. package/dist/artifact-blocks/blocks/callout/block.d.ts +7 -0
  43. package/dist/artifact-blocks/blocks/callout/block.js +39 -0
  44. package/dist/artifact-blocks/blocks/callout/schema.d.ts +72 -0
  45. package/dist/artifact-blocks/blocks/callout/schema.js +115 -0
  46. package/dist/artifact-blocks/blocks/chart/ChartBlock.svelte +875 -0
  47. package/dist/artifact-blocks/blocks/chart/ChartBlock.svelte.d.ts +59 -0
  48. package/dist/artifact-blocks/blocks/chart/block.d.ts +9 -0
  49. package/dist/artifact-blocks/blocks/chart/block.js +70 -0
  50. package/dist/artifact-blocks/blocks/chart/schema.d.ts +171 -0
  51. package/dist/artifact-blocks/blocks/chart/schema.js +498 -0
  52. package/dist/artifact-blocks/blocks/chart/thumb.d.ts +2 -0
  53. package/dist/artifact-blocks/blocks/chart/thumb.js +201 -0
  54. package/dist/artifact-blocks/blocks/checklist/ChecklistBlock.svelte +1048 -0
  55. package/dist/artifact-blocks/blocks/checklist/ChecklistBlock.svelte.d.ts +16 -0
  56. package/dist/artifact-blocks/blocks/checklist/Icon.svelte +105 -0
  57. package/dist/artifact-blocks/blocks/checklist/Icon.svelte.d.ts +17 -0
  58. package/dist/artifact-blocks/blocks/checklist/block.d.ts +10 -0
  59. package/dist/artifact-blocks/blocks/checklist/block.js +63 -0
  60. package/dist/artifact-blocks/blocks/checklist/itemReview.d.ts +16 -0
  61. package/dist/artifact-blocks/blocks/checklist/itemReview.js +63 -0
  62. package/dist/artifact-blocks/blocks/checklist/labels.d.ts +62 -0
  63. package/dist/artifact-blocks/blocks/checklist/labels.js +96 -0
  64. package/dist/artifact-blocks/blocks/checklist/retest.d.ts +43 -0
  65. package/dist/artifact-blocks/blocks/checklist/retest.js +68 -0
  66. package/dist/artifact-blocks/blocks/checklist/schema.d.ts +84 -0
  67. package/dist/artifact-blocks/blocks/checklist/schema.js +91 -0
  68. package/dist/artifact-blocks/blocks/code/CodeBlock.svelte +128 -0
  69. package/dist/artifact-blocks/blocks/code/CodeBlock.svelte.d.ts +12 -0
  70. package/dist/artifact-blocks/blocks/code/block.d.ts +8 -0
  71. package/dist/artifact-blocks/blocks/code/block.js +31 -0
  72. package/dist/artifact-blocks/blocks/code/highlight.d.ts +34 -0
  73. package/dist/artifact-blocks/blocks/code/highlight.js +280 -0
  74. package/dist/artifact-blocks/blocks/code/schema.d.ts +32 -0
  75. package/dist/artifact-blocks/blocks/code/schema.js +39 -0
  76. package/dist/artifact-blocks/blocks/collage/CollageBlock.svelte +290 -0
  77. package/dist/artifact-blocks/blocks/collage/CollageBlock.svelte.d.ts +29 -0
  78. package/dist/artifact-blocks/blocks/collage/block.d.ts +9 -0
  79. package/dist/artifact-blocks/blocks/collage/block.js +29 -0
  80. package/dist/artifact-blocks/blocks/collage/schema.d.ts +52 -0
  81. package/dist/artifact-blocks/blocks/collage/schema.js +86 -0
  82. package/dist/artifact-blocks/blocks/compare/CompareBlock.svelte +484 -0
  83. package/dist/artifact-blocks/blocks/compare/CompareBlock.svelte.d.ts +25 -0
  84. package/dist/artifact-blocks/blocks/compare/block.d.ts +9 -0
  85. package/dist/artifact-blocks/blocks/compare/block.js +32 -0
  86. package/dist/artifact-blocks/blocks/compare/schema.d.ts +74 -0
  87. package/dist/artifact-blocks/blocks/compare/schema.js +148 -0
  88. package/dist/artifact-blocks/blocks/diagram/DiagramBlock.svelte +392 -0
  89. package/dist/artifact-blocks/blocks/diagram/DiagramBlock.svelte.d.ts +30 -0
  90. package/dist/artifact-blocks/blocks/diagram/block.d.ts +9 -0
  91. package/dist/artifact-blocks/blocks/diagram/block.js +50 -0
  92. package/dist/artifact-blocks/blocks/diagram/constants.d.ts +48 -0
  93. package/dist/artifact-blocks/blocks/diagram/constants.js +53 -0
  94. package/dist/artifact-blocks/blocks/diagram/schema.d.ts +161 -0
  95. package/dist/artifact-blocks/blocks/diagram/schema.js +621 -0
  96. package/dist/artifact-blocks/blocks/diagram/thumb.d.ts +2 -0
  97. package/dist/artifact-blocks/blocks/diagram/thumb.js +157 -0
  98. package/dist/artifact-blocks/blocks/diagram/types.d.ts +74 -0
  99. package/dist/artifact-blocks/blocks/diagram/types.js +1 -0
  100. package/dist/artifact-blocks/blocks/diff/DiffBlock.svelte +81 -0
  101. package/dist/artifact-blocks/blocks/diff/DiffBlock.svelte.d.ts +10 -0
  102. package/dist/artifact-blocks/blocks/diff/block.d.ts +7 -0
  103. package/dist/artifact-blocks/blocks/diff/block.js +36 -0
  104. package/dist/artifact-blocks/blocks/diff/schema.d.ts +18 -0
  105. package/dist/artifact-blocks/blocks/diff/schema.js +35 -0
  106. package/dist/artifact-blocks/blocks/diff-review/DiffReviewBlock.svelte +1055 -0
  107. package/dist/artifact-blocks/blocks/diff-review/DiffReviewBlock.svelte.d.ts +5 -0
  108. package/dist/artifact-blocks/blocks/diff-review/block.d.ts +15 -0
  109. package/dist/artifact-blocks/blocks/diff-review/block.js +64 -0
  110. package/dist/artifact-blocks/blocks/diff-review/decisions.d.ts +57 -0
  111. package/dist/artifact-blocks/blocks/diff-review/decisions.js +80 -0
  112. package/dist/artifact-blocks/blocks/diff-review/schema.d.ts +13 -0
  113. package/dist/artifact-blocks/blocks/diff-review/schema.js +84 -0
  114. package/dist/artifact-blocks/blocks/diff-review/types.d.ts +35 -0
  115. package/dist/artifact-blocks/blocks/diff-review/types.js +1 -0
  116. package/dist/artifact-blocks/blocks/explainer/ExplainerBlock.svelte +145 -0
  117. package/dist/artifact-blocks/blocks/explainer/ExplainerBlock.svelte.d.ts +5 -0
  118. package/dist/artifact-blocks/blocks/explainer/block.d.ts +8 -0
  119. package/dist/artifact-blocks/blocks/explainer/block.js +21 -0
  120. package/dist/artifact-blocks/blocks/explainer/schema.d.ts +26 -0
  121. package/dist/artifact-blocks/blocks/explainer/schema.js +69 -0
  122. package/dist/artifact-blocks/blocks/group-content.d.ts +10 -0
  123. package/dist/artifact-blocks/blocks/group-content.js +16 -0
  124. package/dist/artifact-blocks/blocks/group-data.d.ts +10 -0
  125. package/dist/artifact-blocks/blocks/group-data.js +7 -0
  126. package/dist/artifact-blocks/blocks/group-review.d.ts +10 -0
  127. package/dist/artifact-blocks/blocks/group-review.js +12 -0
  128. package/dist/artifact-blocks/blocks/group-visual.d.ts +17 -0
  129. package/dist/artifact-blocks/blocks/group-visual.js +14 -0
  130. package/dist/artifact-blocks/blocks/map/MapBlock.svelte +413 -0
  131. package/dist/artifact-blocks/blocks/map/MapBlock.svelte.d.ts +53 -0
  132. package/dist/artifact-blocks/blocks/map/block.d.ts +9 -0
  133. package/dist/artifact-blocks/blocks/map/block.js +62 -0
  134. package/dist/artifact-blocks/blocks/map/schema.d.ts +123 -0
  135. package/dist/artifact-blocks/blocks/map/schema.js +113 -0
  136. package/dist/artifact-blocks/blocks/map/thumb.d.ts +2 -0
  137. package/dist/artifact-blocks/blocks/map/thumb.js +69 -0
  138. package/dist/artifact-blocks/blocks/markdown/MarkdownBlock.svelte +33 -0
  139. package/dist/artifact-blocks/blocks/markdown/MarkdownBlock.svelte.d.ts +15 -0
  140. package/dist/artifact-blocks/blocks/markdown/block.d.ts +7 -0
  141. package/dist/artifact-blocks/blocks/markdown/block.js +28 -0
  142. package/dist/artifact-blocks/blocks/markdown/render.d.ts +17 -0
  143. package/dist/artifact-blocks/blocks/markdown/render.js +115 -0
  144. package/dist/artifact-blocks/blocks/markdown/schema.d.ts +10 -0
  145. package/dist/artifact-blocks/blocks/markdown/schema.js +23 -0
  146. package/dist/artifact-blocks/blocks/media-picker/MediaPickerBlock.svelte +2112 -0
  147. package/dist/artifact-blocks/blocks/media-picker/MediaPickerBlock.svelte.d.ts +5 -0
  148. package/dist/artifact-blocks/blocks/media-picker/block.d.ts +24 -0
  149. package/dist/artifact-blocks/blocks/media-picker/block.js +137 -0
  150. package/dist/artifact-blocks/blocks/media-picker/choices.d.ts +28 -0
  151. package/dist/artifact-blocks/blocks/media-picker/choices.js +35 -0
  152. package/dist/artifact-blocks/blocks/media-picker/decisions.d.ts +51 -0
  153. package/dist/artifact-blocks/blocks/media-picker/decisions.js +75 -0
  154. package/dist/artifact-blocks/blocks/media-picker/schema.d.ts +7 -0
  155. package/dist/artifact-blocks/blocks/media-picker/schema.js +199 -0
  156. package/dist/artifact-blocks/blocks/media-picker/types.d.ts +92 -0
  157. package/dist/artifact-blocks/blocks/media-picker/types.js +1 -0
  158. package/dist/artifact-blocks/blocks/media-picker/versions.d.ts +51 -0
  159. package/dist/artifact-blocks/blocks/media-picker/versions.js +118 -0
  160. package/dist/artifact-blocks/blocks/mockup/MockupBlock.svelte +213 -0
  161. package/dist/artifact-blocks/blocks/mockup/MockupBlock.svelte.d.ts +5 -0
  162. package/dist/artifact-blocks/blocks/mockup/block.d.ts +26 -0
  163. package/dist/artifact-blocks/blocks/mockup/block.js +52 -0
  164. package/dist/artifact-blocks/blocks/mockup/doc.d.ts +24 -0
  165. package/dist/artifact-blocks/blocks/mockup/doc.js +44 -0
  166. package/dist/artifact-blocks/blocks/mockup/sandbox.d.ts +21 -0
  167. package/dist/artifact-blocks/blocks/mockup/sandbox.js +27 -0
  168. package/dist/artifact-blocks/blocks/mockup/schema.d.ts +7 -0
  169. package/dist/artifact-blocks/blocks/mockup/schema.js +90 -0
  170. package/dist/artifact-blocks/blocks/mockup/types.d.ts +36 -0
  171. package/dist/artifact-blocks/blocks/mockup/types.js +17 -0
  172. package/dist/artifact-blocks/blocks/program/ProgramBlock.svelte +359 -0
  173. package/dist/artifact-blocks/blocks/program/ProgramBlock.svelte.d.ts +32 -0
  174. package/dist/artifact-blocks/blocks/program/block.d.ts +35 -0
  175. package/dist/artifact-blocks/blocks/program/block.js +68 -0
  176. package/dist/artifact-blocks/blocks/program/schema.d.ts +132 -0
  177. package/dist/artifact-blocks/blocks/program/schema.js +268 -0
  178. package/dist/artifact-blocks/blocks/stats/StatsBlock.svelte +315 -0
  179. package/dist/artifact-blocks/blocks/stats/StatsBlock.svelte.d.ts +24 -0
  180. package/dist/artifact-blocks/blocks/stats/block.d.ts +7 -0
  181. package/dist/artifact-blocks/blocks/stats/block.js +49 -0
  182. package/dist/artifact-blocks/blocks/stats/schema.d.ts +82 -0
  183. package/dist/artifact-blocks/blocks/stats/schema.js +43 -0
  184. package/dist/artifact-blocks/blocks/stats/thumb.d.ts +2 -0
  185. package/dist/artifact-blocks/blocks/stats/thumb.js +102 -0
  186. package/dist/artifact-blocks/blocks/table/TableBlock.svelte +490 -0
  187. package/dist/artifact-blocks/blocks/table/TableBlock.svelte.d.ts +28 -0
  188. package/dist/artifact-blocks/blocks/table/block.d.ts +9 -0
  189. package/dist/artifact-blocks/blocks/table/block.js +100 -0
  190. package/dist/artifact-blocks/blocks/table/schema.d.ts +143 -0
  191. package/dist/artifact-blocks/blocks/table/schema.js +278 -0
  192. package/dist/artifact-blocks/blocks/timeline/TimelineBlock.svelte +347 -0
  193. package/dist/artifact-blocks/blocks/timeline/TimelineBlock.svelte.d.ts +42 -0
  194. package/dist/artifact-blocks/blocks/timeline/block.d.ts +9 -0
  195. package/dist/artifact-blocks/blocks/timeline/block.js +96 -0
  196. package/dist/artifact-blocks/blocks/timeline/constants.d.ts +26 -0
  197. package/dist/artifact-blocks/blocks/timeline/constants.js +27 -0
  198. package/dist/artifact-blocks/blocks/timeline/schema.d.ts +102 -0
  199. package/dist/artifact-blocks/blocks/timeline/schema.js +405 -0
  200. package/dist/artifact-blocks/blocks/timeline/thumb.d.ts +2 -0
  201. package/dist/artifact-blocks/blocks/timeline/thumb.js +117 -0
  202. package/dist/artifact-blocks/blocks/timeline/types.d.ts +66 -0
  203. package/dist/artifact-blocks/blocks/timeline/types.js +1 -0
  204. package/dist/artifact-blocks/blocks/transcript/TranscriptBlock.svelte +169 -0
  205. package/dist/artifact-blocks/blocks/transcript/TranscriptBlock.svelte.d.ts +26 -0
  206. package/dist/artifact-blocks/blocks/transcript/block.d.ts +9 -0
  207. package/dist/artifact-blocks/blocks/transcript/block.js +86 -0
  208. package/dist/artifact-blocks/blocks/transcript/schema.d.ts +114 -0
  209. package/dist/artifact-blocks/blocks/transcript/schema.js +126 -0
  210. package/dist/artifact-blocks/builtins.d.ts +40 -0
  211. package/dist/artifact-blocks/builtins.js +22 -0
  212. package/dist/artifact-blocks/contractBlocks.d.ts +92 -0
  213. package/dist/artifact-blocks/contractBlocks.js +279 -0
  214. package/dist/artifact-blocks/history.d.ts +140 -0
  215. package/dist/artifact-blocks/history.js +363 -0
  216. package/dist/artifact-blocks/index.d.ts +40 -0
  217. package/dist/artifact-blocks/index.js +46 -0
  218. package/dist/artifact-blocks/listen/context.d.ts +30 -0
  219. package/dist/artifact-blocks/listen/context.js +30 -0
  220. package/dist/artifact-blocks/liveData.d.ts +78 -0
  221. package/dist/artifact-blocks/liveData.js +137 -0
  222. package/dist/artifact-blocks/liveDataPoller.d.ts +41 -0
  223. package/dist/artifact-blocks/liveDataPoller.js +140 -0
  224. package/dist/artifact-blocks/openNav.d.ts +46 -0
  225. package/dist/artifact-blocks/openNav.js +106 -0
  226. package/dist/artifact-blocks/pageReviewKeys.d.ts +17 -0
  227. package/dist/artifact-blocks/pageReviewKeys.js +115 -0
  228. package/dist/artifact-blocks/params.d.ts +98 -0
  229. package/dist/artifact-blocks/params.js +159 -0
  230. package/dist/artifact-blocks/registry.d.ts +27 -0
  231. package/dist/artifact-blocks/registry.js +83 -0
  232. package/dist/artifact-blocks/review/BlockIcon.svelte +99 -0
  233. package/dist/artifact-blocks/review/BlockIcon.svelte.d.ts +17 -0
  234. package/dist/artifact-blocks/review/BulkRejectForm.svelte +94 -0
  235. package/dist/artifact-blocks/review/BulkRejectForm.svelte.d.ts +11 -0
  236. package/dist/artifact-blocks/review/BulkUndoBar.svelte +40 -0
  237. package/dist/artifact-blocks/review/BulkUndoBar.svelte.d.ts +9 -0
  238. package/dist/artifact-blocks/review/ItemNote.svelte +193 -0
  239. package/dist/artifact-blocks/review/ItemNote.svelte.d.ts +33 -0
  240. package/dist/artifact-blocks/review/NoteToggle.svelte +52 -0
  241. package/dist/artifact-blocks/review/NoteToggle.svelte.d.ts +12 -0
  242. package/dist/artifact-blocks/review/TeamChip.svelte +71 -0
  243. package/dist/artifact-blocks/review/TeamChip.svelte.d.ts +8 -0
  244. package/dist/artifact-blocks/review/attachments.d.ts +10 -0
  245. package/dist/artifact-blocks/review/attachments.js +37 -0
  246. package/dist/artifact-blocks/review/bulk.d.ts +52 -0
  247. package/dist/artifact-blocks/review/bulk.js +61 -0
  248. package/dist/artifact-blocks/review/itemReview.d.ts +33 -0
  249. package/dist/artifact-blocks/review/itemReview.js +112 -0
  250. package/dist/artifact-blocks/review/roundLines.d.ts +14 -0
  251. package/dist/artifact-blocks/review/roundLines.js +20 -0
  252. package/dist/artifact-blocks/review/rounds.d.ts +86 -0
  253. package/dist/artifact-blocks/review/rounds.js +302 -0
  254. package/dist/artifact-blocks/review/saver.d.ts +23 -0
  255. package/dist/artifact-blocks/review/saver.js +48 -0
  256. package/dist/artifact-blocks/review/team.d.ts +31 -0
  257. package/dist/artifact-blocks/review/team.js +42 -0
  258. package/dist/artifact-blocks/review/visualOrder.d.ts +29 -0
  259. package/dist/artifact-blocks/review/visualOrder.js +66 -0
  260. package/dist/artifact-blocks/review.d.ts +180 -0
  261. package/dist/artifact-blocks/review.js +716 -0
  262. package/dist/artifact-blocks/thumb-kit.d.ts +80 -0
  263. package/dist/artifact-blocks/thumb-kit.js +149 -0
  264. package/dist/artifact-blocks/types.d.ts +513 -0
  265. package/dist/artifact-blocks/types.js +1 -0
  266. 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
+ }