react-cheminfo 0.28.0 → 0.29.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 (691) hide show
  1. package/README.md +38 -25
  2. package/lib/chart/core/axisLabels.d.ts +82 -0
  3. package/lib/chart/core/axisLabels.d.ts.map +1 -0
  4. package/lib/chart/core/axisLabels.js +111 -0
  5. package/lib/chart/core/axisLabels.js.map +1 -0
  6. package/lib/chart/core/boxLayout.d.ts +53 -0
  7. package/lib/chart/core/boxLayout.d.ts.map +1 -0
  8. package/lib/chart/core/boxLayout.js +112 -0
  9. package/lib/chart/core/boxLayout.js.map +1 -0
  10. package/lib/chart/core/chartAxisScale.d.ts +23 -2
  11. package/lib/chart/core/chartAxisScale.d.ts.map +1 -1
  12. package/lib/chart/core/chartAxisScale.js +64 -13
  13. package/lib/chart/core/chartAxisScale.js.map +1 -1
  14. package/lib/chart/core/chartDomain.d.ts +160 -0
  15. package/lib/chart/core/chartDomain.d.ts.map +1 -0
  16. package/lib/chart/core/chartDomain.js +46 -0
  17. package/lib/chart/core/chartDomain.js.map +1 -0
  18. package/lib/chart/core/chartGeometry.d.ts +131 -0
  19. package/lib/chart/core/chartGeometry.d.ts.map +1 -0
  20. package/lib/chart/core/chartGeometry.js +101 -0
  21. package/lib/chart/core/chartGeometry.js.map +1 -0
  22. package/lib/chart/core/chartPane.d.ts +11 -0
  23. package/lib/chart/core/chartPane.d.ts.map +1 -0
  24. package/lib/chart/core/chartPane.js +11 -0
  25. package/lib/chart/core/chartPane.js.map +1 -0
  26. package/lib/chart/core/chartScale.d.ts +4 -1
  27. package/lib/chart/core/chartScale.d.ts.map +1 -1
  28. package/lib/chart/core/chartScale.js +8 -4
  29. package/lib/chart/core/chartScale.js.map +1 -1
  30. package/lib/chart/core/chartTheme.d.ts +156 -0
  31. package/lib/chart/core/chartTheme.d.ts.map +1 -0
  32. package/lib/chart/core/chartTheme.js +156 -0
  33. package/lib/chart/core/chartTheme.js.map +1 -0
  34. package/lib/chart/core/chartViewport.d.ts +32 -5
  35. package/lib/chart/core/chartViewport.d.ts.map +1 -1
  36. package/lib/chart/core/chartViewport.js +40 -11
  37. package/lib/chart/core/chartViewport.js.map +1 -1
  38. package/lib/chart/core/guidePlacement.d.ts +52 -0
  39. package/lib/chart/core/guidePlacement.d.ts.map +1 -0
  40. package/lib/chart/core/guidePlacement.js +52 -0
  41. package/lib/chart/core/guidePlacement.js.map +1 -0
  42. package/lib/chart/core/index.d.ts +29 -2
  43. package/lib/chart/core/index.d.ts.map +1 -1
  44. package/lib/chart/core/index.js +19 -2
  45. package/lib/chart/core/index.js.map +1 -1
  46. package/lib/chart/core/labelStack.d.ts +27 -0
  47. package/lib/chart/core/labelStack.d.ts.map +1 -0
  48. package/lib/chart/core/labelStack.js +62 -0
  49. package/lib/chart/core/labelStack.js.map +1 -0
  50. package/lib/chart/core/legendBox.d.ts +152 -0
  51. package/lib/chart/core/legendBox.d.ts.map +1 -0
  52. package/lib/chart/core/legendBox.js +169 -0
  53. package/lib/chart/core/legendBox.js.map +1 -0
  54. package/lib/chart/core/selectionGeometry.d.ts +45 -0
  55. package/lib/chart/core/selectionGeometry.d.ts.map +1 -0
  56. package/lib/chart/core/selectionGeometry.js +49 -0
  57. package/lib/chart/core/selectionGeometry.js.map +1 -0
  58. package/lib/chart/core/spectrumColor.d.ts +80 -0
  59. package/lib/chart/core/spectrumColor.d.ts.map +1 -0
  60. package/lib/chart/core/spectrumColor.js +120 -0
  61. package/lib/chart/core/spectrumColor.js.map +1 -0
  62. package/lib/chart/core/stackCapacity.d.ts +136 -0
  63. package/lib/chart/core/stackCapacity.d.ts.map +1 -0
  64. package/lib/chart/core/stackCapacity.js +153 -0
  65. package/lib/chart/core/stackCapacity.js.map +1 -0
  66. package/lib/chart/core/svgPoint.d.ts +62 -0
  67. package/lib/chart/core/svgPoint.d.ts.map +1 -0
  68. package/lib/chart/core/svgPoint.js +43 -0
  69. package/lib/chart/core/svgPoint.js.map +1 -0
  70. package/lib/chart/core/tracePath.d.ts +94 -0
  71. package/lib/chart/core/tracePath.d.ts.map +1 -0
  72. package/lib/chart/core/tracePath.js +191 -0
  73. package/lib/chart/core/tracePath.js.map +1 -0
  74. package/lib/chart/core/trackerReadout.d.ts +55 -0
  75. package/lib/chart/core/trackerReadout.d.ts.map +1 -0
  76. package/lib/chart/core/trackerReadout.js +53 -0
  77. package/lib/chart/core/trackerReadout.js.map +1 -0
  78. package/lib/chart/core/viewTransform.d.ts +167 -0
  79. package/lib/chart/core/viewTransform.d.ts.map +1 -0
  80. package/lib/chart/core/viewTransform.js +188 -0
  81. package/lib/chart/core/viewTransform.js.map +1 -0
  82. package/lib/chart/core/zoomDomain.d.ts +127 -0
  83. package/lib/chart/core/zoomDomain.d.ts.map +1 -0
  84. package/lib/chart/core/zoomDomain.js +175 -0
  85. package/lib/chart/core/zoomDomain.js.map +1 -0
  86. package/lib/chart/ui/Axes.d.ts +104 -0
  87. package/lib/chart/ui/Axes.d.ts.map +1 -0
  88. package/lib/chart/ui/Axes.js +155 -0
  89. package/lib/chart/ui/Axes.js.map +1 -0
  90. package/lib/chart/ui/AxisGuide.d.ts +60 -0
  91. package/lib/chart/ui/AxisGuide.d.ts.map +1 -0
  92. package/lib/chart/ui/AxisGuide.js +111 -0
  93. package/lib/chart/ui/AxisGuide.js.map +1 -0
  94. package/lib/chart/ui/ChartStack.d.ts +81 -0
  95. package/lib/chart/ui/ChartStack.d.ts.map +1 -0
  96. package/lib/chart/ui/ChartStack.js +42 -0
  97. package/lib/chart/ui/ChartStack.js.map +1 -0
  98. package/lib/chart/ui/ChartTracker.d.ts +36 -0
  99. package/lib/chart/ui/ChartTracker.d.ts.map +1 -0
  100. package/lib/chart/ui/ChartTracker.js +27 -0
  101. package/lib/chart/ui/ChartTracker.js.map +1 -0
  102. package/lib/chart/ui/PlotCaption.d.ts +44 -0
  103. package/lib/chart/ui/PlotCaption.d.ts.map +1 -0
  104. package/lib/chart/ui/PlotCaption.js +68 -0
  105. package/lib/chart/ui/PlotCaption.js.map +1 -0
  106. package/lib/chart/ui/SelectionRect.d.ts +27 -0
  107. package/lib/chart/ui/SelectionRect.d.ts.map +1 -0
  108. package/lib/chart/ui/SelectionRect.js +31 -0
  109. package/lib/chart/ui/SelectionRect.js.map +1 -0
  110. package/lib/chart/ui/TraceLegend.d.ts +99 -0
  111. package/lib/chart/ui/TraceLegend.d.ts.map +1 -0
  112. package/lib/chart/ui/TraceLegend.js +45 -0
  113. package/lib/chart/ui/TraceLegend.js.map +1 -0
  114. package/lib/chart/ui/chartGestures.d.ts +158 -0
  115. package/lib/chart/ui/chartGestures.d.ts.map +1 -0
  116. package/lib/chart/ui/chartGestures.js +145 -0
  117. package/lib/chart/ui/chartGestures.js.map +1 -0
  118. package/lib/chart/ui/chartStackLevel.d.ts +115 -0
  119. package/lib/chart/ui/chartStackLevel.d.ts.map +1 -0
  120. package/lib/chart/ui/chartStackLevel.js +96 -0
  121. package/lib/chart/ui/chartStackLevel.js.map +1 -0
  122. package/lib/chart/ui/chartSurface.d.ts +35 -0
  123. package/lib/chart/ui/chartSurface.d.ts.map +1 -0
  124. package/lib/chart/ui/chartSurface.js +58 -0
  125. package/lib/chart/ui/chartSurface.js.map +1 -0
  126. package/lib/chart/ui/index.d.ts +24 -0
  127. package/lib/chart/ui/index.d.ts.map +1 -1
  128. package/lib/chart/ui/index.js +13 -0
  129. package/lib/chart/ui/index.js.map +1 -1
  130. package/lib/chart/ui/useChartPointer.d.ts +124 -0
  131. package/lib/chart/ui/useChartPointer.d.ts.map +1 -0
  132. package/lib/chart/ui/useChartPointer.js +152 -0
  133. package/lib/chart/ui/useChartPointer.js.map +1 -0
  134. package/lib/chart/ui/useChartSize.d.ts +49 -0
  135. package/lib/chart/ui/useChartSize.d.ts.map +1 -0
  136. package/lib/chart/ui/useChartSize.js +91 -0
  137. package/lib/chart/ui/useChartSize.js.map +1 -0
  138. package/lib/chart/ui/useChartWindow.d.ts +147 -0
  139. package/lib/chart/ui/useChartWindow.d.ts.map +1 -0
  140. package/lib/chart/ui/useChartWindow.js +135 -0
  141. package/lib/chart/ui/useChartWindow.js.map +1 -0
  142. package/lib/chart/ui/useChartZoom.d.ts +88 -0
  143. package/lib/chart/ui/useChartZoom.d.ts.map +1 -0
  144. package/lib/chart/ui/useChartZoom.js +142 -0
  145. package/lib/chart/ui/useChartZoom.js.map +1 -0
  146. package/lib/chart/ui/useWheelListener.d.ts +30 -0
  147. package/lib/chart/ui/useWheelListener.d.ts.map +1 -0
  148. package/lib/chart/ui/useWheelListener.js +57 -0
  149. package/lib/chart/ui/useWheelListener.js.map +1 -0
  150. package/lib/clipboard/core/copyPng.d.ts +13 -0
  151. package/lib/clipboard/core/copyPng.d.ts.map +1 -0
  152. package/lib/clipboard/core/copyPng.js +19 -0
  153. package/lib/clipboard/core/copyPng.js.map +1 -0
  154. package/lib/clipboard/core/index.d.ts +1 -0
  155. package/lib/clipboard/core/index.d.ts.map +1 -1
  156. package/lib/clipboard/core/index.js +1 -0
  157. package/lib/clipboard/core/index.js.map +1 -1
  158. package/lib/core.d.ts +1 -0
  159. package/lib/core.d.ts.map +1 -1
  160. package/lib/core.js +1 -0
  161. package/lib/core.js.map +1 -1
  162. package/lib/download/core/exportStyles.d.ts +22 -0
  163. package/lib/download/core/exportStyles.d.ts.map +1 -0
  164. package/lib/download/core/exportStyles.js +19 -0
  165. package/lib/download/core/exportStyles.js.map +1 -0
  166. package/lib/download/core/imageResolution.d.ts +88 -0
  167. package/lib/download/core/imageResolution.d.ts.map +1 -0
  168. package/lib/download/core/imageResolution.js +77 -0
  169. package/lib/download/core/imageResolution.js.map +1 -0
  170. package/lib/download/core/index.d.ts +13 -0
  171. package/lib/download/core/index.d.ts.map +1 -1
  172. package/lib/download/core/index.js +8 -0
  173. package/lib/download/core/index.js.map +1 -1
  174. package/lib/download/core/pictureExport.d.ts +93 -0
  175. package/lib/download/core/pictureExport.d.ts.map +1 -0
  176. package/lib/download/core/pictureExport.js +116 -0
  177. package/lib/download/core/pictureExport.js.map +1 -0
  178. package/lib/download/core/stackedDrawing.d.ts +36 -0
  179. package/lib/download/core/stackedDrawing.d.ts.map +1 -0
  180. package/lib/download/core/stackedDrawing.js +98 -0
  181. package/lib/download/core/stackedDrawing.js.map +1 -0
  182. package/lib/download/core/svgBounds.d.ts +44 -0
  183. package/lib/download/core/svgBounds.d.ts.map +1 -0
  184. package/lib/download/core/svgBounds.js +69 -0
  185. package/lib/download/core/svgBounds.js.map +1 -0
  186. package/lib/download/core/svgNamespace.d.ts +9 -0
  187. package/lib/download/core/svgNamespace.d.ts.map +1 -0
  188. package/lib/download/core/svgNamespace.js +10 -0
  189. package/lib/download/core/svgNamespace.js.map +1 -0
  190. package/lib/download/core/svgToPng.d.ts +43 -0
  191. package/lib/download/core/svgToPng.d.ts.map +1 -0
  192. package/lib/download/core/svgToPng.js +79 -0
  193. package/lib/download/core/svgToPng.js.map +1 -0
  194. package/lib/download/core/svgToString.d.ts +45 -0
  195. package/lib/download/core/svgToString.d.ts.map +1 -0
  196. package/lib/download/core/svgToString.js +58 -0
  197. package/lib/download/core/svgToString.js.map +1 -0
  198. package/lib/download/ui/ExportDialogFrame.d.ts +46 -0
  199. package/lib/download/ui/ExportDialogFrame.d.ts.map +1 -0
  200. package/lib/download/ui/ExportDialogFrame.js +24 -0
  201. package/lib/download/ui/ExportDialogFrame.js.map +1 -0
  202. package/lib/download/ui/ExportImageDialog.d.ts +47 -0
  203. package/lib/download/ui/ExportImageDialog.d.ts.map +1 -0
  204. package/lib/download/ui/ExportImageDialog.js +25 -0
  205. package/lib/download/ui/ExportImageDialog.js.map +1 -0
  206. package/lib/download/ui/ExportNameField.d.ts +29 -0
  207. package/lib/download/ui/ExportNameField.d.ts.map +1 -0
  208. package/lib/download/ui/ExportNameField.js +99 -0
  209. package/lib/download/ui/ExportNameField.js.map +1 -0
  210. package/lib/download/ui/ExportPictureSection.d.ts +38 -0
  211. package/lib/download/ui/ExportPictureSection.d.ts.map +1 -0
  212. package/lib/download/ui/ExportPictureSection.js +48 -0
  213. package/lib/download/ui/ExportPictureSection.js.map +1 -0
  214. package/lib/download/ui/index.d.ts +10 -0
  215. package/lib/download/ui/index.d.ts.map +1 -1
  216. package/lib/download/ui/index.js +5 -0
  217. package/lib/download/ui/index.js.map +1 -1
  218. package/lib/download/ui/useDrawingBox.d.ts +23 -0
  219. package/lib/download/ui/useDrawingBox.d.ts.map +1 -0
  220. package/lib/download/ui/useDrawingBox.js +21 -0
  221. package/lib/download/ui/useDrawingBox.js.map +1 -0
  222. package/lib/error/core/describeSource.d.ts +17 -0
  223. package/lib/error/core/describeSource.d.ts.map +1 -0
  224. package/lib/error/core/describeSource.js +19 -0
  225. package/lib/error/core/describeSource.js.map +1 -0
  226. package/lib/error/core/index.d.ts +1 -0
  227. package/lib/error/core/index.d.ts.map +1 -1
  228. package/lib/error/core/index.js +1 -0
  229. package/lib/error/core/index.js.map +1 -1
  230. package/lib/help/ui/HelpBody.d.ts +10 -1
  231. package/lib/help/ui/HelpBody.d.ts.map +1 -1
  232. package/lib/help/ui/HelpBody.js +24 -1
  233. package/lib/help/ui/HelpBody.js.map +1 -1
  234. package/lib/help/ui/index.d.ts +1 -1
  235. package/lib/help/ui/index.d.ts.map +1 -1
  236. package/lib/help/ui/index.js.map +1 -1
  237. package/lib/ir/core/analysisSpectra.d.ts +46 -0
  238. package/lib/ir/core/analysisSpectra.d.ts.map +1 -0
  239. package/lib/ir/core/analysisSpectra.js +187 -0
  240. package/lib/ir/core/analysisSpectra.js.map +1 -0
  241. package/lib/ir/core/assignBands.d.ts +83 -0
  242. package/lib/ir/core/assignBands.d.ts.map +1 -0
  243. package/lib/ir/core/assignBands.js +83 -0
  244. package/lib/ir/core/assignBands.js.map +1 -0
  245. package/lib/ir/core/bandAssignments.d.ts +47 -0
  246. package/lib/ir/core/bandAssignments.d.ts.map +1 -0
  247. package/lib/ir/core/bandAssignments.js +305 -0
  248. package/lib/ir/core/bandAssignments.js.map +1 -0
  249. package/lib/ir/core/bandLabelPlan.d.ts +93 -0
  250. package/lib/ir/core/bandLabelPlan.d.ts.map +1 -0
  251. package/lib/ir/core/bandLabelPlan.js +104 -0
  252. package/lib/ir/core/bandLabelPlan.js.map +1 -0
  253. package/lib/ir/core/detectIrFormat.d.ts +23 -0
  254. package/lib/ir/core/detectIrFormat.d.ts.map +1 -0
  255. package/lib/ir/core/detectIrFormat.js +133 -0
  256. package/lib/ir/core/detectIrFormat.js.map +1 -0
  257. package/lib/ir/core/downloadSpectra.d.ts +26 -0
  258. package/lib/ir/core/downloadSpectra.d.ts.map +1 -0
  259. package/lib/ir/core/downloadSpectra.js +37 -0
  260. package/lib/ir/core/downloadSpectra.js.map +1 -0
  261. package/lib/ir/core/fromJcamp.d.ts +35 -0
  262. package/lib/ir/core/fromJcamp.d.ts.map +1 -0
  263. package/lib/ir/core/fromJcamp.js +48 -0
  264. package/lib/ir/core/fromJcamp.js.map +1 -0
  265. package/lib/ir/core/fromSpc.d.ts +30 -0
  266. package/lib/ir/core/fromSpc.d.ts.map +1 -0
  267. package/lib/ir/core/fromSpc.js +40 -0
  268. package/lib/ir/core/fromSpc.js.map +1 -0
  269. package/lib/ir/core/index.d.ts +51 -0
  270. package/lib/ir/core/index.d.ts.map +1 -0
  271. package/lib/ir/core/index.js +35 -0
  272. package/lib/ir/core/index.js.map +1 -0
  273. package/lib/ir/core/irBand.d.ts +45 -0
  274. package/lib/ir/core/irBand.d.ts.map +1 -0
  275. package/lib/ir/core/irBand.js +30 -0
  276. package/lib/ir/core/irBand.js.map +1 -0
  277. package/lib/ir/core/irCommands.d.ts +168 -0
  278. package/lib/ir/core/irCommands.d.ts.map +1 -0
  279. package/lib/ir/core/irCommands.js +94 -0
  280. package/lib/ir/core/irCommands.js.map +1 -0
  281. package/lib/ir/core/irDomain.d.ts +63 -0
  282. package/lib/ir/core/irDomain.d.ts.map +1 -0
  283. package/lib/ir/core/irDomain.js +136 -0
  284. package/lib/ir/core/irDomain.js.map +1 -0
  285. package/lib/ir/core/irEditorApi.d.ts +42 -0
  286. package/lib/ir/core/irEditorApi.d.ts.map +1 -0
  287. package/lib/ir/core/irEditorApi.js +10 -0
  288. package/lib/ir/core/irEditorApi.js.map +1 -0
  289. package/lib/ir/core/irFormat.d.ts +42 -0
  290. package/lib/ir/core/irFormat.d.ts.map +1 -0
  291. package/lib/ir/core/irFormat.js +51 -0
  292. package/lib/ir/core/irFormat.js.map +1 -0
  293. package/lib/ir/core/irMode.d.ts +160 -0
  294. package/lib/ir/core/irMode.d.ts.map +1 -0
  295. package/lib/ir/core/irMode.js +175 -0
  296. package/lib/ir/core/irMode.js.map +1 -0
  297. package/lib/ir/core/irReducer.d.ts +101 -0
  298. package/lib/ir/core/irReducer.d.ts.map +1 -0
  299. package/lib/ir/core/irReducer.js +207 -0
  300. package/lib/ir/core/irReducer.js.map +1 -0
  301. package/lib/ir/core/irSidePanels.d.ts +22 -0
  302. package/lib/ir/core/irSidePanels.d.ts.map +1 -0
  303. package/lib/ir/core/irSidePanels.js +12 -0
  304. package/lib/ir/core/irSidePanels.js.map +1 -0
  305. package/lib/ir/core/irSpectrum.d.ts +140 -0
  306. package/lib/ir/core/irSpectrum.d.ts.map +1 -0
  307. package/lib/ir/core/irSpectrum.js +34 -0
  308. package/lib/ir/core/irSpectrum.js.map +1 -0
  309. package/lib/ir/core/irState.d.ts +119 -0
  310. package/lib/ir/core/irState.d.ts.map +1 -0
  311. package/lib/ir/core/irState.js +92 -0
  312. package/lib/ir/core/irState.js.map +1 -0
  313. package/lib/ir/core/loadIrSpectra.d.ts +36 -0
  314. package/lib/ir/core/loadIrSpectra.d.ts.map +1 -0
  315. package/lib/ir/core/loadIrSpectra.js +44 -0
  316. package/lib/ir/core/loadIrSpectra.js.map +1 -0
  317. package/lib/ir/core/nearestBand.d.ts +35 -0
  318. package/lib/ir/core/nearestBand.d.ts.map +1 -0
  319. package/lib/ir/core/nearestBand.js +47 -0
  320. package/lib/ir/core/nearestBand.js.map +1 -0
  321. package/lib/ir/core/pickBands.d.ts +70 -0
  322. package/lib/ir/core/pickBands.d.ts.map +1 -0
  323. package/lib/ir/core/pickBands.js +125 -0
  324. package/lib/ir/core/pickBands.js.map +1 -0
  325. package/lib/ir/core/spectrumJcamp.d.ts +58 -0
  326. package/lib/ir/core/spectrumJcamp.d.ts.map +1 -0
  327. package/lib/ir/core/spectrumJcamp.js +156 -0
  328. package/lib/ir/core/spectrumJcamp.js.map +1 -0
  329. package/lib/ir/core/toIrSpectrum.d.ts +59 -0
  330. package/lib/ir/core/toIrSpectrum.d.ts.map +1 -0
  331. package/lib/ir/core/toIrSpectrum.js +56 -0
  332. package/lib/ir/core/toIrSpectrum.js.map +1 -0
  333. package/lib/ir/ui/BandMarks.d.ts +52 -0
  334. package/lib/ir/ui/BandMarks.d.ts.map +1 -0
  335. package/lib/ir/ui/BandMarks.js +71 -0
  336. package/lib/ir/ui/BandMarks.js.map +1 -0
  337. package/lib/ir/ui/BandsPanel.d.ts +31 -0
  338. package/lib/ir/ui/BandsPanel.d.ts.map +1 -0
  339. package/lib/ir/ui/BandsPanel.js +94 -0
  340. package/lib/ir/ui/BandsPanel.js.map +1 -0
  341. package/lib/ir/ui/IrAboutDialog.d.ts +18 -0
  342. package/lib/ir/ui/IrAboutDialog.d.ts.map +1 -0
  343. package/lib/ir/ui/IrAboutDialog.js +32 -0
  344. package/lib/ir/ui/IrAboutDialog.js.map +1 -0
  345. package/lib/ir/ui/IrCanvas.d.ts +38 -0
  346. package/lib/ir/ui/IrCanvas.d.ts.map +1 -0
  347. package/lib/ir/ui/IrCanvas.js +41 -0
  348. package/lib/ir/ui/IrCanvas.js.map +1 -0
  349. package/lib/ir/ui/IrChart.d.ts +28 -0
  350. package/lib/ir/ui/IrChart.d.ts.map +1 -0
  351. package/lib/ir/ui/IrChart.js +114 -0
  352. package/lib/ir/ui/IrChart.js.map +1 -0
  353. package/lib/ir/ui/IrCommandProvider.d.ts +15 -0
  354. package/lib/ir/ui/IrCommandProvider.d.ts.map +1 -0
  355. package/lib/ir/ui/IrCommandProvider.js +14 -0
  356. package/lib/ir/ui/IrCommandProvider.js.map +1 -0
  357. package/lib/ir/ui/IrCommandTooltip.d.ts +16 -0
  358. package/lib/ir/ui/IrCommandTooltip.d.ts.map +1 -0
  359. package/lib/ir/ui/IrCommandTooltip.js +22 -0
  360. package/lib/ir/ui/IrCommandTooltip.js.map +1 -0
  361. package/lib/ir/ui/IrDocumentationDialog.d.ts +18 -0
  362. package/lib/ir/ui/IrDocumentationDialog.d.ts.map +1 -0
  363. package/lib/ir/ui/IrDocumentationDialog.js +68 -0
  364. package/lib/ir/ui/IrDocumentationDialog.js.map +1 -0
  365. package/lib/ir/ui/IrEditor.d.ts +60 -0
  366. package/lib/ir/ui/IrEditor.d.ts.map +1 -0
  367. package/lib/ir/ui/IrEditor.js +42 -0
  368. package/lib/ir/ui/IrEditor.js.map +1 -0
  369. package/lib/ir/ui/IrHeader.d.ts +13 -0
  370. package/lib/ir/ui/IrHeader.d.ts.map +1 -0
  371. package/lib/ir/ui/IrHeader.js +21 -0
  372. package/lib/ir/ui/IrHeader.js.map +1 -0
  373. package/lib/ir/ui/IrLogo.d.ts +20 -0
  374. package/lib/ir/ui/IrLogo.d.ts.map +1 -0
  375. package/lib/ir/ui/IrLogo.js +17 -0
  376. package/lib/ir/ui/IrLogo.js.map +1 -0
  377. package/lib/ir/ui/IrPointerTracker.d.ts +29 -0
  378. package/lib/ir/ui/IrPointerTracker.d.ts.map +1 -0
  379. package/lib/ir/ui/IrPointerTracker.js +47 -0
  380. package/lib/ir/ui/IrPointerTracker.js.map +1 -0
  381. package/lib/ir/ui/IrShell.d.ts +25 -0
  382. package/lib/ir/ui/IrShell.d.ts.map +1 -0
  383. package/lib/ir/ui/IrShell.js +178 -0
  384. package/lib/ir/ui/IrShell.js.map +1 -0
  385. package/lib/ir/ui/IrSidePanel.d.ts +26 -0
  386. package/lib/ir/ui/IrSidePanel.d.ts.map +1 -0
  387. package/lib/ir/ui/IrSidePanel.js +39 -0
  388. package/lib/ir/ui/IrSidePanel.js.map +1 -0
  389. package/lib/ir/ui/IrStateProvider.d.ts +19 -0
  390. package/lib/ir/ui/IrStateProvider.d.ts.map +1 -0
  391. package/lib/ir/ui/IrStateProvider.js +16 -0
  392. package/lib/ir/ui/IrStateProvider.js.map +1 -0
  393. package/lib/ir/ui/IrStatusBar.d.ts +14 -0
  394. package/lib/ir/ui/IrStatusBar.d.ts.map +1 -0
  395. package/lib/ir/ui/IrStatusBar.js +48 -0
  396. package/lib/ir/ui/IrStatusBar.js.map +1 -0
  397. package/lib/ir/ui/IrToolbar.d.ts +18 -0
  398. package/lib/ir/ui/IrToolbar.d.ts.map +1 -0
  399. package/lib/ir/ui/IrToolbar.js +32 -0
  400. package/lib/ir/ui/IrToolbar.js.map +1 -0
  401. package/lib/ir/ui/IrTraces.d.ts +63 -0
  402. package/lib/ir/ui/IrTraces.d.ts.map +1 -0
  403. package/lib/ir/ui/IrTraces.js +72 -0
  404. package/lib/ir/ui/IrTraces.js.map +1 -0
  405. package/lib/ir/ui/MetadataPanel.d.ts +15 -0
  406. package/lib/ir/ui/MetadataPanel.d.ts.map +1 -0
  407. package/lib/ir/ui/MetadataPanel.js +49 -0
  408. package/lib/ir/ui/MetadataPanel.js.map +1 -0
  409. package/lib/ir/ui/SpectraPanel.d.ts +20 -0
  410. package/lib/ir/ui/SpectraPanel.d.ts.map +1 -0
  411. package/lib/ir/ui/SpectraPanel.js +42 -0
  412. package/lib/ir/ui/SpectraPanel.js.map +1 -0
  413. package/lib/ir/ui/SpectrumRow.d.ts +26 -0
  414. package/lib/ir/ui/SpectrumRow.d.ts.map +1 -0
  415. package/lib/ir/ui/SpectrumRow.js +41 -0
  416. package/lib/ir/ui/SpectrumRow.js.map +1 -0
  417. package/lib/ir/ui/index.d.ts +56 -0
  418. package/lib/ir/ui/index.d.ts.map +1 -0
  419. package/lib/ir/ui/index.js +36 -0
  420. package/lib/ir/ui/index.js.map +1 -0
  421. package/lib/ir/ui/irActions.d.ts +52 -0
  422. package/lib/ir/ui/irActions.d.ts.map +1 -0
  423. package/lib/ir/ui/irActions.js +62 -0
  424. package/lib/ir/ui/irActions.js.map +1 -0
  425. package/lib/ir/ui/irChartProps.d.ts +116 -0
  426. package/lib/ir/ui/irChartProps.d.ts.map +1 -0
  427. package/lib/ir/ui/irChartProps.js +14 -0
  428. package/lib/ir/ui/irChartProps.js.map +1 -0
  429. package/lib/ir/ui/irCommandContext.d.ts +35 -0
  430. package/lib/ir/ui/irCommandContext.d.ts.map +1 -0
  431. package/lib/ir/ui/irCommandContext.js +44 -0
  432. package/lib/ir/ui/irCommandContext.js.map +1 -0
  433. package/lib/ir/ui/irStateContext.d.ts +26 -0
  434. package/lib/ir/ui/irStateContext.d.ts.map +1 -0
  435. package/lib/ir/ui/irStateContext.js +37 -0
  436. package/lib/ir/ui/irStateContext.js.map +1 -0
  437. package/lib/ir/ui/useIrEditor.d.ts +51 -0
  438. package/lib/ir/ui/useIrEditor.d.ts.map +1 -0
  439. package/lib/ir/ui/useIrEditor.js +88 -0
  440. package/lib/ir/ui/useIrEditor.js.map +1 -0
  441. package/lib/ir/ui/useIrPointer.d.ts +66 -0
  442. package/lib/ir/ui/useIrPointer.d.ts.map +1 -0
  443. package/lib/ir/ui/useIrPointer.js +53 -0
  444. package/lib/ir/ui/useIrPointer.js.map +1 -0
  445. package/lib/ir/ui/useIrShortcuts.d.ts +24 -0
  446. package/lib/ir/ui/useIrShortcuts.d.ts.map +1 -0
  447. package/lib/ir/ui/useIrShortcuts.js +73 -0
  448. package/lib/ir/ui/useIrShortcuts.js.map +1 -0
  449. package/lib/ir/ui/useIrZoom.d.ts +51 -0
  450. package/lib/ir/ui/useIrZoom.d.ts.map +1 -0
  451. package/lib/ir/ui/useIrZoom.js +46 -0
  452. package/lib/ir/ui/useIrZoom.js.map +1 -0
  453. package/lib/ir.d.ts +13 -0
  454. package/lib/ir.d.ts.map +1 -0
  455. package/lib/ir.js +13 -0
  456. package/lib/ir.js.map +1 -0
  457. package/lib/panel/core/dialogStyles.d.ts +13 -0
  458. package/lib/panel/core/dialogStyles.d.ts.map +1 -0
  459. package/lib/panel/core/dialogStyles.js +11 -0
  460. package/lib/panel/core/dialogStyles.js.map +1 -0
  461. package/lib/panel/core/index.d.ts +19 -0
  462. package/lib/panel/core/index.d.ts.map +1 -0
  463. package/lib/panel/core/index.js +18 -0
  464. package/lib/panel/core/index.js.map +1 -0
  465. package/lib/panel/core/isEditingField.d.ts +17 -0
  466. package/lib/panel/core/isEditingField.d.ts.map +1 -0
  467. package/lib/panel/core/isEditingField.js +25 -0
  468. package/lib/panel/core/isEditingField.js.map +1 -0
  469. package/lib/panel/core/panelStyles.d.ts +242 -0
  470. package/lib/panel/core/panelStyles.d.ts.map +1 -0
  471. package/lib/panel/core/panelStyles.js +228 -0
  472. package/lib/panel/core/panelStyles.js.map +1 -0
  473. package/lib/panel/core/rowSpacers.d.ts +38 -0
  474. package/lib/panel/core/rowSpacers.d.ts.map +1 -0
  475. package/lib/panel/core/rowSpacers.js +31 -0
  476. package/lib/panel/core/rowSpacers.js.map +1 -0
  477. package/lib/panel/core/statusBar.d.ts +44 -0
  478. package/lib/panel/core/statusBar.d.ts.map +1 -0
  479. package/lib/panel/core/statusBar.js +40 -0
  480. package/lib/panel/core/statusBar.js.map +1 -0
  481. package/lib/panel/core/textFilter.d.ts +22 -0
  482. package/lib/panel/core/textFilter.d.ts.map +1 -0
  483. package/lib/panel/core/textFilter.js +32 -0
  484. package/lib/panel/core/textFilter.js.map +1 -0
  485. package/lib/panel/core/yieldToPainting.d.ts +17 -0
  486. package/lib/panel/core/yieldToPainting.d.ts.map +1 -0
  487. package/lib/panel/core/yieldToPainting.js +21 -0
  488. package/lib/panel/core/yieldToPainting.js.map +1 -0
  489. package/lib/panel/ui/AboutDialogFrame.d.ts +36 -0
  490. package/lib/panel/ui/AboutDialogFrame.d.ts.map +1 -0
  491. package/lib/panel/ui/AboutDialogFrame.js +43 -0
  492. package/lib/panel/ui/AboutDialogFrame.js.map +1 -0
  493. package/lib/panel/ui/ClearButton.d.ts +28 -0
  494. package/lib/panel/ui/ClearButton.d.ts.map +1 -0
  495. package/lib/panel/ui/ClearButton.js +23 -0
  496. package/lib/panel/ui/ClearButton.js.map +1 -0
  497. package/lib/panel/ui/DocumentationDialogFrame.d.ts +39 -0
  498. package/lib/panel/ui/DocumentationDialogFrame.d.ts.map +1 -0
  499. package/lib/panel/ui/DocumentationDialogFrame.js +29 -0
  500. package/lib/panel/ui/DocumentationDialogFrame.js.map +1 -0
  501. package/lib/panel/ui/FilterInput.d.ts +31 -0
  502. package/lib/panel/ui/FilterInput.d.ts.map +1 -0
  503. package/lib/panel/ui/FilterInput.js +23 -0
  504. package/lib/panel/ui/FilterInput.js.map +1 -0
  505. package/lib/panel/ui/HelpLabel.d.ts +24 -0
  506. package/lib/panel/ui/HelpLabel.d.ts.map +1 -0
  507. package/lib/panel/ui/HelpLabel.js +23 -0
  508. package/lib/panel/ui/HelpLabel.js.map +1 -0
  509. package/lib/panel/ui/PanelMessage.d.ts +41 -0
  510. package/lib/panel/ui/PanelMessage.d.ts.map +1 -0
  511. package/lib/panel/ui/PanelMessage.js +30 -0
  512. package/lib/panel/ui/PanelMessage.js.map +1 -0
  513. package/lib/panel/ui/PanelRail.d.ts +41 -0
  514. package/lib/panel/ui/PanelRail.d.ts.map +1 -0
  515. package/lib/panel/ui/PanelRail.js +12 -0
  516. package/lib/panel/ui/PanelRail.js.map +1 -0
  517. package/lib/panel/ui/Section.d.ts +25 -0
  518. package/lib/panel/ui/Section.d.ts.map +1 -0
  519. package/lib/panel/ui/Section.js +41 -0
  520. package/lib/panel/ui/Section.js.map +1 -0
  521. package/lib/panel/ui/SidePanelStack.d.ts +62 -0
  522. package/lib/panel/ui/SidePanelStack.d.ts.map +1 -0
  523. package/lib/panel/ui/SidePanelStack.js +40 -0
  524. package/lib/panel/ui/SidePanelStack.js.map +1 -0
  525. package/lib/panel/ui/SpectrumColorSwatch.d.ts +33 -0
  526. package/lib/panel/ui/SpectrumColorSwatch.d.ts.map +1 -0
  527. package/lib/panel/ui/SpectrumColorSwatch.js +76 -0
  528. package/lib/panel/ui/SpectrumColorSwatch.js.map +1 -0
  529. package/lib/panel/ui/index.d.ts +37 -0
  530. package/lib/panel/ui/index.d.ts.map +1 -0
  531. package/lib/panel/ui/index.js +24 -0
  532. package/lib/panel/ui/index.js.map +1 -0
  533. package/lib/panel/ui/useConfirmOnEnter.d.ts +19 -0
  534. package/lib/panel/ui/useConfirmOnEnter.d.ts.map +1 -0
  535. package/lib/panel/ui/useConfirmOnEnter.js +64 -0
  536. package/lib/panel/ui/useConfirmOnEnter.js.map +1 -0
  537. package/lib/panel/ui/useFilterBox.d.ts +23 -0
  538. package/lib/panel/ui/useFilterBox.d.ts.map +1 -0
  539. package/lib/panel/ui/useFilterBox.js +22 -0
  540. package/lib/panel/ui/useFilterBox.js.map +1 -0
  541. package/lib/panel/ui/useVirtualRows.d.ts +46 -0
  542. package/lib/panel/ui/useVirtualRows.d.ts.map +1 -0
  543. package/lib/panel/ui/useVirtualRows.js +56 -0
  544. package/lib/panel/ui/useVirtualRows.js.map +1 -0
  545. package/lib/panel/ui/useVirtualWindowRows.d.ts +40 -0
  546. package/lib/panel/ui/useVirtualWindowRows.d.ts.map +1 -0
  547. package/lib/panel/ui/useVirtualWindowRows.js +65 -0
  548. package/lib/panel/ui/useVirtualWindowRows.js.map +1 -0
  549. package/lib/ui.d.ts +1 -0
  550. package/lib/ui.d.ts.map +1 -1
  551. package/lib/ui.js +1 -0
  552. package/lib/ui.js.map +1 -1
  553. package/package.json +8 -1
  554. package/src/chart/core/axisLabels.ts +117 -0
  555. package/src/chart/core/boxLayout.ts +126 -0
  556. package/src/chart/core/chartAxisScale.ts +92 -10
  557. package/src/chart/core/chartDomain.ts +185 -0
  558. package/src/chart/core/chartGeometry.ts +159 -0
  559. package/src/chart/core/chartPane.ts +10 -0
  560. package/src/chart/core/chartScale.ts +7 -4
  561. package/src/chart/core/chartTheme.ts +161 -0
  562. package/src/chart/core/chartViewport.ts +40 -13
  563. package/src/chart/core/guidePlacement.ts +66 -0
  564. package/src/chart/core/index.ts +121 -2
  565. package/src/chart/core/labelStack.ts +72 -0
  566. package/src/chart/core/legendBox.ts +263 -0
  567. package/src/chart/core/selectionGeometry.ts +68 -0
  568. package/src/chart/core/spectrumColor.ts +129 -0
  569. package/src/chart/core/stackCapacity.ts +162 -0
  570. package/src/chart/core/svgPoint.ts +77 -0
  571. package/src/chart/core/tracePath.ts +228 -0
  572. package/src/chart/core/trackerReadout.ts +78 -0
  573. package/src/chart/core/viewTransform.ts +287 -0
  574. package/src/chart/core/zoomDomain.ts +235 -0
  575. package/src/chart/ui/Axes.tsx +361 -0
  576. package/src/chart/ui/AxisGuide.tsx +187 -0
  577. package/src/chart/ui/ChartStack.tsx +130 -0
  578. package/src/chart/ui/ChartTracker.tsx +101 -0
  579. package/src/chart/ui/PlotCaption.tsx +108 -0
  580. package/src/chart/ui/SelectionRect.tsx +52 -0
  581. package/src/chart/ui/TraceLegend.tsx +193 -0
  582. package/src/chart/ui/chartGestures.ts +270 -0
  583. package/src/chart/ui/chartStackLevel.tsx +210 -0
  584. package/src/chart/ui/chartSurface.ts +66 -0
  585. package/src/chart/ui/index.ts +35 -0
  586. package/src/chart/ui/useChartPointer.ts +223 -0
  587. package/src/chart/ui/useChartSize.ts +115 -0
  588. package/src/chart/ui/useChartWindow.ts +240 -0
  589. package/src/chart/ui/useChartZoom.ts +255 -0
  590. package/src/chart/ui/useWheelListener.ts +62 -0
  591. package/src/clipboard/core/copyPng.ts +20 -0
  592. package/src/clipboard/core/index.ts +1 -0
  593. package/src/core.ts +1 -0
  594. package/src/download/core/exportStyles.ts +20 -0
  595. package/src/download/core/imageResolution.ts +118 -0
  596. package/src/download/core/index.ts +34 -0
  597. package/src/download/core/pictureExport.ts +207 -0
  598. package/src/download/core/stackedDrawing.ts +108 -0
  599. package/src/download/core/svgBounds.ts +80 -0
  600. package/src/download/core/svgNamespace.ts +9 -0
  601. package/src/download/core/svgToPng.ts +121 -0
  602. package/src/download/core/svgToString.ts +95 -0
  603. package/src/download/ui/ExportDialogFrame.tsx +86 -0
  604. package/src/download/ui/ExportImageDialog.tsx +91 -0
  605. package/src/download/ui/ExportNameField.tsx +148 -0
  606. package/src/download/ui/ExportPictureSection.tsx +142 -0
  607. package/src/download/ui/index.ts +11 -0
  608. package/src/download/ui/useDrawingBox.ts +37 -0
  609. package/src/error/core/describeSource.ts +18 -0
  610. package/src/error/core/index.ts +1 -0
  611. package/src/help/ui/HelpBody.tsx +41 -2
  612. package/src/help/ui/index.ts +6 -1
  613. package/src/ir/core/analysisSpectra.ts +231 -0
  614. package/src/ir/core/assignBands.ts +144 -0
  615. package/src/ir/core/bandAssignments.ts +329 -0
  616. package/src/ir/core/bandLabelPlan.ts +194 -0
  617. package/src/ir/core/detectIrFormat.ts +139 -0
  618. package/src/ir/core/downloadSpectra.ts +57 -0
  619. package/src/ir/core/fromJcamp.ts +70 -0
  620. package/src/ir/core/fromSpc.ts +61 -0
  621. package/src/ir/core/index.ts +113 -0
  622. package/src/ir/core/irBand.ts +57 -0
  623. package/src/ir/core/irCommands.ts +154 -0
  624. package/src/ir/core/irDomain.ts +163 -0
  625. package/src/ir/core/irEditorApi.ts +44 -0
  626. package/src/ir/core/irFormat.ts +57 -0
  627. package/src/ir/core/irMode.ts +203 -0
  628. package/src/ir/core/irReducer.ts +273 -0
  629. package/src/ir/core/irSidePanels.ts +20 -0
  630. package/src/ir/core/irSpectrum.ts +155 -0
  631. package/src/ir/core/irState.ts +173 -0
  632. package/src/ir/core/loadIrSpectra.ts +79 -0
  633. package/src/ir/core/nearestBand.ts +57 -0
  634. package/src/ir/core/pickBands.ts +181 -0
  635. package/src/ir/core/spectrumJcamp.ts +178 -0
  636. package/src/ir/core/toIrSpectrum.ts +102 -0
  637. package/src/ir/ui/BandMarks.tsx +166 -0
  638. package/src/ir/ui/BandsPanel.tsx +271 -0
  639. package/src/ir/ui/IrAboutDialog.tsx +121 -0
  640. package/src/ir/ui/IrCanvas.tsx +91 -0
  641. package/src/ir/ui/IrChart.tsx +215 -0
  642. package/src/ir/ui/IrCommandProvider.tsx +32 -0
  643. package/src/ir/ui/IrCommandTooltip.tsx +36 -0
  644. package/src/ir/ui/IrDocumentationDialog.tsx +174 -0
  645. package/src/ir/ui/IrEditor.tsx +99 -0
  646. package/src/ir/ui/IrHeader.tsx +39 -0
  647. package/src/ir/ui/IrLogo.tsx +49 -0
  648. package/src/ir/ui/IrPointerTracker.tsx +102 -0
  649. package/src/ir/ui/IrShell.tsx +285 -0
  650. package/src/ir/ui/IrSidePanel.tsx +78 -0
  651. package/src/ir/ui/IrStateProvider.tsx +32 -0
  652. package/src/ir/ui/IrStatusBar.tsx +97 -0
  653. package/src/ir/ui/IrToolbar.tsx +102 -0
  654. package/src/ir/ui/IrTraces.tsx +134 -0
  655. package/src/ir/ui/MetadataPanel.tsx +88 -0
  656. package/src/ir/ui/SpectraPanel.tsx +114 -0
  657. package/src/ir/ui/SpectrumRow.tsx +127 -0
  658. package/src/ir/ui/index.ts +56 -0
  659. package/src/ir/ui/irActions.ts +103 -0
  660. package/src/ir/ui/irChartProps.ts +118 -0
  661. package/src/ir/ui/irCommandContext.tsx +62 -0
  662. package/src/ir/ui/irStateContext.ts +48 -0
  663. package/src/ir/ui/useIrEditor.ts +139 -0
  664. package/src/ir/ui/useIrPointer.ts +109 -0
  665. package/src/ir/ui/useIrShortcuts.ts +95 -0
  666. package/src/ir/ui/useIrZoom.ts +86 -0
  667. package/src/ir.ts +13 -0
  668. package/src/panel/core/dialogStyles.ts +11 -0
  669. package/src/panel/core/index.ts +47 -0
  670. package/src/panel/core/isEditingField.ts +23 -0
  671. package/src/panel/core/panelStyles.ts +248 -0
  672. package/src/panel/core/rowSpacers.ts +50 -0
  673. package/src/panel/core/statusBar.ts +48 -0
  674. package/src/panel/core/textFilter.ts +33 -0
  675. package/src/panel/core/yieldToPainting.ts +20 -0
  676. package/src/panel/ui/AboutDialogFrame.tsx +100 -0
  677. package/src/panel/ui/ClearButton.tsx +42 -0
  678. package/src/panel/ui/DocumentationDialogFrame.tsx +86 -0
  679. package/src/panel/ui/FilterInput.tsx +60 -0
  680. package/src/panel/ui/HelpLabel.tsx +43 -0
  681. package/src/panel/ui/PanelMessage.tsx +64 -0
  682. package/src/panel/ui/PanelRail.tsx +64 -0
  683. package/src/panel/ui/Section.tsx +66 -0
  684. package/src/panel/ui/SidePanelStack.tsx +109 -0
  685. package/src/panel/ui/SpectrumColorSwatch.tsx +119 -0
  686. package/src/panel/ui/index.ts +47 -0
  687. package/src/panel/ui/useConfirmOnEnter.ts +68 -0
  688. package/src/panel/ui/useFilterBox.ts +35 -0
  689. package/src/panel/ui/useVirtualRows.ts +82 -0
  690. package/src/panel/ui/useVirtualWindowRows.ts +86 -0
  691. package/src/ui.ts +1 -0
@@ -0,0 +1,155 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { axisLabeller } from "../core/axisLabels.js";
4
+ import { chartAxisScale } from "../core/chartAxisScale.js";
5
+ import { chartPixel } from "../core/chartScale.js";
6
+ import { CHART_COLORS, CHART_FONT } from "../core/chartTheme.js";
7
+ /**
8
+ * The frame the spectra are read against: two axis lines, a grid, and titles.
9
+ *
10
+ * The ticks are rules across the whole plot rather than dashes at its edge. A
11
+ * feature is read for its height against the ones around it — is this the base
12
+ * peak, is that band half of it — and a dash on the far left is a measuring
13
+ * stick nobody can lay across the peak they are looking at. The rules
14
+ * are drawn in the palest colour the theme carries and under the data band, so
15
+ * a grid line is never mistaken for a trace.
16
+ *
17
+ * Every number is written outside the plot, and every line inside it. That is
18
+ * what lets the data band be clipped without a label being cut in half, and it
19
+ * keeps the plot itself free for the only thing it is about.
20
+ *
21
+ * The axis pair is one L rather than a box: the top and the right of a spectrum
22
+ * are open, because a peak that runs out of the top is a peak the zoom has cut
23
+ * off, and a rule along the top would read as a ceiling the measurement stopped
24
+ * at.
25
+ *
26
+ * How many ticks there are follows the room there is for them — a chart in a
27
+ * narrow panel is given fewer, rather than the same six labels overprinting one
28
+ * another — and the precision each is written to comes from the step, so a
29
+ * window two millimass units wide is labelled to four decimals and a full scan
30
+ * to none. The notation is settled once per axis rather than per label, so an
31
+ * intensity axis running to two hundred million reads `5e+7 1e+8 1.5e+8 2e+8`
32
+ * and not a column of nine digits the title has to be read around.
33
+ * @param props - Component props.
34
+ * @returns The axes, as SVG.
35
+ */
36
+ export function Axes(props) {
37
+ const { plot, xDomain, yDomain, xScale, yScale, absYTicks = false, showXTicks = true, showXTitle = true, xTitle, yTitle, xTickSpacing = X_TICK_SPACING, yTickSpacing = Y_TICK_SPACING, } = props;
38
+ const xTicks = useMemo(() => spectrumAxis(xDomain, tickCount(plot.width, xTickSpacing)), [xDomain, plot.width, xTickSpacing]);
39
+ const yTicks = useMemo(() => spectrumAxis(yDomain, tickCount(plot.height, yTickSpacing)), [yDomain, plot.height, yTickSpacing]);
40
+ const writeXTick = useMemo(() => axisLabeller(xTicks), [xTicks]);
41
+ const writeYTick = useMemo(() => axisLabeller(yTicks), [yTicks]);
42
+ const middleX = plot.left + plot.width / 2;
43
+ const middleY = plot.top + plot.height / 2;
44
+ // Beside the numbers rather than in a fixed column at the edge of the margin.
45
+ // One gutter holds `100` on a spectrum and `1.5e+8` on a chromatogram, and a
46
+ // title pinned where the wider of the two would leave it stands twenty pixels
47
+ // clear of the narrower — far enough to read as naming the chart rather than
48
+ // the axis.
49
+ const titleColumn = useMemo(() => valueTitleColumn(yTicks.values, writeYTick, absYTicks, plot.left), [yTicks, writeYTick, absYTicks, plot.left]);
50
+ // The rule a mirrored pair is reflected in only exists while both halves are
51
+ // on screen; on an ordinary chart zero is the baseline and already drawn.
52
+ const zero = chartPixel(yScale, 0);
53
+ const showsZeroRule = yDomain[0] < 0 && yDomain[1] > 0;
54
+ return (_jsxs("g", { pointerEvents: "none", children: [xTicks.values.map((tick) => (_jsx("line", { x1: chartPixel(xScale, tick), y1: plot.top, x2: chartPixel(xScale, tick), y2: plot.bottom, style: gridStyle }, tick))), yTicks.values.map((tick) => (_jsx("line", { x1: plot.left, y1: chartPixel(yScale, tick), x2: plot.right, y2: chartPixel(yScale, tick), style: gridStyle }, tick))), showsZeroRule ? (_jsx("line", { x1: plot.left, y1: zero, x2: plot.right, y2: zero, style: zeroRuleStyle })) : null, _jsx("path", { d: `M${plot.left} ${plot.top}V${plot.bottom}H${plot.right}`, fill: "none", style: axisStyle }), showXTicks &&
55
+ xTicks.values.map((tick) => (_jsx("text", { x: chartPixel(xScale, tick), y: plot.bottom + TICK_LABEL_GAP, textAnchor: "middle", dominantBaseline: "hanging", style: tickStyle, children: writeXTick(tick) }, tick))), yTicks.values.map((tick) => (_jsx("text", { x: plot.left - TICK_LABEL_GAP, y: chartPixel(yScale, tick), textAnchor: "end", dominantBaseline: "central", style: tickStyle, children: writeYTick(absYTicks ? Math.abs(tick) : tick) }, tick))), showXTitle && (_jsx("text", { x: middleX, y: plot.bottom + TITLE_GAP, textAnchor: "middle", dominantBaseline: "hanging", style: titleStyle, children: xTitle })), _jsx("text", { x: titleColumn, y: middleY, transform: `rotate(-90 ${titleColumn} ${middleY})`, textAnchor: "middle", dominantBaseline: "central", style: titleStyle, children: yTitle })] }));
56
+ }
57
+ /**
58
+ * The ticks of one axis of a chart a reader has zoomed for themselves.
59
+ *
60
+ * The window is exactly what the reader dragged out, so it is never widened to
61
+ * end on a round tick — an axis that jumped outward as the drag was released
62
+ * would show data the reader had just excluded. And the count is a budget
63
+ * worked out from the room the panel has, so the step is rounded up rather than
64
+ * to the nearest: one tick more than the room allows is two labels touching.
65
+ * @param domain - The window on screen, `[from, to]`.
66
+ * @param count - The most intervals the axis has room for.
67
+ * @returns The axis, divided.
68
+ */
69
+ function spectrumAxis(domain, count) {
70
+ return chartAxisScale(domain[0], domain[1], {
71
+ count,
72
+ nice: false,
73
+ step: 'atMost',
74
+ });
75
+ }
76
+ /**
77
+ * How many intervals an axis of a given length has room to name.
78
+ *
79
+ * A label at a deep zoom is eight characters wide, so the spacings are the width
80
+ * of a label and not a fraction of the axis: a chart in a side panel then
81
+ * carries three labels rather than the same six run together.
82
+ * @param length - How long the axis is, in pixels.
83
+ * @param spacing - The room one label wants along it.
84
+ * @returns The number of intervals to aim for, never below two.
85
+ */
86
+ function tickCount(length, spacing) {
87
+ return Math.max(2, Math.round(length / spacing));
88
+ }
89
+ /**
90
+ * Where the rotated value title stands, given the numbers it has to clear.
91
+ *
92
+ * The widest label is measured in characters rather than in pixels, because the
93
+ * chart has no font to measure against — `CHART_FONT` sets sizes and leaves the
94
+ * family to the host — and a rendered measurement would mean laying the text out
95
+ * and reading it back on every zoom.
96
+ * @param ticks - The ticks up the side, as `chartAxisScale` chose them.
97
+ * @param write - How this axis writes one of them.
98
+ * @param absolute - Whether the labels are written by magnitude, which is one
99
+ * character narrower on the half of a mirrored chart that runs negative.
100
+ * @param left - Where the plot begins, which is the far side of the gutter.
101
+ * @returns The column to centre the title on, never left of `TITLE_COLUMN`.
102
+ */
103
+ function valueTitleColumn(ticks, write, absolute, left) {
104
+ let widest = 0;
105
+ for (const tick of ticks) {
106
+ const width = write(absolute ? Math.abs(tick) : tick).length;
107
+ if (width > widest)
108
+ widest = width;
109
+ }
110
+ const beside = left - TICK_LABEL_GAP - widest * TICK_CHARACTER - TITLE_ASIDE - HALF_TITLE;
111
+ return Math.max(TITLE_COLUMN, beside);
112
+ }
113
+ /** Half the height of the title, which is what its rotated glyphs claim. */
114
+ const HALF_TITLE = CHART_FONT.title / 2;
115
+ /** The room a label wants along the bottom, at its widest. */
116
+ const X_TICK_SPACING = 90;
117
+ /** The room a label wants up the side. */
118
+ const Y_TICK_SPACING = 44;
119
+ /** The clear space between the plot and the numbers written outside it. */
120
+ const TICK_LABEL_GAP = 5;
121
+ /** How far under the plot the horizontal title hangs, clear of the numbers. */
122
+ const TITLE_GAP = 18;
123
+ /**
124
+ * The column the rotated value title stands in when the numbers leave it no
125
+ * room, inside the left margin.
126
+ *
127
+ * A floor rather than the place it is written: `valueTitleColumn` puts the
128
+ * title beside the widest number instead, and this is where an axis whose
129
+ * labels fill the whole gutter pushes it back to.
130
+ */
131
+ const TITLE_COLUMN = 8;
132
+ /** The clear space between the widest number up the side and the title. */
133
+ const TITLE_ASIDE = 4;
134
+ /**
135
+ * How wide one character of a tick label is, at the size the ticks are written.
136
+ *
137
+ * Six tenths of the type size, which is a shade wider than a digit is in any of
138
+ * the sans faces a host is likely to be set in — the chart sets no family of its
139
+ * own, so this is an estimate and is deliberately the generous one. Too wide
140
+ * writes the value title a pixel or two further from the numbers than it had to
141
+ * be; too narrow writes it over them.
142
+ */
143
+ const TICK_CHARACTER = 0.6 * CHART_FONT.tick;
144
+ const gridStyle = { stroke: CHART_COLORS.grid };
145
+ const zeroRuleStyle = { stroke: CHART_COLORS.zeroRule };
146
+ const axisStyle = { stroke: CHART_COLORS.axis };
147
+ const tickStyle = {
148
+ fill: CHART_COLORS.tick,
149
+ fontSize: CHART_FONT.tick,
150
+ };
151
+ const titleStyle = {
152
+ fill: CHART_COLORS.title,
153
+ fontSize: CHART_FONT.title,
154
+ };
155
+ //# sourceMappingURL=Axes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Axes.js","sourceRoot":"","sources":["../../../src/chart/ui/Axes.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { ReactElement } from 'react';
2
+ import type { PlotRect } from '../core/chartGeometry.ts';
3
+ import type { ChartScale } from '../core/chartScale.ts';
4
+ /** What the rule is drawn at, and what it says about itself. */
5
+ export interface AxisGuideProps {
6
+ /**
7
+ * The place on the horizontal axis being pointed at, in whatever that axis
8
+ * measures, and `null` when nothing is being looked at.
9
+ */
10
+ value: number | null;
11
+ /** Where the plot sits inside the SVG. */
12
+ plot: PlotRect;
13
+ /** The horizontal axis as it is currently zoomed. */
14
+ xScale: ChartScale;
15
+ /**
16
+ * What the guide is drawn in.
17
+ * @default the theme's highlight colour
18
+ */
19
+ color?: string;
20
+ /**
21
+ * A few words written beside the rule, for a chart carrying more than one of
22
+ * them — `MS2 456.7`, `scan 314`. Nothing is written when it is absent, which
23
+ * is right for a chart whose single guide answers a hover the reader is
24
+ * already making.
25
+ * @default nothing is written
26
+ */
27
+ label?: string;
28
+ }
29
+ /**
30
+ * The vertical rule marking the place on the horizontal axis being looked at.
31
+ *
32
+ * A peak hovered in a table, a fragment hovered on a structure beside the chart,
33
+ * a search result rested on, the retention time whose scan is drawn in the pane
34
+ * below: each of them asks the chart the same question, and this is its whole
35
+ * answer. It sits below the viewers rather than inside one of them because a
36
+ * mass viewer's precursor rule and a chromatogram's time cursor are not two
37
+ * pictures that resemble each other — they are one picture, drawn from a value
38
+ * and a scale, and neither half of it can tell what it is measuring.
39
+ *
40
+ * When the value is inside the window the rule stands on it, solid. When it is
41
+ * not, the rule is parked on the edge the value went out of, dashed, and
42
+ * carries an arrow pointing that way. That is the case the component exists
43
+ * for: a chart zoomed onto one isotopologue cluster has almost everything a
44
+ * panel can point at outside its window, and answering with nothing drawn
45
+ * leaves a fragment the spectrum does not carry looking exactly like one that
46
+ * is two hundred mass units to the left. Dashed says *not here*, and the arrow
47
+ * says where to go.
48
+ *
49
+ * The arrow is a triangle rather than a `◀` glyph, because whether that
50
+ * character has one is the host's font's business and a missing one draws a
51
+ * hollow box in the middle of the chart. It sits just under the top edge, the
52
+ * strip of the plot a trace is least often in.
53
+ *
54
+ * Nothing here takes a pointer event: the guide is an answer, never a target.
55
+ * @param props - Component props.
56
+ * @returns The guide, or nothing when there is no value to point at and when
57
+ * the scale maps it nowhere.
58
+ */
59
+ export declare function AxisGuide(props: AxisGuideProps): ReactElement | null;
60
+ //# sourceMappingURL=AxisGuide.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AxisGuide.d.ts","sourceRoot":"","sources":["../../../src/chart/ui/AxisGuide.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAKxD,gEAAgE;AAChE,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,0CAA0C;IAC1C,IAAI,EAAE,QAAQ,CAAC;IACf,qDAAqD;IACrD,MAAM,EAAE,UAAU,CAAC;IACnB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,GAAG,IAAI,CA0CpE"}
@@ -0,0 +1,111 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { CHART_COLORS, CHART_FONT, LABEL_HALO } from "../core/chartTheme.js";
4
+ import { guidePlacement } from "../core/guidePlacement.js";
5
+ /**
6
+ * The vertical rule marking the place on the horizontal axis being looked at.
7
+ *
8
+ * A peak hovered in a table, a fragment hovered on a structure beside the chart,
9
+ * a search result rested on, the retention time whose scan is drawn in the pane
10
+ * below: each of them asks the chart the same question, and this is its whole
11
+ * answer. It sits below the viewers rather than inside one of them because a
12
+ * mass viewer's precursor rule and a chromatogram's time cursor are not two
13
+ * pictures that resemble each other — they are one picture, drawn from a value
14
+ * and a scale, and neither half of it can tell what it is measuring.
15
+ *
16
+ * When the value is inside the window the rule stands on it, solid. When it is
17
+ * not, the rule is parked on the edge the value went out of, dashed, and
18
+ * carries an arrow pointing that way. That is the case the component exists
19
+ * for: a chart zoomed onto one isotopologue cluster has almost everything a
20
+ * panel can point at outside its window, and answering with nothing drawn
21
+ * leaves a fragment the spectrum does not carry looking exactly like one that
22
+ * is two hundred mass units to the left. Dashed says *not here*, and the arrow
23
+ * says where to go.
24
+ *
25
+ * The arrow is a triangle rather than a `◀` glyph, because whether that
26
+ * character has one is the host's font's business and a missing one draws a
27
+ * hollow box in the middle of the chart. It sits just under the top edge, the
28
+ * strip of the plot a trace is least often in.
29
+ *
30
+ * Nothing here takes a pointer event: the guide is an answer, never a target.
31
+ * @param props - Component props.
32
+ * @returns The guide, or nothing when there is no value to point at and when
33
+ * the scale maps it nowhere.
34
+ */
35
+ export function AxisGuide(props) {
36
+ const { value, plot, xScale, color = CHART_COLORS.highlight, label } = props;
37
+ const placement = value === null ? null : guidePlacement(value, plot, xScale);
38
+ const lineStyle = useMemo(() => ({ stroke: color }), [color]);
39
+ const arrowStyle = useMemo(() => ({ fill: color }), [color]);
40
+ const labelStyle = useMemo(() => ({ fill: color, fontSize: CHART_FONT.label, ...LABEL_HALO }), [color]);
41
+ if (placement === null)
42
+ return null;
43
+ const { x, direction } = placement;
44
+ const labelPlace = labelPlacement(placement, plot);
45
+ return (_jsxs("g", { pointerEvents: "none", children: [_jsx("line", { x1: x, y1: plot.top, x2: x, y2: plot.bottom, strokeWidth: GUIDE_WIDTH, strokeDasharray: direction === null ? undefined : PARKED_DASH, style: lineStyle }), direction === null ? null : (_jsx("path", { d: arrowPath({ x, direction }, plot), style: arrowStyle })), label === undefined ? null : (_jsx("text", { x: labelPlace.x, y: plot.top + ARROW_TOP_INSET, textAnchor: labelPlace.anchor, dominantBaseline: "central", style: labelStyle, children: label }))] }));
46
+ }
47
+ /** How thick the rule is: thin enough to read a peak beside, not through. */
48
+ const GUIDE_WIDTH = 1.5;
49
+ /** What a parked guide is dashed with. */
50
+ const PARKED_DASH = '4 3';
51
+ /** How far the arrow reaches back into the plot from its point. */
52
+ const ARROW_LENGTH = 7;
53
+ /** Half the width of its base. */
54
+ const ARROW_HALF_HEIGHT = 5;
55
+ /** How far below the top of the plot it sits. */
56
+ const ARROW_TOP_INSET = 8;
57
+ /** The clear space between the rule, or its arrow, and the label beside it. */
58
+ const LABEL_GAP = 4;
59
+ /**
60
+ * How much room a label is assumed to want.
61
+ *
62
+ * Measuring the text would mean rendering it first, which is a whole layout
63
+ * pass for a decision that only has to be right at the edges. Sixty pixels is
64
+ * about eight characters at the label size — `MS2 456.7` — and a label longer
65
+ * than that is one written for a panel rather than for a plot.
66
+ */
67
+ const LABEL_ROOM = 60;
68
+ /**
69
+ * The triangle a parked guide carries, pointing off the edge it is parked on.
70
+ *
71
+ * Only a parked guide has one, and the parameter says so rather than a guard
72
+ * inside: a guide standing on its own value has no edge to point at, and the
73
+ * caller has already told the two apart to decide whether to draw a path at all.
74
+ * @param placement - Where the guide is parked, and which edge its value lies past.
75
+ * @param plot - The plotting area, whose top the arrow hangs under.
76
+ * @returns The `d` of the triangle.
77
+ */
78
+ function arrowPath(placement, plot) {
79
+ const { x, direction } = placement;
80
+ const back = direction === 'left' ? x + ARROW_LENGTH : x - ARROW_LENGTH;
81
+ const y = plot.top + ARROW_TOP_INSET;
82
+ return `M${x} ${y}L${back} ${y - ARROW_HALF_HEIGHT}L${back} ${y + ARROW_HALF_HEIGHT}Z`;
83
+ }
84
+ /**
85
+ * Which side of the rule the label is written on.
86
+ *
87
+ * It runs to the right and flips to the left as soon as it would otherwise
88
+ * cross the right edge — flipping rather than sliding, for the reason the
89
+ * pointer readout flips: a label pinned to the edge drifts away from the rule
90
+ * it belongs to and the pair stops reading as one thing. A guide parked on an
91
+ * edge has only one side that is inside the plot at all, so there the flip is
92
+ * forced, and the gap clears the arrow rather than the rule.
93
+ * @param placement - Where the guide ended up, and which way its value lies.
94
+ * @param plot - The plotting area the label has to stay inside.
95
+ * @returns The anchor, and which way the text runs from it.
96
+ */
97
+ function labelPlacement(placement, plot) {
98
+ const { x, direction } = placement;
99
+ if (direction === 'left') {
100
+ return { x: x + ARROW_LENGTH + LABEL_GAP, anchor: 'start' };
101
+ }
102
+ if (direction === 'right') {
103
+ return { x: x - ARROW_LENGTH - LABEL_GAP, anchor: 'end' };
104
+ }
105
+ const runsRight = x + LABEL_GAP + LABEL_ROOM <= plot.right;
106
+ return {
107
+ x: runsRight ? x + LABEL_GAP : x - LABEL_GAP,
108
+ anchor: runsRight ? 'start' : 'end',
109
+ };
110
+ }
111
+ //# sourceMappingURL=AxisGuide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AxisGuide.js","sourceRoot":"","sources":["../../../src/chart/ui/AxisGuide.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Charts stacked one above another, each resized by the splitter under it.
3
+ *
4
+ * One measurement is often read on more than one chart at once — the separation
5
+ * a sample was run through, the spectrum taken where the cursor stands, and what
6
+ * that spectrum broke into — and those are windows over different axes rather
7
+ * than traces on one. Stacking them is layout and nothing else, which is the
8
+ * whole of what this component knows: N panes, one above another, sharing the
9
+ * gutter their value axes are drawn in, the one at the foot writing the
10
+ * horizontal axis under all of them. Which pane holds what, and what makes one
11
+ * appear at all, is a fact about the measurement and stays in the viewer.
12
+ *
13
+ * How N panes become N nested splits is in `chartStackLevel.tsx`; what is held
14
+ * here is the one thing that outlives a render, which is how tall each of them
15
+ * was last left.
16
+ *
17
+ * Two things `SplitPane` does not do, and both of them draw a plausible wrong
18
+ * picture rather than failing outright:
19
+ *
20
+ * - **It has no minimum.** `useSplitPaneSize` clamps a drag to
21
+ * `{ min: 0, max: parentDimension }`, so a splitter dragged to the top of the
22
+ * stack leaves the pane above it at nothing at all; `plotRect` then holds the
23
+ * plot at `MINIMUM_PLOT_SIDE` and what is left is a ten-pixel stub with a full
24
+ * set of axes over it. Every height is held above the pane's own minimum —
25
+ * the default it starts at as much as the one a drag arrives at — because
26
+ * nothing underneath will do it.
27
+ * - **Its controlled side gets no `min-height: 0`.** `getItemStyle` resets that
28
+ * on the *other* side only, and a chart is an `<svg>` carrying a real `height`
29
+ * attribute, so the controlled pane's min-content height is whatever the
30
+ * chart was last measured at: the pane grows and then refuses to shrink back.
31
+ * Every pane is wrapped in a box that carries the reset itself.
32
+ *
33
+ * A pane keeps its children mounted whether it is open or shut — `unmountChildren`
34
+ * stays false — so a closed pane measures 0 × 0 behind a `display: none`, its
35
+ * `ResizeObserver` fires again the moment it is revealed, and it comes back
36
+ * through the window it was being looked at through. A remounted chart is empty.
37
+ */
38
+ import type { ReactElement } from 'react';
39
+ import type { ChartStackPane } from './chartStackLevel.tsx';
40
+ export type { ChartStackPane } from './chartStackLevel.tsx';
41
+ /** What the stack is drawn from. */
42
+ export interface ChartStackProps {
43
+ /**
44
+ * The panes, in the order they are stacked, top to bottom.
45
+ *
46
+ * A pane with nothing to draw is left out of this array rather than handed in
47
+ * empty — that is what makes its splitter go away with it. Appending a pane,
48
+ * and dropping the one at the foot, cost nothing: every pane is a split
49
+ * whether or not anything follows it, so no chart already stacked is stood up
50
+ * again. Taking one out of the *middle* still is expensive — every split
51
+ * below it takes on the identity of the one that was under it, and the charts
52
+ * in them are all remounted, coming back fitted to what they draw rather than
53
+ * through the window they were left at. So a pane is still better dropped
54
+ * from the foot of the stack than out of its middle.
55
+ */
56
+ panes: readonly ChartStackPane[];
57
+ /**
58
+ * Told when a splitter is let go, with the height the pane came to rest at.
59
+ *
60
+ * On release rather than on every pixel of the drag, because a viewer that
61
+ * hears this puts it in its own state, and a store per pointer move renders
62
+ * every pane of the stack again on each one. The height reported is the one
63
+ * that was kept, minimum already applied.
64
+ * @default the height is remembered inside the stack and nowhere else
65
+ * @param id - Which pane was resized.
66
+ * @param height - How tall it now stands, in pixels.
67
+ */
68
+ onHeightChange?: (id: string, height: number) => void;
69
+ }
70
+ /**
71
+ * Stack charts vertically, with a splitter between each pair.
72
+ *
73
+ * Everything a level of the nesting is handed is memoised, and for the reason
74
+ * the release is told apart from the drag: `resize` fires on every pointer move,
75
+ * and a `StackLevel` rebuilt there would recurse through every `SplitPane` of
76
+ * the stack on each one, taking every chart in it with them.
77
+ * @param props - Component props.
78
+ * @returns The stack, filling the box it is given.
79
+ */
80
+ export declare function ChartStack(props: ChartStackProps): ReactElement;
81
+ //# sourceMappingURL=ChartStack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartStack.d.ts","sourceRoot":"","sources":["../../../src/chart/ui/ChartStack.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAI1C,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,uBAAuB,CAAC;AAGxE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B;;;;;;;;;;;;OAYG;IACH,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IACjC;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,CA+B/D"}
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback, useMemo, useState } from 'react';
3
+ import { keptHeight, paneHeight, stackFrom } from "./chartStackLevel.js";
4
+ /**
5
+ * Stack charts vertically, with a splitter between each pair.
6
+ *
7
+ * Everything a level of the nesting is handed is memoised, and for the reason
8
+ * the release is told apart from the drag: `resize` fires on every pointer move,
9
+ * and a `StackLevel` rebuilt there would recurse through every `SplitPane` of
10
+ * the stack on each one, taking every chart in it with them.
11
+ * @param props - Component props.
12
+ * @returns The stack, filling the box it is given.
13
+ */
14
+ export function ChartStack(props) {
15
+ const { panes, onHeightChange } = props;
16
+ const [heights, setHeights] = useState({});
17
+ const heightOf = useCallback((pane) => paneHeight(pane, heights[pane.id]), [heights]);
18
+ const resize = useCallback((pane, asked) => {
19
+ const height = keptHeight(asked, pane);
20
+ if (height === null)
21
+ return;
22
+ setHeights((current) => current[pane.id] === height ? current : { ...current, [pane.id]: height });
23
+ }, []);
24
+ const rest = useCallback((pane, asked) => {
25
+ const height = keptHeight(asked, pane);
26
+ if (height !== null)
27
+ onHeightChange?.(pane.id, height);
28
+ }, [onHeightChange]);
29
+ const level = useMemo(() => ({ panes, heightOf, resize, rest }), [panes, heightOf, resize, rest]);
30
+ return _jsx("div", { style: stackStyle, children: stackFrom(level, 0) });
31
+ }
32
+ /** The box the whole stack fills, whatever it was given by way of a parent. */
33
+ const stackStyle = {
34
+ display: 'flex',
35
+ flexDirection: 'column',
36
+ width: '100%',
37
+ height: '100%',
38
+ minWidth: 0,
39
+ minHeight: 0,
40
+ overflow: 'hidden',
41
+ };
42
+ //# sourceMappingURL=ChartStack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartStack.js","sourceRoot":"","sources":["../../../src/chart/ui/ChartStack.tsx"],"names":[],"mappings":";AAuCA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAIvD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAuB,CAAC;AAkC1E;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IACxC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAmC,EAAE,CAAC,CAAC;IAE7E,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,IAAoB,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAC5D,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,IAAoB,EAAE,KAAoB,EAAE,EAAE;QACxE,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO;QAC5B,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CACrB,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAC1E,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,IAAI,GAAG,WAAW,CACtB,CAAC,IAAoB,EAAE,KAAoB,EAAE,EAAE;QAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,MAAM,KAAK,IAAI;YAAE,cAAc,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC,EACD,CAAC,cAAc,CAAC,CACjB,CAAC;IAEF,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EACzC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAChC,CAAC;IAEF,OAAO,cAAK,KAAK,EAAE,UAAU,YAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,GAAO,CAAC;AAC7D,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,GAAG;IACjB,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,QAAQ;IACvB,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,MAAM;IACd,QAAQ,EAAE,CAAC;IACX,SAAS,EAAE,CAAC;IACZ,QAAQ,EAAE,QAAQ;CACV,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * The crosshair a chart follows the pointer with, and the lines it reads out.
3
+ *
4
+ * Every viewer draws the same two dashed rules and writes the same stack of
5
+ * short lines beside them; what differs is the words, which are the one thing
6
+ * only the viewer knows — an m/z and a height here, a retention time and a
7
+ * summed current there. So the geometry, the dashes and the placement live
8
+ * here, and the caller hands over the lines already written.
9
+ *
10
+ * The first line is the one being pointed at and is written plainly; the rest
11
+ * are quieter, because they answer the question the first one raises rather
12
+ * than being asked for in their own right.
13
+ */
14
+ import type { ReactElement } from 'react';
15
+ import type { PlotRect } from '../core/chartGeometry.ts';
16
+ import type { ChartPoint } from '../core/svgPoint.ts';
17
+ /** What the tracker is given. */
18
+ export interface ChartTrackerProps {
19
+ /** Where the pointer is, `null` whenever it is off the plot. */
20
+ position: ChartPoint | null;
21
+ /** Where the plot sits inside the SVG. */
22
+ plot: PlotRect;
23
+ /**
24
+ * What to write beside the crosshair, most important first, `null` where the
25
+ * axes read nothing under the pointer.
26
+ * @default null
27
+ */
28
+ lines?: readonly string[] | null;
29
+ }
30
+ /**
31
+ * Draw the crosshair and its readout.
32
+ * @param props - The pointer, the plot and the lines to write.
33
+ * @returns The crosshair, or nothing while the pointer is off the plot.
34
+ */
35
+ export declare function ChartTracker(props: ChartTrackerProps): ReactElement | null;
36
+ //# sourceMappingURL=ChartTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartTracker.d.ts","sourceRoot":"","sources":["../../../src/chart/ui/ChartTracker.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAQzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,iCAAiC;AACjC,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,QAAQ,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5B,0CAA0C;IAC1C,IAAI,EAAE,QAAQ,CAAC;IACf;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,GAAG,IAAI,CAwC1E"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { CHART_COLORS, CHART_FONT, LABEL_HALO, LABEL_QUIET, PEAK_LABEL, } from "../core/chartTheme.js";
3
+ import { readoutPlacement } from "../core/trackerReadout.js";
4
+ /**
5
+ * Draw the crosshair and its readout.
6
+ * @param props - The pointer, the plot and the lines to write.
7
+ * @returns The crosshair, or nothing while the pointer is off the plot.
8
+ */
9
+ export function ChartTracker(props) {
10
+ const { position, plot, lines = null } = props;
11
+ if (position === null)
12
+ return null;
13
+ const place = readoutPlacement(position, plot);
14
+ return (_jsxs("g", { pointerEvents: "none", children: [_jsx("line", { x1: position.x, y1: plot.top, x2: position.x, y2: plot.bottom, strokeDasharray: TRACKER_DASH, style: crosshairStyle }), _jsx("line", { x1: plot.left, y1: position.y, x2: plot.right, y2: position.y, strokeDasharray: TRACKER_DASH, style: crosshairStyle }), lines === null || lines.length === 0 ? null : (_jsx("text", { textAnchor: place.anchor, style: readoutStyle, children: lines.map((line, at) => (_jsx("tspan", { x: place.x, y: place.y + at * PEAK_LABEL.lineHeight, fillOpacity: at === 0 ? undefined : LABEL_QUIET, children: line }, line))) }))] }));
15
+ }
16
+ /** What the crosshair is dashed with, so it is never read as a trace. */
17
+ const TRACKER_DASH = '3 3';
18
+ const crosshairStyle = { stroke: CHART_COLORS.tracker };
19
+ const readoutStyle = {
20
+ fill: CHART_COLORS.trackerText,
21
+ fontSize: CHART_FONT.readout,
22
+ // Haloed like every other label written onto the plot, and it needs it more
23
+ // than any of them: the pointer is put wherever the question is, which is over
24
+ // the trace rather than beside it.
25
+ ...LABEL_HALO,
26
+ };
27
+ //# sourceMappingURL=ChartTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartTracker.js","sourceRoot":"","sources":["../../../src/chart/ui/ChartTracker.tsx"],"names":[],"mappings":";AAiBA,OAAO,EACL,YAAY,EACZ,UAAU,EACV,UAAU,EACV,WAAW,EACX,UAAU,GACX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAgB7D;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAC/C,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEnC,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAE/C,OAAO,CACL,aAAG,aAAa,EAAC,MAAM,aACrB,eACE,EAAE,EAAE,QAAQ,CAAC,CAAC,EACd,EAAE,EAAE,IAAI,CAAC,GAAG,EACZ,EAAE,EAAE,QAAQ,CAAC,CAAC,EACd,EAAE,EAAE,IAAI,CAAC,MAAM,EACf,eAAe,EAAE,YAAY,EAC7B,KAAK,EAAE,cAAc,GACrB,EACF,eACE,EAAE,EAAE,IAAI,CAAC,IAAI,EACb,EAAE,EAAE,QAAQ,CAAC,CAAC,EACd,EAAE,EAAE,IAAI,CAAC,KAAK,EACd,EAAE,EAAE,QAAQ,CAAC,CAAC,EACd,eAAe,EAAE,YAAY,EAC7B,KAAK,EAAE,cAAc,GACrB,EACD,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC7C,eAAM,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,YAChD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CACvB,gBAEE,CAAC,EAAE,KAAK,CAAC,CAAC,EACV,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,UAAU,EACvC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,YAE9C,IAAI,IALA,IAAI,CAMH,CACT,CAAC,GACG,CACR,IACC,CACL,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,MAAM,YAAY,GAAG,KAAK,CAAC;AAE3B,MAAM,cAAc,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,EAAW,CAAC;AAEjE,MAAM,YAAY,GAAG;IACnB,IAAI,EAAE,YAAY,CAAC,WAAW;IAC9B,QAAQ,EAAE,UAAU,CAAC,OAAO;IAC5B,4EAA4E;IAC5E,+EAA+E;IAC/E,mCAAmC;IACnC,GAAG,UAAU;CACL,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { ReactElement } from 'react';
2
+ import type { PlotRect } from '../core/chartGeometry.ts';
3
+ /** What the caption says, and how much of the plot it may say it across. */
4
+ export interface PlotCaptionProps {
5
+ /** What the plot is a picture of, in one line. */
6
+ text: string;
7
+ /** The plot it is written on. */
8
+ plot: PlotRect;
9
+ /**
10
+ * The x it must stop short of, in the plot's own pixels.
11
+ *
12
+ * The left edge of a legend sharing the top of the plot, which `legendBox`
13
+ * answers for whoever is drawing one. Nothing here works that out on its own:
14
+ * a caption is written wherever a caller asks and only the caller knows what
15
+ * else it put up there.
16
+ * @default the plot's right edge
17
+ */
18
+ until?: number;
19
+ }
20
+ /**
21
+ * What a plot is a picture of, written in its top left corner.
22
+ *
23
+ * The opposite corner from the legend, and it says the opposite kind of thing:
24
+ * a legend names the curves against each other, while a caption says which
25
+ * measurement the whole pane is of — which file, which acquisition of it, when
26
+ * it was measured. A stack of panes is where that matters, since three charts
27
+ * one above another are three pictures of three different scans and the axes
28
+ * say nothing about which.
29
+ *
30
+ * Drawn **inside the SVG**, for the reason `TraceLegend` states: a picture is
31
+ * exported by cloning the chart's own `SVGSVGElement`, so a caption living in a
32
+ * `<div>` beside it would be missing from every figure while looking perfectly
33
+ * right on screen — and a figure that does not say what it is a picture of is
34
+ * the one thing a caption exists to prevent.
35
+ *
36
+ * It is written on the plot rather than above it. The room over a plot belongs
37
+ * to the tallest peak's label, and taking it for a caption would either push
38
+ * the measurement down or have the two collide on whichever spectrum happens to
39
+ * peak at the left.
40
+ * @param props - Component props.
41
+ * @returns The caption, or nothing where there is no room to write it.
42
+ */
43
+ export declare function PlotCaption(props: PlotCaptionProps): ReactElement | null;
44
+ //# sourceMappingURL=PlotCaption.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlotCaption.d.ts","sourceRoot":"","sources":["../../../src/chart/ui/PlotCaption.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAUzD,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,IAAI,EAAE,QAAQ,CAAC;IACf;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,GAAG,IAAI,CAmBxE"}