@k2b/ui 0.50.0 → 0.51.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 (294) hide show
  1. package/dist/base.css +32 -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/command-dock.js +47 -0
  10. package/dist/browser/actions/command-dock.js.map +1 -0
  11. package/dist/browser/actions/command-items.js +84 -0
  12. package/dist/browser/actions/command-items.js.map +1 -0
  13. package/dist/browser/actions/command-messages.js +42 -0
  14. package/dist/browser/actions/command-messages.js.map +1 -0
  15. package/dist/browser/actions/index.js +1 -0
  16. package/dist/browser/actions/index.js.map +1 -1
  17. package/dist/browser/charts/core/area.js +3 -5
  18. package/dist/browser/charts/core/area.js.map +1 -1
  19. package/dist/browser/charts/core/calendar.js +1 -1
  20. package/dist/browser/charts/core/calendar.js.map +1 -1
  21. package/dist/browser/charts/core/chart-messages.js +17 -0
  22. package/dist/browser/charts/core/chart-messages.js.map +1 -0
  23. package/dist/browser/charts/core/hbar-layout.js +118 -0
  24. package/dist/browser/charts/core/hbar-layout.js.map +1 -0
  25. package/dist/browser/charts/core/hbar.js +39 -0
  26. package/dist/browser/charts/core/hbar.js.map +1 -0
  27. package/dist/browser/charts/core/index.js +7 -2
  28. package/dist/browser/charts/core/index.js.map +1 -1
  29. package/dist/browser/charts/core/map.js +116 -0
  30. package/dist/browser/charts/core/map.js.map +1 -0
  31. package/dist/browser/charts/core/registry.js +22 -15
  32. package/dist/browser/charts/core/registry.js.map +1 -1
  33. package/dist/browser/charts/core/render-size.js +13 -0
  34. package/dist/browser/charts/core/render-size.js.map +1 -0
  35. package/dist/browser/charts/core/render.js +20 -10
  36. package/dist/browser/charts/core/render.js.map +1 -1
  37. package/dist/browser/charts/core/snapshot.js +3 -3
  38. package/dist/browser/charts/core/snapshot.js.map +1 -1
  39. package/dist/browser/charts/core/svg-renderers.js +2406 -0
  40. package/dist/browser/charts/core/svg-renderers.js.map +1 -0
  41. package/dist/browser/charts/core/svg.js +4 -2525
  42. package/dist/browser/charts/core/svg.js.map +1 -1
  43. package/dist/browser/charts/core/types.js +0 -2
  44. package/dist/browser/charts/core/types.js.map +1 -1
  45. package/dist/browser/charts/core/waterfall.js +162 -0
  46. package/dist/browser/charts/core/waterfall.js.map +1 -0
  47. package/dist/browser/charts/description.js +2 -0
  48. package/dist/browser/charts/description.js.map +1 -0
  49. package/dist/browser/charts.js.map +1 -1
  50. package/dist/browser/content/Chart.js +14 -628
  51. package/dist/browser/content/Chart.js.map +1 -1
  52. package/dist/browser/content/ChartRoot.js +632 -0
  53. package/dist/browser/content/ChartRoot.js.map +1 -0
  54. package/dist/browser/content/ChartSparkline.js +24 -0
  55. package/dist/browser/content/ChartSparkline.js.map +1 -0
  56. package/dist/browser/content/FileView.js +111 -61
  57. package/dist/browser/content/FileView.js.map +1 -1
  58. package/dist/browser/content/Lightbox.js +8 -8
  59. package/dist/browser/content/Lightbox.js.map +1 -1
  60. package/dist/browser/content/MapView.js +30 -28
  61. package/dist/browser/content/MapView.js.map +1 -1
  62. package/dist/browser/content/PdfPreview.js +84 -52
  63. package/dist/browser/content/PdfPreview.js.map +1 -1
  64. package/dist/browser/content/PdfViewer.js +588 -0
  65. package/dist/browser/content/PdfViewer.js.map +1 -0
  66. package/dist/browser/content/chart-bar.js +246 -16
  67. package/dist/browser/content/chart-bar.js.map +1 -1
  68. package/dist/browser/content/chart-inspection-core.js +22 -21
  69. package/dist/browser/content/chart-inspection-core.js.map +1 -1
  70. package/dist/browser/content/chart-line-gaps.js +1 -1
  71. package/dist/browser/content/chart-line-gaps.js.map +1 -1
  72. package/dist/browser/content/chart-message-catalog.js +10 -0
  73. package/dist/browser/content/chart-message-catalog.js.map +1 -1
  74. package/dist/browser/content/chart-state-timeline.js +1 -1
  75. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  76. package/dist/browser/content/chart-svg.js +2 -1
  77. package/dist/browser/content/chart-svg.js.map +1 -1
  78. package/dist/browser/content/index.js +1 -0
  79. package/dist/browser/content/index.js.map +1 -1
  80. package/dist/browser/content/pdf-document.js +29 -0
  81. package/dist/browser/content/pdf-document.js.map +1 -0
  82. package/dist/browser/content/pdf-limits.js +31 -0
  83. package/dist/browser/content/pdf-limits.js.map +1 -0
  84. package/dist/browser/content/pdf-messages.js +34 -2
  85. package/dist/browser/content/pdf-messages.js.map +1 -1
  86. package/dist/browser/content/pdf-viewer-engine.js +57 -0
  87. package/dist/browser/content/pdf-viewer-worker.js +28 -0
  88. package/dist/browser/inputs/ChoiceInputs.js +94 -51
  89. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  90. package/dist/browser/inputs/ChoiceSlider.js +75 -58
  91. package/dist/browser/inputs/ChoiceSlider.js.map +1 -1
  92. package/dist/browser/inputs/DatePicker.js +113 -98
  93. package/dist/browser/inputs/DatePicker.js.map +1 -1
  94. package/dist/browser/inputs/PeriodPicker.js +874 -0
  95. package/dist/browser/inputs/PeriodPicker.js.map +1 -0
  96. package/dist/browser/inputs/index.js +4 -1
  97. package/dist/browser/inputs/index.js.map +1 -1
  98. package/dist/browser/inputs/input-messages.js +8 -2
  99. package/dist/browser/inputs/input-messages.js.map +1 -1
  100. package/dist/browser/inputs/markdown/MarkdownEditor.js +14 -10
  101. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  102. package/dist/browser/inputs/markdown/SlashCommands.js +402 -0
  103. package/dist/browser/inputs/markdown/SlashCommands.js.map +1 -0
  104. package/dist/browser/inputs/period-picker-messages.js +71 -0
  105. package/dist/browser/inputs/period-picker-messages.js.map +1 -0
  106. package/dist/browser/inputs/period.js +263 -0
  107. package/dist/browser/inputs/period.js.map +1 -0
  108. package/dist/browser/layout/DetailPanel.js +147 -120
  109. package/dist/browser/layout/DetailPanel.js.map +1 -1
  110. package/dist/browser/layout/Discussion.js +101 -108
  111. package/dist/browser/layout/Discussion.js.map +1 -1
  112. package/dist/browser/layout/index.js.map +1 -1
  113. package/dist/browser/surfaces/DescriptionList.js +5 -2
  114. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  115. package/dist/browser/surfaces/StatCell.js +19 -14
  116. package/dist/browser/surfaces/StatCell.js.map +1 -1
  117. package/dist/browser/surfaces/delta-badge.js +16 -2
  118. package/dist/browser/surfaces/delta-badge.js.map +1 -1
  119. package/dist/browser/widgets/DashboardFrame.js +310 -0
  120. package/dist/browser/widgets/DashboardFrame.js.map +1 -0
  121. package/dist/browser/widgets/index.js +1 -0
  122. package/dist/browser/widgets/index.js.map +1 -1
  123. package/dist/licenses/pdfjs-dist.txt +177 -0
  124. package/dist/ssr/actions/Button.js.map +1 -1
  125. package/dist/ssr/actions/CommandList.js +638 -0
  126. package/dist/ssr/actions/CommandList.js.map +1 -0
  127. package/dist/ssr/actions/CommandMenu.js +197 -0
  128. package/dist/ssr/actions/CommandMenu.js.map +1 -0
  129. package/dist/ssr/actions/Dropdown.js +43 -10
  130. package/dist/ssr/actions/Dropdown.js.map +1 -1
  131. package/dist/ssr/actions/command-dock.js +47 -0
  132. package/dist/ssr/actions/command-dock.js.map +1 -0
  133. package/dist/ssr/actions/command-items.js +84 -0
  134. package/dist/ssr/actions/command-items.js.map +1 -0
  135. package/dist/ssr/actions/command-messages.js +42 -0
  136. package/dist/ssr/actions/command-messages.js.map +1 -0
  137. package/dist/ssr/actions/index.js +1 -0
  138. package/dist/ssr/actions/index.js.map +1 -1
  139. package/dist/ssr/charts/core/area.js +3 -5
  140. package/dist/ssr/charts/core/area.js.map +1 -1
  141. package/dist/ssr/charts/core/calendar.js +1 -1
  142. package/dist/ssr/charts/core/calendar.js.map +1 -1
  143. package/dist/ssr/charts/core/chart-messages.js +17 -0
  144. package/dist/ssr/charts/core/chart-messages.js.map +1 -0
  145. package/dist/ssr/charts/core/hbar-layout.js +118 -0
  146. package/dist/ssr/charts/core/hbar-layout.js.map +1 -0
  147. package/dist/ssr/charts/core/hbar.js +39 -0
  148. package/dist/ssr/charts/core/hbar.js.map +1 -0
  149. package/dist/ssr/charts/core/index.js +7 -2
  150. package/dist/ssr/charts/core/index.js.map +1 -1
  151. package/dist/ssr/charts/core/map.js +116 -0
  152. package/dist/ssr/charts/core/map.js.map +1 -0
  153. package/dist/ssr/charts/core/registry.js +22 -15
  154. package/dist/ssr/charts/core/registry.js.map +1 -1
  155. package/dist/ssr/charts/core/render-size.js +13 -0
  156. package/dist/ssr/charts/core/render-size.js.map +1 -0
  157. package/dist/ssr/charts/core/render.js +20 -10
  158. package/dist/ssr/charts/core/render.js.map +1 -1
  159. package/dist/ssr/charts/core/snapshot.js +3 -3
  160. package/dist/ssr/charts/core/snapshot.js.map +1 -1
  161. package/dist/ssr/charts/core/svg-renderers.js +2406 -0
  162. package/dist/ssr/charts/core/svg-renderers.js.map +1 -0
  163. package/dist/ssr/charts/core/svg.js +4 -2525
  164. package/dist/ssr/charts/core/svg.js.map +1 -1
  165. package/dist/ssr/charts/core/types.js +0 -2
  166. package/dist/ssr/charts/core/types.js.map +1 -1
  167. package/dist/ssr/charts/core/waterfall.js +162 -0
  168. package/dist/ssr/charts/core/waterfall.js.map +1 -0
  169. package/dist/ssr/charts/description.js +2 -0
  170. package/dist/ssr/charts/description.js.map +1 -0
  171. package/dist/ssr/charts.js.map +1 -1
  172. package/dist/ssr/content/Chart.js +14 -471
  173. package/dist/ssr/content/Chart.js.map +1 -1
  174. package/dist/ssr/content/ChartRoot.js +475 -0
  175. package/dist/ssr/content/ChartRoot.js.map +1 -0
  176. package/dist/ssr/content/ChartSparkline.js +24 -0
  177. package/dist/ssr/content/ChartSparkline.js.map +1 -0
  178. package/dist/ssr/content/FileView.js +56 -7
  179. package/dist/ssr/content/FileView.js.map +1 -1
  180. package/dist/ssr/content/Lightbox.js +8 -8
  181. package/dist/ssr/content/Lightbox.js.map +1 -1
  182. package/dist/ssr/content/MapView.js +9 -9
  183. package/dist/ssr/content/MapView.js.map +1 -1
  184. package/dist/ssr/content/PdfPreview.js +49 -20
  185. package/dist/ssr/content/PdfPreview.js.map +1 -1
  186. package/dist/ssr/content/PdfViewer.js +484 -0
  187. package/dist/ssr/content/PdfViewer.js.map +1 -0
  188. package/dist/ssr/content/chart-bar.js +246 -16
  189. package/dist/ssr/content/chart-bar.js.map +1 -1
  190. package/dist/ssr/content/chart-inspection-core.js +22 -21
  191. package/dist/ssr/content/chart-inspection-core.js.map +1 -1
  192. package/dist/ssr/content/chart-line-gaps.js +1 -1
  193. package/dist/ssr/content/chart-line-gaps.js.map +1 -1
  194. package/dist/ssr/content/chart-message-catalog.js +10 -0
  195. package/dist/ssr/content/chart-message-catalog.js.map +1 -1
  196. package/dist/ssr/content/chart-state-timeline.js +1 -1
  197. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  198. package/dist/ssr/content/chart-svg.js +2 -1
  199. package/dist/ssr/content/chart-svg.js.map +1 -1
  200. package/dist/ssr/content/index.js +1 -0
  201. package/dist/ssr/content/index.js.map +1 -1
  202. package/dist/ssr/content/pdf-document.js +29 -0
  203. package/dist/ssr/content/pdf-document.js.map +1 -0
  204. package/dist/ssr/content/pdf-limits.js +31 -0
  205. package/dist/ssr/content/pdf-limits.js.map +1 -0
  206. package/dist/ssr/content/pdf-messages.js +34 -2
  207. package/dist/ssr/content/pdf-messages.js.map +1 -1
  208. package/dist/ssr/inputs/ChoiceInputs.js +49 -12
  209. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  210. package/dist/ssr/inputs/ChoiceSlider.js +17 -12
  211. package/dist/ssr/inputs/ChoiceSlider.js.map +1 -1
  212. package/dist/ssr/inputs/DatePicker.js +14 -9
  213. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  214. package/dist/ssr/inputs/PeriodPicker.js +598 -0
  215. package/dist/ssr/inputs/PeriodPicker.js.map +1 -0
  216. package/dist/ssr/inputs/index.js +4 -1
  217. package/dist/ssr/inputs/index.js.map +1 -1
  218. package/dist/ssr/inputs/input-messages.js +8 -2
  219. package/dist/ssr/inputs/input-messages.js.map +1 -1
  220. package/dist/ssr/inputs/markdown/MarkdownEditor.js +3 -2
  221. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  222. package/dist/ssr/inputs/markdown/SlashCommands.js +339 -0
  223. package/dist/ssr/inputs/markdown/SlashCommands.js.map +1 -0
  224. package/dist/ssr/inputs/period-picker-messages.js +71 -0
  225. package/dist/ssr/inputs/period-picker-messages.js.map +1 -0
  226. package/dist/ssr/inputs/period.js +263 -0
  227. package/dist/ssr/inputs/period.js.map +1 -0
  228. package/dist/ssr/layout/DetailPanel.js +27 -4
  229. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  230. package/dist/ssr/layout/Discussion.js +16 -2
  231. package/dist/ssr/layout/Discussion.js.map +1 -1
  232. package/dist/ssr/layout/index.js.map +1 -1
  233. package/dist/ssr/surfaces/DescriptionList.js +1 -1
  234. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  235. package/dist/ssr/surfaces/StatCell.js +4 -5
  236. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  237. package/dist/ssr/surfaces/delta-badge.js +16 -2
  238. package/dist/ssr/surfaces/delta-badge.js.map +1 -1
  239. package/dist/ssr/widgets/DashboardFrame.js +200 -0
  240. package/dist/ssr/widgets/DashboardFrame.js.map +1 -0
  241. package/dist/ssr/widgets/index.js +1 -0
  242. package/dist/ssr/widgets/index.js.map +1 -1
  243. package/dist/styles.css +1 -1
  244. package/dist/types/actions/Button.d.ts +1 -1
  245. package/dist/types/actions/CommandList.d.ts +120 -0
  246. package/dist/types/actions/CommandMenu.d.ts +39 -0
  247. package/dist/types/actions/Dropdown.d.ts +17 -0
  248. package/dist/types/actions/command-dock.d.ts +8 -0
  249. package/dist/types/actions/command-items.d.ts +134 -0
  250. package/dist/types/actions/command-messages.d.ts +19 -0
  251. package/dist/types/actions/index.d.ts +3 -0
  252. package/dist/types/charts/core/calendar.d.ts +1 -1
  253. package/dist/types/charts/core/chart-messages.d.ts +5 -0
  254. package/dist/types/charts/core/hbar-layout.d.ts +74 -0
  255. package/dist/types/charts/core/hbar.d.ts +13 -0
  256. package/dist/types/charts/core/index.d.ts +7 -2
  257. package/dist/types/charts/core/map.d.ts +3 -0
  258. package/dist/types/charts/core/registry.d.ts +17 -11
  259. package/dist/types/charts/core/render-size.d.ts +7 -0
  260. package/dist/types/charts/core/render.d.ts +1 -4
  261. package/dist/types/charts/core/snapshot.d.ts +2 -2
  262. package/dist/types/charts/core/svg-renderers.d.ts +722 -0
  263. package/dist/types/charts/core/svg.d.ts +4 -698
  264. package/dist/types/charts/core/types.d.ts +1 -12
  265. package/dist/types/charts/core/waterfall.d.ts +68 -0
  266. package/dist/types/charts/description.d.ts +226 -0
  267. package/dist/types/charts.d.ts +1 -0
  268. package/dist/types/content/Chart.d.ts +3 -91
  269. package/dist/types/content/ChartRoot.d.ts +92 -0
  270. package/dist/types/content/ChartSparkline.d.ts +5 -0
  271. package/dist/types/content/PdfViewer.d.ts +32 -0
  272. package/dist/types/content/chart-bar.d.ts +95 -2
  273. package/dist/types/content/index.d.ts +2 -0
  274. package/dist/types/content/pdf-document.d.ts +5 -0
  275. package/dist/types/content/pdf-engine.d.ts +9 -0
  276. package/dist/types/content/pdf-limits.d.ts +43 -0
  277. package/dist/types/content/pdf-messages.d.ts +16 -0
  278. package/dist/types/inputs/ChoiceInputs.d.ts +4 -0
  279. package/dist/types/inputs/ChoiceSlider.d.ts +12 -0
  280. package/dist/types/inputs/DatePicker.d.ts +22 -0
  281. package/dist/types/inputs/PeriodPicker.d.ts +24 -0
  282. package/dist/types/inputs/index.d.ts +8 -2
  283. package/dist/types/inputs/input-messages.d.ts +3 -0
  284. package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -0
  285. package/dist/types/inputs/markdown/SlashCommands.d.ts +20 -0
  286. package/dist/types/inputs/period-picker-messages.d.ts +34 -0
  287. package/dist/types/inputs/period.d.ts +134 -0
  288. package/dist/types/layout/DetailPanel.d.ts +12 -0
  289. package/dist/types/layout/index.d.ts +1 -1
  290. package/dist/types/surfaces/DescriptionList.d.ts +5 -0
  291. package/dist/types/surfaces/StatCell.d.ts +6 -1
  292. package/dist/types/widgets/DashboardFrame.d.ts +58 -0
  293. package/dist/types/widgets/index.d.ts +1 -0
  294. package/package.json +2 -1
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["charts/core/map.ts"],"sourcesContent":["import { WORLD_LAND_PATH, WORLD_MAP_HEIGHT, WORLD_MAP_WIDTH } from \"./chart-map-data\";\nimport {\n chartDatumSvg,\n clamp,\n computePlotArea,\n escapeXml,\n fmt,\n type MapOptions,\n type MapPoint,\n type MapViewport,\n mapRange,\n measureLegendHeight,\n normalizePadding,\n renderHeader,\n renderLegend,\n svgRoot,\n} from \"./svg-renderers\";\n\nconst isMapPoint = (point: MapPoint): boolean =>\n Number.isFinite(point.latitude) &&\n Number.isFinite(point.longitude) &&\n point.latitude >= -90 &&\n point.latitude <= 90 &&\n point.longitude >= -180 &&\n point.longitude <= 180;\n\nconst MAP_MIN_ZOOM = 0;\nconst MAP_MAX_ZOOM = 5;\n\nconst normalizeMapViewport = (viewport: MapViewport | undefined): MapViewport => {\n const zoom = clamp(viewport && Number.isFinite(viewport.zoom) ? viewport.zoom : MAP_MIN_ZOOM, MAP_MIN_ZOOM, MAP_MAX_ZOOM);\n const zoomScale = 2 ** zoom;\n const latitudeLimit = 90 - 90 / zoomScale;\n const longitudeLimit = 180 - 180 / zoomScale;\n\n return {\n latitude: clamp(viewport && Number.isFinite(viewport.latitude) ? viewport.latitude : 0, -latitudeLimit, latitudeLimit),\n longitude: clamp(viewport && Number.isFinite(viewport.longitude) ? viewport.longitude : 0, -longitudeLimit, longitudeLimit),\n zoom,\n };\n};\n\n/** Render geographic point series over a dependency-free world land map. */\nexport function map(opts: MapOptions): string {\n const width = opts.width ?? 640;\n const height = opts.height ?? 340;\n const padding = normalizePadding(opts.padding ?? { top: 12, right: 16, bottom: 12, left: 16 });\n const header = renderHeader(width, opts.title, opts.subtitle);\n const legendItems = opts.legend\n ? opts.series.map((series, index) => ({\n label: series.label && series.label.length > 0 ? series.label : `Series ${index + 1}`,\n seriesIndex: index,\n }))\n : [];\n const legendHeight = measureLegendHeight(legendItems, width);\n const area = computePlotArea(width, height, padding, false, false, header.height, legendHeight);\n const availableWidth = Math.max(0, area.x1 - area.x0);\n const availableHeight = Math.max(0, area.y1 - area.y0);\n const scale = Math.max(0, Math.min(availableWidth / WORLD_MAP_WIDTH, availableHeight / WORLD_MAP_HEIGHT));\n const mapWidth = WORLD_MAP_WIDTH * scale;\n const mapHeight = WORLD_MAP_HEIGHT * scale;\n const mapX = area.x0 + (availableWidth - mapWidth) / 2;\n const mapY = area.y0 + (availableHeight - mapHeight) / 2;\n const viewport = normalizeMapViewport(opts.viewport);\n const zoomScale = 2 ** viewport.zoom;\n const projectedScale = scale * zoomScale;\n const centerWorldX = ((viewport.longitude + 180) / 360) * WORLD_MAP_WIDTH;\n const centerWorldY = ((90 - viewport.latitude) / 180) * WORLD_MAP_HEIGHT;\n\n const finitePoints = opts.series.flatMap((series, seriesIndex) =>\n series.data.map((point, index) => ({ point, seriesIndex, index })).filter(({ point }) => isMapPoint(point)),\n );\n\n let sizeMin = Number.POSITIVE_INFINITY;\n let sizeMax = Number.NEGATIVE_INFINITY;\n for (const { point } of finitePoints) {\n if (typeof point.size !== \"number\" || !Number.isFinite(point.size) || point.size < 0) {\n continue;\n }\n if (point.size < sizeMin) sizeMin = point.size;\n if (point.size > sizeMax) sizeMax = point.size;\n }\n const hasSizes = Number.isFinite(sizeMin) && Number.isFinite(sizeMax);\n const requestedSizeRange = opts.sizeRange ?? [3, 12];\n const firstRadius = Number.isFinite(requestedSizeRange[0]) ? Math.max(0, requestedSizeRange[0]) : 3;\n const secondRadius = Number.isFinite(requestedSizeRange[1]) ? Math.max(0, requestedSizeRange[1]) : 12;\n const radiusRange: [number, number] = firstRadius <= secondRadius ? [firstRadius, secondRadius] : [secondRadius, firstRadius];\n\n const body: string[] = [header.svg];\n if (scale > 0) {\n body.push(\n `<svg class=\"stdlib-chart-map-viewport\" x=\"${fmt(mapX)}\" y=\"${fmt(mapY)}\" width=\"${fmt(mapWidth)}\" height=\"${fmt(mapHeight)}\" viewBox=\"0 0 ${fmt(mapWidth)} ${fmt(mapHeight)}\" overflow=\"hidden\">`,\n `<path class=\"stdlib-chart-map-land\" fill-rule=\"evenodd\" transform=\"translate(${fmt(mapWidth / 2)} ${fmt(mapHeight / 2)}) scale(${fmt(projectedScale)}) translate(${fmt(-centerWorldX)} ${fmt(-centerWorldY)})\" d=\"${WORLD_LAND_PATH}\"/>`,\n );\n\n for (const { point, seriesIndex, index } of finitePoints) {\n const pointWorldX = ((point.longitude + 180) / 360) * WORLD_MAP_WIDTH;\n const pointWorldY = ((90 - point.latitude) / 180) * WORLD_MAP_HEIGHT;\n const x = mapWidth / 2 + (pointWorldX - centerWorldX) * projectedScale;\n const y = mapHeight / 2 + (pointWorldY - centerWorldY) * projectedScale;\n const radius =\n hasSizes && typeof point.size === \"number\" && Number.isFinite(point.size) && point.size >= 0\n ? sizeMin === sizeMax\n ? (radiusRange[0] + radiusRange[1]) / 2\n : mapRange(point.size, [sizeMin, sizeMax], radiusRange)\n : 4;\n const title = point.label && point.label.length > 0 ? `<title>${escapeXml(point.label)}</title>` : \"\";\n body.push(\n chartDatumSvg(\n `<circle class=\"stdlib-chart-map-point stdlib-chart-series-${seriesIndex % 8}\" cx=\"${fmt(x)}\" cy=\"${fmt(y)}\" r=\"${fmt(radius)}\">${title}</circle>`,\n {\n index,\n seriesIndex,\n role: \"point\",\n label: point.label ?? opts.series[seriesIndex]?.label,\n anchor: [x, y],\n values: [\n { key: \"latitude\", value: point.latitude },\n { key: \"longitude\", value: point.longitude },\n ...(point.size !== undefined && Number.isFinite(point.size) ? [{ key: \"size\", value: point.size }] : []),\n ],\n },\n opts.inspect && x >= 0 && y >= 0 && x <= mapWidth && y <= mapHeight,\n ),\n );\n }\n body.push(\"</svg>\");\n }\n\n if (finitePoints.length === 0) {\n body.push(\n `<text class=\"stdlib-chart-map-empty\" x=\"${fmt(area.x0 + availableWidth / 2)}\" y=\"${fmt(area.y0 + availableHeight / 2)}\" text-anchor=\"middle\" dominant-baseline=\"middle\">No data</text>`,\n );\n }\n if (legendItems.length > 0) {\n body.push(renderLegend(legendItems, width, height - legendHeight).svg);\n }\n\n return svgRoot({ width, height, className: opts.className }, body.join(\"\"));\n}\n"],"mappings":"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","ignoreList":[]}
@@ -2,27 +2,34 @@ import { renderBarChartSvg } from "../../content/chart-bar";
2
2
  import { renderStateTimelineSvg } from "../../content/chart-state-timeline";
3
3
  import { renderAreaSvg } from "./area";
4
4
  import { renderHeatmapSvg } from "./calendar";
5
- import { charts } from "./svg";
5
+ import { renderHbarSvg } from "./hbar";
6
+ import { map } from "./map";
7
+ import { barGauge, boxplot, donut, gauge, histogram, line, pie, scatter, sparkline, stat } from "./svg-renderers";
8
+ import { renderWaterfallSvg } from "./waterfall";
6
9
 
7
10
  // Add one renderer here: its key defines the discriminator, ChartKind and the capitalized Chart namespace member.
8
11
  // Keep kind-specific adaptations in renderChartSvg and add a fixture to the namespace parity test.
9
- export const chartRenderers = {
12
+ const createChartRenderers = () => ({
13
+ waterfall: renderWaterfallSvg,
10
14
  area: renderAreaSvg,
11
- line: charts.line,
15
+ line: line,
12
16
  bar: renderBarChartSvg,
13
- pie: charts.pie,
14
- donut: charts.donut,
15
- scatter: charts.scatter,
16
- sparkline: charts.sparkline,
17
- histogram: charts.histogram,
18
- boxplot: charts.boxplot,
19
- gauge: charts.gauge,
20
- barGauge: charts.barGauge,
21
- stat: charts.stat,
17
+ hbar: renderHbarSvg,
18
+ pie: pie,
19
+ donut: donut,
20
+ scatter: scatter,
21
+ sparkline: sparkline,
22
+ histogram: histogram,
23
+ boxplot: boxplot,
24
+ gauge: gauge,
25
+ barGauge: barGauge,
26
+ stat: stat,
22
27
  heatmap: renderHeatmapSvg,
23
- map: charts.map,
28
+ map: map,
24
29
  stateTimeline: renderStateTimelineSvg
25
- };
30
+ });
31
+ export const chartRenderers = /* @__PURE__ */createChartRenderers();
26
32
  // Object.entries loses literal keys; names are constructed from those same keys here.
27
- export const chartKinds = Object.fromEntries(Object.keys(chartRenderers).map(kind => [kind[0].toUpperCase() + kind.slice(1), kind]));
33
+ const kinds = () => Object.fromEntries(Object.keys(chartRenderers).map(kind => [kind[0].toUpperCase() + kind.slice(1), kind]));
34
+ export const chartKinds = /* @__PURE__ */kinds();
28
35
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["charts/core/registry.ts"],"sourcesContent":["import { renderBarChartSvg } from \"../../content/chart-bar\";\nimport { renderStateTimelineSvg } from \"../../content/chart-state-timeline\";\nimport { renderAreaSvg } from \"./area\";\nimport { renderHeatmapSvg } from \"./calendar\";\nimport { charts } from \"./svg\";\n\n// Add one renderer here: its key defines the discriminator, ChartKind and the capitalized Chart namespace member.\n// Keep kind-specific adaptations in renderChartSvg and add a fixture to the namespace parity test.\nexport const chartRenderers = {\n area: renderAreaSvg,\n line: charts.line,\n bar: renderBarChartSvg,\n pie: charts.pie,\n donut: charts.donut,\n scatter: charts.scatter,\n sparkline: charts.sparkline,\n histogram: charts.histogram,\n boxplot: charts.boxplot,\n gauge: charts.gauge,\n barGauge: charts.barGauge,\n stat: charts.stat,\n heatmap: renderHeatmapSvg,\n map: charts.map,\n stateTimeline: renderStateTimelineSvg,\n};\ntype Kind = keyof typeof chartRenderers;\ntype ChartKinds = { [K in Kind as Capitalize<K>]: K };\n// Object.entries loses literal keys; names are constructed from those same keys here.\nexport const chartKinds = Object.fromEntries(\n Object.keys(chartRenderers).map((kind) => [kind[0]!.toUpperCase() + kind.slice(1), kind]),\n) as ChartKinds;\n"],"mappings":"AAAA,SAAS,iBAAiB,QAAQ,yBAAyB;AAC3D,SAAS,sBAAsB,QAAQ,oCAAoC;AAC3E,SAAS,aAAa,QAAQ,QAAQ;AACtC,SAAS,gBAAgB,QAAQ,YAAY;AAC7C,SAAS,MAAM,QAAQ,OAAO;;AAE9B;AACA;AACA,OAAO,MAAM,cAAc,GAAG;EAC5B,IAAI,EAAE,aAAa;EACnB,IAAI,EAAE,MAAM,CAAC,IAAI;EACjB,GAAG,EAAE,iBAAiB;EACtB,GAAG,EAAE,MAAM,CAAC,GAAG;EACf,KAAK,EAAE,MAAM,CAAC,KAAK;EACnB,OAAO,EAAE,MAAM,CAAC,OAAO;EACvB,SAAS,EAAE,MAAM,CAAC,SAAS;EAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;EAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;EACvB,KAAK,EAAE,MAAM,CAAC,KAAK;EACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;EACzB,IAAI,EAAE,MAAM,CAAC,IAAI;EACjB,OAAO,EAAE,gBAAgB;EACzB,GAAG,EAAE,MAAM,CAAC,GAAG;EACf,aAAa,EAAE;AACjB,CAAC;AAGD;AACA,OAAO,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAC1C,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAE,IAAI,IAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAC1F,CAAe","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["charts/core/registry.ts"],"sourcesContent":["import { renderBarChartSvg } from \"../../content/chart-bar\";\nimport { renderStateTimelineSvg } from \"../../content/chart-state-timeline\";\nimport { renderAreaSvg } from \"./area\";\nimport { renderHeatmapSvg } from \"./calendar\";\nimport { renderHbarSvg } from \"./hbar\";\nimport { map } from \"./map\";\nimport { barGauge, boxplot, donut, gauge, histogram, line, pie, scatter, sparkline, stat } from \"./svg-renderers\";\nimport { renderWaterfallSvg } from \"./waterfall\";\n\n// Add one renderer here: its key defines the discriminator, ChartKind and the capitalized Chart namespace member.\n// Keep kind-specific adaptations in renderChartSvg and add a fixture to the namespace parity test.\nconst createChartRenderers = () => ({\n waterfall: renderWaterfallSvg,\n area: renderAreaSvg,\n line: line,\n bar: renderBarChartSvg,\n hbar: renderHbarSvg,\n pie: pie,\n donut: donut,\n scatter: scatter,\n sparkline: sparkline,\n histogram: histogram,\n boxplot: boxplot,\n gauge: gauge,\n barGauge: barGauge,\n stat: stat,\n heatmap: renderHeatmapSvg,\n map: map,\n stateTimeline: renderStateTimelineSvg,\n});\nexport const chartRenderers = /* @__PURE__ */ createChartRenderers();\ntype Kind = keyof typeof chartRenderers;\ntype ChartKinds = { [K in Kind as Capitalize<K>]: K };\n// Object.entries loses literal keys; names are constructed from those same keys here.\nconst kinds = () =>\n Object.fromEntries(Object.keys(chartRenderers).map((kind) => [kind[0]!.toUpperCase() + kind.slice(1), kind])) as ChartKinds;\nexport const chartKinds = /* @__PURE__ */ kinds();\n"],"mappings":"AAAA,SAAS,iBAAiB,QAAQ,yBAAyB;AAC3D,SAAS,sBAAsB,QAAQ,oCAAoC;AAC3E,SAAS,aAAa,QAAQ,QAAQ;AACtC,SAAS,gBAAgB,QAAQ,YAAY;AAC7C,SAAS,aAAa,QAAQ,QAAQ;AACtC,SAAS,GAAG,QAAQ,OAAO;AAC3B,SAAS,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,QAAQ,iBAAiB;AACjH,SAAS,kBAAkB,QAAQ,aAAa;;AAEhD;AACA;AACA,MAAM,oBAAoB,GAAG,OAAO;EAClC,SAAS,EAAE,kBAAkB;EAC7B,IAAI,EAAE,aAAa;EACnB,IAAI,EAAE,IAAI;EACV,GAAG,EAAE,iBAAiB;EACtB,IAAI,EAAE,aAAa;EACnB,GAAG,EAAE,GAAG;EACR,KAAK,EAAE,KAAK;EACZ,OAAO,EAAE,OAAO;EAChB,SAAS,EAAE,SAAS;EACpB,SAAS,EAAE,SAAS;EACpB,OAAO,EAAE,OAAO;EAChB,KAAK,EAAE,KAAK;EACZ,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,IAAI;EACV,OAAO,EAAE,gBAAgB;EACzB,GAAG,EAAE,GAAG;EACR,aAAa,EAAE;AACjB,CAAC,CAAC;AACF,OAAO,MAAM,cAAc,GAAG,eAAgB,oBAAoB,CAAC,CAAC;AAGpE;AACA,MAAM,KAAK,GAAG,MACZ,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAE,IAAI,IAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAe;AAC7H,OAAO,MAAM,UAAU,GAAG,eAAgB,KAAK,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,13 @@
1
+ import { barChartLayout } from "../../content/chart-bar";
2
+ import { stateTimelineHeight } from "../../content/chart-state-timeline";
3
+ import { hbarLayout } from "./hbar";
4
+ /** Standard logical height, or compact bar-gauge rows for a host without an explicit height. */
5
+ export const chartRenderHeight = (props, sizing = {}) => {
6
+ if (props.kind === "stateTimeline") return stateTimelineHeight(props.rows.length, props.legend !== false);
7
+ if (props.kind === "bar") return barChartLayout(props).height;
8
+ if (props.kind === "hbar") return hbarLayout(props).height;
9
+ if (props.kind === "barGauge") return Math.max(sizing.contentHeight ? 80 : 280, (props.title || props.subtitle ? 42 : 16) + props.data.length * 28 + 14);
10
+ return 280;
11
+ };
12
+ export const preservesAspectRatio = kind => kind === "map" || kind === "pie" || kind === "donut" || kind === "gauge";
13
+ //# sourceMappingURL=render-size.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["charts/core/render-size.ts"],"sourcesContent":["import { barChartLayout } from \"../../content/chart-bar\";\nimport { stateTimelineHeight } from \"../../content/chart-state-timeline\";\nimport { hbarLayout } from \"./hbar\";\nimport type { ChartRenderOptions } from \"./render\";\nimport type { ChartKind } from \"./types\";\n\n/** Standard logical height, or compact bar-gauge rows for a host without an explicit height. */\nexport const chartRenderHeight = (props: ChartRenderOptions, sizing: { contentHeight?: boolean } = {}): number => {\n if (props.kind === \"stateTimeline\") return stateTimelineHeight(props.rows.length, props.legend !== false);\n if (props.kind === \"bar\") return barChartLayout(props).height;\n if (props.kind === \"hbar\") return hbarLayout(props).height;\n if (props.kind === \"barGauge\")\n return Math.max(sizing.contentHeight ? 80 : 280, (props.title || props.subtitle ? 42 : 16) + props.data.length * 28 + 14);\n return 280;\n};\n\nexport const preservesAspectRatio = (kind: ChartKind) => kind === \"map\" || kind === \"pie\" || kind === \"donut\" || kind === \"gauge\";\n"],"mappings":"AAAA,SAAS,cAAc,QAAQ,yBAAyB;AACxD,SAAS,mBAAmB,QAAQ,oCAAoC;AACxE,SAAS,UAAU,QAAQ,QAAQ;AAInC;AACA,OAAO,MAAM,iBAAiB,GAAG,CAAC,KAAyB,EAAE,MAAmC,GAAG,CAAC,CAAC,KAAa;EAChH,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,OAAO,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC;EACzG,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,MAAM;EAC7D,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM;EAC1D,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,GAAG,EAAE,GAAG,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC;EAC3H,OAAO,GAAG;AACZ,CAAC;AAED,OAAO,MAAM,oBAAoB,GAAI,IAAe,IAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO","ignoreList":[]}
@@ -1,18 +1,15 @@
1
- import { barChartLayout, renderBarChartSvg } from "../../content/chart-bar";
1
+ import { renderBarChartSvg } from "../../content/chart-bar";
2
2
  import { lineGapsSvg } from "../../content/chart-line-gaps";
3
3
  import { DEFAULT_MAP_VIEWPORT, normalizeMapViewport } from "../../content/chart-map-viewport";
4
- import { renderStateTimelineSvg, stateTimelineHeight } from "../../content/chart-state-timeline";
4
+ import { renderStateTimelineSvg } from "../../content/chart-state-timeline";
5
5
  import { responsiveChartSvg, responsiveMapSvg } from "../../content/chart-svg";
6
6
  import { timeAxisSvg } from "../../content/chart-time-axis";
7
7
  import { renderAreaSvg } from "./area";
8
+ import { renderHbarSvg } from "./hbar";
8
9
  import { chartRenderers } from "./registry";
9
- /** Keep the fixed 28-unit bar-gauge rows inside the shared SSR/browser coordinate space. */
10
- export const chartRenderHeight = props => {
11
- if (props.kind === "stateTimeline") return stateTimelineHeight(props.rows.length, props.legend !== false);
12
- if (props.kind === "bar") return barChartLayout(props).height;
13
- if (props.kind === "barGauge") return Math.max(280, (props.title || props.subtitle ? 42 : 16) + props.data.length * 28 + 14);
14
- return 280;
15
- };
10
+ import { renderWaterfallSvg } from "./waterfall";
11
+ export { chartRenderHeight, preservesAspectRatio } from "./render-size";
12
+ import { preservesAspectRatio } from "./render-size";
16
13
 
17
14
  /** Shared logical SVG renderer; callbacks and browser interaction stay with the Solid host. */
18
15
  export const renderChartSvg = (props, width, height, mapViewport, timelineViewport, renderLocale) => {
@@ -38,6 +35,20 @@ export const renderChartSvg = (props, width, height, mapViewport, timelineViewpo
38
35
  interactive: true
39
36
  }));
40
37
  }
38
+ if (kind === "hbar") return responsiveChartSvg(renderHbarSvg({
39
+ ...opts,
40
+ width,
41
+ height,
42
+ inspect: true
43
+ }));
44
+ if (kind === "waterfall") return responsiveChartSvg(renderWaterfallSvg({
45
+ ...opts,
46
+ displayWidth: opts.displayWidth ?? 296,
47
+ locale: opts.locale ?? renderLocale,
48
+ width,
49
+ height,
50
+ inspect: true
51
+ }, true));
41
52
  if (kind === "area") return responsiveChartSvg(renderAreaSvg({
42
53
  ...opts,
43
54
  locale: opts.locale ?? renderLocale,
@@ -92,7 +103,6 @@ const lineTimeDomain = props => {
92
103
  hi = Math.max(...xs);
93
104
  return lo < hi ? [lo, hi] : undefined;
94
105
  };
95
- export const preservesAspectRatio = kind => kind === "map" || kind === "pie" || kind === "donut" || kind === "gauge";
96
106
  /** Lay out a chart in a fixed logical coordinate space, without browser measurement. */
97
107
  export const layout = (spec, size) => ({
98
108
  ...size,
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["charts/core/render.ts"],"sourcesContent":["import { type BarChartOptions, barChartLayout, renderBarChartSvg } from \"../../content/chart-bar\";\nimport { lineGapsSvg } from \"../../content/chart-line-gaps\";\nimport { DEFAULT_MAP_VIEWPORT, normalizeMapViewport } from \"../../content/chart-map-viewport\";\nimport {\n renderStateTimelineSvg,\n type StateTimelineChartOptions,\n type StateTimelineDomain,\n stateTimelineHeight,\n} from \"../../content/chart-state-timeline\";\nimport { responsiveChartSvg, responsiveMapSvg } from \"../../content/chart-svg\";\nimport { type ChartTimeAxis, timeAxisSvg } from \"../../content/chart-time-axis\";\nimport { type AreaOptions, renderAreaSvg } from \"./area\";\nimport { chartRenderers } from \"./registry\";\nimport type { MapViewport } from \"./svg\";\nimport type { ChartKind } from \"./types\";\n\ntype DrawingOptions<T> = T extends unknown ? Omit<T, \"width\" | \"height\" | \"inspect\" | \"interactive\"> : never;\ntype RenderOptions<T> = T extends unknown ? Omit<T, \"legendPlacement\"> : never;\n\nexport type ChartDrawingOptions = {\n [K in ChartKind]: { kind: K } & (K extends \"map\"\n ? {\n /** Target when zooming in from the world view. Defaults to Europe (50, 10). */\n zoomFocus?: Pick<MapViewport, \"latitude\" | \"longitude\">;\n }\n : {}) &\n (K extends \"line\"\n ? {\n /** Largest connected X distance; positive, finite, without area/errorBand fills. */\n maxGap?: number;\n /** Wrap the legend above the plot inside the caller's total chart height. Requires legend=true. */\n legendPlacement?: \"top-start\";\n /** Round ticks for instant X values (Unix ms), in the supplied zone. xAxis.format labels them. */\n timeAxis?: ChartTimeAxis;\n }\n : {}) &\n DrawingOptions<Parameters<(typeof chartRenderers)[K]>[0]>;\n}[ChartKind];\nexport type ChartRenderOptions = RenderOptions<ChartDrawingOptions>;\n\n/** Keep the fixed 28-unit bar-gauge rows inside the shared SSR/browser coordinate space. */\nexport const chartRenderHeight = (props: ChartRenderOptions): number => {\n if (props.kind === \"stateTimeline\") return stateTimelineHeight(props.rows.length, props.legend !== false);\n if (props.kind === \"bar\") return barChartLayout(props).height;\n if (props.kind === \"barGauge\") return Math.max(280, (props.title || props.subtitle ? 42 : 16) + props.data.length * 28 + 14);\n return 280;\n};\n\n/** Shared logical SVG renderer; callbacks and browser interaction stay with the Solid host. */\nexport const renderChartSvg = (\n props: ChartDrawingOptions,\n width: number,\n height: number,\n mapViewport?: MapViewport,\n timelineViewport?: StateTimelineDomain,\n renderLocale?: string,\n): string => {\n if (props.kind === \"heatmap\" && props.layout === \"calendar\") return chartRenderers.heatmap({ ...props, width, height, inspect: true });\n const {\n kind,\n zoomFocus: _zoomFocus,\n legendPlacement: _legendPlacement,\n timeAxis: _timeAxis,\n ...opts\n } = props as ChartDrawingOptions & {\n zoomFocus?: Pick<MapViewport, \"latitude\" | \"longitude\">;\n legendPlacement?: \"top-start\";\n timeAxis?: ChartTimeAxis;\n };\n if (kind === \"stateTimeline\") {\n return responsiveChartSvg(\n renderStateTimelineSvg({\n ...(opts as StateTimelineChartOptions),\n width,\n height,\n viewport: timelineViewport,\n interactive: true,\n }),\n );\n }\n if (kind === \"area\")\n return responsiveChartSvg(\n renderAreaSvg({\n ...(opts as AreaOptions),\n locale: (opts as AreaOptions).locale ?? renderLocale,\n legend: false,\n width,\n height,\n inspect: true,\n }),\n );\n if (kind === \"bar\") return responsiveChartSvg(renderBarChartSvg({ ...(opts as BarChartOptions), width, height, inspect: true }));\n // A time axis needs an explicit X domain: it maps its round ticks onto the axis the renderer drew over it.\n const timeAxis = props.kind === \"line\" ? props.timeAxis : undefined;\n const timeDomain = timeAxis && props.kind === \"line\" ? lineTimeDomain(props) : undefined;\n let svg = (chartRenderers[kind] as (o: unknown) => string)({\n ...opts,\n ...(timeDomain && props.kind === \"line\" ? { xAxis: { ...props.xAxis, domain: timeDomain, format: () => \"\" } } : {}),\n ...(props.kind === \"line\" && props.legend && props.legendPlacement === \"top-start\" ? { legend: false } : {}),\n ...(kind === \"map\" ? { viewport: DEFAULT_MAP_VIEWPORT } : {}),\n width,\n height,\n inspect: true,\n });\n if (props.kind === \"line\" && props.maxGap !== undefined) {\n if (props.area || props.errorBand) throw new Error(\"Chart maxGap does not support area or errorBand fills\");\n svg = lineGapsSvg(svg, props.maxGap, props);\n }\n if (timeAxis && timeDomain && props.kind === \"line\")\n svg = timeAxisSvg(svg, timeDomain, timeAxis, (props.xAxis?.ticks ?? 3) + 2, props.xAxis?.format);\n if (props.kind === \"map\") return responsiveMapSvg(svg, width, height, normalizeMapViewport(mapViewport ?? props.viewport));\n return preservesAspectRatio(kind) ? svg : responsiveChartSvg(svg);\n};\n\n/** The given X domain, or the span of the plotted instants. */\nconst lineTimeDomain = (props: Extract<ChartDrawingOptions, { kind: \"line\" }>): [number, number] | undefined => {\n if (props.xAxis?.domain) return props.xAxis.domain;\n const xs = props.series.flatMap((series) => series.data.map((point) => point.x)).filter(Number.isFinite);\n if (!xs.length) return undefined;\n const lo = Math.min(...xs),\n hi = Math.max(...xs);\n return lo < hi ? [lo, hi] : undefined;\n};\n\nexport const preservesAspectRatio = (kind: ChartKind) => kind === \"map\" || kind === \"pie\" || kind === \"donut\" || kind === \"gauge\";\n\nexport type ChartSize = { width: number; height: number };\nexport type ChartScene = ChartSize & { kind: ChartKind; svg: string };\n/** Lay out a chart in a fixed logical coordinate space, without browser measurement. */\nexport const layout = (spec: ChartDrawingOptions, size: ChartSize): ChartScene => ({\n ...size,\n kind: spec.kind,\n svg: renderChartSvg(spec, size.width, size.height),\n});\nexport const toSvg = (scene: ChartScene): string => scene.svg;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["charts/core/render.ts"],"sourcesContent":["import { type BarChartOptions, renderBarChartSvg } from \"../../content/chart-bar\";\nimport { lineGapsSvg } from \"../../content/chart-line-gaps\";\nimport { DEFAULT_MAP_VIEWPORT, normalizeMapViewport } from \"../../content/chart-map-viewport\";\nimport { renderStateTimelineSvg, type StateTimelineChartOptions, type StateTimelineDomain } from \"../../content/chart-state-timeline\";\nimport { responsiveChartSvg, responsiveMapSvg } from \"../../content/chart-svg\";\nimport { type ChartTimeAxis, timeAxisSvg } from \"../../content/chart-time-axis\";\nimport { type AreaOptions, renderAreaSvg } from \"./area\";\nimport { type HorizontalBarOptions, renderHbarSvg } from \"./hbar\";\nimport { chartRenderers } from \"./registry\";\nimport type { MapViewport } from \"./svg\";\nimport type { ChartKind } from \"./types\";\nimport { renderWaterfallSvg, type WaterfallOptions } from \"./waterfall\";\n\ntype DrawingOptions<T> = T extends unknown ? Omit<T, \"width\" | \"height\" | \"inspect\" | \"interactive\"> : never;\ntype RenderOptions<T> = T extends unknown ? Omit<T, \"legendPlacement\"> : never;\n\nexport type ChartDrawingOptions = {\n [K in ChartKind]: { kind: K } & (K extends \"map\"\n ? {\n /** Target when zooming in from the world view. Defaults to Europe (50, 10). */\n zoomFocus?: Pick<MapViewport, \"latitude\" | \"longitude\">;\n }\n : {}) &\n (K extends \"line\"\n ? {\n /** Largest connected X distance; positive, finite, without area/errorBand fills. */\n maxGap?: number;\n /** Wrap the legend above the plot inside the caller's total chart height. Requires legend=true. */\n legendPlacement?: \"top-start\";\n /** Round ticks for instant X values (Unix ms), in the supplied zone. xAxis.format labels them. */\n timeAxis?: ChartTimeAxis;\n }\n : {}) &\n DrawingOptions<Parameters<(typeof chartRenderers)[K]>[0]>;\n}[ChartKind];\nexport type ChartRenderOptions = RenderOptions<ChartDrawingOptions>;\n\nexport { chartRenderHeight, preservesAspectRatio } from \"./render-size\";\n\nimport { preservesAspectRatio } from \"./render-size\";\n\n/** Shared logical SVG renderer; callbacks and browser interaction stay with the Solid host. */\nexport const renderChartSvg = (\n props: ChartDrawingOptions,\n width: number,\n height: number,\n mapViewport?: MapViewport,\n timelineViewport?: StateTimelineDomain,\n renderLocale?: string,\n): string => {\n if (props.kind === \"heatmap\" && props.layout === \"calendar\") return chartRenderers.heatmap({ ...props, width, height, inspect: true });\n const {\n kind,\n zoomFocus: _zoomFocus,\n legendPlacement: _legendPlacement,\n timeAxis: _timeAxis,\n ...opts\n } = props as ChartDrawingOptions & {\n zoomFocus?: Pick<MapViewport, \"latitude\" | \"longitude\">;\n legendPlacement?: \"top-start\";\n timeAxis?: ChartTimeAxis;\n };\n if (kind === \"stateTimeline\") {\n return responsiveChartSvg(\n renderStateTimelineSvg({\n ...(opts as StateTimelineChartOptions),\n width,\n height,\n viewport: timelineViewport,\n interactive: true,\n }),\n );\n }\n if (kind === \"hbar\") return responsiveChartSvg(renderHbarSvg({ ...(opts as HorizontalBarOptions), width, height, inspect: true }));\n if (kind === \"waterfall\")\n return responsiveChartSvg(\n renderWaterfallSvg(\n {\n ...(opts as WaterfallOptions),\n displayWidth: (opts as WaterfallOptions).displayWidth ?? 296,\n locale: (opts as WaterfallOptions).locale ?? renderLocale,\n width,\n height,\n inspect: true,\n },\n true,\n ),\n );\n if (kind === \"area\")\n return responsiveChartSvg(\n renderAreaSvg({\n ...(opts as AreaOptions),\n locale: (opts as AreaOptions).locale ?? renderLocale,\n legend: false,\n width,\n height,\n inspect: true,\n }),\n );\n if (kind === \"bar\") return responsiveChartSvg(renderBarChartSvg({ ...(opts as BarChartOptions), width, height, inspect: true }));\n // A time axis needs an explicit X domain: it maps its round ticks onto the axis the renderer drew over it.\n const timeAxis = props.kind === \"line\" ? props.timeAxis : undefined;\n const timeDomain = timeAxis && props.kind === \"line\" ? lineTimeDomain(props) : undefined;\n let svg = (chartRenderers[kind] as (o: unknown) => string)({\n ...opts,\n ...(timeDomain && props.kind === \"line\" ? { xAxis: { ...props.xAxis, domain: timeDomain, format: () => \"\" } } : {}),\n ...(props.kind === \"line\" && props.legend && props.legendPlacement === \"top-start\" ? { legend: false } : {}),\n ...(kind === \"map\" ? { viewport: DEFAULT_MAP_VIEWPORT } : {}),\n width,\n height,\n inspect: true,\n });\n if (props.kind === \"line\" && props.maxGap !== undefined) {\n if (props.area || props.errorBand) throw new Error(\"Chart maxGap does not support area or errorBand fills\");\n svg = lineGapsSvg(svg, props.maxGap, props);\n }\n if (timeAxis && timeDomain && props.kind === \"line\")\n svg = timeAxisSvg(svg, timeDomain, timeAxis, (props.xAxis?.ticks ?? 3) + 2, props.xAxis?.format);\n if (props.kind === \"map\") return responsiveMapSvg(svg, width, height, normalizeMapViewport(mapViewport ?? props.viewport));\n return preservesAspectRatio(kind) ? svg : responsiveChartSvg(svg);\n};\n\n/** The given X domain, or the span of the plotted instants. */\nconst lineTimeDomain = (props: Extract<ChartDrawingOptions, { kind: \"line\" }>): [number, number] | undefined => {\n if (props.xAxis?.domain) return props.xAxis.domain;\n const xs = props.series.flatMap((series) => series.data.map((point) => point.x)).filter(Number.isFinite);\n if (!xs.length) return undefined;\n const lo = Math.min(...xs),\n hi = Math.max(...xs);\n return lo < hi ? [lo, hi] : undefined;\n};\n\nexport type ChartSize = { width: number; height: number };\nexport type ChartScene = ChartSize & { kind: ChartKind; svg: string };\n/** Lay out a chart in a fixed logical coordinate space, without browser measurement. */\nexport const layout = (spec: ChartDrawingOptions, size: ChartSize): ChartScene => ({\n ...size,\n kind: spec.kind,\n svg: renderChartSvg(spec, size.width, size.height),\n});\nexport const toSvg = (scene: ChartScene): string => scene.svg;\n"],"mappings":"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","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  import { calendarLayout } from "./calendar";
2
2
  import { isChartDatum } from "./inspection";
3
3
  import { chartRenderHeight, renderChartSvg } from "./render";
4
- import { escapeXml } from "./svg";
4
+ import { escapeXml } from "./svg-renderers";
5
5
 
6
6
  /** Trusted output of prepareChartSnapshot; never accept arbitrary user SVG. */
7
7
 
@@ -9,10 +9,10 @@ import { escapeXml } from "./svg";
9
9
  const decodeAttribute = value => value.replace(/&quot;/g, '"').replace(/&apos;|&#39;/g, "'").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&");
10
10
 
11
11
  /** Pure SVG preparation for server or browser. Transfer only this output across SSR boundaries. */
12
- export function prepareChartSnapshot(options, inspection) {
12
+ export function prepareChartSnapshot(options, inspection, sizing = {}) {
13
13
  const calendar = options.kind === "heatmap" && options.layout === "calendar" ? calendarLayout(options) : undefined;
14
14
  const width = calendar?.width ?? 480;
15
- const height = chartRenderHeight(options);
15
+ const height = chartRenderHeight(options, sizing);
16
16
  const svg = renderChartSvg(options, width, height);
17
17
  const marks = [];
18
18
  const keys = new Set();
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["charts/core/snapshot.ts"],"sourcesContent":["import { calendarLayout } from \"./calendar\";\nimport { type ChartSelection, type ChartTooltip, type ChartTooltipFormatter, isChartDatum } from \"./inspection\";\nimport { type ChartRenderOptions, chartRenderHeight, renderChartSvg } from \"./render\";\nimport { escapeXml } from \"./svg\";\nimport type { ChartDatum, ChartKind } from \"./types\";\n\n/** Trusted output of prepareChartSnapshot; never accept arbitrary user SVG. */\nexport type ChartSnapshot = {\n kind: ChartKind;\n svg: string;\n width: number;\n height: number;\n stretch: boolean;\n minWidth?: number;\n marks: readonly { key: string; rowKey: string; datum: ChartDatum; tooltip: ChartTooltip; reference?: boolean }[];\n};\n\n// Matches metadata emitted by our SVG renderer, not arbitrary XML.\nconst decodeAttribute = (value: string) =>\n value\n .replace(/&quot;/g, '\"')\n .replace(/&apos;|&#39;/g, \"'\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&amp;/g, \"&\");\n\n/** Pure SVG preparation for server or browser. Transfer only this output across SSR boundaries. */\nexport function prepareChartSnapshot(\n options: ChartRenderOptions,\n inspection: {\n key: (selection: ChartSelection) => string;\n /** Defaults to the mark key for one-to-one charts. */\n rowKey?: (selection: ChartSelection) => string;\n tooltip: ChartTooltipFormatter;\n reference?: (selection: ChartSelection) => boolean;\n },\n): ChartSnapshot {\n const calendar = options.kind === \"heatmap\" && options.layout === \"calendar\" ? calendarLayout(options) : undefined;\n const width = calendar?.width ?? 480;\n const height = chartRenderHeight(options);\n const svg = renderChartSvg(options, width, height);\n const marks: ChartSnapshot[\"marks\"][number][] = [];\n const keys = new Set<string>();\n for (const match of svg.matchAll(/data-chart-datum=\"([^\"]*)\"/g)) {\n const datum: unknown = JSON.parse(decodeAttribute(match[1]!));\n if (!isChartDatum(datum)) throw new Error(\"Invalid renderer chart metadata\");\n const selection = { kind: options.kind, datum };\n const key = inspection.key(selection);\n if (!key || keys.has(key)) throw new Error(\"Chart snapshot requires a unique nonempty key for every mark\");\n keys.add(key);\n const rowKey = inspection.rowKey?.(selection) ?? key;\n if (!rowKey) throw new Error(\"Chart marks require a nonempty rowKey\");\n marks.push({\n key,\n rowKey,\n datum,\n tooltip: inspection.tooltip(selection),\n ...(inspection.reference?.(selection) ? { reference: true } : {}),\n });\n }\n let markIndex = 0;\n const formattedSvg = svg.replace(\n /(<g data-chart-role=\"[^\"]*\" data-chart-datum=\"[^\"]*\"><title>)[\\s\\S]*?<\\/title>/g,\n (_match, opening: string, offset: number) => {\n const mark = marks[markIndex++]!;\n const tooltip = mark.tooltip;\n const text = [tooltip.title, ...tooltip.rows.map((row) => `${row.label}: ${row.value}`)].filter(Boolean).join(\" · \");\n if (mark.reference) {\n const children = svg.slice(offset, svg.indexOf(\"</g>\", offset));\n const palette = (Number(children.match(/stdlib-chart-series-(\\d+)/)?.[1] ?? mark.datum.seriesIndex ?? 0) % 8) + 1;\n opening = opening.replace(\n \"<g \",\n `<g data-chart-reference=\"true\" style=\"--k2b-chart-reference-color:var(--stdlib-chart-c${palette})\" `,\n );\n }\n return `${opening}${escapeXml(text)}</title>`;\n },\n );\n return {\n kind: options.kind,\n svg: formattedSvg,\n width,\n height,\n ...(calendar ? { minWidth: calendar.minWidth } : {}),\n stretch: !calendar && ![\"map\", \"pie\", \"donut\", \"gauge\"].includes(options.kind),\n marks,\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["charts/core/snapshot.ts"],"sourcesContent":["import { calendarLayout } from \"./calendar\";\nimport { type ChartSelection, type ChartTooltip, type ChartTooltipFormatter, isChartDatum } from \"./inspection\";\nimport { type ChartRenderOptions, chartRenderHeight, renderChartSvg } from \"./render\";\nimport { escapeXml } from \"./svg-renderers\";\nimport type { ChartDatum, ChartKind } from \"./types\";\n\n/** Trusted output of prepareChartSnapshot; never accept arbitrary user SVG. */\nexport type ChartSnapshot = {\n kind: ChartKind;\n svg: string;\n width: number;\n height: number;\n stretch: boolean;\n minWidth?: number;\n marks: readonly { key: string; rowKey: string; datum: ChartDatum; tooltip: ChartTooltip; reference?: boolean }[];\n};\n\n// Matches metadata emitted by our SVG renderer, not arbitrary XML.\nconst decodeAttribute = (value: string) =>\n value\n .replace(/&quot;/g, '\"')\n .replace(/&apos;|&#39;/g, \"'\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&amp;/g, \"&\");\n\n/** Pure SVG preparation for server or browser. Transfer only this output across SSR boundaries. */\nexport function prepareChartSnapshot(\n options: ChartRenderOptions,\n inspection: {\n key: (selection: ChartSelection) => string;\n /** Defaults to the mark key for one-to-one charts. */\n rowKey?: (selection: ChartSelection) => string;\n tooltip: ChartTooltipFormatter;\n reference?: (selection: ChartSelection) => boolean;\n },\n sizing: Parameters<typeof chartRenderHeight>[1] = {},\n): ChartSnapshot {\n const calendar = options.kind === \"heatmap\" && options.layout === \"calendar\" ? calendarLayout(options) : undefined;\n const width = calendar?.width ?? 480;\n const height = chartRenderHeight(options, sizing);\n const svg = renderChartSvg(options, width, height);\n const marks: ChartSnapshot[\"marks\"][number][] = [];\n const keys = new Set<string>();\n for (const match of svg.matchAll(/data-chart-datum=\"([^\"]*)\"/g)) {\n const datum: unknown = JSON.parse(decodeAttribute(match[1]!));\n if (!isChartDatum(datum)) throw new Error(\"Invalid renderer chart metadata\");\n const selection = { kind: options.kind, datum };\n const key = inspection.key(selection);\n if (!key || keys.has(key)) throw new Error(\"Chart snapshot requires a unique nonempty key for every mark\");\n keys.add(key);\n const rowKey = inspection.rowKey?.(selection) ?? key;\n if (!rowKey) throw new Error(\"Chart marks require a nonempty rowKey\");\n marks.push({\n key,\n rowKey,\n datum,\n tooltip: inspection.tooltip(selection),\n ...(inspection.reference?.(selection) ? { reference: true } : {}),\n });\n }\n let markIndex = 0;\n const formattedSvg = svg.replace(\n /(<g data-chart-role=\"[^\"]*\" data-chart-datum=\"[^\"]*\"><title>)[\\s\\S]*?<\\/title>/g,\n (_match, opening: string, offset: number) => {\n const mark = marks[markIndex++]!;\n const tooltip = mark.tooltip;\n const text = [tooltip.title, ...tooltip.rows.map((row) => `${row.label}: ${row.value}`)].filter(Boolean).join(\" · \");\n if (mark.reference) {\n const children = svg.slice(offset, svg.indexOf(\"</g>\", offset));\n const palette = (Number(children.match(/stdlib-chart-series-(\\d+)/)?.[1] ?? mark.datum.seriesIndex ?? 0) % 8) + 1;\n opening = opening.replace(\n \"<g \",\n `<g data-chart-reference=\"true\" style=\"--k2b-chart-reference-color:var(--stdlib-chart-c${palette})\" `,\n );\n }\n return `${opening}${escapeXml(text)}</title>`;\n },\n );\n return {\n kind: options.kind,\n svg: formattedSvg,\n width,\n height,\n ...(calendar ? { minWidth: calendar.minWidth } : {}),\n stretch: !calendar && ![\"map\", \"pie\", \"donut\", \"gauge\"].includes(options.kind),\n marks,\n };\n}\n"],"mappings":"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","ignoreList":[]}