react-cheminfo 0.28.0 → 0.30.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 (742) hide show
  1. package/README.md +79 -26
  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/chrome/ui/AccountButton.d.ts +76 -0
  151. package/lib/chrome/ui/AccountButton.d.ts.map +1 -0
  152. package/lib/chrome/ui/AccountButton.js +66 -0
  153. package/lib/chrome/ui/AccountButton.js.map +1 -0
  154. package/lib/chrome/ui/index.d.ts +2 -0
  155. package/lib/chrome/ui/index.d.ts.map +1 -1
  156. package/lib/chrome/ui/index.js +1 -0
  157. package/lib/chrome/ui/index.js.map +1 -1
  158. package/lib/clipboard/core/copyPng.d.ts +13 -0
  159. package/lib/clipboard/core/copyPng.d.ts.map +1 -0
  160. package/lib/clipboard/core/copyPng.js +19 -0
  161. package/lib/clipboard/core/copyPng.js.map +1 -0
  162. package/lib/clipboard/core/index.d.ts +1 -0
  163. package/lib/clipboard/core/index.d.ts.map +1 -1
  164. package/lib/clipboard/core/index.js +1 -0
  165. package/lib/clipboard/core/index.js.map +1 -1
  166. package/lib/clipboard/ui/ClickToCopy.d.ts +6 -0
  167. package/lib/clipboard/ui/ClickToCopy.d.ts.map +1 -1
  168. package/lib/clipboard/ui/ClickToCopy.js +3 -3
  169. package/lib/clipboard/ui/ClickToCopy.js.map +1 -1
  170. package/lib/core.d.ts +1 -0
  171. package/lib/core.d.ts.map +1 -1
  172. package/lib/core.js +1 -0
  173. package/lib/core.js.map +1 -1
  174. package/lib/download/core/exportStyles.d.ts +22 -0
  175. package/lib/download/core/exportStyles.d.ts.map +1 -0
  176. package/lib/download/core/exportStyles.js +19 -0
  177. package/lib/download/core/exportStyles.js.map +1 -0
  178. package/lib/download/core/imageResolution.d.ts +88 -0
  179. package/lib/download/core/imageResolution.d.ts.map +1 -0
  180. package/lib/download/core/imageResolution.js +77 -0
  181. package/lib/download/core/imageResolution.js.map +1 -0
  182. package/lib/download/core/index.d.ts +13 -0
  183. package/lib/download/core/index.d.ts.map +1 -1
  184. package/lib/download/core/index.js +8 -0
  185. package/lib/download/core/index.js.map +1 -1
  186. package/lib/download/core/pictureExport.d.ts +93 -0
  187. package/lib/download/core/pictureExport.d.ts.map +1 -0
  188. package/lib/download/core/pictureExport.js +116 -0
  189. package/lib/download/core/pictureExport.js.map +1 -0
  190. package/lib/download/core/stackedDrawing.d.ts +36 -0
  191. package/lib/download/core/stackedDrawing.d.ts.map +1 -0
  192. package/lib/download/core/stackedDrawing.js +98 -0
  193. package/lib/download/core/stackedDrawing.js.map +1 -0
  194. package/lib/download/core/svgBounds.d.ts +44 -0
  195. package/lib/download/core/svgBounds.d.ts.map +1 -0
  196. package/lib/download/core/svgBounds.js +69 -0
  197. package/lib/download/core/svgBounds.js.map +1 -0
  198. package/lib/download/core/svgNamespace.d.ts +9 -0
  199. package/lib/download/core/svgNamespace.d.ts.map +1 -0
  200. package/lib/download/core/svgNamespace.js +10 -0
  201. package/lib/download/core/svgNamespace.js.map +1 -0
  202. package/lib/download/core/svgToPng.d.ts +43 -0
  203. package/lib/download/core/svgToPng.d.ts.map +1 -0
  204. package/lib/download/core/svgToPng.js +79 -0
  205. package/lib/download/core/svgToPng.js.map +1 -0
  206. package/lib/download/core/svgToString.d.ts +45 -0
  207. package/lib/download/core/svgToString.d.ts.map +1 -0
  208. package/lib/download/core/svgToString.js +58 -0
  209. package/lib/download/core/svgToString.js.map +1 -0
  210. package/lib/download/ui/ExportDialogFrame.d.ts +46 -0
  211. package/lib/download/ui/ExportDialogFrame.d.ts.map +1 -0
  212. package/lib/download/ui/ExportDialogFrame.js +24 -0
  213. package/lib/download/ui/ExportDialogFrame.js.map +1 -0
  214. package/lib/download/ui/ExportImageDialog.d.ts +47 -0
  215. package/lib/download/ui/ExportImageDialog.d.ts.map +1 -0
  216. package/lib/download/ui/ExportImageDialog.js +25 -0
  217. package/lib/download/ui/ExportImageDialog.js.map +1 -0
  218. package/lib/download/ui/ExportNameField.d.ts +29 -0
  219. package/lib/download/ui/ExportNameField.d.ts.map +1 -0
  220. package/lib/download/ui/ExportNameField.js +99 -0
  221. package/lib/download/ui/ExportNameField.js.map +1 -0
  222. package/lib/download/ui/ExportPictureSection.d.ts +38 -0
  223. package/lib/download/ui/ExportPictureSection.d.ts.map +1 -0
  224. package/lib/download/ui/ExportPictureSection.js +48 -0
  225. package/lib/download/ui/ExportPictureSection.js.map +1 -0
  226. package/lib/download/ui/index.d.ts +10 -0
  227. package/lib/download/ui/index.d.ts.map +1 -1
  228. package/lib/download/ui/index.js +5 -0
  229. package/lib/download/ui/index.js.map +1 -1
  230. package/lib/download/ui/useDrawingBox.d.ts +23 -0
  231. package/lib/download/ui/useDrawingBox.d.ts.map +1 -0
  232. package/lib/download/ui/useDrawingBox.js +21 -0
  233. package/lib/download/ui/useDrawingBox.js.map +1 -0
  234. package/lib/error/core/describeSource.d.ts +17 -0
  235. package/lib/error/core/describeSource.d.ts.map +1 -0
  236. package/lib/error/core/describeSource.js +19 -0
  237. package/lib/error/core/describeSource.js.map +1 -0
  238. package/lib/error/core/index.d.ts +1 -0
  239. package/lib/error/core/index.d.ts.map +1 -1
  240. package/lib/error/core/index.js +1 -0
  241. package/lib/error/core/index.js.map +1 -1
  242. package/lib/help/ui/HelpBody.d.ts +10 -1
  243. package/lib/help/ui/HelpBody.d.ts.map +1 -1
  244. package/lib/help/ui/HelpBody.js +24 -1
  245. package/lib/help/ui/HelpBody.js.map +1 -1
  246. package/lib/help/ui/index.d.ts +1 -1
  247. package/lib/help/ui/index.d.ts.map +1 -1
  248. package/lib/help/ui/index.js.map +1 -1
  249. package/lib/i18n/core/chromeCatalog.d.ts +1 -1
  250. package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
  251. package/lib/ir/core/analysisSpectra.d.ts +46 -0
  252. package/lib/ir/core/analysisSpectra.d.ts.map +1 -0
  253. package/lib/ir/core/analysisSpectra.js +187 -0
  254. package/lib/ir/core/analysisSpectra.js.map +1 -0
  255. package/lib/ir/core/assignBands.d.ts +83 -0
  256. package/lib/ir/core/assignBands.d.ts.map +1 -0
  257. package/lib/ir/core/assignBands.js +83 -0
  258. package/lib/ir/core/assignBands.js.map +1 -0
  259. package/lib/ir/core/bandAssignments.d.ts +47 -0
  260. package/lib/ir/core/bandAssignments.d.ts.map +1 -0
  261. package/lib/ir/core/bandAssignments.js +305 -0
  262. package/lib/ir/core/bandAssignments.js.map +1 -0
  263. package/lib/ir/core/bandLabelPlan.d.ts +93 -0
  264. package/lib/ir/core/bandLabelPlan.d.ts.map +1 -0
  265. package/lib/ir/core/bandLabelPlan.js +104 -0
  266. package/lib/ir/core/bandLabelPlan.js.map +1 -0
  267. package/lib/ir/core/detectIrFormat.d.ts +23 -0
  268. package/lib/ir/core/detectIrFormat.d.ts.map +1 -0
  269. package/lib/ir/core/detectIrFormat.js +133 -0
  270. package/lib/ir/core/detectIrFormat.js.map +1 -0
  271. package/lib/ir/core/downloadSpectra.d.ts +26 -0
  272. package/lib/ir/core/downloadSpectra.d.ts.map +1 -0
  273. package/lib/ir/core/downloadSpectra.js +37 -0
  274. package/lib/ir/core/downloadSpectra.js.map +1 -0
  275. package/lib/ir/core/fromJcamp.d.ts +35 -0
  276. package/lib/ir/core/fromJcamp.d.ts.map +1 -0
  277. package/lib/ir/core/fromJcamp.js +48 -0
  278. package/lib/ir/core/fromJcamp.js.map +1 -0
  279. package/lib/ir/core/fromSpc.d.ts +30 -0
  280. package/lib/ir/core/fromSpc.d.ts.map +1 -0
  281. package/lib/ir/core/fromSpc.js +40 -0
  282. package/lib/ir/core/fromSpc.js.map +1 -0
  283. package/lib/ir/core/index.d.ts +51 -0
  284. package/lib/ir/core/index.d.ts.map +1 -0
  285. package/lib/ir/core/index.js +35 -0
  286. package/lib/ir/core/index.js.map +1 -0
  287. package/lib/ir/core/irBand.d.ts +45 -0
  288. package/lib/ir/core/irBand.d.ts.map +1 -0
  289. package/lib/ir/core/irBand.js +30 -0
  290. package/lib/ir/core/irBand.js.map +1 -0
  291. package/lib/ir/core/irCommands.d.ts +168 -0
  292. package/lib/ir/core/irCommands.d.ts.map +1 -0
  293. package/lib/ir/core/irCommands.js +94 -0
  294. package/lib/ir/core/irCommands.js.map +1 -0
  295. package/lib/ir/core/irDomain.d.ts +63 -0
  296. package/lib/ir/core/irDomain.d.ts.map +1 -0
  297. package/lib/ir/core/irDomain.js +136 -0
  298. package/lib/ir/core/irDomain.js.map +1 -0
  299. package/lib/ir/core/irEditorApi.d.ts +42 -0
  300. package/lib/ir/core/irEditorApi.d.ts.map +1 -0
  301. package/lib/ir/core/irEditorApi.js +10 -0
  302. package/lib/ir/core/irEditorApi.js.map +1 -0
  303. package/lib/ir/core/irFormat.d.ts +42 -0
  304. package/lib/ir/core/irFormat.d.ts.map +1 -0
  305. package/lib/ir/core/irFormat.js +51 -0
  306. package/lib/ir/core/irFormat.js.map +1 -0
  307. package/lib/ir/core/irMode.d.ts +160 -0
  308. package/lib/ir/core/irMode.d.ts.map +1 -0
  309. package/lib/ir/core/irMode.js +175 -0
  310. package/lib/ir/core/irMode.js.map +1 -0
  311. package/lib/ir/core/irReducer.d.ts +101 -0
  312. package/lib/ir/core/irReducer.d.ts.map +1 -0
  313. package/lib/ir/core/irReducer.js +207 -0
  314. package/lib/ir/core/irReducer.js.map +1 -0
  315. package/lib/ir/core/irSidePanels.d.ts +22 -0
  316. package/lib/ir/core/irSidePanels.d.ts.map +1 -0
  317. package/lib/ir/core/irSidePanels.js +12 -0
  318. package/lib/ir/core/irSidePanels.js.map +1 -0
  319. package/lib/ir/core/irSpectrum.d.ts +140 -0
  320. package/lib/ir/core/irSpectrum.d.ts.map +1 -0
  321. package/lib/ir/core/irSpectrum.js +34 -0
  322. package/lib/ir/core/irSpectrum.js.map +1 -0
  323. package/lib/ir/core/irState.d.ts +119 -0
  324. package/lib/ir/core/irState.d.ts.map +1 -0
  325. package/lib/ir/core/irState.js +92 -0
  326. package/lib/ir/core/irState.js.map +1 -0
  327. package/lib/ir/core/loadIrSpectra.d.ts +36 -0
  328. package/lib/ir/core/loadIrSpectra.d.ts.map +1 -0
  329. package/lib/ir/core/loadIrSpectra.js +44 -0
  330. package/lib/ir/core/loadIrSpectra.js.map +1 -0
  331. package/lib/ir/core/nearestBand.d.ts +35 -0
  332. package/lib/ir/core/nearestBand.d.ts.map +1 -0
  333. package/lib/ir/core/nearestBand.js +47 -0
  334. package/lib/ir/core/nearestBand.js.map +1 -0
  335. package/lib/ir/core/pickBands.d.ts +70 -0
  336. package/lib/ir/core/pickBands.d.ts.map +1 -0
  337. package/lib/ir/core/pickBands.js +125 -0
  338. package/lib/ir/core/pickBands.js.map +1 -0
  339. package/lib/ir/core/spectrumJcamp.d.ts +58 -0
  340. package/lib/ir/core/spectrumJcamp.d.ts.map +1 -0
  341. package/lib/ir/core/spectrumJcamp.js +156 -0
  342. package/lib/ir/core/spectrumJcamp.js.map +1 -0
  343. package/lib/ir/core/toIrSpectrum.d.ts +59 -0
  344. package/lib/ir/core/toIrSpectrum.d.ts.map +1 -0
  345. package/lib/ir/core/toIrSpectrum.js +56 -0
  346. package/lib/ir/core/toIrSpectrum.js.map +1 -0
  347. package/lib/ir/ui/BandMarks.d.ts +52 -0
  348. package/lib/ir/ui/BandMarks.d.ts.map +1 -0
  349. package/lib/ir/ui/BandMarks.js +71 -0
  350. package/lib/ir/ui/BandMarks.js.map +1 -0
  351. package/lib/ir/ui/BandsPanel.d.ts +31 -0
  352. package/lib/ir/ui/BandsPanel.d.ts.map +1 -0
  353. package/lib/ir/ui/BandsPanel.js +94 -0
  354. package/lib/ir/ui/BandsPanel.js.map +1 -0
  355. package/lib/ir/ui/IrAboutDialog.d.ts +18 -0
  356. package/lib/ir/ui/IrAboutDialog.d.ts.map +1 -0
  357. package/lib/ir/ui/IrAboutDialog.js +32 -0
  358. package/lib/ir/ui/IrAboutDialog.js.map +1 -0
  359. package/lib/ir/ui/IrCanvas.d.ts +38 -0
  360. package/lib/ir/ui/IrCanvas.d.ts.map +1 -0
  361. package/lib/ir/ui/IrCanvas.js +41 -0
  362. package/lib/ir/ui/IrCanvas.js.map +1 -0
  363. package/lib/ir/ui/IrChart.d.ts +28 -0
  364. package/lib/ir/ui/IrChart.d.ts.map +1 -0
  365. package/lib/ir/ui/IrChart.js +114 -0
  366. package/lib/ir/ui/IrChart.js.map +1 -0
  367. package/lib/ir/ui/IrCommandProvider.d.ts +15 -0
  368. package/lib/ir/ui/IrCommandProvider.d.ts.map +1 -0
  369. package/lib/ir/ui/IrCommandProvider.js +14 -0
  370. package/lib/ir/ui/IrCommandProvider.js.map +1 -0
  371. package/lib/ir/ui/IrCommandTooltip.d.ts +16 -0
  372. package/lib/ir/ui/IrCommandTooltip.d.ts.map +1 -0
  373. package/lib/ir/ui/IrCommandTooltip.js +22 -0
  374. package/lib/ir/ui/IrCommandTooltip.js.map +1 -0
  375. package/lib/ir/ui/IrDocumentationDialog.d.ts +18 -0
  376. package/lib/ir/ui/IrDocumentationDialog.d.ts.map +1 -0
  377. package/lib/ir/ui/IrDocumentationDialog.js +68 -0
  378. package/lib/ir/ui/IrDocumentationDialog.js.map +1 -0
  379. package/lib/ir/ui/IrEditor.d.ts +60 -0
  380. package/lib/ir/ui/IrEditor.d.ts.map +1 -0
  381. package/lib/ir/ui/IrEditor.js +42 -0
  382. package/lib/ir/ui/IrEditor.js.map +1 -0
  383. package/lib/ir/ui/IrHeader.d.ts +13 -0
  384. package/lib/ir/ui/IrHeader.d.ts.map +1 -0
  385. package/lib/ir/ui/IrHeader.js +21 -0
  386. package/lib/ir/ui/IrHeader.js.map +1 -0
  387. package/lib/ir/ui/IrLogo.d.ts +20 -0
  388. package/lib/ir/ui/IrLogo.d.ts.map +1 -0
  389. package/lib/ir/ui/IrLogo.js +17 -0
  390. package/lib/ir/ui/IrLogo.js.map +1 -0
  391. package/lib/ir/ui/IrPointerTracker.d.ts +29 -0
  392. package/lib/ir/ui/IrPointerTracker.d.ts.map +1 -0
  393. package/lib/ir/ui/IrPointerTracker.js +47 -0
  394. package/lib/ir/ui/IrPointerTracker.js.map +1 -0
  395. package/lib/ir/ui/IrShell.d.ts +25 -0
  396. package/lib/ir/ui/IrShell.d.ts.map +1 -0
  397. package/lib/ir/ui/IrShell.js +178 -0
  398. package/lib/ir/ui/IrShell.js.map +1 -0
  399. package/lib/ir/ui/IrSidePanel.d.ts +26 -0
  400. package/lib/ir/ui/IrSidePanel.d.ts.map +1 -0
  401. package/lib/ir/ui/IrSidePanel.js +39 -0
  402. package/lib/ir/ui/IrSidePanel.js.map +1 -0
  403. package/lib/ir/ui/IrStateProvider.d.ts +19 -0
  404. package/lib/ir/ui/IrStateProvider.d.ts.map +1 -0
  405. package/lib/ir/ui/IrStateProvider.js +16 -0
  406. package/lib/ir/ui/IrStateProvider.js.map +1 -0
  407. package/lib/ir/ui/IrStatusBar.d.ts +14 -0
  408. package/lib/ir/ui/IrStatusBar.d.ts.map +1 -0
  409. package/lib/ir/ui/IrStatusBar.js +48 -0
  410. package/lib/ir/ui/IrStatusBar.js.map +1 -0
  411. package/lib/ir/ui/IrToolbar.d.ts +18 -0
  412. package/lib/ir/ui/IrToolbar.d.ts.map +1 -0
  413. package/lib/ir/ui/IrToolbar.js +32 -0
  414. package/lib/ir/ui/IrToolbar.js.map +1 -0
  415. package/lib/ir/ui/IrTraces.d.ts +63 -0
  416. package/lib/ir/ui/IrTraces.d.ts.map +1 -0
  417. package/lib/ir/ui/IrTraces.js +72 -0
  418. package/lib/ir/ui/IrTraces.js.map +1 -0
  419. package/lib/ir/ui/MetadataPanel.d.ts +15 -0
  420. package/lib/ir/ui/MetadataPanel.d.ts.map +1 -0
  421. package/lib/ir/ui/MetadataPanel.js +49 -0
  422. package/lib/ir/ui/MetadataPanel.js.map +1 -0
  423. package/lib/ir/ui/SpectraPanel.d.ts +20 -0
  424. package/lib/ir/ui/SpectraPanel.d.ts.map +1 -0
  425. package/lib/ir/ui/SpectraPanel.js +42 -0
  426. package/lib/ir/ui/SpectraPanel.js.map +1 -0
  427. package/lib/ir/ui/SpectrumRow.d.ts +26 -0
  428. package/lib/ir/ui/SpectrumRow.d.ts.map +1 -0
  429. package/lib/ir/ui/SpectrumRow.js +41 -0
  430. package/lib/ir/ui/SpectrumRow.js.map +1 -0
  431. package/lib/ir/ui/index.d.ts +56 -0
  432. package/lib/ir/ui/index.d.ts.map +1 -0
  433. package/lib/ir/ui/index.js +36 -0
  434. package/lib/ir/ui/index.js.map +1 -0
  435. package/lib/ir/ui/irActions.d.ts +52 -0
  436. package/lib/ir/ui/irActions.d.ts.map +1 -0
  437. package/lib/ir/ui/irActions.js +62 -0
  438. package/lib/ir/ui/irActions.js.map +1 -0
  439. package/lib/ir/ui/irChartProps.d.ts +116 -0
  440. package/lib/ir/ui/irChartProps.d.ts.map +1 -0
  441. package/lib/ir/ui/irChartProps.js +14 -0
  442. package/lib/ir/ui/irChartProps.js.map +1 -0
  443. package/lib/ir/ui/irCommandContext.d.ts +35 -0
  444. package/lib/ir/ui/irCommandContext.d.ts.map +1 -0
  445. package/lib/ir/ui/irCommandContext.js +44 -0
  446. package/lib/ir/ui/irCommandContext.js.map +1 -0
  447. package/lib/ir/ui/irStateContext.d.ts +26 -0
  448. package/lib/ir/ui/irStateContext.d.ts.map +1 -0
  449. package/lib/ir/ui/irStateContext.js +37 -0
  450. package/lib/ir/ui/irStateContext.js.map +1 -0
  451. package/lib/ir/ui/useIrEditor.d.ts +51 -0
  452. package/lib/ir/ui/useIrEditor.d.ts.map +1 -0
  453. package/lib/ir/ui/useIrEditor.js +88 -0
  454. package/lib/ir/ui/useIrEditor.js.map +1 -0
  455. package/lib/ir/ui/useIrPointer.d.ts +66 -0
  456. package/lib/ir/ui/useIrPointer.d.ts.map +1 -0
  457. package/lib/ir/ui/useIrPointer.js +53 -0
  458. package/lib/ir/ui/useIrPointer.js.map +1 -0
  459. package/lib/ir/ui/useIrShortcuts.d.ts +24 -0
  460. package/lib/ir/ui/useIrShortcuts.d.ts.map +1 -0
  461. package/lib/ir/ui/useIrShortcuts.js +73 -0
  462. package/lib/ir/ui/useIrShortcuts.js.map +1 -0
  463. package/lib/ir/ui/useIrZoom.d.ts +51 -0
  464. package/lib/ir/ui/useIrZoom.d.ts.map +1 -0
  465. package/lib/ir/ui/useIrZoom.js +46 -0
  466. package/lib/ir/ui/useIrZoom.js.map +1 -0
  467. package/lib/ir.d.ts +13 -0
  468. package/lib/ir.d.ts.map +1 -0
  469. package/lib/ir.js +13 -0
  470. package/lib/ir.js.map +1 -0
  471. package/lib/locales/de.json +3 -0
  472. package/lib/locales/en.json +3 -0
  473. package/lib/locales/es.json +3 -0
  474. package/lib/locales/fr.json +3 -0
  475. package/lib/panel/core/dialogStyles.d.ts +13 -0
  476. package/lib/panel/core/dialogStyles.d.ts.map +1 -0
  477. package/lib/panel/core/dialogStyles.js +11 -0
  478. package/lib/panel/core/dialogStyles.js.map +1 -0
  479. package/lib/panel/core/index.d.ts +19 -0
  480. package/lib/panel/core/index.d.ts.map +1 -0
  481. package/lib/panel/core/index.js +18 -0
  482. package/lib/panel/core/index.js.map +1 -0
  483. package/lib/panel/core/isEditingField.d.ts +17 -0
  484. package/lib/panel/core/isEditingField.d.ts.map +1 -0
  485. package/lib/panel/core/isEditingField.js +25 -0
  486. package/lib/panel/core/isEditingField.js.map +1 -0
  487. package/lib/panel/core/panelStyles.d.ts +242 -0
  488. package/lib/panel/core/panelStyles.d.ts.map +1 -0
  489. package/lib/panel/core/panelStyles.js +228 -0
  490. package/lib/panel/core/panelStyles.js.map +1 -0
  491. package/lib/panel/core/rowSpacers.d.ts +38 -0
  492. package/lib/panel/core/rowSpacers.d.ts.map +1 -0
  493. package/lib/panel/core/rowSpacers.js +31 -0
  494. package/lib/panel/core/rowSpacers.js.map +1 -0
  495. package/lib/panel/core/statusBar.d.ts +44 -0
  496. package/lib/panel/core/statusBar.d.ts.map +1 -0
  497. package/lib/panel/core/statusBar.js +40 -0
  498. package/lib/panel/core/statusBar.js.map +1 -0
  499. package/lib/panel/core/textFilter.d.ts +22 -0
  500. package/lib/panel/core/textFilter.d.ts.map +1 -0
  501. package/lib/panel/core/textFilter.js +32 -0
  502. package/lib/panel/core/textFilter.js.map +1 -0
  503. package/lib/panel/core/yieldToPainting.d.ts +17 -0
  504. package/lib/panel/core/yieldToPainting.d.ts.map +1 -0
  505. package/lib/panel/core/yieldToPainting.js +21 -0
  506. package/lib/panel/core/yieldToPainting.js.map +1 -0
  507. package/lib/panel/ui/AboutDialogFrame.d.ts +36 -0
  508. package/lib/panel/ui/AboutDialogFrame.d.ts.map +1 -0
  509. package/lib/panel/ui/AboutDialogFrame.js +43 -0
  510. package/lib/panel/ui/AboutDialogFrame.js.map +1 -0
  511. package/lib/panel/ui/ClearButton.d.ts +28 -0
  512. package/lib/panel/ui/ClearButton.d.ts.map +1 -0
  513. package/lib/panel/ui/ClearButton.js +23 -0
  514. package/lib/panel/ui/ClearButton.js.map +1 -0
  515. package/lib/panel/ui/DocumentationDialogFrame.d.ts +39 -0
  516. package/lib/panel/ui/DocumentationDialogFrame.d.ts.map +1 -0
  517. package/lib/panel/ui/DocumentationDialogFrame.js +29 -0
  518. package/lib/panel/ui/DocumentationDialogFrame.js.map +1 -0
  519. package/lib/panel/ui/FilterInput.d.ts +31 -0
  520. package/lib/panel/ui/FilterInput.d.ts.map +1 -0
  521. package/lib/panel/ui/FilterInput.js +23 -0
  522. package/lib/panel/ui/FilterInput.js.map +1 -0
  523. package/lib/panel/ui/HelpLabel.d.ts +24 -0
  524. package/lib/panel/ui/HelpLabel.d.ts.map +1 -0
  525. package/lib/panel/ui/HelpLabel.js +23 -0
  526. package/lib/panel/ui/HelpLabel.js.map +1 -0
  527. package/lib/panel/ui/PanelMessage.d.ts +41 -0
  528. package/lib/panel/ui/PanelMessage.d.ts.map +1 -0
  529. package/lib/panel/ui/PanelMessage.js +30 -0
  530. package/lib/panel/ui/PanelMessage.js.map +1 -0
  531. package/lib/panel/ui/PanelRail.d.ts +41 -0
  532. package/lib/panel/ui/PanelRail.d.ts.map +1 -0
  533. package/lib/panel/ui/PanelRail.js +12 -0
  534. package/lib/panel/ui/PanelRail.js.map +1 -0
  535. package/lib/panel/ui/Section.d.ts +25 -0
  536. package/lib/panel/ui/Section.d.ts.map +1 -0
  537. package/lib/panel/ui/Section.js +41 -0
  538. package/lib/panel/ui/Section.js.map +1 -0
  539. package/lib/panel/ui/SidePanelStack.d.ts +62 -0
  540. package/lib/panel/ui/SidePanelStack.d.ts.map +1 -0
  541. package/lib/panel/ui/SidePanelStack.js +40 -0
  542. package/lib/panel/ui/SidePanelStack.js.map +1 -0
  543. package/lib/panel/ui/SpectrumColorSwatch.d.ts +33 -0
  544. package/lib/panel/ui/SpectrumColorSwatch.d.ts.map +1 -0
  545. package/lib/panel/ui/SpectrumColorSwatch.js +76 -0
  546. package/lib/panel/ui/SpectrumColorSwatch.js.map +1 -0
  547. package/lib/panel/ui/index.d.ts +37 -0
  548. package/lib/panel/ui/index.d.ts.map +1 -0
  549. package/lib/panel/ui/index.js +24 -0
  550. package/lib/panel/ui/index.js.map +1 -0
  551. package/lib/panel/ui/useConfirmOnEnter.d.ts +19 -0
  552. package/lib/panel/ui/useConfirmOnEnter.d.ts.map +1 -0
  553. package/lib/panel/ui/useConfirmOnEnter.js +64 -0
  554. package/lib/panel/ui/useConfirmOnEnter.js.map +1 -0
  555. package/lib/panel/ui/useFilterBox.d.ts +23 -0
  556. package/lib/panel/ui/useFilterBox.d.ts.map +1 -0
  557. package/lib/panel/ui/useFilterBox.js +22 -0
  558. package/lib/panel/ui/useFilterBox.js.map +1 -0
  559. package/lib/panel/ui/useVirtualRows.d.ts +46 -0
  560. package/lib/panel/ui/useVirtualRows.d.ts.map +1 -0
  561. package/lib/panel/ui/useVirtualRows.js +56 -0
  562. package/lib/panel/ui/useVirtualRows.js.map +1 -0
  563. package/lib/panel/ui/useVirtualWindowRows.d.ts +40 -0
  564. package/lib/panel/ui/useVirtualWindowRows.d.ts.map +1 -0
  565. package/lib/panel/ui/useVirtualWindowRows.js +65 -0
  566. package/lib/panel/ui/useVirtualWindowRows.js.map +1 -0
  567. package/lib/structure/core/conformerBoltzmann.d.ts +56 -0
  568. package/lib/structure/core/conformerBoltzmann.d.ts.map +1 -0
  569. package/lib/structure/core/conformerBoltzmann.js +96 -0
  570. package/lib/structure/core/conformerBoltzmann.js.map +1 -0
  571. package/lib/structure/core/conformerEnergy.d.ts +69 -0
  572. package/lib/structure/core/conformerEnergy.d.ts.map +1 -0
  573. package/lib/structure/core/conformerEnergy.js +47 -0
  574. package/lib/structure/core/conformerEnergy.js.map +1 -0
  575. package/lib/structure/core/index.d.ts +3 -0
  576. package/lib/structure/core/index.d.ts.map +1 -1
  577. package/lib/structure/core/index.js +2 -0
  578. package/lib/structure/core/index.js.map +1 -1
  579. package/lib/structure/ui/ConformerTable.d.ts +73 -0
  580. package/lib/structure/ui/ConformerTable.d.ts.map +1 -0
  581. package/lib/structure/ui/ConformerTable.js +259 -0
  582. package/lib/structure/ui/ConformerTable.js.map +1 -0
  583. package/lib/structure/ui/conformerColumns.d.ts +30 -0
  584. package/lib/structure/ui/conformerColumns.d.ts.map +1 -0
  585. package/lib/structure/ui/conformerColumns.js +37 -0
  586. package/lib/structure/ui/conformerColumns.js.map +1 -0
  587. package/lib/ui.d.ts +5 -0
  588. package/lib/ui.d.ts.map +1 -1
  589. package/lib/ui.js +3 -0
  590. package/lib/ui.js.map +1 -1
  591. package/package.json +8 -1
  592. package/src/chart/core/axisLabels.ts +117 -0
  593. package/src/chart/core/boxLayout.ts +126 -0
  594. package/src/chart/core/chartAxisScale.ts +92 -10
  595. package/src/chart/core/chartDomain.ts +185 -0
  596. package/src/chart/core/chartGeometry.ts +159 -0
  597. package/src/chart/core/chartPane.ts +10 -0
  598. package/src/chart/core/chartScale.ts +7 -4
  599. package/src/chart/core/chartTheme.ts +161 -0
  600. package/src/chart/core/chartViewport.ts +40 -13
  601. package/src/chart/core/guidePlacement.ts +66 -0
  602. package/src/chart/core/index.ts +121 -2
  603. package/src/chart/core/labelStack.ts +72 -0
  604. package/src/chart/core/legendBox.ts +263 -0
  605. package/src/chart/core/selectionGeometry.ts +68 -0
  606. package/src/chart/core/spectrumColor.ts +129 -0
  607. package/src/chart/core/stackCapacity.ts +162 -0
  608. package/src/chart/core/svgPoint.ts +77 -0
  609. package/src/chart/core/tracePath.ts +228 -0
  610. package/src/chart/core/trackerReadout.ts +78 -0
  611. package/src/chart/core/viewTransform.ts +287 -0
  612. package/src/chart/core/zoomDomain.ts +235 -0
  613. package/src/chart/ui/Axes.tsx +361 -0
  614. package/src/chart/ui/AxisGuide.tsx +187 -0
  615. package/src/chart/ui/ChartStack.tsx +130 -0
  616. package/src/chart/ui/ChartTracker.tsx +101 -0
  617. package/src/chart/ui/PlotCaption.tsx +108 -0
  618. package/src/chart/ui/SelectionRect.tsx +52 -0
  619. package/src/chart/ui/TraceLegend.tsx +193 -0
  620. package/src/chart/ui/chartGestures.ts +270 -0
  621. package/src/chart/ui/chartStackLevel.tsx +210 -0
  622. package/src/chart/ui/chartSurface.ts +66 -0
  623. package/src/chart/ui/index.ts +35 -0
  624. package/src/chart/ui/useChartPointer.ts +223 -0
  625. package/src/chart/ui/useChartSize.ts +115 -0
  626. package/src/chart/ui/useChartWindow.ts +240 -0
  627. package/src/chart/ui/useChartZoom.ts +255 -0
  628. package/src/chart/ui/useWheelListener.ts +62 -0
  629. package/src/chrome/ui/AccountButton.tsx +185 -0
  630. package/src/chrome/ui/index.ts +2 -0
  631. package/src/clipboard/core/copyPng.ts +20 -0
  632. package/src/clipboard/core/index.ts +1 -0
  633. package/src/clipboard/ui/ClickToCopy.tsx +9 -1
  634. package/src/core.ts +1 -0
  635. package/src/download/core/exportStyles.ts +20 -0
  636. package/src/download/core/imageResolution.ts +118 -0
  637. package/src/download/core/index.ts +34 -0
  638. package/src/download/core/pictureExport.ts +207 -0
  639. package/src/download/core/stackedDrawing.ts +108 -0
  640. package/src/download/core/svgBounds.ts +80 -0
  641. package/src/download/core/svgNamespace.ts +9 -0
  642. package/src/download/core/svgToPng.ts +121 -0
  643. package/src/download/core/svgToString.ts +95 -0
  644. package/src/download/ui/ExportDialogFrame.tsx +86 -0
  645. package/src/download/ui/ExportImageDialog.tsx +91 -0
  646. package/src/download/ui/ExportNameField.tsx +148 -0
  647. package/src/download/ui/ExportPictureSection.tsx +142 -0
  648. package/src/download/ui/index.ts +11 -0
  649. package/src/download/ui/useDrawingBox.ts +37 -0
  650. package/src/error/core/describeSource.ts +18 -0
  651. package/src/error/core/index.ts +1 -0
  652. package/src/help/ui/HelpBody.tsx +41 -2
  653. package/src/help/ui/index.ts +6 -1
  654. package/src/ir/core/analysisSpectra.ts +231 -0
  655. package/src/ir/core/assignBands.ts +144 -0
  656. package/src/ir/core/bandAssignments.ts +329 -0
  657. package/src/ir/core/bandLabelPlan.ts +194 -0
  658. package/src/ir/core/detectIrFormat.ts +139 -0
  659. package/src/ir/core/downloadSpectra.ts +57 -0
  660. package/src/ir/core/fromJcamp.ts +70 -0
  661. package/src/ir/core/fromSpc.ts +61 -0
  662. package/src/ir/core/index.ts +113 -0
  663. package/src/ir/core/irBand.ts +57 -0
  664. package/src/ir/core/irCommands.ts +154 -0
  665. package/src/ir/core/irDomain.ts +163 -0
  666. package/src/ir/core/irEditorApi.ts +44 -0
  667. package/src/ir/core/irFormat.ts +57 -0
  668. package/src/ir/core/irMode.ts +203 -0
  669. package/src/ir/core/irReducer.ts +273 -0
  670. package/src/ir/core/irSidePanels.ts +20 -0
  671. package/src/ir/core/irSpectrum.ts +155 -0
  672. package/src/ir/core/irState.ts +173 -0
  673. package/src/ir/core/loadIrSpectra.ts +79 -0
  674. package/src/ir/core/nearestBand.ts +57 -0
  675. package/src/ir/core/pickBands.ts +181 -0
  676. package/src/ir/core/spectrumJcamp.ts +178 -0
  677. package/src/ir/core/toIrSpectrum.ts +102 -0
  678. package/src/ir/ui/BandMarks.tsx +166 -0
  679. package/src/ir/ui/BandsPanel.tsx +271 -0
  680. package/src/ir/ui/IrAboutDialog.tsx +121 -0
  681. package/src/ir/ui/IrCanvas.tsx +91 -0
  682. package/src/ir/ui/IrChart.tsx +215 -0
  683. package/src/ir/ui/IrCommandProvider.tsx +32 -0
  684. package/src/ir/ui/IrCommandTooltip.tsx +36 -0
  685. package/src/ir/ui/IrDocumentationDialog.tsx +174 -0
  686. package/src/ir/ui/IrEditor.tsx +99 -0
  687. package/src/ir/ui/IrHeader.tsx +39 -0
  688. package/src/ir/ui/IrLogo.tsx +49 -0
  689. package/src/ir/ui/IrPointerTracker.tsx +102 -0
  690. package/src/ir/ui/IrShell.tsx +285 -0
  691. package/src/ir/ui/IrSidePanel.tsx +78 -0
  692. package/src/ir/ui/IrStateProvider.tsx +32 -0
  693. package/src/ir/ui/IrStatusBar.tsx +97 -0
  694. package/src/ir/ui/IrToolbar.tsx +102 -0
  695. package/src/ir/ui/IrTraces.tsx +134 -0
  696. package/src/ir/ui/MetadataPanel.tsx +88 -0
  697. package/src/ir/ui/SpectraPanel.tsx +114 -0
  698. package/src/ir/ui/SpectrumRow.tsx +127 -0
  699. package/src/ir/ui/index.ts +56 -0
  700. package/src/ir/ui/irActions.ts +103 -0
  701. package/src/ir/ui/irChartProps.ts +118 -0
  702. package/src/ir/ui/irCommandContext.tsx +62 -0
  703. package/src/ir/ui/irStateContext.ts +48 -0
  704. package/src/ir/ui/useIrEditor.ts +139 -0
  705. package/src/ir/ui/useIrPointer.ts +109 -0
  706. package/src/ir/ui/useIrShortcuts.ts +95 -0
  707. package/src/ir/ui/useIrZoom.ts +86 -0
  708. package/src/ir.ts +13 -0
  709. package/src/locales/de.json +3 -0
  710. package/src/locales/en.json +3 -0
  711. package/src/locales/es.json +3 -0
  712. package/src/locales/fr.json +3 -0
  713. package/src/panel/core/dialogStyles.ts +11 -0
  714. package/src/panel/core/index.ts +47 -0
  715. package/src/panel/core/isEditingField.ts +23 -0
  716. package/src/panel/core/panelStyles.ts +248 -0
  717. package/src/panel/core/rowSpacers.ts +50 -0
  718. package/src/panel/core/statusBar.ts +48 -0
  719. package/src/panel/core/textFilter.ts +33 -0
  720. package/src/panel/core/yieldToPainting.ts +20 -0
  721. package/src/panel/ui/AboutDialogFrame.tsx +100 -0
  722. package/src/panel/ui/ClearButton.tsx +42 -0
  723. package/src/panel/ui/DocumentationDialogFrame.tsx +86 -0
  724. package/src/panel/ui/FilterInput.tsx +60 -0
  725. package/src/panel/ui/HelpLabel.tsx +43 -0
  726. package/src/panel/ui/PanelMessage.tsx +64 -0
  727. package/src/panel/ui/PanelRail.tsx +64 -0
  728. package/src/panel/ui/Section.tsx +66 -0
  729. package/src/panel/ui/SidePanelStack.tsx +109 -0
  730. package/src/panel/ui/SpectrumColorSwatch.tsx +119 -0
  731. package/src/panel/ui/index.ts +47 -0
  732. package/src/panel/ui/useConfirmOnEnter.ts +68 -0
  733. package/src/panel/ui/useFilterBox.ts +35 -0
  734. package/src/panel/ui/useVirtualRows.ts +82 -0
  735. package/src/panel/ui/useVirtualWindowRows.ts +86 -0
  736. package/src/structure/core/conformerBoltzmann.ts +102 -0
  737. package/src/structure/core/conformerEnergy.ts +97 -0
  738. package/src/structure/core/index.ts +15 -0
  739. package/src/structure/ui/ConformerTable.tsx +429 -0
  740. package/src/structure/ui/conformerColumns.ts +55 -0
  741. package/src/ui.ts +13 -0
  742. package/styles/chrome.css +55 -0
@@ -0,0 +1,155 @@
1
+ /**
2
+ * What an infrared spectrum is once it has been read, whatever it was read from.
3
+ *
4
+ * One acquisition becomes one `IrSpectrum` carrying **both** value axes —
5
+ * absorbance and percent transmittance — over one shared array of wavenumbers.
6
+ * Both are held rather than one being derived on demand because `ir-spectrum`
7
+ * already produces both when it reads a file: it adds an `a` and a `t` variable
8
+ * to every spectrum whichever of the two the instrument wrote, so the conversion
9
+ * happens once, in the one place that knows what the file's y axis meant. Holding
10
+ * the answer means switching what is drawn costs nothing, and means the two
11
+ * axes can never drift apart through a round trip.
12
+ *
13
+ * The arrays are `Float64Array` and are replaced on a change, never written
14
+ * into, since every consumer holds the same object by reference. An infrared
15
+ * spectrum is a few thousand points rather than a mass spectrum's few hundred
16
+ * thousand, so holding two value axes costs nothing worth counting.
17
+ */
18
+
19
+ import type { DataXY } from 'cheminfo-types';
20
+
21
+ import type { ChartDomain } from '../../chart/core/chartDomain.ts';
22
+
23
+ /**
24
+ * One trace of a measurement: wavenumber against whichever value axis is drawn.
25
+ *
26
+ * `DataXY` is the shape every package in this pipeline speaks — `ir-spectrum`,
27
+ * `common-spectrum`, `xy-parser` and `ml-spectra-processing` all take and return
28
+ * it — so declaring a parallel type of our own would buy nothing and cost an
29
+ * adapter at each boundary.
30
+ */
31
+ export type IrTrace = DataXY<Float64Array>;
32
+
33
+ /** The formats a spectrum can have been read from. */
34
+ export type IrFormat = 'jcamp' | 'spc' | 'text' | 'calculated';
35
+
36
+ /**
37
+ * Where a spectrum came from, and what the file said about the acquisition.
38
+ *
39
+ * Kept apart from `meta` because these are the facts other code branches on,
40
+ * while `meta` is a table to read.
41
+ */
42
+ export interface IrOrigin {
43
+ /** The format it was read from. */
44
+ format: IrFormat;
45
+ /**
46
+ * Name of the file it came from, absent for a paste.
47
+ * @default undefined
48
+ */
49
+ fileName?: string;
50
+ /**
51
+ * Which block of that file, absent when the file held only one.
52
+ * @default undefined
53
+ */
54
+ blockIndex?: number;
55
+ /**
56
+ * Which value axis the file itself carried, absent when it said nothing.
57
+ *
58
+ * Worth keeping even though both axes are held: a spectrum exported as
59
+ * transmittance and one exported as absorbance are the same measurement, but
60
+ * only one of the two is what the instrument actually recorded, and the other
61
+ * carries whatever the conversion did to its noise.
62
+ * @default undefined
63
+ */
64
+ recorded?: IrMode;
65
+ }
66
+
67
+ /** One row of the acquisition table. */
68
+ export interface IrMetaField {
69
+ /** How the row is named, in the display order the table fixes. */
70
+ label: string;
71
+ /** The value as the file states it. */
72
+ value: string;
73
+ }
74
+
75
+ /**
76
+ * What the file says about how the spectrum was acquired.
77
+ *
78
+ * Only ever what it actually says: a field the file leaves blank is left out
79
+ * rather than shown empty, so the table is short and every line in it is a fact.
80
+ * A plain two-column paste carries none of this, and the panel then shows the
81
+ * file name alone.
82
+ */
83
+ export interface IrMeta {
84
+ /** The title record, `null` when the file carries none. */
85
+ title: string | null;
86
+ /** The fields that are populated, in display order. */
87
+ fields: IrMetaField[];
88
+ }
89
+
90
+ /** Which value axis is being drawn and read. */
91
+ export type IrMode = 'absorbance' | 'transmittance';
92
+
93
+ /** One spectrum as the viewer holds it. */
94
+ export interface IrSpectrum {
95
+ /** Identity, stable across edits so a selection survives a rename. */
96
+ id: string;
97
+ /** What the list calls it; editable, and never used as identity. */
98
+ name: string;
99
+ /** The colour it is drawn in. */
100
+ color: string;
101
+ /**
102
+ * The wavenumbers in cm⁻¹, **ascending**.
103
+ *
104
+ * Ascending even though the axis is read from 4000 down to 400: which way the
105
+ * numbers run on screen is the chart's business, and every binary search and
106
+ * every extent taken off index zero downstream wants them in order. Reversing
107
+ * the data instead would make the drawing simpler once and everything else
108
+ * wrong.
109
+ */
110
+ wavenumber: Float64Array;
111
+ /** Absorbance at each wavenumber, as `ir-spectrum` supplied it. */
112
+ absorbance: Float64Array;
113
+ /** Percent transmittance at each wavenumber, likewise. */
114
+ transmittance: Float64Array;
115
+ /** What the file said about the acquisition, `null` when it said nothing. */
116
+ meta: IrMeta | null;
117
+ /** Where it came from. */
118
+ origin: IrOrigin;
119
+ /** Whether it is drawn. */
120
+ visible: boolean;
121
+ /**
122
+ * Whether the trace is left out of the automatic domain. A reference held
123
+ * under the pointer for comparison must not move the axes, or hovering one
124
+ * would throw away the zoom the user set.
125
+ * @default false
126
+ */
127
+ excludeFromDomain?: boolean;
128
+ }
129
+
130
+ /**
131
+ * The window the chart is showing, in data units.
132
+ *
133
+ * `ChartDomain` itself, not a type of our own: the arithmetic that moves a
134
+ * window is the shared chart's and speaks that type, and an alias here
135
+ * that merely renamed it would need converting at every call. `x` is in
136
+ * wavenumbers and runs low to high, whichever way round the axis is drawn.
137
+ */
138
+ export type IrDomain = ChartDomain;
139
+
140
+ /**
141
+ * The trace to draw for a spectrum, in whichever value axis is being read.
142
+ *
143
+ * The arrays are handed back by reference rather than copied: nothing downstream
144
+ * writes into a trace, and a profile of a few thousand points copied on every
145
+ * render of every spectrum is a copy per frame for no gain.
146
+ * @param spectrum - The spectrum.
147
+ * @param mode - Which value axis is being drawn.
148
+ * @returns The trace, sharing the spectrum's own arrays.
149
+ */
150
+ export function traceOf(spectrum: IrSpectrum, mode: IrMode): IrTrace {
151
+ return {
152
+ x: spectrum.wavenumber,
153
+ y: mode === 'absorbance' ? spectrum.absorbance : spectrum.transmittance,
154
+ };
155
+ }
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Everything the viewer knows, in the three buckets NMRium splits its own into
3
+ * — the same three the mass viewer holds, under the same names.
4
+ *
5
+ * The split is the persistence boundary as much as anything: `data` is the
6
+ * document, `view` is where you are in it and lasts as long as the session, and
7
+ * `settings` is the workspace, which is how every spectrum is drawn whichever
8
+ * ones happen to be open.
9
+ *
10
+ * The bands are **not** in here. They are derived from the spectra and the
11
+ * picking settings, so holding them would mean holding an answer that has to be
12
+ * kept in step with its own inputs — `useIrEditor` recomputes them instead, and
13
+ * a stale band is then impossible rather than merely unlikely.
14
+ */
15
+
16
+ import type { IrSidePanelId } from './irSidePanels.ts';
17
+ import type { IrDomain, IrMode, IrSpectrum } from './irSpectrum.ts';
18
+ import type { PickBandsOptions } from './pickBands.ts';
19
+
20
+ /** The document: what a file holds. */
21
+ export interface IrData {
22
+ /** The spectra, in the order they were loaded. */
23
+ spectra: IrSpectrum[];
24
+ }
25
+
26
+ /** What a drag across the chart is for while it is chosen. */
27
+ export type IrTool = 'read' | 'box';
28
+
29
+ /** Where you are in the viewer. */
30
+ export interface IrView {
31
+ /** Identity of the spectrum the panels act on, `null` for none. */
32
+ selectedId: string | null;
33
+ /**
34
+ * The window being shown, `null` while the chart is showing what fits.
35
+ *
36
+ * Held here so that a toolbar button can zoom — the chart is told a window and
37
+ * reports every window it arrives at, and this is where the answer lives
38
+ * between the two.
39
+ */
40
+ domain: IrDomain | null;
41
+ /** Which tool a drag across the chart is running. */
42
+ tool: IrTool;
43
+ /** The side panels that are open, in the order their icons are stacked. */
44
+ openPanelIds: IrSidePanelId[];
45
+ /** Why the last action was refused, `null` as soon as one succeeds. */
46
+ error: string | null;
47
+ }
48
+
49
+ /** The workspace: how every spectrum is drawn, whichever ones are open. */
50
+ export interface IrSettings {
51
+ /** Which value axis the spectra are read in. */
52
+ mode: IrMode;
53
+ /** Whether the bands are picked at all. */
54
+ pickBands: boolean;
55
+ /** How the bands are picked when they are. */
56
+ picking: PickBandsOptions;
57
+ /** Whether a band's label names its assignment as well as its wavenumber. */
58
+ showAssignments: boolean;
59
+ /** At most how many bands are labelled on the chart. */
60
+ labelLimit: number;
61
+ /** How far outside a table range a band may fall and still be offered it. */
62
+ assignmentTolerance: number;
63
+ }
64
+
65
+ /** Everything the viewer knows. */
66
+ export interface IrState {
67
+ /** The spectra that are open. */
68
+ data: IrData;
69
+ /** Where you are in the viewer. */
70
+ view: IrView;
71
+ /** How spectra are drawn and read. */
72
+ settings: IrSettings;
73
+ }
74
+
75
+ /** Part of a state, as a host restoring one supplies it. */
76
+ export interface PartialIrState {
77
+ /** The spectra that were open. */
78
+ data?: IrData;
79
+ /** Where the viewer was left. */
80
+ view?: Partial<IrView>;
81
+ /** The workspace they were drawn in. */
82
+ settings?: Partial<IrSettings>;
83
+ }
84
+
85
+ /** The panel the splitter brings back when it is dragged open on nothing. */
86
+ export const DEFAULT_SIDE_PANEL: IrSidePanelId = 'spectra';
87
+
88
+ /**
89
+ * The panels a fresh viewer opens with.
90
+ *
91
+ * The band table, because it is the reason to open an infrared spectrum at all
92
+ * — a trace on its own can be looked at, and it is the table beside it that lets
93
+ * it be read.
94
+ */
95
+ export const DEFAULT_SIDE_PANELS: IrSidePanelId[] = ['spectra', 'bands'];
96
+
97
+ /** At most how many bands a gesture may ask to have labelled. */
98
+ export const MAXIMUM_LABEL_LIMIT = 200;
99
+
100
+ /** How many are labelled to begin with. */
101
+ export const DEFAULT_LABEL_LIMIT = 12;
102
+
103
+ /** How the bands are picked before anybody adjusts it. */
104
+ export const DEFAULT_PICKING: PickBandsOptions = {
105
+ minRelativeHeight: 0.02,
106
+ minPeakWidth: 4,
107
+ };
108
+
109
+ /** The workspace a fresh viewer starts from. */
110
+ export const DEFAULT_SETTINGS: IrSettings = {
111
+ mode: 'transmittance',
112
+ pickBands: true,
113
+ picking: DEFAULT_PICKING,
114
+ showAssignments: false,
115
+ labelLimit: DEFAULT_LABEL_LIMIT,
116
+ assignmentTolerance: 5,
117
+ };
118
+
119
+ /**
120
+ * Fold a change into the workspace, refusing what no chart survives.
121
+ *
122
+ * A number typed into a field arrives here as `NaN` for every keystroke that is
123
+ * not yet a number — a lone minus sign, an empty box — and a limit of `NaN`
124
+ * silently stops every label being drawn. So each is checked, and the current
125
+ * value is kept where the new one is unusable rather than the field being
126
+ * fought with while it is being typed in.
127
+ * @param current - The workspace in force.
128
+ * @param change - What to change about it.
129
+ * @returns The new workspace.
130
+ */
131
+ export function mergeIrSettings(
132
+ current: IrSettings,
133
+ change: Partial<IrSettings> = {},
134
+ ): IrSettings {
135
+ const asked = change.labelLimit ?? current.labelLimit;
136
+ const tolerance = change.assignmentTolerance ?? current.assignmentTolerance;
137
+ return {
138
+ ...current,
139
+ ...change,
140
+ picking: { ...current.picking, ...change.picking },
141
+ labelLimit: Number.isFinite(asked)
142
+ ? Math.min(MAXIMUM_LABEL_LIMIT, Math.max(0, Math.round(asked)))
143
+ : current.labelLimit,
144
+ assignmentTolerance:
145
+ Number.isFinite(tolerance) && tolerance >= 0
146
+ ? tolerance
147
+ : current.assignmentTolerance,
148
+ };
149
+ }
150
+
151
+ /**
152
+ * Whether a window is one a chart can be built on.
153
+ *
154
+ * Both ends finite and the low one below the high one. A window failing either
155
+ * makes every scale built from it infinite, which the DOM refuses outright — so
156
+ * a handle told to frame a band it worked out wrongly leaves the chart alone
157
+ * instead of blanking it.
158
+ * @param domain - The window to check.
159
+ * @returns Whether it can be shown.
160
+ */
161
+ export function isIrWindow(domain: IrDomain): boolean {
162
+ return isWindow(domain.x) && isWindow(domain.y);
163
+ }
164
+
165
+ /**
166
+ * Whether one axis of a window runs from somewhere to somewhere else.
167
+ * @param bounds - `[from, to]` on that axis.
168
+ * @returns Whether it is usable.
169
+ */
170
+ function isWindow(bounds: [number, number]): boolean {
171
+ const [from, to] = bounds;
172
+ return Number.isFinite(from) && Number.isFinite(to) && from < to;
173
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * One entry point for whatever was dropped, opened or pasted.
3
+ *
4
+ * The format is decided from the bytes and the right reader is called, so a
5
+ * caller hands over a file and gets spectra back without knowing what it turned
6
+ * out to be. Each reader is imported only once the bytes turn out to need it, so
7
+ * a page that never opens an SPC never downloads its parser.
8
+ */
9
+
10
+ import { describeSource } from '../../error/core/index.ts';
11
+
12
+ import type { LoadedIrSpectrum } from './analysisSpectra.ts';
13
+ import { detectIrFormat } from './detectIrFormat.ts';
14
+ import type { IrOrigin } from './irSpectrum.ts';
15
+
16
+ /** How a file is read. */
17
+ export interface LoadIrSpectraOptions {
18
+ /**
19
+ * The file's name, which decides the reader when the content is silent and is
20
+ * carried onto every spectrum read out of it.
21
+ * @default undefined
22
+ */
23
+ fileName?: string;
24
+ }
25
+
26
+ /** What a file turned out to hold. */
27
+ export interface LoadIrSpectraResult {
28
+ /** The spectra it held, in the order the file wrote them. */
29
+ spectra: LoadedIrSpectrum[];
30
+ /** What it turned out to be. */
31
+ format: IrOrigin['format'];
32
+ }
33
+
34
+ /**
35
+ * Read every infrared spectrum a file holds.
36
+ * @param data - The file, as bytes, or the pasted text.
37
+ * @param options - The file's name.
38
+ * @returns The spectra, and the format they were read from.
39
+ * @throws {Error} When nothing in the file names a format this can read, or when
40
+ * the reader for that format gave up on it.
41
+ */
42
+ export async function loadIrSpectra(
43
+ data: Uint8Array | string,
44
+ options: LoadIrSpectraOptions = {},
45
+ ): Promise<LoadIrSpectraResult> {
46
+ const { fileName } = options;
47
+ const format = detectIrFormat(data, fileName);
48
+
49
+ if (format === 'jcamp') {
50
+ const { fromJcamp } = await import('./fromJcamp.ts');
51
+ return { spectra: fromJcamp(data, options), format };
52
+ }
53
+
54
+ if (format === 'spc') {
55
+ if (typeof data === 'string') {
56
+ throw new Error(
57
+ `${describeSource(fileName)} looks like an SPC file but arrived as text — SPC is binary, and reading it as text loses bytes it cannot get back.`,
58
+ );
59
+ }
60
+ const { fromSpc } = await import('./fromSpc.ts');
61
+ return { spectra: fromSpc(data, options), format };
62
+ }
63
+
64
+ if (format === 'text') {
65
+ // Deliberately refused rather than half-read. `ir-spectrum` adds the
66
+ // absorbance and transmittance pair to everything `fromJcamp` and `fromSPC`
67
+ // produce, but not to `fromText`, so a two-column file arrives carrying only
68
+ // the axis it was written in. Deriving the other one here would put a second
69
+ // implementation of that conversion in this package, which is exactly what
70
+ // depending on `ir-spectrum` is meant to avoid.
71
+ throw new Error(
72
+ `${describeSource(fileName)} is two columns of numbers, which this viewer cannot read yet: ir-spectrum derives the absorbance and transmittance pair for JCAMP-DX and SPC but not for plain text, and this package deliberately does not do that conversion itself. Export the spectrum as JCAMP-DX (.jdx) instead.`,
73
+ );
74
+ }
75
+
76
+ throw new Error(
77
+ `${describeSource(fileName)} is not a spectrum this viewer can read — JCAMP-DX (.jdx, .dx) and Thermo Galactic SPC (.spc) are understood.`,
78
+ );
79
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Which band the pointer is asking about.
3
+ *
4
+ * Found in pixels rather than in wavenumbers, because what a user means by
5
+ * "that band" is what is under the pointer on screen: at a full-scan zoom two
6
+ * bands thirty wavenumbers apart are three pixels apart and either will do,
7
+ * while at a deep zoom the same thirty wavenumbers is half the plot and only one
8
+ * of them is being pointed at.
9
+ */
10
+
11
+ import type { ChartScale } from '../../chart/core/chartScale.ts';
12
+ import { chartPixel } from '../../chart/core/chartScale.ts';
13
+
14
+ import type { IrBand } from './irBand.ts';
15
+
16
+ /**
17
+ * How close the pointer has to be to a band, in pixels.
18
+ *
19
+ * Eight is about a fingertip's worth of aim on a trackpad. Wider and the readout
20
+ * claims a band while the pointer is plainly on the baseline beside it; narrower
21
+ * and a band has to be hit exactly, which on a dense fingerprint region is not
22
+ * a gesture anyone can make.
23
+ */
24
+ export const BAND_HIT_RADIUS = 8;
25
+
26
+ /**
27
+ * The band nearest a place on the axis, when one is within reach.
28
+ *
29
+ * A plain scan rather than a binary search: a spectrum is picked down to a few
30
+ * dozen bands, so the whole list is shorter than the setup a search would need,
31
+ * and it stays correct if the bands ever arrive in another order.
32
+ * @param bands - The bands of every spectrum currently drawn.
33
+ * @param xScale - The wavenumber axis as it is currently zoomed, which may run
34
+ * either way round.
35
+ * @param pixelX - Where the pointer is, in user units of the SVG.
36
+ * @param radius - How close it has to be. Defaults to `BAND_HIT_RADIUS`.
37
+ * @returns The band, or `null` when none is within reach.
38
+ */
39
+ export function nearestBandAt(
40
+ bands: readonly IrBand[],
41
+ xScale: ChartScale,
42
+ pixelX: number,
43
+ radius = BAND_HIT_RADIUS,
44
+ ): IrBand | null {
45
+ let found: IrBand | null = null;
46
+ let bestDistance = radius;
47
+ for (const band of bands) {
48
+ const distance = Math.abs(chartPixel(xScale, band.wavenumber) - pixelX);
49
+ // Strictly nearer, so the first of two bands at one wavenumber wins and the
50
+ // answer does not flicker between them as the pointer rests still.
51
+ if (distance < bestDistance) {
52
+ bestDistance = distance;
53
+ found = band;
54
+ }
55
+ }
56
+ return found;
57
+ }
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Finding the bands in a spectrum, which `ir-spectrum` does.
3
+ *
4
+ * Everything here is the two things that call needs and does not have: a
5
+ * `MeasurementXY` built out of the arrays the viewer holds, and the decision to
6
+ * pick on **absorbance** rather than on transmittance. That second one is the
7
+ * only judgement in the file and it is not a preference — peak picking finds
8
+ * maxima, and a band is a maximum in absorbance but a *minimum* in transmittance,
9
+ * so picking on transmittance would return the flat baseline between the bands
10
+ * and miss every band there is.
11
+ */
12
+
13
+ import type { MeasurementXY } from 'cheminfo-types';
14
+ import { autoPeakPicking } from 'ir-spectrum';
15
+ import { xMaxValue, xMinValue } from 'ml-spectra-processing';
16
+
17
+ import type { IrBand, IrBandStrength } from './irBand.ts';
18
+ import type { IrSpectrum } from './irSpectrum.ts';
19
+
20
+ /** How the bands are picked. */
21
+ export interface PickBandsOptions {
22
+ /**
23
+ * Lowest wavenumber to pick in, in cm⁻¹.
24
+ * @default the start of the spectrum
25
+ */
26
+ from?: number;
27
+ /**
28
+ * Highest wavenumber to pick in, in cm⁻¹.
29
+ * @default the end of the spectrum
30
+ */
31
+ to?: number;
32
+ /**
33
+ * How tall a band must be against the tallest one to count, as a fraction.
34
+ *
35
+ * Two percent by default, which on a real ATR spectrum is a little above the
36
+ * noise and a long way below any band worth naming. Lowered, the fingerprint
37
+ * region fills with shoulders that have no assignment; raised past about a
38
+ * tenth, weak but diagnostic bands — a nitrile, an alkyne — stop being found.
39
+ * @default 0.02
40
+ */
41
+ minRelativeHeight?: number;
42
+ /**
43
+ * Narrowest band to keep, in cm⁻¹.
44
+ *
45
+ * A spike one point wide is a detector glitch rather than a vibration: real
46
+ * infrared bands are several wavenumbers across even at their sharpest.
47
+ * @default 4
48
+ */
49
+ minPeakWidth?: number;
50
+ /**
51
+ * At most how many bands to keep, the strongest first.
52
+ * @default every band found
53
+ */
54
+ limit?: number;
55
+ }
56
+
57
+ /**
58
+ * Pick the bands of one spectrum.
59
+ *
60
+ * The bands come back in ascending wavenumber, which is the order a spectrum is
61
+ * read in rather than the order they were found — `limit` cuts by height, and
62
+ * then what survives is put back in axis order, so a table of them reads like
63
+ * the chart.
64
+ *
65
+ * **A band centre is a sampled point, not an interpolated one.** `ir-spectrum`
66
+ * reports each picked band at the wavenumber of the sample it peaked on, so on a
67
+ * bench instrument's 4 cm⁻¹ grid a carbonyl centred at 1710 is reported at 1708
68
+ * or 1712. That is within the tolerance the assignment table is matched with, and
69
+ * refining it here would mean re-deriving a peak position this package has
70
+ * deliberately delegated — but it is why a band should never be quoted as though
71
+ * it were measured to the wavenumber.
72
+ * @param spectrum - The spectrum to pick from.
73
+ * @param options - Where to pick, and what to keep.
74
+ * @returns The bands, ascending by wavenumber.
75
+ */
76
+ export function pickBands(
77
+ spectrum: IrSpectrum,
78
+ options: PickBandsOptions = {},
79
+ ): IrBand[] {
80
+ const {
81
+ from,
82
+ to,
83
+ minRelativeHeight = 0.02,
84
+ minPeakWidth = 4,
85
+ limit,
86
+ } = options;
87
+ if (spectrum.wavenumber.length < 2) return [];
88
+
89
+ const picked = autoPeakPicking(measurementOf(spectrum), {
90
+ // Absorbance, because a band is a maximum there and a minimum in the other.
91
+ yVariable: 'a',
92
+ minMaxRatio: minRelativeHeight,
93
+ minPeakWidth,
94
+ ...(from === undefined ? {} : { from }),
95
+ ...(to === undefined ? {} : { to }),
96
+ });
97
+
98
+ const bands: IrBand[] = [];
99
+ for (const peak of picked) {
100
+ if (!Number.isFinite(peak.wavenumber)) continue;
101
+ bands.push({
102
+ spectrumId: spectrum.id,
103
+ wavenumber: peak.wavenumber,
104
+ absorbance: peak.absorbance,
105
+ // `ConvertedPeak.transmittance` is a fraction where the spectrum's own
106
+ // transmittance is a percentage; brought onto the one scale here so that
107
+ // nothing downstream has to remember which of the two it is holding.
108
+ transmittance: peak.transmittance * 100,
109
+ strength: peak.kind as IrBandStrength,
110
+ });
111
+ }
112
+
113
+ const kept =
114
+ limit === undefined || bands.length <= limit
115
+ ? bands
116
+ : bands.toSorted(byDescendingAbsorbance).slice(0, limit);
117
+ return kept.toSorted(byAscendingWavenumber);
118
+ }
119
+
120
+ /**
121
+ * The spectrum as `ir-spectrum` wants it.
122
+ *
123
+ * The `t` variable is given its extremes, because that is what the strength
124
+ * letter is worked out from: without them the conversion assumes a spectrum
125
+ * running the full 0 to 100 percent, and every band of a shallow ATR trace that
126
+ * never leaves the eighties comes back weak.
127
+ * @param spectrum - The spectrum the viewer holds.
128
+ * @returns A measurement carrying all three variables.
129
+ */
130
+ function measurementOf(spectrum: IrSpectrum): MeasurementXY {
131
+ const transmittance = {
132
+ label: 'Transmittance (%)',
133
+ units: '%',
134
+ symbol: 't' as const,
135
+ data: spectrum.transmittance,
136
+ min: xMinValue(spectrum.transmittance),
137
+ max: xMaxValue(spectrum.transmittance),
138
+ };
139
+ return {
140
+ variables: {
141
+ x: {
142
+ label: 'Wavenumber',
143
+ units: '1/cm',
144
+ symbol: 'x',
145
+ data: spectrum.wavenumber,
146
+ },
147
+ // `y` is required of every measurement, and stands for whichever axis was
148
+ // recorded. Nothing here reads it — the picking is told to use `a` and the
149
+ // strength letter is read off `t` — so it carries the transmittance rather
150
+ // than a third copy of anything.
151
+ y: transmittance,
152
+ a: {
153
+ label: 'Absorbance',
154
+ units: '',
155
+ symbol: 'a',
156
+ data: spectrum.absorbance,
157
+ },
158
+ t: transmittance,
159
+ },
160
+ };
161
+ }
162
+
163
+ /**
164
+ * Order two bands by height, tallest first.
165
+ * @param first - One band.
166
+ * @param second - The other.
167
+ * @returns The comparison.
168
+ */
169
+ function byDescendingAbsorbance(first: IrBand, second: IrBand): number {
170
+ return second.absorbance - first.absorbance;
171
+ }
172
+
173
+ /**
174
+ * Order two bands along the axis, lowest wavenumber first.
175
+ * @param first - One band.
176
+ * @param second - The other.
177
+ * @returns The comparison.
178
+ */
179
+ function byAscendingWavenumber(first: IrBand, second: IrBand): number {
180
+ return first.wavenumber - second.wavenumber;
181
+ }