@k2b/ui 0.50.0 → 0.52.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 (420) hide show
  1. package/dist/base.css +35 -1
  2. package/dist/browser/actions/Button.js.map +1 -1
  3. package/dist/browser/actions/CommandList.js +861 -0
  4. package/dist/browser/actions/CommandList.js.map +1 -0
  5. package/dist/browser/actions/CommandMenu.js +237 -0
  6. package/dist/browser/actions/CommandMenu.js.map +1 -0
  7. package/dist/browser/actions/Dropdown.js +43 -10
  8. package/dist/browser/actions/Dropdown.js.map +1 -1
  9. package/dist/browser/actions/Toolbar.js +8 -2
  10. package/dist/browser/actions/Toolbar.js.map +1 -1
  11. package/dist/browser/actions/command-dock.js +47 -0
  12. package/dist/browser/actions/command-dock.js.map +1 -0
  13. package/dist/browser/actions/command-items.js +84 -0
  14. package/dist/browser/actions/command-items.js.map +1 -0
  15. package/dist/browser/actions/command-messages.js +42 -0
  16. package/dist/browser/actions/command-messages.js.map +1 -0
  17. package/dist/browser/actions/index.js +1 -0
  18. package/dist/browser/actions/index.js.map +1 -1
  19. package/dist/browser/charts/core/area.js +3 -5
  20. package/dist/browser/charts/core/area.js.map +1 -1
  21. package/dist/browser/charts/core/bar-labels.js +5 -0
  22. package/dist/browser/charts/core/bar-labels.js.map +1 -0
  23. package/dist/browser/charts/core/bubble.js +166 -0
  24. package/dist/browser/charts/core/bubble.js.map +1 -0
  25. package/dist/browser/charts/core/calendar.js +1 -1
  26. package/dist/browser/charts/core/calendar.js.map +1 -1
  27. package/dist/browser/charts/core/chart-messages.js +17 -0
  28. package/dist/browser/charts/core/chart-messages.js.map +1 -0
  29. package/dist/browser/charts/core/default-styles.js +83 -0
  30. package/dist/browser/charts/core/default-styles.js.map +1 -0
  31. package/dist/browser/charts/core/funnel-layout.js +79 -0
  32. package/dist/browser/charts/core/funnel-layout.js.map +1 -0
  33. package/dist/browser/charts/core/funnel.js +27 -0
  34. package/dist/browser/charts/core/funnel.js.map +1 -0
  35. package/dist/browser/charts/core/hbar-layout.js +118 -0
  36. package/dist/browser/charts/core/hbar-layout.js.map +1 -0
  37. package/dist/browser/charts/core/hbar.js +39 -0
  38. package/dist/browser/charts/core/hbar.js.map +1 -0
  39. package/dist/browser/charts/core/index.js +12 -2
  40. package/dist/browser/charts/core/index.js.map +1 -1
  41. package/dist/browser/charts/core/map.js +116 -0
  42. package/dist/browser/charts/core/map.js.map +1 -0
  43. package/dist/browser/charts/core/pareto.js +120 -0
  44. package/dist/browser/charts/core/pareto.js.map +1 -0
  45. package/dist/browser/charts/core/radar.js +101 -0
  46. package/dist/browser/charts/core/radar.js.map +1 -0
  47. package/dist/browser/charts/core/registry.js +33 -16
  48. package/dist/browser/charts/core/registry.js.map +1 -1
  49. package/dist/browser/charts/core/render-size.js +15 -0
  50. package/dist/browser/charts/core/render-size.js.map +1 -0
  51. package/dist/browser/charts/core/render.js +39 -10
  52. package/dist/browser/charts/core/render.js.map +1 -1
  53. package/dist/browser/charts/core/snapshot.js +4 -4
  54. package/dist/browser/charts/core/snapshot.js.map +1 -1
  55. package/dist/browser/charts/core/svg-barGauge.js +67 -0
  56. package/dist/browser/charts/core/svg-barGauge.js.map +1 -0
  57. package/dist/browser/charts/core/svg-boxplot.js +127 -0
  58. package/dist/browser/charts/core/svg-boxplot.js.map +1 -0
  59. package/dist/browser/charts/core/svg-common.js +1065 -0
  60. package/dist/browser/charts/core/svg-common.js.map +1 -0
  61. package/dist/browser/charts/core/svg-gauge.js +185 -0
  62. package/dist/browser/charts/core/svg-gauge.js.map +1 -0
  63. package/dist/browser/charts/core/svg-heatmap.js +80 -0
  64. package/dist/browser/charts/core/svg-heatmap.js.map +1 -0
  65. package/dist/browser/charts/core/svg-histogram.js +73 -0
  66. package/dist/browser/charts/core/svg-histogram.js.map +1 -0
  67. package/dist/browser/charts/core/svg-renderers.js +638 -0
  68. package/dist/browser/charts/core/svg-renderers.js.map +1 -0
  69. package/dist/browser/charts/core/svg-scatter.js +114 -0
  70. package/dist/browser/charts/core/svg-scatter.js.map +1 -0
  71. package/dist/browser/charts/core/svg.js +4 -2525
  72. package/dist/browser/charts/core/svg.js.map +1 -1
  73. package/dist/browser/charts/core/treemap.js +138 -0
  74. package/dist/browser/charts/core/treemap.js.map +1 -0
  75. package/dist/browser/charts/core/types.js +0 -2
  76. package/dist/browser/charts/core/types.js.map +1 -1
  77. package/dist/browser/charts/core/waterfall.js +162 -0
  78. package/dist/browser/charts/core/waterfall.js.map +1 -0
  79. package/dist/browser/charts/description.js +2 -0
  80. package/dist/browser/charts/description.js.map +1 -0
  81. package/dist/browser/charts.js.map +1 -1
  82. package/dist/browser/content/Chart.js +14 -628
  83. package/dist/browser/content/Chart.js.map +1 -1
  84. package/dist/browser/content/ChartRoot.js +646 -0
  85. package/dist/browser/content/ChartRoot.js.map +1 -0
  86. package/dist/browser/content/ChartSnapshotView.js +4 -1
  87. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  88. package/dist/browser/content/ChartSparkline.js +24 -0
  89. package/dist/browser/content/ChartSparkline.js.map +1 -0
  90. package/dist/browser/content/DataTable.js +186 -193
  91. package/dist/browser/content/DataTable.js.map +1 -1
  92. package/dist/browser/content/FileView.js +111 -61
  93. package/dist/browser/content/FileView.js.map +1 -1
  94. package/dist/browser/content/Lightbox.js +62 -30
  95. package/dist/browser/content/Lightbox.js.map +1 -1
  96. package/dist/browser/content/MapView.js +30 -28
  97. package/dist/browser/content/MapView.js.map +1 -1
  98. package/dist/browser/content/PdfPreview.js +84 -52
  99. package/dist/browser/content/PdfPreview.js.map +1 -1
  100. package/dist/browser/content/PdfViewer.js +588 -0
  101. package/dist/browser/content/PdfViewer.js.map +1 -0
  102. package/dist/browser/content/ThumbnailStrip.js +174 -0
  103. package/dist/browser/content/ThumbnailStrip.js.map +1 -0
  104. package/dist/browser/content/chart-bar.js +344 -16
  105. package/dist/browser/content/chart-bar.js.map +1 -1
  106. package/dist/browser/content/chart-inspection-core.js +50 -29
  107. package/dist/browser/content/chart-inspection-core.js.map +1 -1
  108. package/dist/browser/content/chart-line-gaps.js +1 -1
  109. package/dist/browser/content/chart-line-gaps.js.map +1 -1
  110. package/dist/browser/content/chart-message-catalog.js +28 -0
  111. package/dist/browser/content/chart-message-catalog.js.map +1 -1
  112. package/dist/browser/content/chart-state-timeline.js +1 -1
  113. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  114. package/dist/browser/content/chart-svg.js +2 -1
  115. package/dist/browser/content/chart-svg.js.map +1 -1
  116. package/dist/browser/content/index.js +2 -0
  117. package/dist/browser/content/index.js.map +1 -1
  118. package/dist/browser/content/pdf-document.js +29 -0
  119. package/dist/browser/content/pdf-document.js.map +1 -0
  120. package/dist/browser/content/pdf-limits.js +31 -0
  121. package/dist/browser/content/pdf-limits.js.map +1 -0
  122. package/dist/browser/content/pdf-messages.js +34 -2
  123. package/dist/browser/content/pdf-messages.js.map +1 -1
  124. package/dist/browser/content/pdf-viewer-engine.js +57 -0
  125. package/dist/browser/content/pdf-viewer-worker.js +28 -0
  126. package/dist/browser/content/thumbnail-strip-messages.js +24 -0
  127. package/dist/browser/content/thumbnail-strip-messages.js.map +1 -0
  128. package/dist/browser/inputs/ChoiceInputs.js +150 -76
  129. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  130. package/dist/browser/inputs/ChoiceSlider.js +75 -58
  131. package/dist/browser/inputs/ChoiceSlider.js.map +1 -1
  132. package/dist/browser/inputs/DatePicker.js +113 -98
  133. package/dist/browser/inputs/DatePicker.js.map +1 -1
  134. package/dist/browser/inputs/PeriodPicker.js +874 -0
  135. package/dist/browser/inputs/PeriodPicker.js.map +1 -0
  136. package/dist/browser/inputs/index.js +5 -1
  137. package/dist/browser/inputs/index.js.map +1 -1
  138. package/dist/browser/inputs/input-messages.js +8 -2
  139. package/dist/browser/inputs/input-messages.js.map +1 -1
  140. package/dist/browser/inputs/markdown/MarkdownEditor.js +14 -10
  141. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  142. package/dist/browser/inputs/markdown/MarkdownSelectionToolbar.js +330 -0
  143. package/dist/browser/inputs/markdown/MarkdownSelectionToolbar.js.map +1 -0
  144. package/dist/browser/inputs/markdown/SlashCommands.js +402 -0
  145. package/dist/browser/inputs/markdown/SlashCommands.js.map +1 -0
  146. package/dist/browser/inputs/period-picker-messages.js +71 -0
  147. package/dist/browser/inputs/period-picker-messages.js.map +1 -0
  148. package/dist/browser/inputs/period.js +263 -0
  149. package/dist/browser/inputs/period.js.map +1 -0
  150. package/dist/browser/internal/field.js +96 -77
  151. package/dist/browser/internal/field.js.map +1 -1
  152. package/dist/browser/layout/AppWorkspace.js +7 -5
  153. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  154. package/dist/browser/layout/DetailPanel.js +147 -120
  155. package/dist/browser/layout/DetailPanel.js.map +1 -1
  156. package/dist/browser/layout/Discussion.js +101 -108
  157. package/dist/browser/layout/Discussion.js.map +1 -1
  158. package/dist/browser/layout/PanelDialog.js +92 -68
  159. package/dist/browser/layout/PanelDialog.js.map +1 -1
  160. package/dist/browser/layout/index.js.map +1 -1
  161. package/dist/browser/surfaces/DescriptionList.js +5 -2
  162. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  163. package/dist/browser/surfaces/StatCell.js +95 -78
  164. package/dist/browser/surfaces/StatCell.js.map +1 -1
  165. package/dist/browser/surfaces/delta-badge.js +16 -2
  166. package/dist/browser/surfaces/delta-badge.js.map +1 -1
  167. package/dist/browser/surfaces/stat-cell-messages.js +4 -2
  168. package/dist/browser/surfaces/stat-cell-messages.js.map +1 -1
  169. package/dist/browser/widgets/DashboardFrame.js +315 -0
  170. package/dist/browser/widgets/DashboardFrame.js.map +1 -0
  171. package/dist/browser/widgets/index.js +1 -0
  172. package/dist/browser/widgets/index.js.map +1 -1
  173. package/dist/licenses/pdfjs-dist.txt +177 -0
  174. package/dist/ssr/actions/Button.js.map +1 -1
  175. package/dist/ssr/actions/CommandList.js +638 -0
  176. package/dist/ssr/actions/CommandList.js.map +1 -0
  177. package/dist/ssr/actions/CommandMenu.js +197 -0
  178. package/dist/ssr/actions/CommandMenu.js.map +1 -0
  179. package/dist/ssr/actions/Dropdown.js +43 -10
  180. package/dist/ssr/actions/Dropdown.js.map +1 -1
  181. package/dist/ssr/actions/Toolbar.js +8 -2
  182. package/dist/ssr/actions/Toolbar.js.map +1 -1
  183. package/dist/ssr/actions/command-dock.js +47 -0
  184. package/dist/ssr/actions/command-dock.js.map +1 -0
  185. package/dist/ssr/actions/command-items.js +84 -0
  186. package/dist/ssr/actions/command-items.js.map +1 -0
  187. package/dist/ssr/actions/command-messages.js +42 -0
  188. package/dist/ssr/actions/command-messages.js.map +1 -0
  189. package/dist/ssr/actions/index.js +1 -0
  190. package/dist/ssr/actions/index.js.map +1 -1
  191. package/dist/ssr/charts/core/area.js +3 -5
  192. package/dist/ssr/charts/core/area.js.map +1 -1
  193. package/dist/ssr/charts/core/bar-labels.js +5 -0
  194. package/dist/ssr/charts/core/bar-labels.js.map +1 -0
  195. package/dist/ssr/charts/core/bubble.js +166 -0
  196. package/dist/ssr/charts/core/bubble.js.map +1 -0
  197. package/dist/ssr/charts/core/calendar.js +1 -1
  198. package/dist/ssr/charts/core/calendar.js.map +1 -1
  199. package/dist/ssr/charts/core/chart-messages.js +17 -0
  200. package/dist/ssr/charts/core/chart-messages.js.map +1 -0
  201. package/dist/ssr/charts/core/default-styles.js +83 -0
  202. package/dist/ssr/charts/core/default-styles.js.map +1 -0
  203. package/dist/ssr/charts/core/funnel-layout.js +79 -0
  204. package/dist/ssr/charts/core/funnel-layout.js.map +1 -0
  205. package/dist/ssr/charts/core/funnel.js +27 -0
  206. package/dist/ssr/charts/core/funnel.js.map +1 -0
  207. package/dist/ssr/charts/core/hbar-layout.js +118 -0
  208. package/dist/ssr/charts/core/hbar-layout.js.map +1 -0
  209. package/dist/ssr/charts/core/hbar.js +39 -0
  210. package/dist/ssr/charts/core/hbar.js.map +1 -0
  211. package/dist/ssr/charts/core/index.js +12 -2
  212. package/dist/ssr/charts/core/index.js.map +1 -1
  213. package/dist/ssr/charts/core/map.js +116 -0
  214. package/dist/ssr/charts/core/map.js.map +1 -0
  215. package/dist/ssr/charts/core/pareto.js +120 -0
  216. package/dist/ssr/charts/core/pareto.js.map +1 -0
  217. package/dist/ssr/charts/core/radar.js +101 -0
  218. package/dist/ssr/charts/core/radar.js.map +1 -0
  219. package/dist/ssr/charts/core/registry.js +33 -16
  220. package/dist/ssr/charts/core/registry.js.map +1 -1
  221. package/dist/ssr/charts/core/render-size.js +15 -0
  222. package/dist/ssr/charts/core/render-size.js.map +1 -0
  223. package/dist/ssr/charts/core/render.js +39 -10
  224. package/dist/ssr/charts/core/render.js.map +1 -1
  225. package/dist/ssr/charts/core/snapshot.js +4 -4
  226. package/dist/ssr/charts/core/snapshot.js.map +1 -1
  227. package/dist/ssr/charts/core/svg-barGauge.js +67 -0
  228. package/dist/ssr/charts/core/svg-barGauge.js.map +1 -0
  229. package/dist/ssr/charts/core/svg-boxplot.js +127 -0
  230. package/dist/ssr/charts/core/svg-boxplot.js.map +1 -0
  231. package/dist/ssr/charts/core/svg-common.js +1065 -0
  232. package/dist/ssr/charts/core/svg-common.js.map +1 -0
  233. package/dist/ssr/charts/core/svg-gauge.js +185 -0
  234. package/dist/ssr/charts/core/svg-gauge.js.map +1 -0
  235. package/dist/ssr/charts/core/svg-heatmap.js +80 -0
  236. package/dist/ssr/charts/core/svg-heatmap.js.map +1 -0
  237. package/dist/ssr/charts/core/svg-histogram.js +73 -0
  238. package/dist/ssr/charts/core/svg-histogram.js.map +1 -0
  239. package/dist/ssr/charts/core/svg-renderers.js +638 -0
  240. package/dist/ssr/charts/core/svg-renderers.js.map +1 -0
  241. package/dist/ssr/charts/core/svg-scatter.js +114 -0
  242. package/dist/ssr/charts/core/svg-scatter.js.map +1 -0
  243. package/dist/ssr/charts/core/svg.js +4 -2525
  244. package/dist/ssr/charts/core/svg.js.map +1 -1
  245. package/dist/ssr/charts/core/treemap.js +138 -0
  246. package/dist/ssr/charts/core/treemap.js.map +1 -0
  247. package/dist/ssr/charts/core/types.js +0 -2
  248. package/dist/ssr/charts/core/types.js.map +1 -1
  249. package/dist/ssr/charts/core/waterfall.js +162 -0
  250. package/dist/ssr/charts/core/waterfall.js.map +1 -0
  251. package/dist/ssr/charts/description.js +2 -0
  252. package/dist/ssr/charts/description.js.map +1 -0
  253. package/dist/ssr/charts.js.map +1 -1
  254. package/dist/ssr/content/Chart.js +14 -471
  255. package/dist/ssr/content/Chart.js.map +1 -1
  256. package/dist/ssr/content/ChartRoot.js +489 -0
  257. package/dist/ssr/content/ChartRoot.js.map +1 -0
  258. package/dist/ssr/content/ChartSnapshotView.js +1 -0
  259. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  260. package/dist/ssr/content/ChartSparkline.js +24 -0
  261. package/dist/ssr/content/ChartSparkline.js.map +1 -0
  262. package/dist/ssr/content/DataTable.js +12 -16
  263. package/dist/ssr/content/DataTable.js.map +1 -1
  264. package/dist/ssr/content/FileView.js +56 -7
  265. package/dist/ssr/content/FileView.js.map +1 -1
  266. package/dist/ssr/content/Lightbox.js +39 -10
  267. package/dist/ssr/content/Lightbox.js.map +1 -1
  268. package/dist/ssr/content/MapView.js +9 -9
  269. package/dist/ssr/content/MapView.js.map +1 -1
  270. package/dist/ssr/content/PdfPreview.js +49 -20
  271. package/dist/ssr/content/PdfPreview.js.map +1 -1
  272. package/dist/ssr/content/PdfViewer.js +484 -0
  273. package/dist/ssr/content/PdfViewer.js.map +1 -0
  274. package/dist/ssr/content/ThumbnailStrip.js +103 -0
  275. package/dist/ssr/content/ThumbnailStrip.js.map +1 -0
  276. package/dist/ssr/content/chart-bar.js +344 -16
  277. package/dist/ssr/content/chart-bar.js.map +1 -1
  278. package/dist/ssr/content/chart-inspection-core.js +50 -29
  279. package/dist/ssr/content/chart-inspection-core.js.map +1 -1
  280. package/dist/ssr/content/chart-line-gaps.js +1 -1
  281. package/dist/ssr/content/chart-line-gaps.js.map +1 -1
  282. package/dist/ssr/content/chart-message-catalog.js +28 -0
  283. package/dist/ssr/content/chart-message-catalog.js.map +1 -1
  284. package/dist/ssr/content/chart-state-timeline.js +1 -1
  285. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  286. package/dist/ssr/content/chart-svg.js +2 -1
  287. package/dist/ssr/content/chart-svg.js.map +1 -1
  288. package/dist/ssr/content/index.js +2 -0
  289. package/dist/ssr/content/index.js.map +1 -1
  290. package/dist/ssr/content/pdf-document.js +29 -0
  291. package/dist/ssr/content/pdf-document.js.map +1 -0
  292. package/dist/ssr/content/pdf-limits.js +31 -0
  293. package/dist/ssr/content/pdf-limits.js.map +1 -0
  294. package/dist/ssr/content/pdf-messages.js +34 -2
  295. package/dist/ssr/content/pdf-messages.js.map +1 -1
  296. package/dist/ssr/content/thumbnail-strip-messages.js +24 -0
  297. package/dist/ssr/content/thumbnail-strip-messages.js.map +1 -0
  298. package/dist/ssr/inputs/ChoiceInputs.js +69 -17
  299. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  300. package/dist/ssr/inputs/ChoiceSlider.js +17 -12
  301. package/dist/ssr/inputs/ChoiceSlider.js.map +1 -1
  302. package/dist/ssr/inputs/DatePicker.js +14 -9
  303. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  304. package/dist/ssr/inputs/PeriodPicker.js +598 -0
  305. package/dist/ssr/inputs/PeriodPicker.js.map +1 -0
  306. package/dist/ssr/inputs/index.js +5 -1
  307. package/dist/ssr/inputs/index.js.map +1 -1
  308. package/dist/ssr/inputs/input-messages.js +8 -2
  309. package/dist/ssr/inputs/input-messages.js.map +1 -1
  310. package/dist/ssr/inputs/markdown/MarkdownEditor.js +3 -2
  311. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  312. package/dist/ssr/inputs/markdown/MarkdownSelectionToolbar.js +293 -0
  313. package/dist/ssr/inputs/markdown/MarkdownSelectionToolbar.js.map +1 -0
  314. package/dist/ssr/inputs/markdown/SlashCommands.js +339 -0
  315. package/dist/ssr/inputs/markdown/SlashCommands.js.map +1 -0
  316. package/dist/ssr/inputs/period-picker-messages.js +71 -0
  317. package/dist/ssr/inputs/period-picker-messages.js.map +1 -0
  318. package/dist/ssr/inputs/period.js +263 -0
  319. package/dist/ssr/inputs/period.js.map +1 -0
  320. package/dist/ssr/internal/field.js +36 -24
  321. package/dist/ssr/internal/field.js.map +1 -1
  322. package/dist/ssr/layout/AppWorkspace.js +5 -1
  323. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  324. package/dist/ssr/layout/DetailPanel.js +27 -4
  325. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  326. package/dist/ssr/layout/Discussion.js +16 -2
  327. package/dist/ssr/layout/Discussion.js.map +1 -1
  328. package/dist/ssr/layout/PanelDialog.js +40 -26
  329. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  330. package/dist/ssr/layout/index.js.map +1 -1
  331. package/dist/ssr/surfaces/DescriptionList.js +1 -1
  332. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  333. package/dist/ssr/surfaces/StatCell.js +31 -21
  334. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  335. package/dist/ssr/surfaces/delta-badge.js +16 -2
  336. package/dist/ssr/surfaces/delta-badge.js.map +1 -1
  337. package/dist/ssr/surfaces/stat-cell-messages.js +4 -2
  338. package/dist/ssr/surfaces/stat-cell-messages.js.map +1 -1
  339. package/dist/ssr/widgets/DashboardFrame.js +195 -0
  340. package/dist/ssr/widgets/DashboardFrame.js.map +1 -0
  341. package/dist/ssr/widgets/index.js +1 -0
  342. package/dist/ssr/widgets/index.js.map +1 -1
  343. package/dist/styles.css +1 -1
  344. package/dist/types/actions/Button.d.ts +1 -1
  345. package/dist/types/actions/CommandList.d.ts +120 -0
  346. package/dist/types/actions/CommandMenu.d.ts +39 -0
  347. package/dist/types/actions/Dropdown.d.ts +17 -0
  348. package/dist/types/actions/Toolbar.d.ts +2 -0
  349. package/dist/types/actions/command-dock.d.ts +8 -0
  350. package/dist/types/actions/command-items.d.ts +134 -0
  351. package/dist/types/actions/command-messages.d.ts +19 -0
  352. package/dist/types/actions/index.d.ts +3 -0
  353. package/dist/types/charts/core/bar-labels.d.ts +1 -0
  354. package/dist/types/charts/core/bubble.d.ts +66 -0
  355. package/dist/types/charts/core/calendar.d.ts +1 -1
  356. package/dist/types/charts/core/chart-messages.d.ts +5 -0
  357. package/dist/types/charts/core/default-styles.d.ts +1 -0
  358. package/dist/types/charts/core/funnel-layout.d.ts +43 -0
  359. package/dist/types/charts/core/funnel.d.ts +13 -0
  360. package/dist/types/charts/core/hbar-layout.d.ts +74 -0
  361. package/dist/types/charts/core/hbar.d.ts +13 -0
  362. package/dist/types/charts/core/index.d.ts +12 -2
  363. package/dist/types/charts/core/map.d.ts +3 -0
  364. package/dist/types/charts/core/pareto.d.ts +40 -0
  365. package/dist/types/charts/core/radar.d.ts +47 -0
  366. package/dist/types/charts/core/registry.d.ts +27 -11
  367. package/dist/types/charts/core/render-size.d.ts +7 -0
  368. package/dist/types/charts/core/render.d.ts +1 -4
  369. package/dist/types/charts/core/snapshot.d.ts +2 -2
  370. package/dist/types/charts/core/svg-barGauge.d.ts +3 -0
  371. package/dist/types/charts/core/svg-boxplot.d.ts +18 -0
  372. package/dist/types/charts/core/svg-common.d.ts +612 -0
  373. package/dist/types/charts/core/svg-gauge.d.ts +6 -0
  374. package/dist/types/charts/core/svg-heatmap.d.ts +6 -0
  375. package/dist/types/charts/core/svg-histogram.d.ts +16 -0
  376. package/dist/types/charts/core/svg-renderers.d.ts +118 -0
  377. package/dist/types/charts/core/svg-scatter.d.ts +23 -0
  378. package/dist/types/charts/core/svg.d.ts +4 -698
  379. package/dist/types/charts/core/treemap.d.ts +45 -0
  380. package/dist/types/charts/core/types.d.ts +1 -12
  381. package/dist/types/charts/core/waterfall.d.ts +68 -0
  382. package/dist/types/charts/description.d.ts +289 -0
  383. package/dist/types/charts.d.ts +1 -0
  384. package/dist/types/content/Chart.d.ts +3 -91
  385. package/dist/types/content/ChartRoot.d.ts +92 -0
  386. package/dist/types/content/ChartSparkline.d.ts +5 -0
  387. package/dist/types/content/Lightbox.d.ts +2 -0
  388. package/dist/types/content/PdfViewer.d.ts +32 -0
  389. package/dist/types/content/ThumbnailStrip.d.ts +29 -0
  390. package/dist/types/content/chart-bar.d.ts +131 -2
  391. package/dist/types/content/chart-inspection-core.d.ts +7 -0
  392. package/dist/types/content/chart-inspection.d.ts +1 -0
  393. package/dist/types/content/chart-message-catalog.d.ts +8 -0
  394. package/dist/types/content/index.d.ts +3 -0
  395. package/dist/types/content/pdf-document.d.ts +5 -0
  396. package/dist/types/content/pdf-engine.d.ts +9 -0
  397. package/dist/types/content/pdf-limits.d.ts +43 -0
  398. package/dist/types/content/pdf-messages.d.ts +16 -0
  399. package/dist/types/content/thumbnail-strip-messages.d.ts +10 -0
  400. package/dist/types/inputs/ChoiceInputs.d.ts +6 -0
  401. package/dist/types/inputs/ChoiceSlider.d.ts +12 -0
  402. package/dist/types/inputs/DatePicker.d.ts +22 -0
  403. package/dist/types/inputs/PeriodPicker.d.ts +24 -0
  404. package/dist/types/inputs/index.d.ts +10 -2
  405. package/dist/types/inputs/input-messages.d.ts +3 -0
  406. package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -0
  407. package/dist/types/inputs/markdown/MarkdownSelectionToolbar.d.ts +19 -0
  408. package/dist/types/inputs/markdown/SlashCommands.d.ts +20 -0
  409. package/dist/types/inputs/period-picker-messages.d.ts +34 -0
  410. package/dist/types/inputs/period.d.ts +134 -0
  411. package/dist/types/internal/field.d.ts +2 -0
  412. package/dist/types/layout/DetailPanel.d.ts +12 -0
  413. package/dist/types/layout/PanelDialog.d.ts +5 -0
  414. package/dist/types/layout/index.d.ts +1 -1
  415. package/dist/types/surfaces/DescriptionList.d.ts +5 -0
  416. package/dist/types/surfaces/StatCell.d.ts +6 -1
  417. package/dist/types/surfaces/stat-cell-messages.d.ts +1 -0
  418. package/dist/types/widgets/DashboardFrame.d.ts +61 -0
  419. package/dist/types/widgets/index.d.ts +1 -0
  420. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["charts/core/calendar.ts"],"sourcesContent":["import { type ChartOptions, chartDatumSvg, escapeXml, type HeatmapOptions, heatmap, renderHeader, svgRoot } from \"./svg\";\nimport { chartTextWidth } from \"./text\";\nexport type CalendarHeatmapOptions = ChartOptions & {\n layout: \"calendar\";\n data: [string, number | null][];\n scale: \"sequential\" | \"diverging\";\n /** Unit shown beside each tooltip value. */\n label?: string;\n locale?: string;\n format?: (value: number) => string;\n displayWidth?: number;\n};\nexport type HeatmapChartOptions = (HeatmapOptions & { layout?: undefined }) | CalendarHeatmapOptions;\nconst DAY = 86400000;\n/** Bound sparse inputs too: three leap years of daily observations. */\nexport const CALENDAR_MAX_DAYS = 1098;\nexport function calendarDay(value: string): number {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) throw new RangeError(\"Calendar dates must be YYYY-MM-DD.\");\n const date = new Date(`${value}T00:00:00Z`);\n if (!Number.isFinite(date.getTime()) || date.toISOString().slice(0, 10) !== value) throw new RangeError(\"Invalid calendar date.\");\n return date.getTime();\n}\n/** Intl uses 1..7, JS dates use 0..6. Old engines use an explicit locale fallback. */\nexport function calendarWeekStart(locale = \"en\"): number {\n const info: Intl.Locale & { weekInfo?: { firstDay: number }; getWeekInfo?: () => { firstDay: number } } = new Intl.Locale(locale);\n const fallback: Record<string, number> = { \"en-US\": 0 };\n const key = `${info.language}-${info.region ?? info.maximize().region}`;\n return (info.getWeekInfo?.().firstDay ?? info.weekInfo?.firstDay ?? fallback[key] ?? 1) % 7;\n}\nexport const calendarWords = (locale = \"en\") =>\n locale.split(\"-\")[0] === \"de\"\n ? { day: \"Tag\", less: \"weniger\", more: \"mehr\", moreIn: \"mehr rein\", moreOut: \"mehr raus\" }\n : { day: \"Day\", less: \"less\", more: \"more\", moreIn: \"more in\", moreOut: \"more out\" };\n/** Explicit fields avoid the engine-dependent dateStyle pattern. */\nconst calendarDateParts = (locale: string) => {\n const formatter = new Intl.DateTimeFormat(locale, { weekday: \"long\", month: \"long\", day: \"numeric\", year: \"numeric\", timeZone: \"UTC\" });\n return (time: number) => Object.fromEntries(formatter.formatToParts(time).map((part) => [part.type, part.value]));\n};\nexport function calendarLayout(spec: CalendarHeatmapOptions, size = { width: spec.width ?? 480, height: spec.height ?? 280 }) {\n const seen = new Set<string>();\n const dates = spec.data\n .map(([date, value], index) => {\n if (seen.has(date)) throw new RangeError(\"Calendar dates must be unique.\");\n seen.add(date);\n const time = calendarDay(date);\n if (value !== null && !Number.isNaN(value) && !Number.isFinite(value)) throw new RangeError(\"Calendar values must be finite.\");\n return { date, value, index, time };\n })\n .sort((a, b) => a.time - b.time);\n if (dates.length && (dates.at(-1)!.time - dates[0]!.time) / DAY >= CALENDAR_MAX_DAYS)\n throw new RangeError(\"Calendar span must not exceed three years.\");\n const points = dates.filter((p): p is typeof p & { value: number } => p.value !== null && Number.isFinite(p.value));\n const weekStart = calendarWeekStart(spec.locale);\n const first = dates[0]?.time ?? 0;\n const monday = first - ((new Date(first).getUTCDay() - weekStart + 7) % 7) * DAY;\n const weeks = dates.length ? Math.floor((dates.at(-1)!.time - monday) / DAY / 7) + 1 : 0;\n const headerHeight = renderHeader(size.width, spec.title, spec.subtitle).height;\n // Seven square rows use the available panel height. Wider calendars scroll rather than flattening their cells.\n const cell = Math.max(14, Math.floor((size.height - headerHeight - 32 - 20 - 18) / 7)),\n gap = 3,\n left = 32;\n const width = Math.max(spec.displayWidth ?? size.width, left + weeks * (cell + gap) + 4);\n const top = 32 + renderHeader(width, spec.title, spec.subtitle).height;\n const min = Math.min(...points.map((p) => p.value), 0),\n max = Math.max(...points.map((p) => p.value), 0);\n const absMax = Math.max(-min, max);\n return {\n width,\n height: size.height,\n minWidth: width,\n firstMonday: monday,\n weekStart,\n weeks,\n min,\n max,\n absMax,\n cell,\n cellWidth: cell,\n top,\n cells: points.map((p) => {\n const day = Math.round((p.time - monday) / DAY),\n week = Math.floor(day / 7),\n weekday = day % 7;\n const intensity = spec.scale === \"diverging\" ? Math.abs(p.value) / (absMax || 1) : (p.value - min) / (max - min || 1);\n const color =\n spec.scale === \"diverging\"\n ? p.value < 0\n ? \"var(--k2b-flow-out-mark,#8b5cf6)\"\n : \"var(--k2b-flow-in-mark,#0891b2)\"\n : \"var(--stdlib-chart-c1,#3b82f6)\";\n return { ...p, week, weekday, x: left + week * (cell + gap), y: top + weekday * (cell + gap), intensity, color };\n }),\n };\n}\nconst paint = (color: string, intensity: number) =>\n `color-mix(in srgb,${color} ${12 + 88 * Math.sqrt(intensity)}%,var(--k2b-surface-muted,#f4f4f5))`;\nexport function renderCalendarSvg(spec: CalendarHeatmapOptions): string {\n const s = calendarLayout(spec),\n locale = spec.locale ?? \"en\",\n words = calendarWords(locale);\n const number = spec.format ?? new Intl.NumberFormat(locale, { maximumSignificantDigits: 15 }).format;\n const parts = calendarDateParts(locale);\n const weekday = new Intl.DateTimeFormat(locale, { weekday: \"short\", timeZone: \"UTC\" });\n const month = new Intl.DateTimeFormat(locale, { month: \"short\", timeZone: \"UTC\" });\n // Left aligned direct-core header; interactive hosts keep it at the visible scroll edge.\n const header = renderHeader(s.width, spec.title, spec.subtitle)\n .svg.replace(/x=\"[^\"]*\"/g, 'x=\"0\"')\n .replace(/text-anchor=\"middle\"/g, 'text-anchor=\"start\"')\n .replace(/<text /g, '<text fill=\"var(--k2b-text,#27272a)\" font-size=\"12\" ');\n const body: string[] = [`<g style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\">${header}</g>`];\n const days: string[] = [\n `<g data-calendar-weekdays=\"true\" pointer-events=\"none\" style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\"><rect x=\"-1\" y=\"${s.top - 18}\" width=\"33\" height=\"${7 * (s.cell + 3) + 18}\" fill=\"var(--k2b-surface,#fff)\"/>`,\n ];\n for (const day of [0, 2, 4])\n days.push(\n `<text x=\"0\" y=\"${s.top + day * (s.cell + 3) + s.cell - 2}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(weekday.format(Date.UTC(2026, 0, 4 + s.weekStart + day)))}</text>`,\n );\n let lastRight = -Infinity,\n lastMonth = \"\";\n for (let week = 0; week < s.weeks; week++) {\n const time = s.firstMonday + week * 7 * DAY,\n next = time + 6 * DAY;\n const nextDate = new Date(next),\n ym = nextDate.toISOString().slice(0, 7);\n if (ym === lastMonth) continue;\n lastMonth = ym;\n const text = month.format(next);\n const textWidth = chartTextWidth(text, 11);\n const x = Math.min(s.width - textWidth - 2, Math.max(32 + week * (s.cell + 3), lastRight + 3));\n const visibility = `visibility:var(--k2b-calendar-month-${week},visible)`;\n // The year has its own row, so a partial first month cannot suppress the following month.\n if (week === 0 || nextDate.getUTCMonth() === 0)\n body.push(\n `<g style=\"${visibility}\"><text x=\"${x}\" y=\"${s.top - 24}\" font-size=\"10\" fill=\"var(--k2b-text-muted,#45454e)\">${nextDate.getUTCFullYear()}</text></g>`,\n );\n body.push(\n `<text data-calendar-month=\"${week}\" style=\"${visibility}\" x=\"${x}\" y=\"${s.top - 10}\" font-size=\"11\" fill=\"var(--k2b-text-muted,#45454e)\">${escapeXml(text)}</text>`,\n );\n lastRight = x + textWidth;\n }\n for (const c of s.cells) {\n const d = parts(c.time);\n const date = locale.startsWith(\"de\")\n ? `${d.day}. ${d.month} ${d.year}`\n : /^en(?:-US)?$/.test(locale)\n ? `${d.month} ${d.day}, ${d.year}`\n : `${d.day} ${d.month} ${d.year}`;\n const fill = spec.scale === \"diverging\" && c.value === 0 ? \"var(--k2b-surface-muted,#f4f4f5)\" : paint(c.color, c.intensity);\n const value =\n spec.scale === \"diverging\" && c.value !== 0\n ? `${number(Math.abs(c.value))} ${c.value < 0 ? words.moreOut : words.moreIn}`\n : number(c.value);\n body.push(\n chartDatumSvg(\n `<rect x=\"${c.x}\" y=\"${c.y}\" width=\"${s.cell}\" height=\"${s.cell}\" rx=\"2\" fill=\"${fill}\" stroke=\"none\"/>`,\n {\n role: \"cell\",\n index: c.index,\n label: `${d.weekday}, ${date}`,\n anchor: [c.x + s.cell / 2, c.y + s.cell / 2],\n grid: [c.week, c.weekday],\n values: [{ key: \"value\", value: c.value, formatted: value }],\n },\n spec.inspect,\n ),\n );\n }\n days.push(\"</g>\");\n body.push(days.join(\"\"));\n const legendY = s.top + 7 * (s.cell + 3) + 12;\n const start = spec.scale === \"diverging\" ? words.moreOut : words.less,\n end = spec.scale === \"diverging\" ? words.moreIn : words.more;\n const swatches = spec.scale === \"diverging\" ? [-1, -0.5, 0, 0.5, 1] : [0, 0.25, 0.5, 0.75, 1];\n const offset = 32 + start.length * 6 + 8;\n body.push(\n `<g data-calendar-legend=\"true\" style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\"><text x=\"32\" y=\"${legendY}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(start)}</text>`,\n );\n swatches.forEach((v, i) => {\n const color =\n spec.scale === \"diverging\"\n ? v < 0\n ? \"var(--k2b-flow-out-mark,#8b5cf6)\"\n : \"var(--k2b-flow-in-mark,#0891b2)\"\n : \"var(--stdlib-chart-c1,#3b82f6)\";\n body.push(\n `<rect x=\"${offset + i * 14}\" y=\"${legendY - 10}\" width=\"11\" height=\"11\" rx=\"2\" fill=\"${spec.scale === \"diverging\" && v === 0 ? \"var(--k2b-surface-muted,#f4f4f5)\" : paint(color, Math.abs(v))}\"/>`,\n );\n });\n body.push(\n `<text x=\"${offset + swatches.length * 14 + 4}\" y=\"${legendY}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(end)}</text></g>`,\n );\n return svgRoot({ ...s, className: spec.className }, body.join(\"\")).replace(\n \"<svg \",\n `<svg data-calendar=\"true\" data-chart-min-width=\"${s.minWidth}\" `,\n );\n}\nexport const renderHeatmapSvg = (spec: HeatmapChartOptions): string =>\n spec.layout === \"calendar\" ? renderCalendarSvg(spec) : heatmap(spec);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["charts/core/calendar.ts"],"sourcesContent":["import { type ChartOptions, chartDatumSvg, escapeXml, type HeatmapOptions, heatmap, renderHeader, svgRoot } from \"./svg-renderers\";\nimport { chartTextWidth } from \"./text\";\nexport type CalendarHeatmapOptions = ChartOptions & {\n layout: \"calendar\";\n data: [string, number | null][];\n scale: \"sequential\" | \"diverging\";\n /** Unit shown beside each tooltip value. */\n label?: string;\n locale?: string;\n format?: (value: number) => string;\n displayWidth?: number;\n};\nexport type HeatmapChartOptions = (HeatmapOptions & { layout?: undefined }) | CalendarHeatmapOptions;\nconst DAY = 86400000;\n/** Bound sparse inputs too: three leap years of daily observations. */\nexport const CALENDAR_MAX_DAYS = 1098;\nexport function calendarDay(value: string): number {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) throw new RangeError(\"Calendar dates must be YYYY-MM-DD.\");\n const date = new Date(`${value}T00:00:00Z`);\n if (!Number.isFinite(date.getTime()) || date.toISOString().slice(0, 10) !== value) throw new RangeError(\"Invalid calendar date.\");\n return date.getTime();\n}\n/** Intl uses 1..7, JS dates use 0..6. Old engines use an explicit locale fallback. */\nexport function calendarWeekStart(locale = \"en\"): number {\n const info: Intl.Locale & { weekInfo?: { firstDay: number }; getWeekInfo?: () => { firstDay: number } } = new Intl.Locale(locale);\n const fallback: Record<string, number> = { \"en-US\": 0 };\n const key = `${info.language}-${info.region ?? info.maximize().region}`;\n return (info.getWeekInfo?.().firstDay ?? info.weekInfo?.firstDay ?? fallback[key] ?? 1) % 7;\n}\nexport const calendarWords = (locale = \"en\") =>\n locale.split(\"-\")[0] === \"de\"\n ? { day: \"Tag\", less: \"weniger\", more: \"mehr\", moreIn: \"mehr rein\", moreOut: \"mehr raus\" }\n : { day: \"Day\", less: \"less\", more: \"more\", moreIn: \"more in\", moreOut: \"more out\" };\n/** Explicit fields avoid the engine-dependent dateStyle pattern. */\nconst calendarDateParts = (locale: string) => {\n const formatter = new Intl.DateTimeFormat(locale, { weekday: \"long\", month: \"long\", day: \"numeric\", year: \"numeric\", timeZone: \"UTC\" });\n return (time: number) => Object.fromEntries(formatter.formatToParts(time).map((part) => [part.type, part.value]));\n};\nexport function calendarLayout(spec: CalendarHeatmapOptions, size = { width: spec.width ?? 480, height: spec.height ?? 280 }) {\n const seen = new Set<string>();\n const dates = spec.data\n .map(([date, value], index) => {\n if (seen.has(date)) throw new RangeError(\"Calendar dates must be unique.\");\n seen.add(date);\n const time = calendarDay(date);\n if (value !== null && !Number.isNaN(value) && !Number.isFinite(value)) throw new RangeError(\"Calendar values must be finite.\");\n return { date, value, index, time };\n })\n .sort((a, b) => a.time - b.time);\n if (dates.length && (dates.at(-1)!.time - dates[0]!.time) / DAY >= CALENDAR_MAX_DAYS)\n throw new RangeError(\"Calendar span must not exceed three years.\");\n const points = dates.filter((p): p is typeof p & { value: number } => p.value !== null && Number.isFinite(p.value));\n const weekStart = calendarWeekStart(spec.locale);\n const first = dates[0]?.time ?? 0;\n const monday = first - ((new Date(first).getUTCDay() - weekStart + 7) % 7) * DAY;\n const weeks = dates.length ? Math.floor((dates.at(-1)!.time - monday) / DAY / 7) + 1 : 0;\n const headerHeight = renderHeader(size.width, spec.title, spec.subtitle).height;\n // Seven square rows use the available panel height. Wider calendars scroll rather than flattening their cells.\n const cell = Math.max(14, Math.floor((size.height - headerHeight - 32 - 20 - 18) / 7)),\n gap = 3,\n left = 32;\n const width = Math.max(spec.displayWidth ?? size.width, left + weeks * (cell + gap) + 4);\n const top = 32 + renderHeader(width, spec.title, spec.subtitle).height;\n const min = Math.min(...points.map((p) => p.value), 0),\n max = Math.max(...points.map((p) => p.value), 0);\n const absMax = Math.max(-min, max);\n return {\n width,\n height: size.height,\n minWidth: width,\n firstMonday: monday,\n weekStart,\n weeks,\n min,\n max,\n absMax,\n cell,\n cellWidth: cell,\n top,\n cells: points.map((p) => {\n const day = Math.round((p.time - monday) / DAY),\n week = Math.floor(day / 7),\n weekday = day % 7;\n const intensity = spec.scale === \"diverging\" ? Math.abs(p.value) / (absMax || 1) : (p.value - min) / (max - min || 1);\n const color =\n spec.scale === \"diverging\"\n ? p.value < 0\n ? \"var(--k2b-flow-out-mark,#8b5cf6)\"\n : \"var(--k2b-flow-in-mark,#0891b2)\"\n : \"var(--stdlib-chart-c1,#3b82f6)\";\n return { ...p, week, weekday, x: left + week * (cell + gap), y: top + weekday * (cell + gap), intensity, color };\n }),\n };\n}\nconst paint = (color: string, intensity: number) =>\n `color-mix(in srgb,${color} ${12 + 88 * Math.sqrt(intensity)}%,var(--k2b-surface-muted,#f4f4f5))`;\nexport function renderCalendarSvg(spec: CalendarHeatmapOptions): string {\n const s = calendarLayout(spec),\n locale = spec.locale ?? \"en\",\n words = calendarWords(locale);\n const number = spec.format ?? new Intl.NumberFormat(locale, { maximumSignificantDigits: 15 }).format;\n const parts = calendarDateParts(locale);\n const weekday = new Intl.DateTimeFormat(locale, { weekday: \"short\", timeZone: \"UTC\" });\n const month = new Intl.DateTimeFormat(locale, { month: \"short\", timeZone: \"UTC\" });\n // Left aligned direct-core header; interactive hosts keep it at the visible scroll edge.\n const header = renderHeader(s.width, spec.title, spec.subtitle)\n .svg.replace(/x=\"[^\"]*\"/g, 'x=\"0\"')\n .replace(/text-anchor=\"middle\"/g, 'text-anchor=\"start\"')\n .replace(/<text /g, '<text fill=\"var(--k2b-text,#27272a)\" font-size=\"12\" ');\n const body: string[] = [`<g style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\">${header}</g>`];\n const days: string[] = [\n `<g data-calendar-weekdays=\"true\" pointer-events=\"none\" style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\"><rect x=\"-1\" y=\"${s.top - 18}\" width=\"33\" height=\"${7 * (s.cell + 3) + 18}\" fill=\"var(--k2b-surface,#fff)\"/>`,\n ];\n for (const day of [0, 2, 4])\n days.push(\n `<text x=\"0\" y=\"${s.top + day * (s.cell + 3) + s.cell - 2}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(weekday.format(Date.UTC(2026, 0, 4 + s.weekStart + day)))}</text>`,\n );\n let lastRight = -Infinity,\n lastMonth = \"\";\n for (let week = 0; week < s.weeks; week++) {\n const time = s.firstMonday + week * 7 * DAY,\n next = time + 6 * DAY;\n const nextDate = new Date(next),\n ym = nextDate.toISOString().slice(0, 7);\n if (ym === lastMonth) continue;\n lastMonth = ym;\n const text = month.format(next);\n const textWidth = chartTextWidth(text, 11);\n const x = Math.min(s.width - textWidth - 2, Math.max(32 + week * (s.cell + 3), lastRight + 3));\n const visibility = `visibility:var(--k2b-calendar-month-${week},visible)`;\n // The year has its own row, so a partial first month cannot suppress the following month.\n if (week === 0 || nextDate.getUTCMonth() === 0)\n body.push(\n `<g style=\"${visibility}\"><text x=\"${x}\" y=\"${s.top - 24}\" font-size=\"10\" fill=\"var(--k2b-text-muted,#45454e)\">${nextDate.getUTCFullYear()}</text></g>`,\n );\n body.push(\n `<text data-calendar-month=\"${week}\" style=\"${visibility}\" x=\"${x}\" y=\"${s.top - 10}\" font-size=\"11\" fill=\"var(--k2b-text-muted,#45454e)\">${escapeXml(text)}</text>`,\n );\n lastRight = x + textWidth;\n }\n for (const c of s.cells) {\n const d = parts(c.time);\n const date = locale.startsWith(\"de\")\n ? `${d.day}. ${d.month} ${d.year}`\n : /^en(?:-US)?$/.test(locale)\n ? `${d.month} ${d.day}, ${d.year}`\n : `${d.day} ${d.month} ${d.year}`;\n const fill = spec.scale === \"diverging\" && c.value === 0 ? \"var(--k2b-surface-muted,#f4f4f5)\" : paint(c.color, c.intensity);\n const value =\n spec.scale === \"diverging\" && c.value !== 0\n ? `${number(Math.abs(c.value))} ${c.value < 0 ? words.moreOut : words.moreIn}`\n : number(c.value);\n body.push(\n chartDatumSvg(\n `<rect x=\"${c.x}\" y=\"${c.y}\" width=\"${s.cell}\" height=\"${s.cell}\" rx=\"2\" fill=\"${fill}\" stroke=\"none\"/>`,\n {\n role: \"cell\",\n index: c.index,\n label: `${d.weekday}, ${date}`,\n anchor: [c.x + s.cell / 2, c.y + s.cell / 2],\n grid: [c.week, c.weekday],\n values: [{ key: \"value\", value: c.value, formatted: value }],\n },\n spec.inspect,\n ),\n );\n }\n days.push(\"</g>\");\n body.push(days.join(\"\"));\n const legendY = s.top + 7 * (s.cell + 3) + 12;\n const start = spec.scale === \"diverging\" ? words.moreOut : words.less,\n end = spec.scale === \"diverging\" ? words.moreIn : words.more;\n const swatches = spec.scale === \"diverging\" ? [-1, -0.5, 0, 0.5, 1] : [0, 0.25, 0.5, 0.75, 1];\n const offset = 32 + start.length * 6 + 8;\n body.push(\n `<g data-calendar-legend=\"true\" style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\"><text x=\"32\" y=\"${legendY}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(start)}</text>`,\n );\n swatches.forEach((v, i) => {\n const color =\n spec.scale === \"diverging\"\n ? v < 0\n ? \"var(--k2b-flow-out-mark,#8b5cf6)\"\n : \"var(--k2b-flow-in-mark,#0891b2)\"\n : \"var(--stdlib-chart-c1,#3b82f6)\";\n body.push(\n `<rect x=\"${offset + i * 14}\" y=\"${legendY - 10}\" width=\"11\" height=\"11\" rx=\"2\" fill=\"${spec.scale === \"diverging\" && v === 0 ? \"var(--k2b-surface-muted,#f4f4f5)\" : paint(color, Math.abs(v))}\"/>`,\n );\n });\n body.push(\n `<text x=\"${offset + swatches.length * 14 + 4}\" y=\"${legendY}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(end)}</text></g>`,\n );\n return svgRoot({ ...s, className: spec.className }, body.join(\"\")).replace(\n \"<svg \",\n `<svg data-calendar=\"true\" data-chart-min-width=\"${s.minWidth}\" `,\n );\n}\nexport const renderHeatmapSvg = (spec: HeatmapChartOptions): string =>\n spec.layout === \"calendar\" ? renderCalendarSvg(spec) : heatmap(spec);\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,17 @@
1
+ import { i18n } from "@k2b/stdlib";
2
+
3
+ /** Labels needed by pure SVG renderers; UI inspection messages stay with the UI host. */
4
+ export const coreChartMessages = i18n.define({
5
+ baseLocale: "en",
6
+ messages: {
7
+ en: {
8
+ series: "Series",
9
+ areaTotal: "Total"
10
+ },
11
+ de: {
12
+ series: "Datenreihe",
13
+ areaTotal: "Zusammen"
14
+ }
15
+ }
16
+ });
17
+ //# sourceMappingURL=chart-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["charts/core/chart-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\n\n/** Labels needed by pure SVG renderers; UI inspection messages stay with the UI host. */\nexport const coreChartMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: { series: \"Series\", areaTotal: \"Total\" },\n de: { series: \"Datenreihe\", areaTotal: \"Zusammen\" },\n },\n});\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;;AAElC;AACA,OAAO,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;EAC3C,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MAAE,MAAM,EAAE,QAAQ;MAAE,SAAS,EAAE;IAAQ,CAAC;IAC5C,EAAE,EAAE;MAAE,MAAM,EAAE,YAAY;MAAE,SAAS,EAAE;IAAW;EACpD;AACF,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,83 @@
1
+ // CSS rule order is significant. Series-N rules emit first so shape-specific
2
+ // rules below can override (e.g. line's `fill: none` beats series fill, and
3
+ // slice/point's `stroke: white` beats series stroke).
4
+ export const DEFAULT_STYLES = `
5
+ /* font-family is intentionally not set here so the chart inherits the app's
6
+ font from its surrounding HTML context. For standalone SVG usage, set
7
+ font-family on a wrapping element or override .stdlib-chart in your CSS. */
8
+ .stdlib-chart {
9
+ color: #1f2937;
10
+ --stdlib-chart-c1: #3b82f6; --stdlib-chart-c2: #10b981;
11
+ --stdlib-chart-c3: #f59e0b; --stdlib-chart-c4: #ef4444;
12
+ --stdlib-chart-c5: #8b5cf6; --stdlib-chart-c6: #ec4899;
13
+ --stdlib-chart-c7: #14b8a6; --stdlib-chart-c8: #f97316;
14
+ }
15
+ .stdlib-chart-series-0 { fill: var(--stdlib-chart-c1); stroke: var(--stdlib-chart-c1); }
16
+ .stdlib-chart-series-1 { fill: var(--stdlib-chart-c2); stroke: var(--stdlib-chart-c2); }
17
+ .stdlib-chart-series-2 { fill: var(--stdlib-chart-c3); stroke: var(--stdlib-chart-c3); }
18
+ .stdlib-chart-series-3 { fill: var(--stdlib-chart-c4); stroke: var(--stdlib-chart-c4); }
19
+ .stdlib-chart-series-4 { fill: var(--stdlib-chart-c5); stroke: var(--stdlib-chart-c5); }
20
+ .stdlib-chart-series-5 { fill: var(--stdlib-chart-c6); stroke: var(--stdlib-chart-c6); }
21
+ .stdlib-chart-series-6 { fill: var(--stdlib-chart-c7); stroke: var(--stdlib-chart-c7); }
22
+ .stdlib-chart-series-7 { fill: var(--stdlib-chart-c8); stroke: var(--stdlib-chart-c8); }
23
+ .stdlib-chart-axis { stroke: currentColor; opacity: 0.4; fill: none; }
24
+ .stdlib-chart-tick-label { font-size: 10px; fill: currentColor; opacity: 0.6; }
25
+ .stdlib-chart-axis-label { font-size: 11px; fill: currentColor; opacity: 0.85; }
26
+ .stdlib-chart-grid { stroke: currentColor; opacity: 0.08; stroke-dasharray: 2 2; fill: none; }
27
+ .stdlib-chart-title { font-size: 14px; font-weight: 600; fill: currentColor; }
28
+ .stdlib-chart-subtitle { font-size: 11px; fill: currentColor; opacity: 0.7; }
29
+ .stdlib-chart-reference { stroke: currentColor; opacity: 0.5; stroke-dasharray: 4 4; fill: none; }
30
+ .stdlib-chart-reference-label { font-size: 10px; fill: currentColor; opacity: 0.7; }
31
+ .stdlib-chart-line { fill: none; stroke-width: 2; }
32
+ .stdlib-chart-area { fill-opacity: 0.18; stroke: none; }
33
+ .stdlib-chart-sparkline { fill: none; stroke-width: 1.5; stroke: currentColor; }
34
+ .stdlib-chart-sparkline-area { stroke: none; }
35
+ .stdlib-chart-sparkline-last { fill: currentColor; stroke: none; }
36
+ .stdlib-chart-sparkline-max { fill: #10b981; stroke: none; }
37
+ .stdlib-chart-sparkline-min { fill: #ef4444; stroke: none; }
38
+ .stdlib-chart-point { stroke: white; stroke-width: 1.5; }
39
+ .stdlib-chart-slice { stroke: white; stroke-width: 2; stroke-linejoin: round; }
40
+ .stdlib-chart-label { font-size: 11px; fill: currentColor; }
41
+ .stdlib-chart-bar-value { font-size: 10px; fill: currentColor; opacity: 0.8; }
42
+ .stdlib-chart-errorbar { stroke: currentColor; opacity: 0.55; fill: none; stroke-width: 1; }
43
+ .stdlib-chart-error-band { fill-opacity: 0.15; stroke: none; }
44
+ .stdlib-chart-trendline { stroke: currentColor; opacity: 0.55; stroke-width: 1.5; fill: none; stroke-dasharray: 5 4; }
45
+ .stdlib-chart-minor-tick { stroke: currentColor; opacity: 0.25; }
46
+ .stdlib-chart-box { fill-opacity: 0.4; stroke-width: 1; }
47
+ .stdlib-chart-box-median { stroke: currentColor; stroke-width: 1.5; fill: none; }
48
+ .stdlib-chart-box-whisker { stroke: currentColor; opacity: 0.6; fill: none; }
49
+ .stdlib-chart-box-cap { stroke: currentColor; opacity: 0.6; fill: none; }
50
+ .stdlib-chart-box-outlier { fill: currentColor; opacity: 0.5; stroke: white; stroke-width: 1; }
51
+ .stdlib-chart-legend-swatch { stroke: none; }
52
+ .stdlib-chart-legend-label { font-size: 11px; font-weight: 400; fill: currentColor; stroke: none; }
53
+ .stdlib-chart-empty-text { font-size: 11px; fill: currentColor; opacity: 0.5; }
54
+ .stdlib-chart-gauge-track { stroke: currentColor; stroke-width: 10; opacity: 0.12; fill: none; stroke-linecap: round; }
55
+ .stdlib-chart-gauge-fill { stroke-width: 10; fill: none; stroke-linecap: round; }
56
+ .stdlib-chart-gauge-gradient-segment { stroke-width: 10; fill: none; stroke-linecap: butt; }
57
+ .stdlib-chart-gauge-gradient-scale { opacity: 0.22; }
58
+ .stdlib-chart-gauge-needle { stroke-width: 2; fill: none; stroke-linecap: round; }
59
+ .stdlib-chart-gauge-hub { fill: currentColor; stroke: none; }
60
+ .stdlib-chart-gauge-value { font-size: 28px; font-weight: 700; fill: currentColor; }
61
+ .stdlib-chart-gauge-label { font-size: 12px; fill: currentColor; opacity: 0.72; }
62
+ .stdlib-chart-gauge-unit { font-size: 11px; fill: currentColor; opacity: 0.6; }
63
+ .stdlib-chart-bar-gauge-track { fill: currentColor; opacity: 0.1; }
64
+ .stdlib-chart-bar-gauge-fill { stroke: none; }
65
+ .stdlib-chart-bar-gauge-label { font-size: 11px; fill: currentColor; opacity: 0.75; }
66
+ .stdlib-chart-bar-gauge-value { font-size: 11px; font-weight: 600; fill: currentColor; }
67
+ .stdlib-chart-stat-label { font-size: 12px; fill: currentColor; opacity: 0.72; }
68
+ .stdlib-chart-stat-value { font-size: 30px; font-weight: 700; fill: currentColor; }
69
+ .stdlib-chart-stat-unit { font-size: 14px; font-weight: 600; fill: currentColor; opacity: 0.72; }
70
+ .stdlib-chart-stat-delta { font-size: 12px; font-weight: 600; fill: currentColor; opacity: 0.72; }
71
+ .stdlib-chart-stat-delta-up { fill: #10b981; opacity: 1; }
72
+ .stdlib-chart-stat-delta-down { fill: #ef4444; opacity: 1; }
73
+ .stdlib-chart-stat-sparkline { fill: none; stroke: currentColor; stroke-width: 1.6; opacity: 0.86; }
74
+ .stdlib-chart-stat-sparkline-area { stroke: none; opacity: 0.18; }
75
+ .stdlib-chart-heatmap-cell { stroke: white; stroke-width: 1; }
76
+ .stdlib-chart-heatmap-label { font-size: 10px; fill: currentColor; opacity: 0.68; }
77
+ .stdlib-chart-map-land { fill: currentColor; opacity: var(--stdlib-chart-map-land-opacity, 0.12); stroke: currentColor; stroke-width: 0.5; stroke-linejoin: round; }
78
+ .stdlib-chart-map-point { stroke: var(--stdlib-chart-map-point-stroke, white); stroke-width: 1.5; }
79
+ .stdlib-chart-map-empty { font-size: 11px; fill: currentColor; opacity: 0.55; }
80
+ .stdlib-chart-state-region { stroke: white; stroke-width: 1; }
81
+ .stdlib-chart-state-label { font-size: 11px; fill: currentColor; opacity: 0.75; }
82
+ `.trim();
83
+ //# sourceMappingURL=default-styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["charts/core/default-styles.ts"],"sourcesContent":["// CSS rule order is significant. Series-N rules emit first so shape-specific\n// rules below can override (e.g. line's `fill: none` beats series fill, and\n// slice/point's `stroke: white` beats series stroke).\nexport const DEFAULT_STYLES = `\n/* font-family is intentionally not set here so the chart inherits the app's\n font from its surrounding HTML context. For standalone SVG usage, set\n font-family on a wrapping element or override .stdlib-chart in your CSS. */\n.stdlib-chart {\n color: #1f2937;\n --stdlib-chart-c1: #3b82f6; --stdlib-chart-c2: #10b981;\n --stdlib-chart-c3: #f59e0b; --stdlib-chart-c4: #ef4444;\n --stdlib-chart-c5: #8b5cf6; --stdlib-chart-c6: #ec4899;\n --stdlib-chart-c7: #14b8a6; --stdlib-chart-c8: #f97316;\n}\n.stdlib-chart-series-0 { fill: var(--stdlib-chart-c1); stroke: var(--stdlib-chart-c1); }\n.stdlib-chart-series-1 { fill: var(--stdlib-chart-c2); stroke: var(--stdlib-chart-c2); }\n.stdlib-chart-series-2 { fill: var(--stdlib-chart-c3); stroke: var(--stdlib-chart-c3); }\n.stdlib-chart-series-3 { fill: var(--stdlib-chart-c4); stroke: var(--stdlib-chart-c4); }\n.stdlib-chart-series-4 { fill: var(--stdlib-chart-c5); stroke: var(--stdlib-chart-c5); }\n.stdlib-chart-series-5 { fill: var(--stdlib-chart-c6); stroke: var(--stdlib-chart-c6); }\n.stdlib-chart-series-6 { fill: var(--stdlib-chart-c7); stroke: var(--stdlib-chart-c7); }\n.stdlib-chart-series-7 { fill: var(--stdlib-chart-c8); stroke: var(--stdlib-chart-c8); }\n.stdlib-chart-axis { stroke: currentColor; opacity: 0.4; fill: none; }\n.stdlib-chart-tick-label { font-size: 10px; fill: currentColor; opacity: 0.6; }\n.stdlib-chart-axis-label { font-size: 11px; fill: currentColor; opacity: 0.85; }\n.stdlib-chart-grid { stroke: currentColor; opacity: 0.08; stroke-dasharray: 2 2; fill: none; }\n.stdlib-chart-title { font-size: 14px; font-weight: 600; fill: currentColor; }\n.stdlib-chart-subtitle { font-size: 11px; fill: currentColor; opacity: 0.7; }\n.stdlib-chart-reference { stroke: currentColor; opacity: 0.5; stroke-dasharray: 4 4; fill: none; }\n.stdlib-chart-reference-label { font-size: 10px; fill: currentColor; opacity: 0.7; }\n.stdlib-chart-line { fill: none; stroke-width: 2; }\n.stdlib-chart-area { fill-opacity: 0.18; stroke: none; }\n.stdlib-chart-sparkline { fill: none; stroke-width: 1.5; stroke: currentColor; }\n.stdlib-chart-sparkline-area { stroke: none; }\n.stdlib-chart-sparkline-last { fill: currentColor; stroke: none; }\n.stdlib-chart-sparkline-max { fill: #10b981; stroke: none; }\n.stdlib-chart-sparkline-min { fill: #ef4444; stroke: none; }\n.stdlib-chart-point { stroke: white; stroke-width: 1.5; }\n.stdlib-chart-slice { stroke: white; stroke-width: 2; stroke-linejoin: round; }\n.stdlib-chart-label { font-size: 11px; fill: currentColor; }\n.stdlib-chart-bar-value { font-size: 10px; fill: currentColor; opacity: 0.8; }\n.stdlib-chart-errorbar { stroke: currentColor; opacity: 0.55; fill: none; stroke-width: 1; }\n.stdlib-chart-error-band { fill-opacity: 0.15; stroke: none; }\n.stdlib-chart-trendline { stroke: currentColor; opacity: 0.55; stroke-width: 1.5; fill: none; stroke-dasharray: 5 4; }\n.stdlib-chart-minor-tick { stroke: currentColor; opacity: 0.25; }\n.stdlib-chart-box { fill-opacity: 0.4; stroke-width: 1; }\n.stdlib-chart-box-median { stroke: currentColor; stroke-width: 1.5; fill: none; }\n.stdlib-chart-box-whisker { stroke: currentColor; opacity: 0.6; fill: none; }\n.stdlib-chart-box-cap { stroke: currentColor; opacity: 0.6; fill: none; }\n.stdlib-chart-box-outlier { fill: currentColor; opacity: 0.5; stroke: white; stroke-width: 1; }\n.stdlib-chart-legend-swatch { stroke: none; }\n.stdlib-chart-legend-label { font-size: 11px; font-weight: 400; fill: currentColor; stroke: none; }\n.stdlib-chart-empty-text { font-size: 11px; fill: currentColor; opacity: 0.5; }\n.stdlib-chart-gauge-track { stroke: currentColor; stroke-width: 10; opacity: 0.12; fill: none; stroke-linecap: round; }\n.stdlib-chart-gauge-fill { stroke-width: 10; fill: none; stroke-linecap: round; }\n.stdlib-chart-gauge-gradient-segment { stroke-width: 10; fill: none; stroke-linecap: butt; }\n.stdlib-chart-gauge-gradient-scale { opacity: 0.22; }\n.stdlib-chart-gauge-needle { stroke-width: 2; fill: none; stroke-linecap: round; }\n.stdlib-chart-gauge-hub { fill: currentColor; stroke: none; }\n.stdlib-chart-gauge-value { font-size: 28px; font-weight: 700; fill: currentColor; }\n.stdlib-chart-gauge-label { font-size: 12px; fill: currentColor; opacity: 0.72; }\n.stdlib-chart-gauge-unit { font-size: 11px; fill: currentColor; opacity: 0.6; }\n.stdlib-chart-bar-gauge-track { fill: currentColor; opacity: 0.1; }\n.stdlib-chart-bar-gauge-fill { stroke: none; }\n.stdlib-chart-bar-gauge-label { font-size: 11px; fill: currentColor; opacity: 0.75; }\n.stdlib-chart-bar-gauge-value { font-size: 11px; font-weight: 600; fill: currentColor; }\n.stdlib-chart-stat-label { font-size: 12px; fill: currentColor; opacity: 0.72; }\n.stdlib-chart-stat-value { font-size: 30px; font-weight: 700; fill: currentColor; }\n.stdlib-chart-stat-unit { font-size: 14px; font-weight: 600; fill: currentColor; opacity: 0.72; }\n.stdlib-chart-stat-delta { font-size: 12px; font-weight: 600; fill: currentColor; opacity: 0.72; }\n.stdlib-chart-stat-delta-up { fill: #10b981; opacity: 1; }\n.stdlib-chart-stat-delta-down { fill: #ef4444; opacity: 1; }\n.stdlib-chart-stat-sparkline { fill: none; stroke: currentColor; stroke-width: 1.6; opacity: 0.86; }\n.stdlib-chart-stat-sparkline-area { stroke: none; opacity: 0.18; }\n.stdlib-chart-heatmap-cell { stroke: white; stroke-width: 1; }\n.stdlib-chart-heatmap-label { font-size: 10px; fill: currentColor; opacity: 0.68; }\n.stdlib-chart-map-land { fill: currentColor; opacity: var(--stdlib-chart-map-land-opacity, 0.12); stroke: currentColor; stroke-width: 0.5; stroke-linejoin: round; }\n.stdlib-chart-map-point { stroke: var(--stdlib-chart-map-point-stroke, white); stroke-width: 1.5; }\n.stdlib-chart-map-empty { font-size: 11px; fill: currentColor; opacity: 0.55; }\n.stdlib-chart-state-region { stroke: white; stroke-width: 1; }\n.stdlib-chart-state-label { font-size: 11px; fill: currentColor; opacity: 0.75; }\n`.trim();\n"],"mappings":"AAAA;AACA;AACA;AACA,OAAO,MAAM,cAAc,GAAG;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC,IAAI,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,79 @@
1
+ import { chartTextWidth, headerHeight, wrapLabel } from "../../content/chart-bar";
2
+ import { chartMessages } from "../../content/chart-message-catalog";
3
+ import { barPercent } from "./bar-labels";
4
+ /** Ratios use the original start/previous observation. Geometry fits the largest observed step, including rises. */
5
+ export function funnelLayout(spec, size = {
6
+ width: 480,
7
+ height: 280
8
+ }) {
9
+ if (spec.data.some(d => d.value !== null && (!Number.isFinite(d.value) || d.value < 0))) throw new RangeError("Funnel values must be finite and nonnegative, or null");
10
+ const unit = size.width / 296;
11
+ const numbers = new Intl.NumberFormat(spec.locale ?? "en");
12
+ const format = spec.valueFormat ?? (v => numbers.format(v));
13
+ const labels = chartMessages.resolve([spec.locale ?? "en"]).t;
14
+ const percent = barPercent(spec.locale);
15
+ const share = (value, denominator) => value === null || denominator == null || denominator === 0 ? null : value / denominator;
16
+ const left = Math.min(96 * unit, size.width * 0.3);
17
+ const right = Math.max(104 * unit, ...spec.data.map(d => d.value === null ? 0 : (chartTextWidth(format(d.value)) + 8) * unit));
18
+ const plot = Math.max(0, size.width - left - right - 8);
19
+ const center = left + plot / 2;
20
+ const top = headerHeight(spec);
21
+ const pitch = (size.height - top) / Math.max(1, spec.data.length);
22
+ const height = Math.min(pitch * 0.6, 34);
23
+ const max = Math.max(0, ...spec.data.map(d => d.value ?? 0));
24
+ const steps = spec.data.map((d, index) => {
25
+ const startShare = share(d.value, spec.data[0]?.value);
26
+ const previousShare = index ? share(d.value, spec.data[index - 1]?.value) : null;
27
+ const y = top + index * pitch + (pitch - height) / 2;
28
+ const fields = [{
29
+ key: "value",
30
+ value: d.value ?? "–",
31
+ formatted: d.value === null ? "–" : format(d.value)
32
+ }, {
33
+ key: "startPercent",
34
+ value: startShare === null ? "–" : startShare * 100,
35
+ formatted: startShare === null ? "–" : percent.format(startShare)
36
+ }, ...(index ? [{
37
+ key: "previousPercent",
38
+ value: previousShare === null ? "–" : previousShare * 100,
39
+ formatted: previousShare === null ? "–" : percent.format(previousShare)
40
+ }] : [])];
41
+ const datum = {
42
+ role: "item",
43
+ index,
44
+ label: d.label,
45
+ anchor: [center, y],
46
+ values: fields
47
+ };
48
+ return {
49
+ ...d,
50
+ index,
51
+ center,
52
+ y,
53
+ width: d.value === null || max === 0 ? 0 : d.value / max * plot,
54
+ startShare,
55
+ previousShare,
56
+ datum,
57
+ labelLines: wrapLabel(d.label, (left / unit - 8) * 11 / 12.5, 2).lines,
58
+ valueText: fields[0].formatted,
59
+ shareText: `${fields[1].formatted} ${labels.chartBarStart}`,
60
+ title: `${d.label} · ${fields[0].formatted} · ${labels.chartFields({
61
+ key: "startPercent"
62
+ })}: ${fields[1].formatted}${index ? ` · ${labels.chartFields({
63
+ key: "previousPercent"
64
+ })}: ${fields[2].formatted}` : ""}`
65
+ };
66
+ });
67
+ return {
68
+ ...size,
69
+ unit,
70
+ left,
71
+ right,
72
+ center,
73
+ top,
74
+ pitch,
75
+ barHeight: height,
76
+ steps
77
+ };
78
+ }
79
+ //# sourceMappingURL=funnel-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["charts/core/funnel-layout.ts"],"sourcesContent":["import { chartTextWidth, headerHeight, wrapLabel } from \"../../content/chart-bar\";\nimport { chartMessages } from \"../../content/chart-message-catalog\";\nimport { barPercent } from \"./bar-labels\";\nimport type { ChartDatum } from \"./types\";\n\nexport type FunnelOptions = {\n data: { label: string; value: number | null }[];\n valueFormat?: (value: number) => string;\n locale?: string;\n title?: string;\n subtitle?: string;\n className?: string;\n};\n\n/** Ratios use the original start/previous observation. Geometry fits the largest observed step, including rises. */\nexport function funnelLayout(spec: FunnelOptions, size = { width: 480, height: 280 }) {\n if (spec.data.some((d) => d.value !== null && (!Number.isFinite(d.value) || d.value < 0)))\n throw new RangeError(\"Funnel values must be finite and nonnegative, or null\");\n const unit = size.width / 296;\n const numbers = new Intl.NumberFormat(spec.locale ?? \"en\");\n const format = spec.valueFormat ?? ((v: number) => numbers.format(v));\n const labels = chartMessages.resolve([spec.locale ?? \"en\"]).t;\n const percent = barPercent(spec.locale);\n const share = (value: number | null, denominator: number | null | undefined) =>\n value === null || denominator == null || denominator === 0 ? null : value / denominator;\n const left = Math.min(96 * unit, size.width * 0.3);\n const right = Math.max(104 * unit, ...spec.data.map((d) => (d.value === null ? 0 : (chartTextWidth(format(d.value)) + 8) * unit)));\n const plot = Math.max(0, size.width - left - right - 8);\n const center = left + plot / 2;\n const top = headerHeight(spec);\n const pitch = (size.height - top) / Math.max(1, spec.data.length);\n const height = Math.min(pitch * 0.6, 34);\n const max = Math.max(0, ...spec.data.map((d) => d.value ?? 0));\n const steps = spec.data.map((d, index) => {\n const startShare = share(d.value, spec.data[0]?.value);\n const previousShare = index ? share(d.value, spec.data[index - 1]?.value) : null;\n const y = top + index * pitch + (pitch - height) / 2;\n const fields = [\n { key: \"value\", value: d.value ?? \"–\", formatted: d.value === null ? \"–\" : format(d.value) },\n {\n key: \"startPercent\",\n value: startShare === null ? \"–\" : startShare * 100,\n formatted: startShare === null ? \"–\" : percent.format(startShare),\n },\n ...(index\n ? [\n {\n key: \"previousPercent\",\n value: previousShare === null ? \"–\" : previousShare * 100,\n formatted: previousShare === null ? \"–\" : percent.format(previousShare),\n },\n ]\n : []),\n ];\n const datum: ChartDatum = { role: \"item\", index, label: d.label, anchor: [center, y], values: fields };\n return {\n ...d,\n index,\n center,\n y,\n width: d.value === null || max === 0 ? 0 : (d.value / max) * plot,\n startShare,\n previousShare,\n datum,\n labelLines: wrapLabel(d.label, ((left / unit - 8) * 11) / 12.5, 2).lines,\n valueText: fields[0]!.formatted,\n shareText: `${fields[1]!.formatted} ${labels.chartBarStart}`,\n title: `${d.label} · ${fields[0]!.formatted} · ${labels.chartFields({ key: \"startPercent\" })}: ${fields[1]!.formatted}${index ? ` · ${labels.chartFields({ key: \"previousPercent\" })}: ${fields[2]!.formatted}` : \"\"}`,\n };\n });\n return { ...size, unit, left, right, center, top, pitch, barHeight: height, steps };\n}\n\nexport type FunnelLayout = ReturnType<typeof funnelLayout>;\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,27 @@
1
+ import { funnelLayout } from "./funnel-layout";
2
+ import { chartDatumSvg, escapeXml, renderHeader, svgRoot } from "./svg-renderers";
3
+ export { funnelLayout } from "./funnel-layout";
4
+ export function renderFunnelSvg(spec) {
5
+ return renderFunnelLayoutSvg(spec, funnelLayout(spec, spec));
6
+ }
7
+
8
+ /** Draw the same geometry reserved before a lazy host loads its renderer. */
9
+ export function renderFunnelLayoutSvg(spec, g) {
10
+ const text = (x, y, value, anchor = "start", cls = "stdlib-chart-tick-label") => `<text class="${cls}" x="${x}" y="${y}" text-anchor="${anchor}">${escapeXml(value)}</text>`;
11
+ const parts = [renderHeader(spec.width, spec.title, spec.subtitle).svg];
12
+ for (const step of g.steps) {
13
+ const next = g.steps[step.index + 1];
14
+ if (next && step.value !== null && next.value !== null) parts.push(`<polygon points="${g.center - step.width / 2},${step.y + g.barHeight} ${g.center + step.width / 2},${step.y + g.barHeight} ${g.center + next.width / 2},${next.y} ${g.center - next.width / 2},${next.y}" style="fill:var(--stdlib-chart-c1,#3b82f6);fill-opacity:.09"/>`);
15
+ const marks = `<rect class="k2b-chart-category-band" fill="none" pointer-events="all" x="0" y="${g.top + step.index * g.pitch}" width="${g.width}" height="${g.pitch}" rx="6"/>${step.value === null ? "" : `<rect class="stdlib-chart-bar" x="${g.center - step.width / 2}" y="${step.y}" width="${step.width}" height="${g.barHeight}" rx="3" style="fill:var(--stdlib-chart-c1,#3b82f6);fill-opacity:${Math.max(0.3, 1 - step.index * 0.14)}" stroke="none" stroke-width="0"/>`}`;
16
+ parts.push(chartDatumSvg(marks, step.datum, spec.inspect ?? false, step.title));
17
+ const lines = step.labelLines;
18
+ lines.forEach((line, i) => parts.push(text(0, step.y + g.barHeight / 2 + 4 + (lines.length > 1 ? i === 0 ? -6.5 : 6.5 : 0), line)));
19
+ parts.push(text(g.width, step.y + g.barHeight / 2 + (step.index ? -2 : 4), step.valueText, "end", "stdlib-chart-bar-value"));
20
+ if (step.index) parts.push(text(g.width, step.y + g.barHeight / 2 + 12, step.shareText, "end"));
21
+ }
22
+ return svgRoot({
23
+ ...spec,
24
+ className: [spec.className, "k2b-chart-funnel"].filter(Boolean).join(" ")
25
+ }, parts.join("")).replace("</style>", ".k2b-chart-funnel :is(.stdlib-chart-tick-label,.stdlib-chart-bar-value){font-size:12.5px}</style>").replace("<svg ", '<svg data-bar-layout="rows" ');
26
+ }
27
+ //# sourceMappingURL=funnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["charts/core/funnel.ts"],"sourcesContent":["import { type FunnelLayout, type FunnelOptions, funnelLayout } from \"./funnel-layout\";\nimport { chartDatumSvg, escapeXml, renderHeader, svgRoot } from \"./svg-renderers\";\n\nexport { type FunnelLayout, type FunnelOptions, funnelLayout } from \"./funnel-layout\";\n\nexport function renderFunnelSvg(spec: FunnelOptions & { width: number; height: number; inspect?: boolean }) {\n return renderFunnelLayoutSvg(spec, funnelLayout(spec, spec));\n}\n\n/** Draw the same geometry reserved before a lazy host loads its renderer. */\nexport function renderFunnelLayoutSvg(spec: FunnelOptions & { width: number; height: number; inspect?: boolean }, g: FunnelLayout) {\n const text = (x: number, y: number, value: string, anchor = \"start\", cls = \"stdlib-chart-tick-label\") =>\n `<text class=\"${cls}\" x=\"${x}\" y=\"${y}\" text-anchor=\"${anchor}\">${escapeXml(value)}</text>`;\n const parts: string[] = [renderHeader(spec.width, spec.title, spec.subtitle).svg];\n for (const step of g.steps) {\n const next = g.steps[step.index + 1];\n if (next && step.value !== null && next.value !== null)\n parts.push(\n `<polygon points=\"${g.center - step.width / 2},${step.y + g.barHeight} ${g.center + step.width / 2},${step.y + g.barHeight} ${g.center + next.width / 2},${next.y} ${g.center - next.width / 2},${next.y}\" style=\"fill:var(--stdlib-chart-c1,#3b82f6);fill-opacity:.09\"/>`,\n );\n const marks = `<rect class=\"k2b-chart-category-band\" fill=\"none\" pointer-events=\"all\" x=\"0\" y=\"${g.top + step.index * g.pitch}\" width=\"${g.width}\" height=\"${g.pitch}\" rx=\"6\"/>${step.value === null ? \"\" : `<rect class=\"stdlib-chart-bar\" x=\"${g.center - step.width / 2}\" y=\"${step.y}\" width=\"${step.width}\" height=\"${g.barHeight}\" rx=\"3\" style=\"fill:var(--stdlib-chart-c1,#3b82f6);fill-opacity:${Math.max(0.3, 1 - step.index * 0.14)}\" stroke=\"none\" stroke-width=\"0\"/>`}`;\n parts.push(chartDatumSvg(marks, step.datum, spec.inspect ?? false, step.title));\n const lines = step.labelLines;\n lines.forEach((line, i) => parts.push(text(0, step.y + g.barHeight / 2 + 4 + (lines.length > 1 ? (i === 0 ? -6.5 : 6.5) : 0), line)));\n parts.push(text(g.width, step.y + g.barHeight / 2 + (step.index ? -2 : 4), step.valueText, \"end\", \"stdlib-chart-bar-value\"));\n if (step.index) parts.push(text(g.width, step.y + g.barHeight / 2 + 12, step.shareText, \"end\"));\n }\n return svgRoot({ ...spec, className: [spec.className, \"k2b-chart-funnel\"].filter(Boolean).join(\" \") }, parts.join(\"\"))\n .replace(\"</style>\", \".k2b-chart-funnel :is(.stdlib-chart-tick-label,.stdlib-chart-bar-value){font-size:12.5px}</style>\")\n .replace(\"<svg \", '<svg data-bar-layout=\"rows\" ');\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,118 @@
1
+ import { barSeriesLegend, chartTextWidth, headerHeight, wrapLabel } from "../../content/chart-bar";
2
+ import { chartMessages } from "../../content/chart-message-catalog";
3
+ import { extendDomainToNice, niceStep } from "./svg-renderers";
4
+ /** Stacks start at zero, group headings keep their first-appearance order. */
5
+ export function hbarLayout(spec, size = {
6
+ width: 480,
7
+ height: 280
8
+ }) {
9
+ if (spec.rows.some(row => row.values.length !== spec.series.length || row.values.some(v => v !== null && (!Number.isFinite(v) || v < 0)))) throw new RangeError("Horizontal bars require aligned nonnegative segment values");
10
+ const format = spec.valueFormat ?? String;
11
+ const labels = chartMessages.resolve([spec.locale ?? "en"]).t;
12
+ const groups = [...new Set(spec.rows.map(r => r.group))];
13
+ const totals = spec.rows.map(r => r.values.some(v => v !== null) ? r.values.reduce((sum, v) => sum + (v ?? 0), 0) : null);
14
+ const max = Math.max(0, ...totals.filter(v => v !== null));
15
+ const scale = extendDomainToNice(0, max || 1, niceStep(max || 1, 4));
16
+ const unit = size.width / 296;
17
+ const left = Math.min(104 * unit, size.width * 0.26);
18
+ const right = size.width - Math.max(52 * unit, ...totals.map(v => (chartTextWidth(v === null ? "–" : format(v)) + 8) * unit));
19
+ const legendLayout = barSeriesLegend(spec.series.map((label, i) => ({
20
+ label,
21
+ data: spec.rows.map(r => r.values[i] ?? null)
22
+ })), format, size.width, 296, 70 // One legend budget even when rows grow the initial 280-unit drawing.
23
+ );
24
+ const legend = {
25
+ ...legendLayout,
26
+ items: legendLayout.items.map(entry => ({
27
+ ...entry,
28
+ valueText: entry.total === null ? "–" : format(entry.total),
29
+ text: wrapLabel(entry.label, entry.labelWidth, 1).lines[0] ?? entry.label
30
+ }))
31
+ };
32
+ const header = headerHeight({
33
+ title: spec.title,
34
+ subtitle: spec.subtitle
35
+ });
36
+ const top = header + (spec.legend === false ? 0 : legend.height);
37
+ const groupHeight = 20;
38
+ const pitch = Math.max(32, (size.height - top - 24 - groups.filter(g => g !== undefined).length * groupHeight) / Math.max(1, spec.rows.length));
39
+ const x = v => left + v / scale.domain[1] * (right - left);
40
+ let y = top;
41
+ const rows = groups.flatMap(group => {
42
+ if (group !== undefined) y += groupHeight;
43
+ let first = true;
44
+ return spec.rows.flatMap((row, index) => {
45
+ if (row.group !== group) return [];
46
+ const groupHeading = first ? group : undefined;
47
+ first = false;
48
+ const center = y + pitch / 2;
49
+ y += pitch;
50
+ let acc = 0;
51
+ const segments = row.values.map((value, seriesIndex) => {
52
+ const start = acc;
53
+ acc += value ?? 0;
54
+ const width = x(acc) - x(start);
55
+ const label = value === null ? "–" : format(value);
56
+ return {
57
+ value,
58
+ seriesIndex,
59
+ x: x(start),
60
+ width,
61
+ label,
62
+ showLabel: width / unit > chartTextWidth(label) + 10
63
+ };
64
+ });
65
+ const labelLines = wrapLabel(row.label, Math.max(8, left / unit - 8), 2).lines;
66
+ const total = totals[index];
67
+ const valueText = total === null ? "–" : format(total);
68
+ const datum = {
69
+ role: "item",
70
+ index,
71
+ label: [row.label, row.group].filter(Boolean).join(" · "),
72
+ anchor: [x(total ?? 0) + 4, center],
73
+ values: [...row.values.map((v, i) => ({
74
+ key: `series:${i}`,
75
+ value: v ?? "–",
76
+ formatted: v === null ? "–" : format(v)
77
+ })), {
78
+ key: "total",
79
+ value: total ?? "–",
80
+ formatted: valueText
81
+ }]
82
+ };
83
+ const title = [row.label, row.group, ...row.values.map((v, i) => `${spec.series[i]}: ${v === null ? "–" : format(v)}`), `${labels.chartFields({
84
+ key: "total"
85
+ })}: ${valueText}`].filter(Boolean).join(" · ");
86
+ return [{
87
+ ...row,
88
+ labelLines,
89
+ groupHeading,
90
+ index,
91
+ center,
92
+ segments,
93
+ total,
94
+ valueText,
95
+ datum,
96
+ title,
97
+ groupY: center - pitch / 2 - groupHeight
98
+ }];
99
+ });
100
+ });
101
+ return {
102
+ ...size,
103
+ header,
104
+ height: Math.max(size.height, y + 24),
105
+ top,
106
+ left,
107
+ right,
108
+ rows,
109
+ groups,
110
+ pitch,
111
+ x,
112
+ scale,
113
+ format,
114
+ unit,
115
+ legend
116
+ };
117
+ }
118
+ //# sourceMappingURL=hbar-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["charts/core/hbar-layout.ts"],"sourcesContent":["import { barSeriesLegend, chartTextWidth, headerHeight, wrapLabel } from \"../../content/chart-bar\";\nimport { chartMessages } from \"../../content/chart-message-catalog\";\nimport { extendDomainToNice, niceStep } from \"./svg-renderers\";\nimport type { ChartDatum } from \"./types\";\n\nexport type HorizontalBarOptions = {\n series: string[];\n rows: { group?: string; label: string; values: (number | null)[] }[];\n valueFormat?: (value: number) => string;\n legend?: boolean;\n title?: string;\n subtitle?: string;\n locale?: string;\n className?: string;\n};\n\n/** Stacks start at zero, group headings keep their first-appearance order. */\nexport function hbarLayout(spec: HorizontalBarOptions, size = { width: 480, height: 280 }) {\n if (\n spec.rows.some(\n (row) => row.values.length !== spec.series.length || row.values.some((v) => v !== null && (!Number.isFinite(v) || v < 0)),\n )\n )\n throw new RangeError(\"Horizontal bars require aligned nonnegative segment values\");\n const format = spec.valueFormat ?? String;\n const labels = chartMessages.resolve([spec.locale ?? \"en\"]).t;\n const groups = [...new Set(spec.rows.map((r) => r.group))];\n const totals = spec.rows.map((r) => (r.values.some((v) => v !== null) ? r.values.reduce<number>((sum, v) => sum + (v ?? 0), 0) : null));\n const max = Math.max(0, ...totals.filter((v): v is number => v !== null));\n const scale = extendDomainToNice(0, max || 1, niceStep(max || 1, 4));\n const unit = size.width / 296;\n const left = Math.min(104 * unit, size.width * 0.26);\n const right = size.width - Math.max(52 * unit, ...totals.map((v) => (chartTextWidth(v === null ? \"–\" : format(v)) + 8) * unit));\n const legendLayout = barSeriesLegend(\n spec.series.map((label, i) => ({ label, data: spec.rows.map((r) => r.values[i] ?? null) })),\n format,\n size.width,\n 296,\n 70, // One legend budget even when rows grow the initial 280-unit drawing.\n );\n const legend = {\n ...legendLayout,\n items: legendLayout.items.map((entry) => ({\n ...entry,\n valueText: entry.total === null ? \"–\" : format(entry.total),\n text: wrapLabel(entry.label, entry.labelWidth, 1).lines[0] ?? entry.label,\n })),\n };\n const header = headerHeight({ title: spec.title, subtitle: spec.subtitle });\n const top = header + (spec.legend === false ? 0 : legend.height);\n const groupHeight = 20;\n const pitch = Math.max(\n 32,\n (size.height - top - 24 - groups.filter((g) => g !== undefined).length * groupHeight) / Math.max(1, spec.rows.length),\n );\n const x = (v: number) => left + (v / scale.domain[1]) * (right - left);\n let y = top;\n const rows = groups.flatMap((group) => {\n if (group !== undefined) y += groupHeight;\n let first = true;\n return spec.rows.flatMap((row, index) => {\n if (row.group !== group) return [];\n const groupHeading = first ? group : undefined;\n first = false;\n const center = y + pitch / 2;\n y += pitch;\n let acc = 0;\n const segments = row.values.map((value, seriesIndex) => {\n const start = acc;\n acc += value ?? 0;\n const width = x(acc) - x(start);\n const label = value === null ? \"–\" : format(value);\n return { value, seriesIndex, x: x(start), width, label, showLabel: width / unit > chartTextWidth(label) + 10 };\n });\n const labelLines = wrapLabel(row.label, Math.max(8, left / unit - 8), 2).lines;\n const total = totals[index]!;\n const valueText = total === null ? \"–\" : format(total);\n const datum: ChartDatum = {\n role: \"item\",\n index,\n label: [row.label, row.group].filter(Boolean).join(\" · \"),\n anchor: [x(total ?? 0) + 4, center],\n values: [\n ...row.values.map((v, i) => ({ key: `series:${i}`, value: v ?? \"–\", formatted: v === null ? \"–\" : format(v) })),\n { key: \"total\", value: total ?? \"–\", formatted: valueText },\n ],\n };\n const title = [\n row.label,\n row.group,\n ...row.values.map((v, i) => `${spec.series[i]}: ${v === null ? \"–\" : format(v)}`),\n `${labels.chartFields({ key: \"total\" })}: ${valueText}`,\n ]\n .filter(Boolean)\n .join(\" · \");\n return [\n {\n ...row,\n labelLines,\n groupHeading,\n index,\n center,\n segments,\n total,\n valueText,\n datum,\n title,\n groupY: center - pitch / 2 - groupHeight,\n },\n ];\n });\n });\n return { ...size, header, height: Math.max(size.height, y + 24), top, left, right, rows, groups, pitch, x, scale, format, unit, legend };\n}\n\nexport type HorizontalBarLayout = ReturnType<typeof hbarLayout>;\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,39 @@
1
+ import { hbarLayout } from "./hbar-layout";
2
+ import { chartDatumSvg, escapeXml, renderHeader, svgRoot } from "./svg-renderers";
3
+ export { hbarLayout } from "./hbar-layout";
4
+ export function renderHbarSvg(spec) {
5
+ return renderHbarLayoutSvg(spec, hbarLayout(spec, spec));
6
+ }
7
+
8
+ /** Draw an already prepared layout; lazy hosts reuse the geometry reserved before loading. */
9
+ export function renderHbarLayoutSvg(spec, g) {
10
+ const text = (x, y, value, anchor = "start", extra = "", attrs = 'class="stdlib-chart-tick-label"') => `<text ${attrs} x="${x}" y="${y}" text-anchor="${anchor}" ${extra}>${escapeXml(value)}</text>`;
11
+ const parts = [renderHeader(spec.width, spec.title, spec.subtitle).svg];
12
+ const header = g.header;
13
+ if (spec.legend !== false) g.legend.items.forEach((entry, i) => {
14
+ const y = header + entry.y;
15
+ parts.push(`<rect class="stdlib-chart-series-${i % 8}" x="${entry.x}" y="${y - 8}" width="${8 * g.unit}" height="8"/>`, text(entry.x + 14 * g.unit, y, entry.text), text(entry.valueX, y, entry.valueText, "end", `data-chart-legend-value data-field="series:${i}" data-default="${escapeXml(entry.valueText)}"`));
16
+ });
17
+ if (spec.legend !== false && g.legend.hidden) parts.push(text(0, header + g.legend.height - 8, `+${g.legend.hidden}`));
18
+ for (const tick of g.scale.ticks) parts.push(`<line class="stdlib-chart-grid" x1="${g.x(tick)}" x2="${g.x(tick)}" y1="${g.top}" y2="${g.height - 24}"/>`, text(g.x(tick), g.height - 5, g.format(tick), "middle"));
19
+ for (const row of g.rows) {
20
+ if (row.groupHeading !== undefined) {
21
+ parts.push(text(0, row.groupY + 14, row.groupHeading, "start", "", 'class="k2b-chart-group-heading" font-size="11.5" font-weight="600" fill="currentColor"'));
22
+ }
23
+ const height = Math.min(26, g.pitch * 0.74);
24
+ const marks = [`<rect class="k2b-chart-category-band" fill="none" pointer-events="all" x="0" y="${row.center - g.pitch / 2}" width="${spec.width}" height="${g.pitch}" rx="6"/>`];
25
+ for (const segment of row.segments) {
26
+ if (segment.value === null) continue;
27
+ marks.push(`<rect class="stdlib-chart-bar stdlib-chart-series-${segment.seriesIndex % 8}" x="${segment.x}" y="${row.center - height / 2}" width="${Math.max(segment.width / 2, segment.width - 1.5)}" height="${height}" rx="3" stroke="none" stroke-width="0" style="fill:var(--stdlib-chart-c${segment.seriesIndex % 8 + 1},#3b82f6);fill-opacity:.18"/>`);
28
+ if (segment.showLabel) marks.push(text(segment.x + segment.width / 2, row.center + 4, segment.label, "middle", "", 'class="k2b-chart-segment-value" font-size="11" font-weight="500" fill="currentColor"'));
29
+ }
30
+ parts.push(chartDatumSvg(marks.join(""), row.datum, spec.inspect ?? false, row.title));
31
+ row.labelLines.forEach((line, i) => parts.push(text(g.left - 8 * g.unit, row.center + 4 + (row.labelLines.length > 1 ? i === 0 ? -6.5 : 6.5 : 0), line, "end")));
32
+ parts.push(text(g.x(row.total ?? 0) + 6 * g.unit, row.center + 4, row.valueText));
33
+ }
34
+ return svgRoot({
35
+ ...spec,
36
+ height: g.height
37
+ }, parts.join("")).replace("<svg ", '<svg data-bar-layout="rows" ');
38
+ }
39
+ //# sourceMappingURL=hbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["charts/core/hbar.ts"],"sourcesContent":["import { type HorizontalBarLayout, type HorizontalBarOptions, hbarLayout } from \"./hbar-layout\";\nimport { chartDatumSvg, escapeXml, renderHeader, svgRoot } from \"./svg-renderers\";\n\nexport { type HorizontalBarLayout, type HorizontalBarOptions, hbarLayout } from \"./hbar-layout\";\n\nexport function renderHbarSvg(spec: HorizontalBarOptions & { width: number; height: number; inspect?: boolean }) {\n return renderHbarLayoutSvg(spec, hbarLayout(spec, spec));\n}\n\n/** Draw an already prepared layout; lazy hosts reuse the geometry reserved before loading. */\nexport function renderHbarLayoutSvg(\n spec: HorizontalBarOptions & { width: number; height: number; inspect?: boolean },\n g: HorizontalBarLayout,\n) {\n const text = (x: number, y: number, value: string, anchor = \"start\", extra = \"\", attrs = 'class=\"stdlib-chart-tick-label\"') =>\n `<text ${attrs} x=\"${x}\" y=\"${y}\" text-anchor=\"${anchor}\" ${extra}>${escapeXml(value)}</text>`;\n const parts: string[] = [renderHeader(spec.width, spec.title, spec.subtitle).svg];\n const header = g.header;\n if (spec.legend !== false)\n g.legend.items.forEach((entry, i) => {\n const y = header + entry.y;\n parts.push(\n `<rect class=\"stdlib-chart-series-${i % 8}\" x=\"${entry.x}\" y=\"${y - 8}\" width=\"${8 * g.unit}\" height=\"8\"/>`,\n text(entry.x + 14 * g.unit, y, entry.text),\n text(\n entry.valueX,\n y,\n entry.valueText,\n \"end\",\n `data-chart-legend-value data-field=\"series:${i}\" data-default=\"${escapeXml(entry.valueText)}\"`,\n ),\n );\n });\n if (spec.legend !== false && g.legend.hidden) parts.push(text(0, header + g.legend.height - 8, `+${g.legend.hidden}`));\n for (const tick of g.scale.ticks)\n parts.push(\n `<line class=\"stdlib-chart-grid\" x1=\"${g.x(tick)}\" x2=\"${g.x(tick)}\" y1=\"${g.top}\" y2=\"${g.height - 24}\"/>`,\n text(g.x(tick), g.height - 5, g.format(tick), \"middle\"),\n );\n for (const row of g.rows) {\n if (row.groupHeading !== undefined) {\n parts.push(\n text(\n 0,\n row.groupY + 14,\n row.groupHeading,\n \"start\",\n \"\",\n 'class=\"k2b-chart-group-heading\" font-size=\"11.5\" font-weight=\"600\" fill=\"currentColor\"',\n ),\n );\n }\n const height = Math.min(26, g.pitch * 0.74);\n const marks = [\n `<rect class=\"k2b-chart-category-band\" fill=\"none\" pointer-events=\"all\" x=\"0\" y=\"${row.center - g.pitch / 2}\" width=\"${spec.width}\" height=\"${g.pitch}\" rx=\"6\"/>`,\n ];\n for (const segment of row.segments) {\n if (segment.value === null) continue;\n marks.push(\n `<rect class=\"stdlib-chart-bar stdlib-chart-series-${segment.seriesIndex % 8}\" x=\"${segment.x}\" y=\"${row.center - height / 2}\" width=\"${Math.max(segment.width / 2, segment.width - 1.5)}\" height=\"${height}\" rx=\"3\" stroke=\"none\" stroke-width=\"0\" style=\"fill:var(--stdlib-chart-c${(segment.seriesIndex % 8) + 1},#3b82f6);fill-opacity:.18\"/>`,\n );\n if (segment.showLabel)\n marks.push(\n text(\n segment.x + segment.width / 2,\n row.center + 4,\n segment.label,\n \"middle\",\n \"\",\n 'class=\"k2b-chart-segment-value\" font-size=\"11\" font-weight=\"500\" fill=\"currentColor\"',\n ),\n );\n }\n parts.push(chartDatumSvg(marks.join(\"\"), row.datum, spec.inspect ?? false, row.title));\n row.labelLines.forEach((line, i) =>\n parts.push(text(g.left - 8 * g.unit, row.center + 4 + (row.labelLines.length > 1 ? (i === 0 ? -6.5 : 6.5) : 0), line, \"end\")),\n );\n parts.push(text(g.x(row.total ?? 0) + 6 * g.unit, row.center + 4, row.valueText));\n }\n return svgRoot({ ...spec, height: g.height }, parts.join(\"\")).replace(\"<svg \", '<svg data-bar-layout=\"rows\" ');\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,12 +1,22 @@
1
1
  /** Portable chart contracts. This entry never imports Solid or browser APIs. */
2
2
 
3
- export { barChartLayout, renderBarChartSvg } from "../../content/chart-bar";
3
+ export { barChartLayout, rankedBarLayout, renderBarChartSvg, seriesBarLayout } from "../../content/chart-bar";
4
4
  export { renderStateTimelineSvg, stateTimelineDomain, stateTimelineHeight } from "../../content/chart-state-timeline";
5
5
  export { areaLayout, renderAreaSvg } from "./area";
6
+ export * from "./bubble";
6
7
  export * from "./calendar";
8
+ export { funnelLayout, renderFunnelLayoutSvg, renderFunnelSvg } from "./funnel";
9
+ export { hbarLayout, renderHbarLayoutSvg, renderHbarSvg } from "./hbar";
7
10
  export * from "./inspection";
11
+ export { map } from "./map";
12
+ export * from "./pareto";
13
+ export * from "./radar";
8
14
  export * from "./render";
15
+ export { chartRenderHeight, preservesAspectRatio } from "./render-size";
9
16
  export * from "./snapshot";
10
- export { arcPathD, autoBin, bar, barGauge, boxplot, chartDatumSvg, charts, computeBoxStats, computeDomain, donut, escapeXml, extendDomainToNice, gauge, heatmap, histogram, line, linearRegression, linePathD, map, mapLog, mapRange, markerPath, niceLogTicks, niceStep, normalizePadding, pie, scatter, smoothPathD, sparkline, stat, stateTimeline, stepPathD, svgRoot } from "./svg";
17
+ export { charts } from "./svg";
18
+ export { arcPathD, autoBin, bar, barGauge, boxplot, chartDatumSvg, computeBoxStats, computeDomain, donut, escapeXml, extendDomainToNice, gauge, heatmap, histogram, line, linearRegression, linePathD, mapLog, mapRange, markerPath, niceLogTicks, niceStep, normalizePadding, pie, scatter, smoothPathD, sparkline, stat, stateTimeline, stepPathD, svgRoot } from "./svg-renderers";
19
+ export * from "./treemap";
11
20
  export { chartDatumRoles } from "./types";
21
+ export { renderWaterfallLayoutSvg, renderWaterfallSvg, waterfallLayout } from "./waterfall";
12
22
  //# sourceMappingURL=index.js.map