react-cheminfo 0.27.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 (696) 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/clipboard/ui/CopyableValue.d.ts +12 -9
  159. package/lib/clipboard/ui/CopyableValue.d.ts.map +1 -1
  160. package/lib/clipboard/ui/CopyableValue.js +11 -15
  161. package/lib/clipboard/ui/CopyableValue.js.map +1 -1
  162. package/lib/core.d.ts +1 -0
  163. package/lib/core.d.ts.map +1 -1
  164. package/lib/core.js +1 -0
  165. package/lib/core.js.map +1 -1
  166. package/lib/download/core/exportStyles.d.ts +22 -0
  167. package/lib/download/core/exportStyles.d.ts.map +1 -0
  168. package/lib/download/core/exportStyles.js +19 -0
  169. package/lib/download/core/exportStyles.js.map +1 -0
  170. package/lib/download/core/imageResolution.d.ts +88 -0
  171. package/lib/download/core/imageResolution.d.ts.map +1 -0
  172. package/lib/download/core/imageResolution.js +77 -0
  173. package/lib/download/core/imageResolution.js.map +1 -0
  174. package/lib/download/core/index.d.ts +13 -0
  175. package/lib/download/core/index.d.ts.map +1 -1
  176. package/lib/download/core/index.js +8 -0
  177. package/lib/download/core/index.js.map +1 -1
  178. package/lib/download/core/pictureExport.d.ts +93 -0
  179. package/lib/download/core/pictureExport.d.ts.map +1 -0
  180. package/lib/download/core/pictureExport.js +116 -0
  181. package/lib/download/core/pictureExport.js.map +1 -0
  182. package/lib/download/core/stackedDrawing.d.ts +36 -0
  183. package/lib/download/core/stackedDrawing.d.ts.map +1 -0
  184. package/lib/download/core/stackedDrawing.js +98 -0
  185. package/lib/download/core/stackedDrawing.js.map +1 -0
  186. package/lib/download/core/svgBounds.d.ts +44 -0
  187. package/lib/download/core/svgBounds.d.ts.map +1 -0
  188. package/lib/download/core/svgBounds.js +69 -0
  189. package/lib/download/core/svgBounds.js.map +1 -0
  190. package/lib/download/core/svgNamespace.d.ts +9 -0
  191. package/lib/download/core/svgNamespace.d.ts.map +1 -0
  192. package/lib/download/core/svgNamespace.js +10 -0
  193. package/lib/download/core/svgNamespace.js.map +1 -0
  194. package/lib/download/core/svgToPng.d.ts +43 -0
  195. package/lib/download/core/svgToPng.d.ts.map +1 -0
  196. package/lib/download/core/svgToPng.js +79 -0
  197. package/lib/download/core/svgToPng.js.map +1 -0
  198. package/lib/download/core/svgToString.d.ts +45 -0
  199. package/lib/download/core/svgToString.d.ts.map +1 -0
  200. package/lib/download/core/svgToString.js +58 -0
  201. package/lib/download/core/svgToString.js.map +1 -0
  202. package/lib/download/ui/ExportDialogFrame.d.ts +46 -0
  203. package/lib/download/ui/ExportDialogFrame.d.ts.map +1 -0
  204. package/lib/download/ui/ExportDialogFrame.js +24 -0
  205. package/lib/download/ui/ExportDialogFrame.js.map +1 -0
  206. package/lib/download/ui/ExportImageDialog.d.ts +47 -0
  207. package/lib/download/ui/ExportImageDialog.d.ts.map +1 -0
  208. package/lib/download/ui/ExportImageDialog.js +25 -0
  209. package/lib/download/ui/ExportImageDialog.js.map +1 -0
  210. package/lib/download/ui/ExportNameField.d.ts +29 -0
  211. package/lib/download/ui/ExportNameField.d.ts.map +1 -0
  212. package/lib/download/ui/ExportNameField.js +99 -0
  213. package/lib/download/ui/ExportNameField.js.map +1 -0
  214. package/lib/download/ui/ExportPictureSection.d.ts +38 -0
  215. package/lib/download/ui/ExportPictureSection.d.ts.map +1 -0
  216. package/lib/download/ui/ExportPictureSection.js +48 -0
  217. package/lib/download/ui/ExportPictureSection.js.map +1 -0
  218. package/lib/download/ui/index.d.ts +10 -0
  219. package/lib/download/ui/index.d.ts.map +1 -1
  220. package/lib/download/ui/index.js +5 -0
  221. package/lib/download/ui/index.js.map +1 -1
  222. package/lib/download/ui/useDrawingBox.d.ts +23 -0
  223. package/lib/download/ui/useDrawingBox.d.ts.map +1 -0
  224. package/lib/download/ui/useDrawingBox.js +21 -0
  225. package/lib/download/ui/useDrawingBox.js.map +1 -0
  226. package/lib/error/core/describeSource.d.ts +17 -0
  227. package/lib/error/core/describeSource.d.ts.map +1 -0
  228. package/lib/error/core/describeSource.js +19 -0
  229. package/lib/error/core/describeSource.js.map +1 -0
  230. package/lib/error/core/index.d.ts +1 -0
  231. package/lib/error/core/index.d.ts.map +1 -1
  232. package/lib/error/core/index.js +1 -0
  233. package/lib/error/core/index.js.map +1 -1
  234. package/lib/help/ui/HelpBody.d.ts +10 -1
  235. package/lib/help/ui/HelpBody.d.ts.map +1 -1
  236. package/lib/help/ui/HelpBody.js +24 -1
  237. package/lib/help/ui/HelpBody.js.map +1 -1
  238. package/lib/help/ui/index.d.ts +1 -1
  239. package/lib/help/ui/index.d.ts.map +1 -1
  240. package/lib/help/ui/index.js.map +1 -1
  241. package/lib/ir/core/analysisSpectra.d.ts +46 -0
  242. package/lib/ir/core/analysisSpectra.d.ts.map +1 -0
  243. package/lib/ir/core/analysisSpectra.js +187 -0
  244. package/lib/ir/core/analysisSpectra.js.map +1 -0
  245. package/lib/ir/core/assignBands.d.ts +83 -0
  246. package/lib/ir/core/assignBands.d.ts.map +1 -0
  247. package/lib/ir/core/assignBands.js +83 -0
  248. package/lib/ir/core/assignBands.js.map +1 -0
  249. package/lib/ir/core/bandAssignments.d.ts +47 -0
  250. package/lib/ir/core/bandAssignments.d.ts.map +1 -0
  251. package/lib/ir/core/bandAssignments.js +305 -0
  252. package/lib/ir/core/bandAssignments.js.map +1 -0
  253. package/lib/ir/core/bandLabelPlan.d.ts +93 -0
  254. package/lib/ir/core/bandLabelPlan.d.ts.map +1 -0
  255. package/lib/ir/core/bandLabelPlan.js +104 -0
  256. package/lib/ir/core/bandLabelPlan.js.map +1 -0
  257. package/lib/ir/core/detectIrFormat.d.ts +23 -0
  258. package/lib/ir/core/detectIrFormat.d.ts.map +1 -0
  259. package/lib/ir/core/detectIrFormat.js +133 -0
  260. package/lib/ir/core/detectIrFormat.js.map +1 -0
  261. package/lib/ir/core/downloadSpectra.d.ts +26 -0
  262. package/lib/ir/core/downloadSpectra.d.ts.map +1 -0
  263. package/lib/ir/core/downloadSpectra.js +37 -0
  264. package/lib/ir/core/downloadSpectra.js.map +1 -0
  265. package/lib/ir/core/fromJcamp.d.ts +35 -0
  266. package/lib/ir/core/fromJcamp.d.ts.map +1 -0
  267. package/lib/ir/core/fromJcamp.js +48 -0
  268. package/lib/ir/core/fromJcamp.js.map +1 -0
  269. package/lib/ir/core/fromSpc.d.ts +30 -0
  270. package/lib/ir/core/fromSpc.d.ts.map +1 -0
  271. package/lib/ir/core/fromSpc.js +40 -0
  272. package/lib/ir/core/fromSpc.js.map +1 -0
  273. package/lib/ir/core/index.d.ts +51 -0
  274. package/lib/ir/core/index.d.ts.map +1 -0
  275. package/lib/ir/core/index.js +35 -0
  276. package/lib/ir/core/index.js.map +1 -0
  277. package/lib/ir/core/irBand.d.ts +45 -0
  278. package/lib/ir/core/irBand.d.ts.map +1 -0
  279. package/lib/ir/core/irBand.js +30 -0
  280. package/lib/ir/core/irBand.js.map +1 -0
  281. package/lib/ir/core/irCommands.d.ts +168 -0
  282. package/lib/ir/core/irCommands.d.ts.map +1 -0
  283. package/lib/ir/core/irCommands.js +94 -0
  284. package/lib/ir/core/irCommands.js.map +1 -0
  285. package/lib/ir/core/irDomain.d.ts +63 -0
  286. package/lib/ir/core/irDomain.d.ts.map +1 -0
  287. package/lib/ir/core/irDomain.js +136 -0
  288. package/lib/ir/core/irDomain.js.map +1 -0
  289. package/lib/ir/core/irEditorApi.d.ts +42 -0
  290. package/lib/ir/core/irEditorApi.d.ts.map +1 -0
  291. package/lib/ir/core/irEditorApi.js +10 -0
  292. package/lib/ir/core/irEditorApi.js.map +1 -0
  293. package/lib/ir/core/irFormat.d.ts +42 -0
  294. package/lib/ir/core/irFormat.d.ts.map +1 -0
  295. package/lib/ir/core/irFormat.js +51 -0
  296. package/lib/ir/core/irFormat.js.map +1 -0
  297. package/lib/ir/core/irMode.d.ts +160 -0
  298. package/lib/ir/core/irMode.d.ts.map +1 -0
  299. package/lib/ir/core/irMode.js +175 -0
  300. package/lib/ir/core/irMode.js.map +1 -0
  301. package/lib/ir/core/irReducer.d.ts +101 -0
  302. package/lib/ir/core/irReducer.d.ts.map +1 -0
  303. package/lib/ir/core/irReducer.js +207 -0
  304. package/lib/ir/core/irReducer.js.map +1 -0
  305. package/lib/ir/core/irSidePanels.d.ts +22 -0
  306. package/lib/ir/core/irSidePanels.d.ts.map +1 -0
  307. package/lib/ir/core/irSidePanels.js +12 -0
  308. package/lib/ir/core/irSidePanels.js.map +1 -0
  309. package/lib/ir/core/irSpectrum.d.ts +140 -0
  310. package/lib/ir/core/irSpectrum.d.ts.map +1 -0
  311. package/lib/ir/core/irSpectrum.js +34 -0
  312. package/lib/ir/core/irSpectrum.js.map +1 -0
  313. package/lib/ir/core/irState.d.ts +119 -0
  314. package/lib/ir/core/irState.d.ts.map +1 -0
  315. package/lib/ir/core/irState.js +92 -0
  316. package/lib/ir/core/irState.js.map +1 -0
  317. package/lib/ir/core/loadIrSpectra.d.ts +36 -0
  318. package/lib/ir/core/loadIrSpectra.d.ts.map +1 -0
  319. package/lib/ir/core/loadIrSpectra.js +44 -0
  320. package/lib/ir/core/loadIrSpectra.js.map +1 -0
  321. package/lib/ir/core/nearestBand.d.ts +35 -0
  322. package/lib/ir/core/nearestBand.d.ts.map +1 -0
  323. package/lib/ir/core/nearestBand.js +47 -0
  324. package/lib/ir/core/nearestBand.js.map +1 -0
  325. package/lib/ir/core/pickBands.d.ts +70 -0
  326. package/lib/ir/core/pickBands.d.ts.map +1 -0
  327. package/lib/ir/core/pickBands.js +125 -0
  328. package/lib/ir/core/pickBands.js.map +1 -0
  329. package/lib/ir/core/spectrumJcamp.d.ts +58 -0
  330. package/lib/ir/core/spectrumJcamp.d.ts.map +1 -0
  331. package/lib/ir/core/spectrumJcamp.js +156 -0
  332. package/lib/ir/core/spectrumJcamp.js.map +1 -0
  333. package/lib/ir/core/toIrSpectrum.d.ts +59 -0
  334. package/lib/ir/core/toIrSpectrum.d.ts.map +1 -0
  335. package/lib/ir/core/toIrSpectrum.js +56 -0
  336. package/lib/ir/core/toIrSpectrum.js.map +1 -0
  337. package/lib/ir/ui/BandMarks.d.ts +52 -0
  338. package/lib/ir/ui/BandMarks.d.ts.map +1 -0
  339. package/lib/ir/ui/BandMarks.js +71 -0
  340. package/lib/ir/ui/BandMarks.js.map +1 -0
  341. package/lib/ir/ui/BandsPanel.d.ts +31 -0
  342. package/lib/ir/ui/BandsPanel.d.ts.map +1 -0
  343. package/lib/ir/ui/BandsPanel.js +94 -0
  344. package/lib/ir/ui/BandsPanel.js.map +1 -0
  345. package/lib/ir/ui/IrAboutDialog.d.ts +18 -0
  346. package/lib/ir/ui/IrAboutDialog.d.ts.map +1 -0
  347. package/lib/ir/ui/IrAboutDialog.js +32 -0
  348. package/lib/ir/ui/IrAboutDialog.js.map +1 -0
  349. package/lib/ir/ui/IrCanvas.d.ts +38 -0
  350. package/lib/ir/ui/IrCanvas.d.ts.map +1 -0
  351. package/lib/ir/ui/IrCanvas.js +41 -0
  352. package/lib/ir/ui/IrCanvas.js.map +1 -0
  353. package/lib/ir/ui/IrChart.d.ts +28 -0
  354. package/lib/ir/ui/IrChart.d.ts.map +1 -0
  355. package/lib/ir/ui/IrChart.js +114 -0
  356. package/lib/ir/ui/IrChart.js.map +1 -0
  357. package/lib/ir/ui/IrCommandProvider.d.ts +15 -0
  358. package/lib/ir/ui/IrCommandProvider.d.ts.map +1 -0
  359. package/lib/ir/ui/IrCommandProvider.js +14 -0
  360. package/lib/ir/ui/IrCommandProvider.js.map +1 -0
  361. package/lib/ir/ui/IrCommandTooltip.d.ts +16 -0
  362. package/lib/ir/ui/IrCommandTooltip.d.ts.map +1 -0
  363. package/lib/ir/ui/IrCommandTooltip.js +22 -0
  364. package/lib/ir/ui/IrCommandTooltip.js.map +1 -0
  365. package/lib/ir/ui/IrDocumentationDialog.d.ts +18 -0
  366. package/lib/ir/ui/IrDocumentationDialog.d.ts.map +1 -0
  367. package/lib/ir/ui/IrDocumentationDialog.js +68 -0
  368. package/lib/ir/ui/IrDocumentationDialog.js.map +1 -0
  369. package/lib/ir/ui/IrEditor.d.ts +60 -0
  370. package/lib/ir/ui/IrEditor.d.ts.map +1 -0
  371. package/lib/ir/ui/IrEditor.js +42 -0
  372. package/lib/ir/ui/IrEditor.js.map +1 -0
  373. package/lib/ir/ui/IrHeader.d.ts +13 -0
  374. package/lib/ir/ui/IrHeader.d.ts.map +1 -0
  375. package/lib/ir/ui/IrHeader.js +21 -0
  376. package/lib/ir/ui/IrHeader.js.map +1 -0
  377. package/lib/ir/ui/IrLogo.d.ts +20 -0
  378. package/lib/ir/ui/IrLogo.d.ts.map +1 -0
  379. package/lib/ir/ui/IrLogo.js +17 -0
  380. package/lib/ir/ui/IrLogo.js.map +1 -0
  381. package/lib/ir/ui/IrPointerTracker.d.ts +29 -0
  382. package/lib/ir/ui/IrPointerTracker.d.ts.map +1 -0
  383. package/lib/ir/ui/IrPointerTracker.js +47 -0
  384. package/lib/ir/ui/IrPointerTracker.js.map +1 -0
  385. package/lib/ir/ui/IrShell.d.ts +25 -0
  386. package/lib/ir/ui/IrShell.d.ts.map +1 -0
  387. package/lib/ir/ui/IrShell.js +178 -0
  388. package/lib/ir/ui/IrShell.js.map +1 -0
  389. package/lib/ir/ui/IrSidePanel.d.ts +26 -0
  390. package/lib/ir/ui/IrSidePanel.d.ts.map +1 -0
  391. package/lib/ir/ui/IrSidePanel.js +39 -0
  392. package/lib/ir/ui/IrSidePanel.js.map +1 -0
  393. package/lib/ir/ui/IrStateProvider.d.ts +19 -0
  394. package/lib/ir/ui/IrStateProvider.d.ts.map +1 -0
  395. package/lib/ir/ui/IrStateProvider.js +16 -0
  396. package/lib/ir/ui/IrStateProvider.js.map +1 -0
  397. package/lib/ir/ui/IrStatusBar.d.ts +14 -0
  398. package/lib/ir/ui/IrStatusBar.d.ts.map +1 -0
  399. package/lib/ir/ui/IrStatusBar.js +48 -0
  400. package/lib/ir/ui/IrStatusBar.js.map +1 -0
  401. package/lib/ir/ui/IrToolbar.d.ts +18 -0
  402. package/lib/ir/ui/IrToolbar.d.ts.map +1 -0
  403. package/lib/ir/ui/IrToolbar.js +32 -0
  404. package/lib/ir/ui/IrToolbar.js.map +1 -0
  405. package/lib/ir/ui/IrTraces.d.ts +63 -0
  406. package/lib/ir/ui/IrTraces.d.ts.map +1 -0
  407. package/lib/ir/ui/IrTraces.js +72 -0
  408. package/lib/ir/ui/IrTraces.js.map +1 -0
  409. package/lib/ir/ui/MetadataPanel.d.ts +15 -0
  410. package/lib/ir/ui/MetadataPanel.d.ts.map +1 -0
  411. package/lib/ir/ui/MetadataPanel.js +49 -0
  412. package/lib/ir/ui/MetadataPanel.js.map +1 -0
  413. package/lib/ir/ui/SpectraPanel.d.ts +20 -0
  414. package/lib/ir/ui/SpectraPanel.d.ts.map +1 -0
  415. package/lib/ir/ui/SpectraPanel.js +42 -0
  416. package/lib/ir/ui/SpectraPanel.js.map +1 -0
  417. package/lib/ir/ui/SpectrumRow.d.ts +26 -0
  418. package/lib/ir/ui/SpectrumRow.d.ts.map +1 -0
  419. package/lib/ir/ui/SpectrumRow.js +41 -0
  420. package/lib/ir/ui/SpectrumRow.js.map +1 -0
  421. package/lib/ir/ui/index.d.ts +56 -0
  422. package/lib/ir/ui/index.d.ts.map +1 -0
  423. package/lib/ir/ui/index.js +36 -0
  424. package/lib/ir/ui/index.js.map +1 -0
  425. package/lib/ir/ui/irActions.d.ts +52 -0
  426. package/lib/ir/ui/irActions.d.ts.map +1 -0
  427. package/lib/ir/ui/irActions.js +62 -0
  428. package/lib/ir/ui/irActions.js.map +1 -0
  429. package/lib/ir/ui/irChartProps.d.ts +116 -0
  430. package/lib/ir/ui/irChartProps.d.ts.map +1 -0
  431. package/lib/ir/ui/irChartProps.js +14 -0
  432. package/lib/ir/ui/irChartProps.js.map +1 -0
  433. package/lib/ir/ui/irCommandContext.d.ts +35 -0
  434. package/lib/ir/ui/irCommandContext.d.ts.map +1 -0
  435. package/lib/ir/ui/irCommandContext.js +44 -0
  436. package/lib/ir/ui/irCommandContext.js.map +1 -0
  437. package/lib/ir/ui/irStateContext.d.ts +26 -0
  438. package/lib/ir/ui/irStateContext.d.ts.map +1 -0
  439. package/lib/ir/ui/irStateContext.js +37 -0
  440. package/lib/ir/ui/irStateContext.js.map +1 -0
  441. package/lib/ir/ui/useIrEditor.d.ts +51 -0
  442. package/lib/ir/ui/useIrEditor.d.ts.map +1 -0
  443. package/lib/ir/ui/useIrEditor.js +88 -0
  444. package/lib/ir/ui/useIrEditor.js.map +1 -0
  445. package/lib/ir/ui/useIrPointer.d.ts +66 -0
  446. package/lib/ir/ui/useIrPointer.d.ts.map +1 -0
  447. package/lib/ir/ui/useIrPointer.js +53 -0
  448. package/lib/ir/ui/useIrPointer.js.map +1 -0
  449. package/lib/ir/ui/useIrShortcuts.d.ts +24 -0
  450. package/lib/ir/ui/useIrShortcuts.d.ts.map +1 -0
  451. package/lib/ir/ui/useIrShortcuts.js +73 -0
  452. package/lib/ir/ui/useIrShortcuts.js.map +1 -0
  453. package/lib/ir/ui/useIrZoom.d.ts +51 -0
  454. package/lib/ir/ui/useIrZoom.d.ts.map +1 -0
  455. package/lib/ir/ui/useIrZoom.js +46 -0
  456. package/lib/ir/ui/useIrZoom.js.map +1 -0
  457. package/lib/ir.d.ts +13 -0
  458. package/lib/ir.d.ts.map +1 -0
  459. package/lib/ir.js +13 -0
  460. package/lib/ir.js.map +1 -0
  461. package/lib/panel/core/dialogStyles.d.ts +13 -0
  462. package/lib/panel/core/dialogStyles.d.ts.map +1 -0
  463. package/lib/panel/core/dialogStyles.js +11 -0
  464. package/lib/panel/core/dialogStyles.js.map +1 -0
  465. package/lib/panel/core/index.d.ts +19 -0
  466. package/lib/panel/core/index.d.ts.map +1 -0
  467. package/lib/panel/core/index.js +18 -0
  468. package/lib/panel/core/index.js.map +1 -0
  469. package/lib/panel/core/isEditingField.d.ts +17 -0
  470. package/lib/panel/core/isEditingField.d.ts.map +1 -0
  471. package/lib/panel/core/isEditingField.js +25 -0
  472. package/lib/panel/core/isEditingField.js.map +1 -0
  473. package/lib/panel/core/panelStyles.d.ts +242 -0
  474. package/lib/panel/core/panelStyles.d.ts.map +1 -0
  475. package/lib/panel/core/panelStyles.js +228 -0
  476. package/lib/panel/core/panelStyles.js.map +1 -0
  477. package/lib/panel/core/rowSpacers.d.ts +38 -0
  478. package/lib/panel/core/rowSpacers.d.ts.map +1 -0
  479. package/lib/panel/core/rowSpacers.js +31 -0
  480. package/lib/panel/core/rowSpacers.js.map +1 -0
  481. package/lib/panel/core/statusBar.d.ts +44 -0
  482. package/lib/panel/core/statusBar.d.ts.map +1 -0
  483. package/lib/panel/core/statusBar.js +40 -0
  484. package/lib/panel/core/statusBar.js.map +1 -0
  485. package/lib/panel/core/textFilter.d.ts +22 -0
  486. package/lib/panel/core/textFilter.d.ts.map +1 -0
  487. package/lib/panel/core/textFilter.js +32 -0
  488. package/lib/panel/core/textFilter.js.map +1 -0
  489. package/lib/panel/core/yieldToPainting.d.ts +17 -0
  490. package/lib/panel/core/yieldToPainting.d.ts.map +1 -0
  491. package/lib/panel/core/yieldToPainting.js +21 -0
  492. package/lib/panel/core/yieldToPainting.js.map +1 -0
  493. package/lib/panel/ui/AboutDialogFrame.d.ts +36 -0
  494. package/lib/panel/ui/AboutDialogFrame.d.ts.map +1 -0
  495. package/lib/panel/ui/AboutDialogFrame.js +43 -0
  496. package/lib/panel/ui/AboutDialogFrame.js.map +1 -0
  497. package/lib/panel/ui/ClearButton.d.ts +28 -0
  498. package/lib/panel/ui/ClearButton.d.ts.map +1 -0
  499. package/lib/panel/ui/ClearButton.js +23 -0
  500. package/lib/panel/ui/ClearButton.js.map +1 -0
  501. package/lib/panel/ui/DocumentationDialogFrame.d.ts +39 -0
  502. package/lib/panel/ui/DocumentationDialogFrame.d.ts.map +1 -0
  503. package/lib/panel/ui/DocumentationDialogFrame.js +29 -0
  504. package/lib/panel/ui/DocumentationDialogFrame.js.map +1 -0
  505. package/lib/panel/ui/FilterInput.d.ts +31 -0
  506. package/lib/panel/ui/FilterInput.d.ts.map +1 -0
  507. package/lib/panel/ui/FilterInput.js +23 -0
  508. package/lib/panel/ui/FilterInput.js.map +1 -0
  509. package/lib/panel/ui/HelpLabel.d.ts +24 -0
  510. package/lib/panel/ui/HelpLabel.d.ts.map +1 -0
  511. package/lib/panel/ui/HelpLabel.js +23 -0
  512. package/lib/panel/ui/HelpLabel.js.map +1 -0
  513. package/lib/panel/ui/PanelMessage.d.ts +41 -0
  514. package/lib/panel/ui/PanelMessage.d.ts.map +1 -0
  515. package/lib/panel/ui/PanelMessage.js +30 -0
  516. package/lib/panel/ui/PanelMessage.js.map +1 -0
  517. package/lib/panel/ui/PanelRail.d.ts +41 -0
  518. package/lib/panel/ui/PanelRail.d.ts.map +1 -0
  519. package/lib/panel/ui/PanelRail.js +12 -0
  520. package/lib/panel/ui/PanelRail.js.map +1 -0
  521. package/lib/panel/ui/Section.d.ts +25 -0
  522. package/lib/panel/ui/Section.d.ts.map +1 -0
  523. package/lib/panel/ui/Section.js +41 -0
  524. package/lib/panel/ui/Section.js.map +1 -0
  525. package/lib/panel/ui/SidePanelStack.d.ts +62 -0
  526. package/lib/panel/ui/SidePanelStack.d.ts.map +1 -0
  527. package/lib/panel/ui/SidePanelStack.js +40 -0
  528. package/lib/panel/ui/SidePanelStack.js.map +1 -0
  529. package/lib/panel/ui/SpectrumColorSwatch.d.ts +33 -0
  530. package/lib/panel/ui/SpectrumColorSwatch.d.ts.map +1 -0
  531. package/lib/panel/ui/SpectrumColorSwatch.js +76 -0
  532. package/lib/panel/ui/SpectrumColorSwatch.js.map +1 -0
  533. package/lib/panel/ui/index.d.ts +37 -0
  534. package/lib/panel/ui/index.d.ts.map +1 -0
  535. package/lib/panel/ui/index.js +24 -0
  536. package/lib/panel/ui/index.js.map +1 -0
  537. package/lib/panel/ui/useConfirmOnEnter.d.ts +19 -0
  538. package/lib/panel/ui/useConfirmOnEnter.d.ts.map +1 -0
  539. package/lib/panel/ui/useConfirmOnEnter.js +64 -0
  540. package/lib/panel/ui/useConfirmOnEnter.js.map +1 -0
  541. package/lib/panel/ui/useFilterBox.d.ts +23 -0
  542. package/lib/panel/ui/useFilterBox.d.ts.map +1 -0
  543. package/lib/panel/ui/useFilterBox.js +22 -0
  544. package/lib/panel/ui/useFilterBox.js.map +1 -0
  545. package/lib/panel/ui/useVirtualRows.d.ts +46 -0
  546. package/lib/panel/ui/useVirtualRows.d.ts.map +1 -0
  547. package/lib/panel/ui/useVirtualRows.js +56 -0
  548. package/lib/panel/ui/useVirtualRows.js.map +1 -0
  549. package/lib/panel/ui/useVirtualWindowRows.d.ts +40 -0
  550. package/lib/panel/ui/useVirtualWindowRows.d.ts.map +1 -0
  551. package/lib/panel/ui/useVirtualWindowRows.js +65 -0
  552. package/lib/panel/ui/useVirtualWindowRows.js.map +1 -0
  553. package/lib/ui.d.ts +1 -0
  554. package/lib/ui.d.ts.map +1 -1
  555. package/lib/ui.js +1 -0
  556. package/lib/ui.js.map +1 -1
  557. package/package.json +8 -1
  558. package/src/chart/core/axisLabels.ts +117 -0
  559. package/src/chart/core/boxLayout.ts +126 -0
  560. package/src/chart/core/chartAxisScale.ts +92 -10
  561. package/src/chart/core/chartDomain.ts +185 -0
  562. package/src/chart/core/chartGeometry.ts +159 -0
  563. package/src/chart/core/chartPane.ts +10 -0
  564. package/src/chart/core/chartScale.ts +7 -4
  565. package/src/chart/core/chartTheme.ts +161 -0
  566. package/src/chart/core/chartViewport.ts +40 -13
  567. package/src/chart/core/guidePlacement.ts +66 -0
  568. package/src/chart/core/index.ts +121 -2
  569. package/src/chart/core/labelStack.ts +72 -0
  570. package/src/chart/core/legendBox.ts +263 -0
  571. package/src/chart/core/selectionGeometry.ts +68 -0
  572. package/src/chart/core/spectrumColor.ts +129 -0
  573. package/src/chart/core/stackCapacity.ts +162 -0
  574. package/src/chart/core/svgPoint.ts +77 -0
  575. package/src/chart/core/tracePath.ts +228 -0
  576. package/src/chart/core/trackerReadout.ts +78 -0
  577. package/src/chart/core/viewTransform.ts +287 -0
  578. package/src/chart/core/zoomDomain.ts +235 -0
  579. package/src/chart/ui/Axes.tsx +361 -0
  580. package/src/chart/ui/AxisGuide.tsx +187 -0
  581. package/src/chart/ui/ChartStack.tsx +130 -0
  582. package/src/chart/ui/ChartTracker.tsx +101 -0
  583. package/src/chart/ui/PlotCaption.tsx +108 -0
  584. package/src/chart/ui/SelectionRect.tsx +52 -0
  585. package/src/chart/ui/TraceLegend.tsx +193 -0
  586. package/src/chart/ui/chartGestures.ts +270 -0
  587. package/src/chart/ui/chartStackLevel.tsx +210 -0
  588. package/src/chart/ui/chartSurface.ts +66 -0
  589. package/src/chart/ui/index.ts +35 -0
  590. package/src/chart/ui/useChartPointer.ts +223 -0
  591. package/src/chart/ui/useChartSize.ts +115 -0
  592. package/src/chart/ui/useChartWindow.ts +240 -0
  593. package/src/chart/ui/useChartZoom.ts +255 -0
  594. package/src/chart/ui/useWheelListener.ts +62 -0
  595. package/src/clipboard/core/copyPng.ts +20 -0
  596. package/src/clipboard/core/index.ts +1 -0
  597. package/src/clipboard/ui/CopyableValue.tsx +22 -35
  598. package/src/core.ts +1 -0
  599. package/src/download/core/exportStyles.ts +20 -0
  600. package/src/download/core/imageResolution.ts +118 -0
  601. package/src/download/core/index.ts +34 -0
  602. package/src/download/core/pictureExport.ts +207 -0
  603. package/src/download/core/stackedDrawing.ts +108 -0
  604. package/src/download/core/svgBounds.ts +80 -0
  605. package/src/download/core/svgNamespace.ts +9 -0
  606. package/src/download/core/svgToPng.ts +121 -0
  607. package/src/download/core/svgToString.ts +95 -0
  608. package/src/download/ui/ExportDialogFrame.tsx +86 -0
  609. package/src/download/ui/ExportImageDialog.tsx +91 -0
  610. package/src/download/ui/ExportNameField.tsx +148 -0
  611. package/src/download/ui/ExportPictureSection.tsx +142 -0
  612. package/src/download/ui/index.ts +11 -0
  613. package/src/download/ui/useDrawingBox.ts +37 -0
  614. package/src/error/core/describeSource.ts +18 -0
  615. package/src/error/core/index.ts +1 -0
  616. package/src/help/ui/HelpBody.tsx +41 -2
  617. package/src/help/ui/index.ts +6 -1
  618. package/src/ir/core/analysisSpectra.ts +231 -0
  619. package/src/ir/core/assignBands.ts +144 -0
  620. package/src/ir/core/bandAssignments.ts +329 -0
  621. package/src/ir/core/bandLabelPlan.ts +194 -0
  622. package/src/ir/core/detectIrFormat.ts +139 -0
  623. package/src/ir/core/downloadSpectra.ts +57 -0
  624. package/src/ir/core/fromJcamp.ts +70 -0
  625. package/src/ir/core/fromSpc.ts +61 -0
  626. package/src/ir/core/index.ts +113 -0
  627. package/src/ir/core/irBand.ts +57 -0
  628. package/src/ir/core/irCommands.ts +154 -0
  629. package/src/ir/core/irDomain.ts +163 -0
  630. package/src/ir/core/irEditorApi.ts +44 -0
  631. package/src/ir/core/irFormat.ts +57 -0
  632. package/src/ir/core/irMode.ts +203 -0
  633. package/src/ir/core/irReducer.ts +273 -0
  634. package/src/ir/core/irSidePanels.ts +20 -0
  635. package/src/ir/core/irSpectrum.ts +155 -0
  636. package/src/ir/core/irState.ts +173 -0
  637. package/src/ir/core/loadIrSpectra.ts +79 -0
  638. package/src/ir/core/nearestBand.ts +57 -0
  639. package/src/ir/core/pickBands.ts +181 -0
  640. package/src/ir/core/spectrumJcamp.ts +178 -0
  641. package/src/ir/core/toIrSpectrum.ts +102 -0
  642. package/src/ir/ui/BandMarks.tsx +166 -0
  643. package/src/ir/ui/BandsPanel.tsx +271 -0
  644. package/src/ir/ui/IrAboutDialog.tsx +121 -0
  645. package/src/ir/ui/IrCanvas.tsx +91 -0
  646. package/src/ir/ui/IrChart.tsx +215 -0
  647. package/src/ir/ui/IrCommandProvider.tsx +32 -0
  648. package/src/ir/ui/IrCommandTooltip.tsx +36 -0
  649. package/src/ir/ui/IrDocumentationDialog.tsx +174 -0
  650. package/src/ir/ui/IrEditor.tsx +99 -0
  651. package/src/ir/ui/IrHeader.tsx +39 -0
  652. package/src/ir/ui/IrLogo.tsx +49 -0
  653. package/src/ir/ui/IrPointerTracker.tsx +102 -0
  654. package/src/ir/ui/IrShell.tsx +285 -0
  655. package/src/ir/ui/IrSidePanel.tsx +78 -0
  656. package/src/ir/ui/IrStateProvider.tsx +32 -0
  657. package/src/ir/ui/IrStatusBar.tsx +97 -0
  658. package/src/ir/ui/IrToolbar.tsx +102 -0
  659. package/src/ir/ui/IrTraces.tsx +134 -0
  660. package/src/ir/ui/MetadataPanel.tsx +88 -0
  661. package/src/ir/ui/SpectraPanel.tsx +114 -0
  662. package/src/ir/ui/SpectrumRow.tsx +127 -0
  663. package/src/ir/ui/index.ts +56 -0
  664. package/src/ir/ui/irActions.ts +103 -0
  665. package/src/ir/ui/irChartProps.ts +118 -0
  666. package/src/ir/ui/irCommandContext.tsx +62 -0
  667. package/src/ir/ui/irStateContext.ts +48 -0
  668. package/src/ir/ui/useIrEditor.ts +139 -0
  669. package/src/ir/ui/useIrPointer.ts +109 -0
  670. package/src/ir/ui/useIrShortcuts.ts +95 -0
  671. package/src/ir/ui/useIrZoom.ts +86 -0
  672. package/src/ir.ts +13 -0
  673. package/src/panel/core/dialogStyles.ts +11 -0
  674. package/src/panel/core/index.ts +47 -0
  675. package/src/panel/core/isEditingField.ts +23 -0
  676. package/src/panel/core/panelStyles.ts +248 -0
  677. package/src/panel/core/rowSpacers.ts +50 -0
  678. package/src/panel/core/statusBar.ts +48 -0
  679. package/src/panel/core/textFilter.ts +33 -0
  680. package/src/panel/core/yieldToPainting.ts +20 -0
  681. package/src/panel/ui/AboutDialogFrame.tsx +100 -0
  682. package/src/panel/ui/ClearButton.tsx +42 -0
  683. package/src/panel/ui/DocumentationDialogFrame.tsx +86 -0
  684. package/src/panel/ui/FilterInput.tsx +60 -0
  685. package/src/panel/ui/HelpLabel.tsx +43 -0
  686. package/src/panel/ui/PanelMessage.tsx +64 -0
  687. package/src/panel/ui/PanelRail.tsx +64 -0
  688. package/src/panel/ui/Section.tsx +66 -0
  689. package/src/panel/ui/SidePanelStack.tsx +109 -0
  690. package/src/panel/ui/SpectrumColorSwatch.tsx +119 -0
  691. package/src/panel/ui/index.ts +47 -0
  692. package/src/panel/ui/useConfirmOnEnter.ts +68 -0
  693. package/src/panel/ui/useFilterBox.ts +35 -0
  694. package/src/panel/ui/useVirtualRows.ts +82 -0
  695. package/src/panel/ui/useVirtualWindowRows.ts +86 -0
  696. package/src/ui.ts +1 -0
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Everything that differs between reading a spectrum as absorbance and reading
3
+ * it as percent transmittance.
4
+ *
5
+ * The two are the same measurement drawn upside down, and nearly every
6
+ * difference between them is one of a handful of facts: what the axis is called,
7
+ * where its baseline is, whether that baseline is held in the window, which way
8
+ * a band points, and which zoom gestures are worth answering. Gathering them
9
+ * here is what keeps the switch from being an `if (mode === …)` in the chart,
10
+ * the tracker, the band marks, the zoom and the fitting separately, where they
11
+ * would eventually disagree.
12
+ *
13
+ * **No conversion happens here, or anywhere in this package.** `ir-spectrum`
14
+ * adds both an absorbance and a transmittance variable to every spectrum it
15
+ * reads, whichever the instrument wrote, so the arithmetic that relates them is
16
+ * its business and is done once at the point the file is understood. A second
17
+ * implementation here would be a second answer.
18
+ */
19
+ import type { YAxisRules, ZoomDragMode, ZoomGestures } from '../../chart/core/chartDomain.ts';
20
+ import type { IrMode } from './irSpectrum.ts';
21
+ /** The two ways a spectrum is read, in the order a control offers them. */
22
+ export declare const IR_MODES: readonly IrMode[];
23
+ /**
24
+ * How each mode behaves, every fact in one place.
25
+ *
26
+ * `transmittance` comes first because it is what the majority of instruments
27
+ * export and what most chemists picture when they say "the IR": bands hanging
28
+ * down from a baseline near 100.
29
+ */
30
+ export declare const IR_MODE_RULES: {
31
+ readonly transmittance: {
32
+ /** What the vertical axis is called. */
33
+ readonly title: "transmittance (%)";
34
+ /**
35
+ * The clear baseline a band hangs from, which the wheel scales about.
36
+ *
37
+ * A hundred rather than zero, and this is the whole reason `YAxisRules`
38
+ * exists: scaling percent transmittance about zero walks the entire trace
39
+ * off the top of the plot, because the trace lives just under 100 and
40
+ * nothing interesting is near the origin.
41
+ */
42
+ readonly baseline: 100;
43
+ /**
44
+ * Whether 100 is held inside the window a drag asks for.
45
+ *
46
+ * It is not. A band dragged out between 20 and 60 percent is being asked
47
+ * about between 20 and 60 percent; forcing the baseline back in would undo
48
+ * the zoom in the act of granting it. This is the opposite of a mass
49
+ * spectrum, whose sticks are drawn *from* their baseline and are cut off at
50
+ * the ankles without it.
51
+ */
52
+ readonly keepBaseline: false;
53
+ /** Bands point down, away from the baseline above them. */
54
+ readonly bandsPointDown: true;
55
+ /**
56
+ * A drag is the rectangle it sweeps out, whatever tool is chosen.
57
+ *
58
+ * Percent transmittance is bounded at both ends and the trace fills nearly
59
+ * all of it, so the question this axis is asked is never "between which two
60
+ * percentages" — it is "look closer at that corner", which is a rectangle
61
+ * and nothing else. Leaving the reading gesture available here would offer a
62
+ * choice between one useful answer and one that changes nothing.
63
+ */
64
+ readonly boxZoomOnly: true;
65
+ /**
66
+ * The wheel is left to the page.
67
+ *
68
+ * The axis is bounded — a transmittance is a percentage of the light that
69
+ * got through, so it lies between 0 and 100 and the trace already fills it.
70
+ * Scaling it freely about 100 therefore only ever takes the window past one
71
+ * end or crushes it against the other, which is a poor thing to have a
72
+ * pointer resting over a chart do by accident. The rectangle asks the same
73
+ * question properly, by naming the two percentages it lands between.
74
+ *
75
+ * The zoom in and zoom out **commands** still scale the axis here: they are
76
+ * aimed at, they step by a known factor, and the reader who pressed one
77
+ * knows what it did.
78
+ */
79
+ readonly wheelZoom: false;
80
+ };
81
+ readonly absorbance: {
82
+ readonly title: "absorbance";
83
+ /** Zero absorbance is a real floor: no light absorbed. */
84
+ readonly baseline: 0;
85
+ /**
86
+ * Whether zero is held inside the window a drag asks for.
87
+ *
88
+ * It is not, for the same reason as transmittance: a weak band between 0.02
89
+ * and 0.05 absorbance is unreadable in a window that starts at zero, and
90
+ * being able to drag to it is the point of the gesture. Zero remains the
91
+ * baseline the wheel scales about, which is what keeps the trace anchored.
92
+ */
93
+ readonly keepBaseline: false;
94
+ /** Bands point up, out of the baseline under them. */
95
+ readonly bandsPointDown: false;
96
+ /**
97
+ * Both drags are worth having, so the tool decides between them.
98
+ *
99
+ * Absorbance is open at the top and its weak bands lie against zero, so "what
100
+ * is between 1650 and 1750" and "what is in that rectangle" are two different
101
+ * questions a chemist genuinely asks of the same trace.
102
+ */
103
+ readonly boxZoomOnly: false;
104
+ /**
105
+ * The wheel scales the axis about zero, which is what brings a weak band up
106
+ * out of the baseline without narrowing the wavenumbers at all.
107
+ */
108
+ readonly wheelZoom: true;
109
+ };
110
+ };
111
+ /**
112
+ * What the vertical axis is called in a mode.
113
+ * @param mode - Which value axis is being drawn.
114
+ * @returns The axis title.
115
+ */
116
+ export declare function yAxisTitle(mode: IrMode): string;
117
+ /**
118
+ * How the vertical axis behaves under a gesture in a mode.
119
+ * @param mode - Which value axis is being drawn.
120
+ * @returns The rules to hand to the zoom.
121
+ */
122
+ export declare function yAxisRules(mode: IrMode): YAxisRules;
123
+ /**
124
+ * Which zoom gestures a mode answers, and what a drag in it asks for.
125
+ *
126
+ * The mode has the last word on the drag rather than the tool, because the tool
127
+ * is a preference and this is not: percent transmittance has one useful drag,
128
+ * and a viewer that let a tool button ask for the other would answer with a
129
+ * gesture that narrows the wavenumbers and leaves the crowded axis exactly as it
130
+ * was. The tool is still read — in absorbance both drags mean something — so a
131
+ * chemist who chose the square zoom keeps it across a switch to %T and back.
132
+ * @param mode - Which value axis is being drawn.
133
+ * @param tool - What a drag asks for where the mode leaves the choice open.
134
+ * Defaults to the reading gesture.
135
+ * @returns The gestures to hand to the zoom.
136
+ */
137
+ export declare function zoomGestures(mode: IrMode, tool?: ZoomDragMode): Required<ZoomGestures>;
138
+ /**
139
+ * Whether a mode leaves the square zoom as the only drag there is.
140
+ *
141
+ * What the toolbar and the status bar need in order to say so: a tool button
142
+ * showing `read` as available in percent transmittance would be describing a
143
+ * gesture the chart will not make.
144
+ * @param mode - Which value axis is being drawn.
145
+ * @returns Whether every drag is a rectangle.
146
+ */
147
+ export declare function boxZoomOnly(mode: IrMode): boolean;
148
+ /**
149
+ * Which way a band points in a mode, which is which way its label is stacked.
150
+ * @param mode - Which value axis is being drawn.
151
+ * @returns Whether bands hang downwards.
152
+ */
153
+ export declare function bandsPointDown(mode: IrMode): boolean;
154
+ /**
155
+ * The other mode, for a control that toggles between the two.
156
+ * @param mode - The mode in force.
157
+ * @returns The one to switch to.
158
+ */
159
+ export declare function otherIrMode(mode: IrMode): IrMode;
160
+ //# sourceMappingURL=irMode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"irMode.d.ts","sourceRoot":"","sources":["../../../src/ir/core/irMode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACb,MAAM,iCAAiC,CAAC;AAEzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,2EAA2E;AAC3E,eAAO,MAAM,QAAQ,EAAE,SAAS,MAAM,EAAoC,CAAC;AAE3E;;;;;;GAMG;AACH,eAAO,MAAM,aAAa;;QAEtB,wCAAwC;;QAExC;;;;;;;WAOG;;QAEH;;;;;;;;WAQG;;QAEH,2DAA2D;;QAE3D;;;;;;;;WAQG;;QAEH;;;;;;;;;;;;;WAaG;;;;;QAKH,0DAA0D;;QAE1D;;;;;;;WAOG;;QAEH,sDAAsD;;QAEtD;;;;;;WAMG;;QAEH;;;WAGG;;;CAaN,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAMnD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,YAAsB,GAC3B,QAAQ,CAAC,YAAY,CAAC,CAGxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Everything that differs between reading a spectrum as absorbance and reading
3
+ * it as percent transmittance.
4
+ *
5
+ * The two are the same measurement drawn upside down, and nearly every
6
+ * difference between them is one of a handful of facts: what the axis is called,
7
+ * where its baseline is, whether that baseline is held in the window, which way
8
+ * a band points, and which zoom gestures are worth answering. Gathering them
9
+ * here is what keeps the switch from being an `if (mode === …)` in the chart,
10
+ * the tracker, the band marks, the zoom and the fitting separately, where they
11
+ * would eventually disagree.
12
+ *
13
+ * **No conversion happens here, or anywhere in this package.** `ir-spectrum`
14
+ * adds both an absorbance and a transmittance variable to every spectrum it
15
+ * reads, whichever the instrument wrote, so the arithmetic that relates them is
16
+ * its business and is done once at the point the file is understood. A second
17
+ * implementation here would be a second answer.
18
+ */
19
+ /** The two ways a spectrum is read, in the order a control offers them. */
20
+ export const IR_MODES = ['transmittance', 'absorbance'];
21
+ /**
22
+ * How each mode behaves, every fact in one place.
23
+ *
24
+ * `transmittance` comes first because it is what the majority of instruments
25
+ * export and what most chemists picture when they say "the IR": bands hanging
26
+ * down from a baseline near 100.
27
+ */
28
+ export const IR_MODE_RULES = {
29
+ transmittance: {
30
+ /** What the vertical axis is called. */
31
+ title: 'transmittance (%)',
32
+ /**
33
+ * The clear baseline a band hangs from, which the wheel scales about.
34
+ *
35
+ * A hundred rather than zero, and this is the whole reason `YAxisRules`
36
+ * exists: scaling percent transmittance about zero walks the entire trace
37
+ * off the top of the plot, because the trace lives just under 100 and
38
+ * nothing interesting is near the origin.
39
+ */
40
+ baseline: 100,
41
+ /**
42
+ * Whether 100 is held inside the window a drag asks for.
43
+ *
44
+ * It is not. A band dragged out between 20 and 60 percent is being asked
45
+ * about between 20 and 60 percent; forcing the baseline back in would undo
46
+ * the zoom in the act of granting it. This is the opposite of a mass
47
+ * spectrum, whose sticks are drawn *from* their baseline and are cut off at
48
+ * the ankles without it.
49
+ */
50
+ keepBaseline: false,
51
+ /** Bands point down, away from the baseline above them. */
52
+ bandsPointDown: true,
53
+ /**
54
+ * A drag is the rectangle it sweeps out, whatever tool is chosen.
55
+ *
56
+ * Percent transmittance is bounded at both ends and the trace fills nearly
57
+ * all of it, so the question this axis is asked is never "between which two
58
+ * percentages" — it is "look closer at that corner", which is a rectangle
59
+ * and nothing else. Leaving the reading gesture available here would offer a
60
+ * choice between one useful answer and one that changes nothing.
61
+ */
62
+ boxZoomOnly: true,
63
+ /**
64
+ * The wheel is left to the page.
65
+ *
66
+ * The axis is bounded — a transmittance is a percentage of the light that
67
+ * got through, so it lies between 0 and 100 and the trace already fills it.
68
+ * Scaling it freely about 100 therefore only ever takes the window past one
69
+ * end or crushes it against the other, which is a poor thing to have a
70
+ * pointer resting over a chart do by accident. The rectangle asks the same
71
+ * question properly, by naming the two percentages it lands between.
72
+ *
73
+ * The zoom in and zoom out **commands** still scale the axis here: they are
74
+ * aimed at, they step by a known factor, and the reader who pressed one
75
+ * knows what it did.
76
+ */
77
+ wheelZoom: false,
78
+ },
79
+ absorbance: {
80
+ title: 'absorbance',
81
+ /** Zero absorbance is a real floor: no light absorbed. */
82
+ baseline: 0,
83
+ /**
84
+ * Whether zero is held inside the window a drag asks for.
85
+ *
86
+ * It is not, for the same reason as transmittance: a weak band between 0.02
87
+ * and 0.05 absorbance is unreadable in a window that starts at zero, and
88
+ * being able to drag to it is the point of the gesture. Zero remains the
89
+ * baseline the wheel scales about, which is what keeps the trace anchored.
90
+ */
91
+ keepBaseline: false,
92
+ /** Bands point up, out of the baseline under them. */
93
+ bandsPointDown: false,
94
+ /**
95
+ * Both drags are worth having, so the tool decides between them.
96
+ *
97
+ * Absorbance is open at the top and its weak bands lie against zero, so "what
98
+ * is between 1650 and 1750" and "what is in that rectangle" are two different
99
+ * questions a chemist genuinely asks of the same trace.
100
+ */
101
+ boxZoomOnly: false,
102
+ /**
103
+ * The wheel scales the axis about zero, which is what brings a weak band up
104
+ * out of the baseline without narrowing the wavenumbers at all.
105
+ */
106
+ wheelZoom: true,
107
+ },
108
+ };
109
+ /**
110
+ * What the vertical axis is called in a mode.
111
+ * @param mode - Which value axis is being drawn.
112
+ * @returns The axis title.
113
+ */
114
+ export function yAxisTitle(mode) {
115
+ return IR_MODE_RULES[mode].title;
116
+ }
117
+ /**
118
+ * How the vertical axis behaves under a gesture in a mode.
119
+ * @param mode - Which value axis is being drawn.
120
+ * @returns The rules to hand to the zoom.
121
+ */
122
+ export function yAxisRules(mode) {
123
+ const { baseline, keepBaseline, bandsPointDown } = IR_MODE_RULES[mode];
124
+ // `pointsDown` is what tells the zoom which way "released past the baseline"
125
+ // points: percent transmittance hangs from 100 at the top of the plot, so the
126
+ // gesture is a drag released above it rather than below.
127
+ return { baseline, keepBaseline, pointsDown: bandsPointDown };
128
+ }
129
+ /**
130
+ * Which zoom gestures a mode answers, and what a drag in it asks for.
131
+ *
132
+ * The mode has the last word on the drag rather than the tool, because the tool
133
+ * is a preference and this is not: percent transmittance has one useful drag,
134
+ * and a viewer that let a tool button ask for the other would answer with a
135
+ * gesture that narrows the wavenumbers and leaves the crowded axis exactly as it
136
+ * was. The tool is still read — in absorbance both drags mean something — so a
137
+ * chemist who chose the square zoom keeps it across a switch to %T and back.
138
+ * @param mode - Which value axis is being drawn.
139
+ * @param tool - What a drag asks for where the mode leaves the choice open.
140
+ * Defaults to the reading gesture.
141
+ * @returns The gestures to hand to the zoom.
142
+ */
143
+ export function zoomGestures(mode, tool = 'xAxis') {
144
+ const { boxZoomOnly, wheelZoom } = IR_MODE_RULES[mode];
145
+ return { drag: boxZoomOnly ? 'box' : tool, wheel: wheelZoom };
146
+ }
147
+ /**
148
+ * Whether a mode leaves the square zoom as the only drag there is.
149
+ *
150
+ * What the toolbar and the status bar need in order to say so: a tool button
151
+ * showing `read` as available in percent transmittance would be describing a
152
+ * gesture the chart will not make.
153
+ * @param mode - Which value axis is being drawn.
154
+ * @returns Whether every drag is a rectangle.
155
+ */
156
+ export function boxZoomOnly(mode) {
157
+ return IR_MODE_RULES[mode].boxZoomOnly;
158
+ }
159
+ /**
160
+ * Which way a band points in a mode, which is which way its label is stacked.
161
+ * @param mode - Which value axis is being drawn.
162
+ * @returns Whether bands hang downwards.
163
+ */
164
+ export function bandsPointDown(mode) {
165
+ return IR_MODE_RULES[mode].bandsPointDown;
166
+ }
167
+ /**
168
+ * The other mode, for a control that toggles between the two.
169
+ * @param mode - The mode in force.
170
+ * @returns The one to switch to.
171
+ */
172
+ export function otherIrMode(mode) {
173
+ return mode === 'absorbance' ? 'transmittance' : 'absorbance';
174
+ }
175
+ //# sourceMappingURL=irMode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"irMode.js","sourceRoot":"","sources":["../../../src/ir/core/irMode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAUH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,QAAQ,GAAsB,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;AAE3E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,aAAa,EAAE;QACb,wCAAwC;QACxC,KAAK,EAAE,mBAAmB;QAC1B;;;;;;;WAOG;QACH,QAAQ,EAAE,GAAG;QACb;;;;;;;;WAQG;QACH,YAAY,EAAE,KAAK;QACnB,2DAA2D;QAC3D,cAAc,EAAE,IAAI;QACpB;;;;;;;;WAQG;QACH,WAAW,EAAE,IAAI;QACjB;;;;;;;;;;;;;WAaG;QACH,SAAS,EAAE,KAAK;KACjB;IACD,UAAU,EAAE;QACV,KAAK,EAAE,YAAY;QACnB,0DAA0D;QAC1D,QAAQ,EAAE,CAAC;QACX;;;;;;;WAOG;QACH,YAAY,EAAE,KAAK;QACnB,sDAAsD;QACtD,cAAc,EAAE,KAAK;QACrB;;;;;;WAMG;QACH,WAAW,EAAE,KAAK;QAClB;;;WAGG;QACH,SAAS,EAAE,IAAI;KAChB;CAWF,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;AACnC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvE,6EAA6E;IAC7E,8EAA8E;IAC9E,yDAAyD;IACzD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;AAChE,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,OAAqB,OAAO;IAE5B,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAChE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC;AAChE,CAAC"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Every change the viewer can undergo, as one function over one object.
3
+ *
4
+ * A reducer rather than a graph of signals, for the reason
5
+ * `docs/decisions.md` gives about the glycan editor: a published component must
6
+ * not impose a state library on the page that mounts it, and two viewers on one
7
+ * page must not share a module-level singleton. The state is a plain object, so a
8
+ * host can save it, restore it and compare it.
9
+ *
10
+ * Every case returns the state **itself** when it has nothing to do, so a render
11
+ * memoised on the state is not defeated by an action that changed nothing —
12
+ * selecting the spectrum already selected, closing an error that is already
13
+ * closed.
14
+ */
15
+ import type { IrSidePanelId } from './irSidePanels.ts';
16
+ import type { IrDomain, IrSpectrum } from './irSpectrum.ts';
17
+ import type { IrSettings, IrState, IrTool, PartialIrState } from './irState.ts';
18
+ /** Everything that can be asked of the viewer. */
19
+ export type IrAction = {
20
+ type: 'addSpectra';
21
+ spectra: IrSpectrum[];
22
+ } | {
23
+ type: 'setSpectra';
24
+ spectra: IrSpectrum[];
25
+ } | {
26
+ type: 'removeSpectrum';
27
+ id: string;
28
+ } | {
29
+ type: 'renameSpectrum';
30
+ id: string;
31
+ name: string;
32
+ } | {
33
+ type: 'setSpectrumColor';
34
+ id: string;
35
+ color: string;
36
+ } | {
37
+ type: 'setSpectrumVisible';
38
+ id: string;
39
+ visible: boolean;
40
+ } | {
41
+ type: 'selectSpectrum';
42
+ id: string | null;
43
+ } | {
44
+ type: 'setDomain';
45
+ domain: IrDomain;
46
+ } | {
47
+ type: 'resetDomain';
48
+ } | {
49
+ type: 'setTool';
50
+ tool: IrTool;
51
+ } | {
52
+ type: 'togglePanel';
53
+ panelId: IrSidePanelId;
54
+ } | {
55
+ type: 'setError';
56
+ error: string | null;
57
+ } | {
58
+ type: 'setSettings';
59
+ settings: Partial<IrSettings>;
60
+ } | {
61
+ type: 'loadState';
62
+ state: PartialIrState;
63
+ } | {
64
+ type: 'clear';
65
+ };
66
+ /** What a viewer opens on. */
67
+ export interface CreateIrStateOptions {
68
+ /**
69
+ * The spectra to open on.
70
+ * @default []
71
+ */
72
+ spectra?: IrSpectrum[];
73
+ /**
74
+ * The workspace to open in.
75
+ * @default DEFAULT_SETTINGS
76
+ */
77
+ settings?: Partial<IrSettings>;
78
+ /**
79
+ * The panels open to begin with.
80
+ * @default DEFAULT_SIDE_PANELS
81
+ */
82
+ panelIds?: IrSidePanelId[];
83
+ }
84
+ /**
85
+ * The state a viewer opens with.
86
+ *
87
+ * The panel list is spread rather than stored by reference: a caller's array is
88
+ * the caller's to mutate, and a viewer holding it would find its open panels
89
+ * changing under it.
90
+ * @param options - What it opens on.
91
+ * @returns The state.
92
+ */
93
+ export declare function createIrState(options?: CreateIrStateOptions): IrState;
94
+ /**
95
+ * Fold one action into the state.
96
+ * @param state - The state in force.
97
+ * @param action - What is being asked.
98
+ * @returns The new state, or the old one when nothing changed.
99
+ */
100
+ export declare function irReducer(state: IrState, action: IrAction): IrState;
101
+ //# sourceMappingURL=irReducer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"irReducer.d.ts","sourceRoot":"","sources":["../../../src/ir/core/irReducer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAQhF,kDAAkD;AAClD,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,UAAU,EAAE,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtB,8BAA8B;AAC9B,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAazE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAmJnE"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Every change the viewer can undergo, as one function over one object.
3
+ *
4
+ * A reducer rather than a graph of signals, for the reason
5
+ * `docs/decisions.md` gives about the glycan editor: a published component must
6
+ * not impose a state library on the page that mounts it, and two viewers on one
7
+ * page must not share a module-level singleton. The state is a plain object, so a
8
+ * host can save it, restore it and compare it.
9
+ *
10
+ * Every case returns the state **itself** when it has nothing to do, so a render
11
+ * memoised on the state is not defeated by an action that changed nothing —
12
+ * selecting the spectrum already selected, closing an error that is already
13
+ * closed.
14
+ */
15
+ import { DEFAULT_SETTINGS, DEFAULT_SIDE_PANELS, isIrWindow, mergeIrSettings, } from "./irState.js";
16
+ /**
17
+ * The state a viewer opens with.
18
+ *
19
+ * The panel list is spread rather than stored by reference: a caller's array is
20
+ * the caller's to mutate, and a viewer holding it would find its open panels
21
+ * changing under it.
22
+ * @param options - What it opens on.
23
+ * @returns The state.
24
+ */
25
+ export function createIrState(options = {}) {
26
+ const { spectra = [], settings, panelIds } = options;
27
+ return {
28
+ data: { spectra: [...spectra] },
29
+ view: {
30
+ selectedId: spectra[0]?.id ?? null,
31
+ domain: null,
32
+ tool: 'read',
33
+ openPanelIds: [...(panelIds ?? DEFAULT_SIDE_PANELS)],
34
+ error: null,
35
+ },
36
+ settings: mergeIrSettings(DEFAULT_SETTINGS, settings),
37
+ };
38
+ }
39
+ /**
40
+ * Fold one action into the state.
41
+ * @param state - The state in force.
42
+ * @param action - What is being asked.
43
+ * @returns The new state, or the old one when nothing changed.
44
+ */
45
+ export function irReducer(state, action) {
46
+ switch (action.type) {
47
+ case 'addSpectra': {
48
+ if (action.spectra.length === 0)
49
+ return state;
50
+ const spectra = [...state.data.spectra, ...action.spectra];
51
+ return {
52
+ ...state,
53
+ data: { spectra },
54
+ view: {
55
+ ...state.view,
56
+ // Whatever arrived is what somebody wants to look at, so it takes the
57
+ // selection — but only when nothing was selected, since a spectrum
58
+ // added for comparison must not steal the panels from the one being
59
+ // read.
60
+ selectedId: state.view.selectedId ?? action.spectra[0]?.id ?? null,
61
+ error: null,
62
+ },
63
+ };
64
+ }
65
+ case 'setSpectra': {
66
+ return {
67
+ ...state,
68
+ data: { spectra: [...action.spectra] },
69
+ view: {
70
+ ...state.view,
71
+ selectedId: action.spectra[0]?.id ?? null,
72
+ // Replacing what is drawn is the one change that throws the window
73
+ // away: a window over one spectrum's wavenumbers means nothing over
74
+ // another's, and the chart refits when it is handed `null`.
75
+ domain: null,
76
+ error: null,
77
+ },
78
+ };
79
+ }
80
+ case 'removeSpectrum': {
81
+ const spectra = state.data.spectra.filter((spectrum) => spectrum.id !== action.id);
82
+ if (spectra.length === state.data.spectra.length)
83
+ return state;
84
+ return {
85
+ ...state,
86
+ data: { spectra },
87
+ view: {
88
+ ...state.view,
89
+ selectedId: state.view.selectedId === action.id
90
+ ? (spectra[0]?.id ?? null)
91
+ : state.view.selectedId,
92
+ },
93
+ };
94
+ }
95
+ case 'renameSpectrum': {
96
+ const name = action.name.trim();
97
+ if (name === '') {
98
+ return withError(state, 'A spectrum needs a name to be called by.');
99
+ }
100
+ return mapSpectrum(state, action.id, (spectrum) => spectrum.name === name ? spectrum : { ...spectrum, name });
101
+ }
102
+ case 'setSpectrumColor': {
103
+ return mapSpectrum(state, action.id, (spectrum) => spectrum.color === action.color
104
+ ? spectrum
105
+ : { ...spectrum, color: action.color });
106
+ }
107
+ case 'setSpectrumVisible': {
108
+ return mapSpectrum(state, action.id, (spectrum) => spectrum.visible === action.visible
109
+ ? spectrum
110
+ : { ...spectrum, visible: action.visible });
111
+ }
112
+ case 'selectSpectrum': {
113
+ if (state.view.selectedId === action.id)
114
+ return state;
115
+ return { ...state, view: { ...state.view, selectedId: action.id } };
116
+ }
117
+ case 'setDomain': {
118
+ if (!isIrWindow(action.domain))
119
+ return state;
120
+ return { ...state, view: { ...state.view, domain: action.domain } };
121
+ }
122
+ case 'resetDomain': {
123
+ if (state.view.domain === null)
124
+ return state;
125
+ return { ...state, view: { ...state.view, domain: null } };
126
+ }
127
+ case 'setTool': {
128
+ if (state.view.tool === action.tool)
129
+ return state;
130
+ return { ...state, view: { ...state.view, tool: action.tool } };
131
+ }
132
+ case 'togglePanel': {
133
+ const { openPanelIds } = state.view;
134
+ const open = openPanelIds.includes(action.panelId);
135
+ return {
136
+ ...state,
137
+ view: {
138
+ ...state.view,
139
+ openPanelIds: open
140
+ ? openPanelIds.filter((id) => id !== action.panelId)
141
+ : [...openPanelIds, action.panelId],
142
+ },
143
+ };
144
+ }
145
+ case 'setError': {
146
+ if (state.view.error === action.error)
147
+ return state;
148
+ return { ...state, view: { ...state.view, error: action.error } };
149
+ }
150
+ case 'setSettings': {
151
+ const settings = mergeIrSettings(state.settings, action.settings);
152
+ return { ...state, settings };
153
+ }
154
+ case 'loadState': {
155
+ const { data, view, settings } = action.state;
156
+ return {
157
+ data: data === undefined ? state.data : { spectra: [...data.spectra] },
158
+ view: { ...state.view, ...view },
159
+ settings: mergeIrSettings(state.settings, settings),
160
+ };
161
+ }
162
+ case 'clear': {
163
+ if (state.data.spectra.length === 0 && state.view.error === null) {
164
+ return state;
165
+ }
166
+ return {
167
+ ...state,
168
+ data: { spectra: [] },
169
+ view: { ...state.view, selectedId: null, domain: null, error: null },
170
+ };
171
+ }
172
+ /* Every action is handled above, and TypeScript is what keeps that true
173
+ when one is added — so there is nothing for a fallback to do. */
174
+ // no default
175
+ }
176
+ }
177
+ /**
178
+ * Change one spectrum, leaving the state alone when it did not change.
179
+ * @param state - The state in force.
180
+ * @param id - Which spectrum.
181
+ * @param change - What to make of it; return it unchanged for no change.
182
+ * @returns The new state, or the old one.
183
+ */
184
+ function mapSpectrum(state, id, change) {
185
+ let changed = false;
186
+ const spectra = state.data.spectra.map((spectrum) => {
187
+ if (spectrum.id !== id)
188
+ return spectrum;
189
+ const next = change(spectrum);
190
+ if (next !== spectrum)
191
+ changed = true;
192
+ return next;
193
+ });
194
+ if (!changed)
195
+ return state;
196
+ return { ...state, data: { spectra }, view: { ...state.view, error: null } };
197
+ }
198
+ /**
199
+ * Refuse an action, saying why.
200
+ * @param state - The state in force.
201
+ * @param error - The sentence to show whoever asked.
202
+ * @returns The state carrying the refusal.
203
+ */
204
+ function withError(state, error) {
205
+ return { ...state, view: { ...state.view, error } };
206
+ }
207
+ //# sourceMappingURL=irReducer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"irReducer.js","sourceRoot":"","sources":["../../../src/ir/core/irReducer.ts"],"names":[],"mappings":"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"}