react-cheminfo 0.28.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (691) hide show
  1. package/README.md +38 -25
  2. package/lib/chart/core/axisLabels.d.ts +82 -0
  3. package/lib/chart/core/axisLabels.d.ts.map +1 -0
  4. package/lib/chart/core/axisLabels.js +111 -0
  5. package/lib/chart/core/axisLabels.js.map +1 -0
  6. package/lib/chart/core/boxLayout.d.ts +53 -0
  7. package/lib/chart/core/boxLayout.d.ts.map +1 -0
  8. package/lib/chart/core/boxLayout.js +112 -0
  9. package/lib/chart/core/boxLayout.js.map +1 -0
  10. package/lib/chart/core/chartAxisScale.d.ts +23 -2
  11. package/lib/chart/core/chartAxisScale.d.ts.map +1 -1
  12. package/lib/chart/core/chartAxisScale.js +64 -13
  13. package/lib/chart/core/chartAxisScale.js.map +1 -1
  14. package/lib/chart/core/chartDomain.d.ts +160 -0
  15. package/lib/chart/core/chartDomain.d.ts.map +1 -0
  16. package/lib/chart/core/chartDomain.js +46 -0
  17. package/lib/chart/core/chartDomain.js.map +1 -0
  18. package/lib/chart/core/chartGeometry.d.ts +131 -0
  19. package/lib/chart/core/chartGeometry.d.ts.map +1 -0
  20. package/lib/chart/core/chartGeometry.js +101 -0
  21. package/lib/chart/core/chartGeometry.js.map +1 -0
  22. package/lib/chart/core/chartPane.d.ts +11 -0
  23. package/lib/chart/core/chartPane.d.ts.map +1 -0
  24. package/lib/chart/core/chartPane.js +11 -0
  25. package/lib/chart/core/chartPane.js.map +1 -0
  26. package/lib/chart/core/chartScale.d.ts +4 -1
  27. package/lib/chart/core/chartScale.d.ts.map +1 -1
  28. package/lib/chart/core/chartScale.js +8 -4
  29. package/lib/chart/core/chartScale.js.map +1 -1
  30. package/lib/chart/core/chartTheme.d.ts +156 -0
  31. package/lib/chart/core/chartTheme.d.ts.map +1 -0
  32. package/lib/chart/core/chartTheme.js +156 -0
  33. package/lib/chart/core/chartTheme.js.map +1 -0
  34. package/lib/chart/core/chartViewport.d.ts +32 -5
  35. package/lib/chart/core/chartViewport.d.ts.map +1 -1
  36. package/lib/chart/core/chartViewport.js +40 -11
  37. package/lib/chart/core/chartViewport.js.map +1 -1
  38. package/lib/chart/core/guidePlacement.d.ts +52 -0
  39. package/lib/chart/core/guidePlacement.d.ts.map +1 -0
  40. package/lib/chart/core/guidePlacement.js +52 -0
  41. package/lib/chart/core/guidePlacement.js.map +1 -0
  42. package/lib/chart/core/index.d.ts +29 -2
  43. package/lib/chart/core/index.d.ts.map +1 -1
  44. package/lib/chart/core/index.js +19 -2
  45. package/lib/chart/core/index.js.map +1 -1
  46. package/lib/chart/core/labelStack.d.ts +27 -0
  47. package/lib/chart/core/labelStack.d.ts.map +1 -0
  48. package/lib/chart/core/labelStack.js +62 -0
  49. package/lib/chart/core/labelStack.js.map +1 -0
  50. package/lib/chart/core/legendBox.d.ts +152 -0
  51. package/lib/chart/core/legendBox.d.ts.map +1 -0
  52. package/lib/chart/core/legendBox.js +169 -0
  53. package/lib/chart/core/legendBox.js.map +1 -0
  54. package/lib/chart/core/selectionGeometry.d.ts +45 -0
  55. package/lib/chart/core/selectionGeometry.d.ts.map +1 -0
  56. package/lib/chart/core/selectionGeometry.js +49 -0
  57. package/lib/chart/core/selectionGeometry.js.map +1 -0
  58. package/lib/chart/core/spectrumColor.d.ts +80 -0
  59. package/lib/chart/core/spectrumColor.d.ts.map +1 -0
  60. package/lib/chart/core/spectrumColor.js +120 -0
  61. package/lib/chart/core/spectrumColor.js.map +1 -0
  62. package/lib/chart/core/stackCapacity.d.ts +136 -0
  63. package/lib/chart/core/stackCapacity.d.ts.map +1 -0
  64. package/lib/chart/core/stackCapacity.js +153 -0
  65. package/lib/chart/core/stackCapacity.js.map +1 -0
  66. package/lib/chart/core/svgPoint.d.ts +62 -0
  67. package/lib/chart/core/svgPoint.d.ts.map +1 -0
  68. package/lib/chart/core/svgPoint.js +43 -0
  69. package/lib/chart/core/svgPoint.js.map +1 -0
  70. package/lib/chart/core/tracePath.d.ts +94 -0
  71. package/lib/chart/core/tracePath.d.ts.map +1 -0
  72. package/lib/chart/core/tracePath.js +191 -0
  73. package/lib/chart/core/tracePath.js.map +1 -0
  74. package/lib/chart/core/trackerReadout.d.ts +55 -0
  75. package/lib/chart/core/trackerReadout.d.ts.map +1 -0
  76. package/lib/chart/core/trackerReadout.js +53 -0
  77. package/lib/chart/core/trackerReadout.js.map +1 -0
  78. package/lib/chart/core/viewTransform.d.ts +167 -0
  79. package/lib/chart/core/viewTransform.d.ts.map +1 -0
  80. package/lib/chart/core/viewTransform.js +188 -0
  81. package/lib/chart/core/viewTransform.js.map +1 -0
  82. package/lib/chart/core/zoomDomain.d.ts +127 -0
  83. package/lib/chart/core/zoomDomain.d.ts.map +1 -0
  84. package/lib/chart/core/zoomDomain.js +175 -0
  85. package/lib/chart/core/zoomDomain.js.map +1 -0
  86. package/lib/chart/ui/Axes.d.ts +104 -0
  87. package/lib/chart/ui/Axes.d.ts.map +1 -0
  88. package/lib/chart/ui/Axes.js +155 -0
  89. package/lib/chart/ui/Axes.js.map +1 -0
  90. package/lib/chart/ui/AxisGuide.d.ts +60 -0
  91. package/lib/chart/ui/AxisGuide.d.ts.map +1 -0
  92. package/lib/chart/ui/AxisGuide.js +111 -0
  93. package/lib/chart/ui/AxisGuide.js.map +1 -0
  94. package/lib/chart/ui/ChartStack.d.ts +81 -0
  95. package/lib/chart/ui/ChartStack.d.ts.map +1 -0
  96. package/lib/chart/ui/ChartStack.js +42 -0
  97. package/lib/chart/ui/ChartStack.js.map +1 -0
  98. package/lib/chart/ui/ChartTracker.d.ts +36 -0
  99. package/lib/chart/ui/ChartTracker.d.ts.map +1 -0
  100. package/lib/chart/ui/ChartTracker.js +27 -0
  101. package/lib/chart/ui/ChartTracker.js.map +1 -0
  102. package/lib/chart/ui/PlotCaption.d.ts +44 -0
  103. package/lib/chart/ui/PlotCaption.d.ts.map +1 -0
  104. package/lib/chart/ui/PlotCaption.js +68 -0
  105. package/lib/chart/ui/PlotCaption.js.map +1 -0
  106. package/lib/chart/ui/SelectionRect.d.ts +27 -0
  107. package/lib/chart/ui/SelectionRect.d.ts.map +1 -0
  108. package/lib/chart/ui/SelectionRect.js +31 -0
  109. package/lib/chart/ui/SelectionRect.js.map +1 -0
  110. package/lib/chart/ui/TraceLegend.d.ts +99 -0
  111. package/lib/chart/ui/TraceLegend.d.ts.map +1 -0
  112. package/lib/chart/ui/TraceLegend.js +45 -0
  113. package/lib/chart/ui/TraceLegend.js.map +1 -0
  114. package/lib/chart/ui/chartGestures.d.ts +158 -0
  115. package/lib/chart/ui/chartGestures.d.ts.map +1 -0
  116. package/lib/chart/ui/chartGestures.js +145 -0
  117. package/lib/chart/ui/chartGestures.js.map +1 -0
  118. package/lib/chart/ui/chartStackLevel.d.ts +115 -0
  119. package/lib/chart/ui/chartStackLevel.d.ts.map +1 -0
  120. package/lib/chart/ui/chartStackLevel.js +96 -0
  121. package/lib/chart/ui/chartStackLevel.js.map +1 -0
  122. package/lib/chart/ui/chartSurface.d.ts +35 -0
  123. package/lib/chart/ui/chartSurface.d.ts.map +1 -0
  124. package/lib/chart/ui/chartSurface.js +58 -0
  125. package/lib/chart/ui/chartSurface.js.map +1 -0
  126. package/lib/chart/ui/index.d.ts +24 -0
  127. package/lib/chart/ui/index.d.ts.map +1 -1
  128. package/lib/chart/ui/index.js +13 -0
  129. package/lib/chart/ui/index.js.map +1 -1
  130. package/lib/chart/ui/useChartPointer.d.ts +124 -0
  131. package/lib/chart/ui/useChartPointer.d.ts.map +1 -0
  132. package/lib/chart/ui/useChartPointer.js +152 -0
  133. package/lib/chart/ui/useChartPointer.js.map +1 -0
  134. package/lib/chart/ui/useChartSize.d.ts +49 -0
  135. package/lib/chart/ui/useChartSize.d.ts.map +1 -0
  136. package/lib/chart/ui/useChartSize.js +91 -0
  137. package/lib/chart/ui/useChartSize.js.map +1 -0
  138. package/lib/chart/ui/useChartWindow.d.ts +147 -0
  139. package/lib/chart/ui/useChartWindow.d.ts.map +1 -0
  140. package/lib/chart/ui/useChartWindow.js +135 -0
  141. package/lib/chart/ui/useChartWindow.js.map +1 -0
  142. package/lib/chart/ui/useChartZoom.d.ts +88 -0
  143. package/lib/chart/ui/useChartZoom.d.ts.map +1 -0
  144. package/lib/chart/ui/useChartZoom.js +142 -0
  145. package/lib/chart/ui/useChartZoom.js.map +1 -0
  146. package/lib/chart/ui/useWheelListener.d.ts +30 -0
  147. package/lib/chart/ui/useWheelListener.d.ts.map +1 -0
  148. package/lib/chart/ui/useWheelListener.js +57 -0
  149. package/lib/chart/ui/useWheelListener.js.map +1 -0
  150. package/lib/clipboard/core/copyPng.d.ts +13 -0
  151. package/lib/clipboard/core/copyPng.d.ts.map +1 -0
  152. package/lib/clipboard/core/copyPng.js +19 -0
  153. package/lib/clipboard/core/copyPng.js.map +1 -0
  154. package/lib/clipboard/core/index.d.ts +1 -0
  155. package/lib/clipboard/core/index.d.ts.map +1 -1
  156. package/lib/clipboard/core/index.js +1 -0
  157. package/lib/clipboard/core/index.js.map +1 -1
  158. package/lib/core.d.ts +1 -0
  159. package/lib/core.d.ts.map +1 -1
  160. package/lib/core.js +1 -0
  161. package/lib/core.js.map +1 -1
  162. package/lib/download/core/exportStyles.d.ts +22 -0
  163. package/lib/download/core/exportStyles.d.ts.map +1 -0
  164. package/lib/download/core/exportStyles.js +19 -0
  165. package/lib/download/core/exportStyles.js.map +1 -0
  166. package/lib/download/core/imageResolution.d.ts +88 -0
  167. package/lib/download/core/imageResolution.d.ts.map +1 -0
  168. package/lib/download/core/imageResolution.js +77 -0
  169. package/lib/download/core/imageResolution.js.map +1 -0
  170. package/lib/download/core/index.d.ts +13 -0
  171. package/lib/download/core/index.d.ts.map +1 -1
  172. package/lib/download/core/index.js +8 -0
  173. package/lib/download/core/index.js.map +1 -1
  174. package/lib/download/core/pictureExport.d.ts +93 -0
  175. package/lib/download/core/pictureExport.d.ts.map +1 -0
  176. package/lib/download/core/pictureExport.js +116 -0
  177. package/lib/download/core/pictureExport.js.map +1 -0
  178. package/lib/download/core/stackedDrawing.d.ts +36 -0
  179. package/lib/download/core/stackedDrawing.d.ts.map +1 -0
  180. package/lib/download/core/stackedDrawing.js +98 -0
  181. package/lib/download/core/stackedDrawing.js.map +1 -0
  182. package/lib/download/core/svgBounds.d.ts +44 -0
  183. package/lib/download/core/svgBounds.d.ts.map +1 -0
  184. package/lib/download/core/svgBounds.js +69 -0
  185. package/lib/download/core/svgBounds.js.map +1 -0
  186. package/lib/download/core/svgNamespace.d.ts +9 -0
  187. package/lib/download/core/svgNamespace.d.ts.map +1 -0
  188. package/lib/download/core/svgNamespace.js +10 -0
  189. package/lib/download/core/svgNamespace.js.map +1 -0
  190. package/lib/download/core/svgToPng.d.ts +43 -0
  191. package/lib/download/core/svgToPng.d.ts.map +1 -0
  192. package/lib/download/core/svgToPng.js +79 -0
  193. package/lib/download/core/svgToPng.js.map +1 -0
  194. package/lib/download/core/svgToString.d.ts +45 -0
  195. package/lib/download/core/svgToString.d.ts.map +1 -0
  196. package/lib/download/core/svgToString.js +58 -0
  197. package/lib/download/core/svgToString.js.map +1 -0
  198. package/lib/download/ui/ExportDialogFrame.d.ts +46 -0
  199. package/lib/download/ui/ExportDialogFrame.d.ts.map +1 -0
  200. package/lib/download/ui/ExportDialogFrame.js +24 -0
  201. package/lib/download/ui/ExportDialogFrame.js.map +1 -0
  202. package/lib/download/ui/ExportImageDialog.d.ts +47 -0
  203. package/lib/download/ui/ExportImageDialog.d.ts.map +1 -0
  204. package/lib/download/ui/ExportImageDialog.js +25 -0
  205. package/lib/download/ui/ExportImageDialog.js.map +1 -0
  206. package/lib/download/ui/ExportNameField.d.ts +29 -0
  207. package/lib/download/ui/ExportNameField.d.ts.map +1 -0
  208. package/lib/download/ui/ExportNameField.js +99 -0
  209. package/lib/download/ui/ExportNameField.js.map +1 -0
  210. package/lib/download/ui/ExportPictureSection.d.ts +38 -0
  211. package/lib/download/ui/ExportPictureSection.d.ts.map +1 -0
  212. package/lib/download/ui/ExportPictureSection.js +48 -0
  213. package/lib/download/ui/ExportPictureSection.js.map +1 -0
  214. package/lib/download/ui/index.d.ts +10 -0
  215. package/lib/download/ui/index.d.ts.map +1 -1
  216. package/lib/download/ui/index.js +5 -0
  217. package/lib/download/ui/index.js.map +1 -1
  218. package/lib/download/ui/useDrawingBox.d.ts +23 -0
  219. package/lib/download/ui/useDrawingBox.d.ts.map +1 -0
  220. package/lib/download/ui/useDrawingBox.js +21 -0
  221. package/lib/download/ui/useDrawingBox.js.map +1 -0
  222. package/lib/error/core/describeSource.d.ts +17 -0
  223. package/lib/error/core/describeSource.d.ts.map +1 -0
  224. package/lib/error/core/describeSource.js +19 -0
  225. package/lib/error/core/describeSource.js.map +1 -0
  226. package/lib/error/core/index.d.ts +1 -0
  227. package/lib/error/core/index.d.ts.map +1 -1
  228. package/lib/error/core/index.js +1 -0
  229. package/lib/error/core/index.js.map +1 -1
  230. package/lib/help/ui/HelpBody.d.ts +10 -1
  231. package/lib/help/ui/HelpBody.d.ts.map +1 -1
  232. package/lib/help/ui/HelpBody.js +24 -1
  233. package/lib/help/ui/HelpBody.js.map +1 -1
  234. package/lib/help/ui/index.d.ts +1 -1
  235. package/lib/help/ui/index.d.ts.map +1 -1
  236. package/lib/help/ui/index.js.map +1 -1
  237. package/lib/ir/core/analysisSpectra.d.ts +46 -0
  238. package/lib/ir/core/analysisSpectra.d.ts.map +1 -0
  239. package/lib/ir/core/analysisSpectra.js +187 -0
  240. package/lib/ir/core/analysisSpectra.js.map +1 -0
  241. package/lib/ir/core/assignBands.d.ts +83 -0
  242. package/lib/ir/core/assignBands.d.ts.map +1 -0
  243. package/lib/ir/core/assignBands.js +83 -0
  244. package/lib/ir/core/assignBands.js.map +1 -0
  245. package/lib/ir/core/bandAssignments.d.ts +47 -0
  246. package/lib/ir/core/bandAssignments.d.ts.map +1 -0
  247. package/lib/ir/core/bandAssignments.js +305 -0
  248. package/lib/ir/core/bandAssignments.js.map +1 -0
  249. package/lib/ir/core/bandLabelPlan.d.ts +93 -0
  250. package/lib/ir/core/bandLabelPlan.d.ts.map +1 -0
  251. package/lib/ir/core/bandLabelPlan.js +104 -0
  252. package/lib/ir/core/bandLabelPlan.js.map +1 -0
  253. package/lib/ir/core/detectIrFormat.d.ts +23 -0
  254. package/lib/ir/core/detectIrFormat.d.ts.map +1 -0
  255. package/lib/ir/core/detectIrFormat.js +133 -0
  256. package/lib/ir/core/detectIrFormat.js.map +1 -0
  257. package/lib/ir/core/downloadSpectra.d.ts +26 -0
  258. package/lib/ir/core/downloadSpectra.d.ts.map +1 -0
  259. package/lib/ir/core/downloadSpectra.js +37 -0
  260. package/lib/ir/core/downloadSpectra.js.map +1 -0
  261. package/lib/ir/core/fromJcamp.d.ts +35 -0
  262. package/lib/ir/core/fromJcamp.d.ts.map +1 -0
  263. package/lib/ir/core/fromJcamp.js +48 -0
  264. package/lib/ir/core/fromJcamp.js.map +1 -0
  265. package/lib/ir/core/fromSpc.d.ts +30 -0
  266. package/lib/ir/core/fromSpc.d.ts.map +1 -0
  267. package/lib/ir/core/fromSpc.js +40 -0
  268. package/lib/ir/core/fromSpc.js.map +1 -0
  269. package/lib/ir/core/index.d.ts +51 -0
  270. package/lib/ir/core/index.d.ts.map +1 -0
  271. package/lib/ir/core/index.js +35 -0
  272. package/lib/ir/core/index.js.map +1 -0
  273. package/lib/ir/core/irBand.d.ts +45 -0
  274. package/lib/ir/core/irBand.d.ts.map +1 -0
  275. package/lib/ir/core/irBand.js +30 -0
  276. package/lib/ir/core/irBand.js.map +1 -0
  277. package/lib/ir/core/irCommands.d.ts +168 -0
  278. package/lib/ir/core/irCommands.d.ts.map +1 -0
  279. package/lib/ir/core/irCommands.js +94 -0
  280. package/lib/ir/core/irCommands.js.map +1 -0
  281. package/lib/ir/core/irDomain.d.ts +63 -0
  282. package/lib/ir/core/irDomain.d.ts.map +1 -0
  283. package/lib/ir/core/irDomain.js +136 -0
  284. package/lib/ir/core/irDomain.js.map +1 -0
  285. package/lib/ir/core/irEditorApi.d.ts +42 -0
  286. package/lib/ir/core/irEditorApi.d.ts.map +1 -0
  287. package/lib/ir/core/irEditorApi.js +10 -0
  288. package/lib/ir/core/irEditorApi.js.map +1 -0
  289. package/lib/ir/core/irFormat.d.ts +42 -0
  290. package/lib/ir/core/irFormat.d.ts.map +1 -0
  291. package/lib/ir/core/irFormat.js +51 -0
  292. package/lib/ir/core/irFormat.js.map +1 -0
  293. package/lib/ir/core/irMode.d.ts +160 -0
  294. package/lib/ir/core/irMode.d.ts.map +1 -0
  295. package/lib/ir/core/irMode.js +175 -0
  296. package/lib/ir/core/irMode.js.map +1 -0
  297. package/lib/ir/core/irReducer.d.ts +101 -0
  298. package/lib/ir/core/irReducer.d.ts.map +1 -0
  299. package/lib/ir/core/irReducer.js +207 -0
  300. package/lib/ir/core/irReducer.js.map +1 -0
  301. package/lib/ir/core/irSidePanels.d.ts +22 -0
  302. package/lib/ir/core/irSidePanels.d.ts.map +1 -0
  303. package/lib/ir/core/irSidePanels.js +12 -0
  304. package/lib/ir/core/irSidePanels.js.map +1 -0
  305. package/lib/ir/core/irSpectrum.d.ts +140 -0
  306. package/lib/ir/core/irSpectrum.d.ts.map +1 -0
  307. package/lib/ir/core/irSpectrum.js +34 -0
  308. package/lib/ir/core/irSpectrum.js.map +1 -0
  309. package/lib/ir/core/irState.d.ts +119 -0
  310. package/lib/ir/core/irState.d.ts.map +1 -0
  311. package/lib/ir/core/irState.js +92 -0
  312. package/lib/ir/core/irState.js.map +1 -0
  313. package/lib/ir/core/loadIrSpectra.d.ts +36 -0
  314. package/lib/ir/core/loadIrSpectra.d.ts.map +1 -0
  315. package/lib/ir/core/loadIrSpectra.js +44 -0
  316. package/lib/ir/core/loadIrSpectra.js.map +1 -0
  317. package/lib/ir/core/nearestBand.d.ts +35 -0
  318. package/lib/ir/core/nearestBand.d.ts.map +1 -0
  319. package/lib/ir/core/nearestBand.js +47 -0
  320. package/lib/ir/core/nearestBand.js.map +1 -0
  321. package/lib/ir/core/pickBands.d.ts +70 -0
  322. package/lib/ir/core/pickBands.d.ts.map +1 -0
  323. package/lib/ir/core/pickBands.js +125 -0
  324. package/lib/ir/core/pickBands.js.map +1 -0
  325. package/lib/ir/core/spectrumJcamp.d.ts +58 -0
  326. package/lib/ir/core/spectrumJcamp.d.ts.map +1 -0
  327. package/lib/ir/core/spectrumJcamp.js +156 -0
  328. package/lib/ir/core/spectrumJcamp.js.map +1 -0
  329. package/lib/ir/core/toIrSpectrum.d.ts +59 -0
  330. package/lib/ir/core/toIrSpectrum.d.ts.map +1 -0
  331. package/lib/ir/core/toIrSpectrum.js +56 -0
  332. package/lib/ir/core/toIrSpectrum.js.map +1 -0
  333. package/lib/ir/ui/BandMarks.d.ts +52 -0
  334. package/lib/ir/ui/BandMarks.d.ts.map +1 -0
  335. package/lib/ir/ui/BandMarks.js +71 -0
  336. package/lib/ir/ui/BandMarks.js.map +1 -0
  337. package/lib/ir/ui/BandsPanel.d.ts +31 -0
  338. package/lib/ir/ui/BandsPanel.d.ts.map +1 -0
  339. package/lib/ir/ui/BandsPanel.js +94 -0
  340. package/lib/ir/ui/BandsPanel.js.map +1 -0
  341. package/lib/ir/ui/IrAboutDialog.d.ts +18 -0
  342. package/lib/ir/ui/IrAboutDialog.d.ts.map +1 -0
  343. package/lib/ir/ui/IrAboutDialog.js +32 -0
  344. package/lib/ir/ui/IrAboutDialog.js.map +1 -0
  345. package/lib/ir/ui/IrCanvas.d.ts +38 -0
  346. package/lib/ir/ui/IrCanvas.d.ts.map +1 -0
  347. package/lib/ir/ui/IrCanvas.js +41 -0
  348. package/lib/ir/ui/IrCanvas.js.map +1 -0
  349. package/lib/ir/ui/IrChart.d.ts +28 -0
  350. package/lib/ir/ui/IrChart.d.ts.map +1 -0
  351. package/lib/ir/ui/IrChart.js +114 -0
  352. package/lib/ir/ui/IrChart.js.map +1 -0
  353. package/lib/ir/ui/IrCommandProvider.d.ts +15 -0
  354. package/lib/ir/ui/IrCommandProvider.d.ts.map +1 -0
  355. package/lib/ir/ui/IrCommandProvider.js +14 -0
  356. package/lib/ir/ui/IrCommandProvider.js.map +1 -0
  357. package/lib/ir/ui/IrCommandTooltip.d.ts +16 -0
  358. package/lib/ir/ui/IrCommandTooltip.d.ts.map +1 -0
  359. package/lib/ir/ui/IrCommandTooltip.js +22 -0
  360. package/lib/ir/ui/IrCommandTooltip.js.map +1 -0
  361. package/lib/ir/ui/IrDocumentationDialog.d.ts +18 -0
  362. package/lib/ir/ui/IrDocumentationDialog.d.ts.map +1 -0
  363. package/lib/ir/ui/IrDocumentationDialog.js +68 -0
  364. package/lib/ir/ui/IrDocumentationDialog.js.map +1 -0
  365. package/lib/ir/ui/IrEditor.d.ts +60 -0
  366. package/lib/ir/ui/IrEditor.d.ts.map +1 -0
  367. package/lib/ir/ui/IrEditor.js +42 -0
  368. package/lib/ir/ui/IrEditor.js.map +1 -0
  369. package/lib/ir/ui/IrHeader.d.ts +13 -0
  370. package/lib/ir/ui/IrHeader.d.ts.map +1 -0
  371. package/lib/ir/ui/IrHeader.js +21 -0
  372. package/lib/ir/ui/IrHeader.js.map +1 -0
  373. package/lib/ir/ui/IrLogo.d.ts +20 -0
  374. package/lib/ir/ui/IrLogo.d.ts.map +1 -0
  375. package/lib/ir/ui/IrLogo.js +17 -0
  376. package/lib/ir/ui/IrLogo.js.map +1 -0
  377. package/lib/ir/ui/IrPointerTracker.d.ts +29 -0
  378. package/lib/ir/ui/IrPointerTracker.d.ts.map +1 -0
  379. package/lib/ir/ui/IrPointerTracker.js +47 -0
  380. package/lib/ir/ui/IrPointerTracker.js.map +1 -0
  381. package/lib/ir/ui/IrShell.d.ts +25 -0
  382. package/lib/ir/ui/IrShell.d.ts.map +1 -0
  383. package/lib/ir/ui/IrShell.js +178 -0
  384. package/lib/ir/ui/IrShell.js.map +1 -0
  385. package/lib/ir/ui/IrSidePanel.d.ts +26 -0
  386. package/lib/ir/ui/IrSidePanel.d.ts.map +1 -0
  387. package/lib/ir/ui/IrSidePanel.js +39 -0
  388. package/lib/ir/ui/IrSidePanel.js.map +1 -0
  389. package/lib/ir/ui/IrStateProvider.d.ts +19 -0
  390. package/lib/ir/ui/IrStateProvider.d.ts.map +1 -0
  391. package/lib/ir/ui/IrStateProvider.js +16 -0
  392. package/lib/ir/ui/IrStateProvider.js.map +1 -0
  393. package/lib/ir/ui/IrStatusBar.d.ts +14 -0
  394. package/lib/ir/ui/IrStatusBar.d.ts.map +1 -0
  395. package/lib/ir/ui/IrStatusBar.js +48 -0
  396. package/lib/ir/ui/IrStatusBar.js.map +1 -0
  397. package/lib/ir/ui/IrToolbar.d.ts +18 -0
  398. package/lib/ir/ui/IrToolbar.d.ts.map +1 -0
  399. package/lib/ir/ui/IrToolbar.js +32 -0
  400. package/lib/ir/ui/IrToolbar.js.map +1 -0
  401. package/lib/ir/ui/IrTraces.d.ts +63 -0
  402. package/lib/ir/ui/IrTraces.d.ts.map +1 -0
  403. package/lib/ir/ui/IrTraces.js +72 -0
  404. package/lib/ir/ui/IrTraces.js.map +1 -0
  405. package/lib/ir/ui/MetadataPanel.d.ts +15 -0
  406. package/lib/ir/ui/MetadataPanel.d.ts.map +1 -0
  407. package/lib/ir/ui/MetadataPanel.js +49 -0
  408. package/lib/ir/ui/MetadataPanel.js.map +1 -0
  409. package/lib/ir/ui/SpectraPanel.d.ts +20 -0
  410. package/lib/ir/ui/SpectraPanel.d.ts.map +1 -0
  411. package/lib/ir/ui/SpectraPanel.js +42 -0
  412. package/lib/ir/ui/SpectraPanel.js.map +1 -0
  413. package/lib/ir/ui/SpectrumRow.d.ts +26 -0
  414. package/lib/ir/ui/SpectrumRow.d.ts.map +1 -0
  415. package/lib/ir/ui/SpectrumRow.js +41 -0
  416. package/lib/ir/ui/SpectrumRow.js.map +1 -0
  417. package/lib/ir/ui/index.d.ts +56 -0
  418. package/lib/ir/ui/index.d.ts.map +1 -0
  419. package/lib/ir/ui/index.js +36 -0
  420. package/lib/ir/ui/index.js.map +1 -0
  421. package/lib/ir/ui/irActions.d.ts +52 -0
  422. package/lib/ir/ui/irActions.d.ts.map +1 -0
  423. package/lib/ir/ui/irActions.js +62 -0
  424. package/lib/ir/ui/irActions.js.map +1 -0
  425. package/lib/ir/ui/irChartProps.d.ts +116 -0
  426. package/lib/ir/ui/irChartProps.d.ts.map +1 -0
  427. package/lib/ir/ui/irChartProps.js +14 -0
  428. package/lib/ir/ui/irChartProps.js.map +1 -0
  429. package/lib/ir/ui/irCommandContext.d.ts +35 -0
  430. package/lib/ir/ui/irCommandContext.d.ts.map +1 -0
  431. package/lib/ir/ui/irCommandContext.js +44 -0
  432. package/lib/ir/ui/irCommandContext.js.map +1 -0
  433. package/lib/ir/ui/irStateContext.d.ts +26 -0
  434. package/lib/ir/ui/irStateContext.d.ts.map +1 -0
  435. package/lib/ir/ui/irStateContext.js +37 -0
  436. package/lib/ir/ui/irStateContext.js.map +1 -0
  437. package/lib/ir/ui/useIrEditor.d.ts +51 -0
  438. package/lib/ir/ui/useIrEditor.d.ts.map +1 -0
  439. package/lib/ir/ui/useIrEditor.js +88 -0
  440. package/lib/ir/ui/useIrEditor.js.map +1 -0
  441. package/lib/ir/ui/useIrPointer.d.ts +66 -0
  442. package/lib/ir/ui/useIrPointer.d.ts.map +1 -0
  443. package/lib/ir/ui/useIrPointer.js +53 -0
  444. package/lib/ir/ui/useIrPointer.js.map +1 -0
  445. package/lib/ir/ui/useIrShortcuts.d.ts +24 -0
  446. package/lib/ir/ui/useIrShortcuts.d.ts.map +1 -0
  447. package/lib/ir/ui/useIrShortcuts.js +73 -0
  448. package/lib/ir/ui/useIrShortcuts.js.map +1 -0
  449. package/lib/ir/ui/useIrZoom.d.ts +51 -0
  450. package/lib/ir/ui/useIrZoom.d.ts.map +1 -0
  451. package/lib/ir/ui/useIrZoom.js +46 -0
  452. package/lib/ir/ui/useIrZoom.js.map +1 -0
  453. package/lib/ir.d.ts +13 -0
  454. package/lib/ir.d.ts.map +1 -0
  455. package/lib/ir.js +13 -0
  456. package/lib/ir.js.map +1 -0
  457. package/lib/panel/core/dialogStyles.d.ts +13 -0
  458. package/lib/panel/core/dialogStyles.d.ts.map +1 -0
  459. package/lib/panel/core/dialogStyles.js +11 -0
  460. package/lib/panel/core/dialogStyles.js.map +1 -0
  461. package/lib/panel/core/index.d.ts +19 -0
  462. package/lib/panel/core/index.d.ts.map +1 -0
  463. package/lib/panel/core/index.js +18 -0
  464. package/lib/panel/core/index.js.map +1 -0
  465. package/lib/panel/core/isEditingField.d.ts +17 -0
  466. package/lib/panel/core/isEditingField.d.ts.map +1 -0
  467. package/lib/panel/core/isEditingField.js +25 -0
  468. package/lib/panel/core/isEditingField.js.map +1 -0
  469. package/lib/panel/core/panelStyles.d.ts +242 -0
  470. package/lib/panel/core/panelStyles.d.ts.map +1 -0
  471. package/lib/panel/core/panelStyles.js +228 -0
  472. package/lib/panel/core/panelStyles.js.map +1 -0
  473. package/lib/panel/core/rowSpacers.d.ts +38 -0
  474. package/lib/panel/core/rowSpacers.d.ts.map +1 -0
  475. package/lib/panel/core/rowSpacers.js +31 -0
  476. package/lib/panel/core/rowSpacers.js.map +1 -0
  477. package/lib/panel/core/statusBar.d.ts +44 -0
  478. package/lib/panel/core/statusBar.d.ts.map +1 -0
  479. package/lib/panel/core/statusBar.js +40 -0
  480. package/lib/panel/core/statusBar.js.map +1 -0
  481. package/lib/panel/core/textFilter.d.ts +22 -0
  482. package/lib/panel/core/textFilter.d.ts.map +1 -0
  483. package/lib/panel/core/textFilter.js +32 -0
  484. package/lib/panel/core/textFilter.js.map +1 -0
  485. package/lib/panel/core/yieldToPainting.d.ts +17 -0
  486. package/lib/panel/core/yieldToPainting.d.ts.map +1 -0
  487. package/lib/panel/core/yieldToPainting.js +21 -0
  488. package/lib/panel/core/yieldToPainting.js.map +1 -0
  489. package/lib/panel/ui/AboutDialogFrame.d.ts +36 -0
  490. package/lib/panel/ui/AboutDialogFrame.d.ts.map +1 -0
  491. package/lib/panel/ui/AboutDialogFrame.js +43 -0
  492. package/lib/panel/ui/AboutDialogFrame.js.map +1 -0
  493. package/lib/panel/ui/ClearButton.d.ts +28 -0
  494. package/lib/panel/ui/ClearButton.d.ts.map +1 -0
  495. package/lib/panel/ui/ClearButton.js +23 -0
  496. package/lib/panel/ui/ClearButton.js.map +1 -0
  497. package/lib/panel/ui/DocumentationDialogFrame.d.ts +39 -0
  498. package/lib/panel/ui/DocumentationDialogFrame.d.ts.map +1 -0
  499. package/lib/panel/ui/DocumentationDialogFrame.js +29 -0
  500. package/lib/panel/ui/DocumentationDialogFrame.js.map +1 -0
  501. package/lib/panel/ui/FilterInput.d.ts +31 -0
  502. package/lib/panel/ui/FilterInput.d.ts.map +1 -0
  503. package/lib/panel/ui/FilterInput.js +23 -0
  504. package/lib/panel/ui/FilterInput.js.map +1 -0
  505. package/lib/panel/ui/HelpLabel.d.ts +24 -0
  506. package/lib/panel/ui/HelpLabel.d.ts.map +1 -0
  507. package/lib/panel/ui/HelpLabel.js +23 -0
  508. package/lib/panel/ui/HelpLabel.js.map +1 -0
  509. package/lib/panel/ui/PanelMessage.d.ts +41 -0
  510. package/lib/panel/ui/PanelMessage.d.ts.map +1 -0
  511. package/lib/panel/ui/PanelMessage.js +30 -0
  512. package/lib/panel/ui/PanelMessage.js.map +1 -0
  513. package/lib/panel/ui/PanelRail.d.ts +41 -0
  514. package/lib/panel/ui/PanelRail.d.ts.map +1 -0
  515. package/lib/panel/ui/PanelRail.js +12 -0
  516. package/lib/panel/ui/PanelRail.js.map +1 -0
  517. package/lib/panel/ui/Section.d.ts +25 -0
  518. package/lib/panel/ui/Section.d.ts.map +1 -0
  519. package/lib/panel/ui/Section.js +41 -0
  520. package/lib/panel/ui/Section.js.map +1 -0
  521. package/lib/panel/ui/SidePanelStack.d.ts +62 -0
  522. package/lib/panel/ui/SidePanelStack.d.ts.map +1 -0
  523. package/lib/panel/ui/SidePanelStack.js +40 -0
  524. package/lib/panel/ui/SidePanelStack.js.map +1 -0
  525. package/lib/panel/ui/SpectrumColorSwatch.d.ts +33 -0
  526. package/lib/panel/ui/SpectrumColorSwatch.d.ts.map +1 -0
  527. package/lib/panel/ui/SpectrumColorSwatch.js +76 -0
  528. package/lib/panel/ui/SpectrumColorSwatch.js.map +1 -0
  529. package/lib/panel/ui/index.d.ts +37 -0
  530. package/lib/panel/ui/index.d.ts.map +1 -0
  531. package/lib/panel/ui/index.js +24 -0
  532. package/lib/panel/ui/index.js.map +1 -0
  533. package/lib/panel/ui/useConfirmOnEnter.d.ts +19 -0
  534. package/lib/panel/ui/useConfirmOnEnter.d.ts.map +1 -0
  535. package/lib/panel/ui/useConfirmOnEnter.js +64 -0
  536. package/lib/panel/ui/useConfirmOnEnter.js.map +1 -0
  537. package/lib/panel/ui/useFilterBox.d.ts +23 -0
  538. package/lib/panel/ui/useFilterBox.d.ts.map +1 -0
  539. package/lib/panel/ui/useFilterBox.js +22 -0
  540. package/lib/panel/ui/useFilterBox.js.map +1 -0
  541. package/lib/panel/ui/useVirtualRows.d.ts +46 -0
  542. package/lib/panel/ui/useVirtualRows.d.ts.map +1 -0
  543. package/lib/panel/ui/useVirtualRows.js +56 -0
  544. package/lib/panel/ui/useVirtualRows.js.map +1 -0
  545. package/lib/panel/ui/useVirtualWindowRows.d.ts +40 -0
  546. package/lib/panel/ui/useVirtualWindowRows.d.ts.map +1 -0
  547. package/lib/panel/ui/useVirtualWindowRows.js +65 -0
  548. package/lib/panel/ui/useVirtualWindowRows.js.map +1 -0
  549. package/lib/ui.d.ts +1 -0
  550. package/lib/ui.d.ts.map +1 -1
  551. package/lib/ui.js +1 -0
  552. package/lib/ui.js.map +1 -1
  553. package/package.json +8 -1
  554. package/src/chart/core/axisLabels.ts +117 -0
  555. package/src/chart/core/boxLayout.ts +126 -0
  556. package/src/chart/core/chartAxisScale.ts +92 -10
  557. package/src/chart/core/chartDomain.ts +185 -0
  558. package/src/chart/core/chartGeometry.ts +159 -0
  559. package/src/chart/core/chartPane.ts +10 -0
  560. package/src/chart/core/chartScale.ts +7 -4
  561. package/src/chart/core/chartTheme.ts +161 -0
  562. package/src/chart/core/chartViewport.ts +40 -13
  563. package/src/chart/core/guidePlacement.ts +66 -0
  564. package/src/chart/core/index.ts +121 -2
  565. package/src/chart/core/labelStack.ts +72 -0
  566. package/src/chart/core/legendBox.ts +263 -0
  567. package/src/chart/core/selectionGeometry.ts +68 -0
  568. package/src/chart/core/spectrumColor.ts +129 -0
  569. package/src/chart/core/stackCapacity.ts +162 -0
  570. package/src/chart/core/svgPoint.ts +77 -0
  571. package/src/chart/core/tracePath.ts +228 -0
  572. package/src/chart/core/trackerReadout.ts +78 -0
  573. package/src/chart/core/viewTransform.ts +287 -0
  574. package/src/chart/core/zoomDomain.ts +235 -0
  575. package/src/chart/ui/Axes.tsx +361 -0
  576. package/src/chart/ui/AxisGuide.tsx +187 -0
  577. package/src/chart/ui/ChartStack.tsx +130 -0
  578. package/src/chart/ui/ChartTracker.tsx +101 -0
  579. package/src/chart/ui/PlotCaption.tsx +108 -0
  580. package/src/chart/ui/SelectionRect.tsx +52 -0
  581. package/src/chart/ui/TraceLegend.tsx +193 -0
  582. package/src/chart/ui/chartGestures.ts +270 -0
  583. package/src/chart/ui/chartStackLevel.tsx +210 -0
  584. package/src/chart/ui/chartSurface.ts +66 -0
  585. package/src/chart/ui/index.ts +35 -0
  586. package/src/chart/ui/useChartPointer.ts +223 -0
  587. package/src/chart/ui/useChartSize.ts +115 -0
  588. package/src/chart/ui/useChartWindow.ts +240 -0
  589. package/src/chart/ui/useChartZoom.ts +255 -0
  590. package/src/chart/ui/useWheelListener.ts +62 -0
  591. package/src/clipboard/core/copyPng.ts +20 -0
  592. package/src/clipboard/core/index.ts +1 -0
  593. package/src/core.ts +1 -0
  594. package/src/download/core/exportStyles.ts +20 -0
  595. package/src/download/core/imageResolution.ts +118 -0
  596. package/src/download/core/index.ts +34 -0
  597. package/src/download/core/pictureExport.ts +207 -0
  598. package/src/download/core/stackedDrawing.ts +108 -0
  599. package/src/download/core/svgBounds.ts +80 -0
  600. package/src/download/core/svgNamespace.ts +9 -0
  601. package/src/download/core/svgToPng.ts +121 -0
  602. package/src/download/core/svgToString.ts +95 -0
  603. package/src/download/ui/ExportDialogFrame.tsx +86 -0
  604. package/src/download/ui/ExportImageDialog.tsx +91 -0
  605. package/src/download/ui/ExportNameField.tsx +148 -0
  606. package/src/download/ui/ExportPictureSection.tsx +142 -0
  607. package/src/download/ui/index.ts +11 -0
  608. package/src/download/ui/useDrawingBox.ts +37 -0
  609. package/src/error/core/describeSource.ts +18 -0
  610. package/src/error/core/index.ts +1 -0
  611. package/src/help/ui/HelpBody.tsx +41 -2
  612. package/src/help/ui/index.ts +6 -1
  613. package/src/ir/core/analysisSpectra.ts +231 -0
  614. package/src/ir/core/assignBands.ts +144 -0
  615. package/src/ir/core/bandAssignments.ts +329 -0
  616. package/src/ir/core/bandLabelPlan.ts +194 -0
  617. package/src/ir/core/detectIrFormat.ts +139 -0
  618. package/src/ir/core/downloadSpectra.ts +57 -0
  619. package/src/ir/core/fromJcamp.ts +70 -0
  620. package/src/ir/core/fromSpc.ts +61 -0
  621. package/src/ir/core/index.ts +113 -0
  622. package/src/ir/core/irBand.ts +57 -0
  623. package/src/ir/core/irCommands.ts +154 -0
  624. package/src/ir/core/irDomain.ts +163 -0
  625. package/src/ir/core/irEditorApi.ts +44 -0
  626. package/src/ir/core/irFormat.ts +57 -0
  627. package/src/ir/core/irMode.ts +203 -0
  628. package/src/ir/core/irReducer.ts +273 -0
  629. package/src/ir/core/irSidePanels.ts +20 -0
  630. package/src/ir/core/irSpectrum.ts +155 -0
  631. package/src/ir/core/irState.ts +173 -0
  632. package/src/ir/core/loadIrSpectra.ts +79 -0
  633. package/src/ir/core/nearestBand.ts +57 -0
  634. package/src/ir/core/pickBands.ts +181 -0
  635. package/src/ir/core/spectrumJcamp.ts +178 -0
  636. package/src/ir/core/toIrSpectrum.ts +102 -0
  637. package/src/ir/ui/BandMarks.tsx +166 -0
  638. package/src/ir/ui/BandsPanel.tsx +271 -0
  639. package/src/ir/ui/IrAboutDialog.tsx +121 -0
  640. package/src/ir/ui/IrCanvas.tsx +91 -0
  641. package/src/ir/ui/IrChart.tsx +215 -0
  642. package/src/ir/ui/IrCommandProvider.tsx +32 -0
  643. package/src/ir/ui/IrCommandTooltip.tsx +36 -0
  644. package/src/ir/ui/IrDocumentationDialog.tsx +174 -0
  645. package/src/ir/ui/IrEditor.tsx +99 -0
  646. package/src/ir/ui/IrHeader.tsx +39 -0
  647. package/src/ir/ui/IrLogo.tsx +49 -0
  648. package/src/ir/ui/IrPointerTracker.tsx +102 -0
  649. package/src/ir/ui/IrShell.tsx +285 -0
  650. package/src/ir/ui/IrSidePanel.tsx +78 -0
  651. package/src/ir/ui/IrStateProvider.tsx +32 -0
  652. package/src/ir/ui/IrStatusBar.tsx +97 -0
  653. package/src/ir/ui/IrToolbar.tsx +102 -0
  654. package/src/ir/ui/IrTraces.tsx +134 -0
  655. package/src/ir/ui/MetadataPanel.tsx +88 -0
  656. package/src/ir/ui/SpectraPanel.tsx +114 -0
  657. package/src/ir/ui/SpectrumRow.tsx +127 -0
  658. package/src/ir/ui/index.ts +56 -0
  659. package/src/ir/ui/irActions.ts +103 -0
  660. package/src/ir/ui/irChartProps.ts +118 -0
  661. package/src/ir/ui/irCommandContext.tsx +62 -0
  662. package/src/ir/ui/irStateContext.ts +48 -0
  663. package/src/ir/ui/useIrEditor.ts +139 -0
  664. package/src/ir/ui/useIrPointer.ts +109 -0
  665. package/src/ir/ui/useIrShortcuts.ts +95 -0
  666. package/src/ir/ui/useIrZoom.ts +86 -0
  667. package/src/ir.ts +13 -0
  668. package/src/panel/core/dialogStyles.ts +11 -0
  669. package/src/panel/core/index.ts +47 -0
  670. package/src/panel/core/isEditingField.ts +23 -0
  671. package/src/panel/core/panelStyles.ts +248 -0
  672. package/src/panel/core/rowSpacers.ts +50 -0
  673. package/src/panel/core/statusBar.ts +48 -0
  674. package/src/panel/core/textFilter.ts +33 -0
  675. package/src/panel/core/yieldToPainting.ts +20 -0
  676. package/src/panel/ui/AboutDialogFrame.tsx +100 -0
  677. package/src/panel/ui/ClearButton.tsx +42 -0
  678. package/src/panel/ui/DocumentationDialogFrame.tsx +86 -0
  679. package/src/panel/ui/FilterInput.tsx +60 -0
  680. package/src/panel/ui/HelpLabel.tsx +43 -0
  681. package/src/panel/ui/PanelMessage.tsx +64 -0
  682. package/src/panel/ui/PanelRail.tsx +64 -0
  683. package/src/panel/ui/Section.tsx +66 -0
  684. package/src/panel/ui/SidePanelStack.tsx +109 -0
  685. package/src/panel/ui/SpectrumColorSwatch.tsx +119 -0
  686. package/src/panel/ui/index.ts +47 -0
  687. package/src/panel/ui/useConfirmOnEnter.ts +68 -0
  688. package/src/panel/ui/useFilterBox.ts +35 -0
  689. package/src/panel/ui/useVirtualRows.ts +82 -0
  690. package/src/panel/ui/useVirtualWindowRows.ts +86 -0
  691. package/src/ui.ts +1 -0
@@ -0,0 +1,118 @@
1
+ /**
2
+ * What a consumer hands the chart, and what the chart tells it back.
3
+ *
4
+ * Held apart from the component because it is the whole of the chart's public
5
+ * API — every spectrum drawn, every band marked on it and every gesture that
6
+ * comes back out is one of these — while the component behind it is an assembly
7
+ * of half a dozen layers nobody needs to read in order to mount one.
8
+ *
9
+ * Everything arrives as a prop and nothing is reached for: the chart reads no
10
+ * context and no store, so the same component serves an editor, a report page
11
+ * that only ever draws one spectrum, and a test.
12
+ */
13
+
14
+ import type { ReactNode } from 'react';
15
+
16
+ import type { ZoomDragMode } from '../../chart/core/chartDomain.ts';
17
+ import type { AssignedBand } from '../core/assignBands.ts';
18
+ import type { IrBand } from '../core/irBand.ts';
19
+ import type { IrDomain, IrMode, IrSpectrum } from '../core/irSpectrum.ts';
20
+
21
+ export interface IrChartProps {
22
+ /** The spectra to draw, each saying in itself whether it is drawn. */
23
+ spectra: readonly IrSpectrum[];
24
+ /**
25
+ * Which value axis to draw them in.
26
+ *
27
+ * A prop rather than state, so the switch lives with whoever owns the toolbar
28
+ * that flips it — and so two charts of the same spectra can be shown side by
29
+ * side, one in each, which is the clearest way to see what the pair means.
30
+ * @default 'transmittance'
31
+ */
32
+ mode?: IrMode;
33
+ /**
34
+ * The bands to mark, with whatever the correlation table said about them.
35
+ *
36
+ * Handed in rather than picked here, because the same bands answer the chart,
37
+ * a table beside it and any assignment count — and picking three times over
38
+ * would let them disagree.
39
+ * @default no bands
40
+ */
41
+ assigned?: readonly AssignedBand[];
42
+ /**
43
+ * Whether each band label names its assignment as well as its wavenumber.
44
+ * @default false
45
+ */
46
+ showAssignments?: boolean;
47
+ /**
48
+ * At most how many bands are labelled; all of them are still marked.
49
+ * @default 12
50
+ */
51
+ labelLimit?: number;
52
+ /**
53
+ * The band the pointer has come to rest on, wherever it was hovered. The chart
54
+ * draws its mark larger, which is how a band hovered in a panel beside the
55
+ * chart shows up on the trace.
56
+ * @default null
57
+ */
58
+ highlight?: IrBand | null;
59
+ /**
60
+ * Told which band the pointer has come to rest on, and told `null` when it
61
+ * leaves — called only when the answer changes, so it is safe to hang a
62
+ * highlight that redraws half the page on it.
63
+ * @default undefined
64
+ */
65
+ onHighlight?: (band: IrBand | null) => void;
66
+ /**
67
+ * The window to show, `null` to let the chart show what fits.
68
+ *
69
+ * The chart holds a window of its own — where you are looking is neither saved
70
+ * nor undone — so this is an override rather than the chart's state. Every
71
+ * window a gesture arrives at is reported through `onDomainChange`, and a host
72
+ * that keeps one is expected to hand back what it is told. Handing back `null`
73
+ * where a window was is how a host asks for the fit again, which is what "zoom
74
+ * to fit" on a toolbar comes down to.
75
+ *
76
+ * `x` is in wavenumbers and runs low to high, whichever way the axis is drawn.
77
+ * @default null
78
+ */
79
+ domain?: IrDomain | null;
80
+ /**
81
+ * Told the window the chart has come to show, whenever it changes — a drag, a
82
+ * turn of the wheel, the double click that fits everything again, or a refit
83
+ * after what is drawn changed.
84
+ * @default undefined
85
+ */
86
+ onDomainChange?: (domain: IrDomain) => void;
87
+ /**
88
+ * What a drag across the plot asks for: the wavenumber axis alone, or exactly
89
+ * the rectangle it sweeps out. A viewer offering a square-zoom tool switches
90
+ * this while the tool is chosen.
91
+ * @default 'xAxis'
92
+ */
93
+ drag?: ZoomDragMode;
94
+ /**
95
+ * Identity of the spectrum drawn thicker than the rest, `null` for none.
96
+ * @default null
97
+ */
98
+ emphasisedId?: string | null;
99
+ /**
100
+ * How wide the chart is drawn, in pixels. Left out, it fills the box it is
101
+ * given and follows it as that box is resized.
102
+ * @default the width of its container
103
+ */
104
+ width?: number;
105
+ /**
106
+ * How tall it is drawn, in pixels.
107
+ * @default the height of its container
108
+ */
109
+ height?: number;
110
+ /**
111
+ * Anything else to draw over the spectra, in the same pixels and under the
112
+ * same clip — a band marking a region of interest, a second producer's layer,
113
+ * a ruler. It is rendered last inside the plot, so a host adds to the chart
114
+ * instead of forking it.
115
+ * @default undefined
116
+ */
117
+ children?: ReactNode;
118
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * How a component reaches the commands, and what a toolbar item needs to be one.
3
+ *
4
+ * The hooks and the context object, with no component of its own — see
5
+ * `irCommands.ts` for why the four files are split the way they are.
6
+ */
7
+
8
+ import { createContext, useContext } from 'react';
9
+
10
+ import type {
11
+ IrCommandHandlers,
12
+ IrCommandId,
13
+ RunIrCommand,
14
+ } from '../core/irCommands.ts';
15
+ import { irCommandLabel } from '../core/irCommands.ts';
16
+
17
+ import { IrCommandTooltip } from './IrCommandTooltip.tsx';
18
+
19
+ /** What the provider holds. */
20
+ export interface IrCommandContextValue {
21
+ /** What each command does. */
22
+ handlers: IrCommandHandlers;
23
+ /** Run one. */
24
+ run: RunIrCommand;
25
+ }
26
+
27
+ /** Where the provider puts it. */
28
+ export const commandContext = createContext<IrCommandContextValue | null>(null);
29
+
30
+ /**
31
+ * Run a command from anywhere inside the viewer.
32
+ * @returns The runner; a command nothing handles does nothing.
33
+ */
34
+ export function useIrCommand(): RunIrCommand {
35
+ const value = useContext(commandContext);
36
+ return value?.run ?? noRun;
37
+ }
38
+
39
+ /**
40
+ * Everything a toolbar item needs to be one command, in one spread.
41
+ *
42
+ * The tooltip, the label a screen reader is given and the click handler all come
43
+ * from the same table entry, so a button cannot end up titled one thing and
44
+ * doing another.
45
+ * @returns A function from a command's identity to the props for its button.
46
+ */
47
+ export function useIrCommandProps() {
48
+ const run = useIrCommand();
49
+ return function command(id: IrCommandId) {
50
+ return {
51
+ tooltip: <IrCommandTooltip id={id} />,
52
+ 'aria-label': irCommandLabel(id),
53
+ onClick: () => run(id),
54
+ };
55
+ };
56
+ }
57
+
58
+ /** What running a command comes to outside a provider: nothing at all. */
59
+ function noRun(): void {
60
+ // Deliberately empty: a chart mounted without the shell has no commands, and
61
+ // a missing provider is not a reason to throw at a button press.
62
+ }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * How a panel reaches the viewer it is inside.
3
+ *
4
+ * Two contexts rather than one, because the actions never change while the state
5
+ * changes on every pointer move: a panel that only ever acts — a toolbar button —
6
+ * reads the second and is not re-rendered by the first.
7
+ */
8
+
9
+ import { createContext, useContext } from 'react';
10
+
11
+ import type { IrEditorActions } from './irActions.ts';
12
+ import type { IrEditorApi } from './useIrEditor.ts';
13
+
14
+ /** Everything one viewer knows, as the provider holds it. */
15
+ export const stateContext = createContext<IrEditorApi | null>(null);
16
+
17
+ /** Everything that changes it, as the provider holds it. */
18
+ export const actionsContext = createContext<IrEditorActions | null>(null);
19
+
20
+ /**
21
+ * Everything the viewer knows, from inside it.
22
+ * @returns The state and what follows from it.
23
+ * @throws {Error} When read outside an `IrStateProvider`.
24
+ */
25
+ export function useIrEditorState(): IrEditorApi {
26
+ const editor = useContext(stateContext);
27
+ if (editor === null) {
28
+ throw new Error(
29
+ 'The infrared viewer state was read outside an IrStateProvider',
30
+ );
31
+ }
32
+ return editor;
33
+ }
34
+
35
+ /**
36
+ * Everything to do, from inside the viewer.
37
+ * @returns The actions.
38
+ * @throws {Error} When read outside an `IrStateProvider`.
39
+ */
40
+ export function useIrActions(): IrEditorActions {
41
+ const actions = useContext(actionsContext);
42
+ if (actions === null) {
43
+ throw new Error(
44
+ 'The infrared viewer actions were read outside an IrStateProvider',
45
+ );
46
+ }
47
+ return actions;
48
+ }
@@ -0,0 +1,139 @@
1
+ /**
2
+ * One viewer's state, and everything derived from it.
3
+ *
4
+ * The bands are derived here rather than held, and that is the one structural
5
+ * decision in this file. Picking is a pure function of a spectrum and the
6
+ * picking settings, so a band held in state would be an answer that has to be
7
+ * invalidated by hand every time either changes — and the version that is wrong
8
+ * is the one drawn on the chart. Derived, a stale band cannot exist.
9
+ *
10
+ * It is memoised on the selected spectrum rather than on all of them: picking
11
+ * runs a peak detection over a few thousand points, and doing it for six loaded
12
+ * spectra when the panels only ever show one would cost six times what it needs
13
+ * to on every change of a threshold.
14
+ */
15
+
16
+ import { useEffect, useMemo, useReducer, useRef } from 'react';
17
+
18
+ import type { AssignedBand } from '../core/assignBands.ts';
19
+ import { assignBands } from '../core/assignBands.ts';
20
+ import type { CreateIrStateOptions } from '../core/irReducer.ts';
21
+ import { createIrState, irReducer } from '../core/irReducer.ts';
22
+ import type { IrSpectrum } from '../core/irSpectrum.ts';
23
+ import type { IrState } from '../core/irState.ts';
24
+ import { pickBands } from '../core/pickBands.ts';
25
+
26
+ import type { IrEditorActions } from './irActions.ts';
27
+ import { createIrActions } from './irActions.ts';
28
+
29
+ /** What a viewer opens on, and who to tell when the spectra change. */
30
+ export interface UseIrEditorOptions extends CreateIrStateOptions {
31
+ /**
32
+ * Called whenever the spectra open change — one loaded, one closed, the chart
33
+ * cleared — with the spectra now open.
34
+ * @default undefined
35
+ */
36
+ onChange?: (spectra: IrSpectrum[]) => void;
37
+ }
38
+
39
+ /** What a component drives the viewer through. */
40
+ export interface IrEditorApi {
41
+ /** Everything the viewer knows, in its three buckets. */
42
+ state: IrState;
43
+ /** The spectra currently drawn, in the order they were loaded. */
44
+ visibleSpectra: IrSpectrum[];
45
+ /** The spectrum the panels act on, `null` while none is selected. */
46
+ selectedSpectrum: IrSpectrum | null;
47
+ /**
48
+ * The bands of the selected spectrum, with everything each might be. Empty
49
+ * while nothing is selected or while picking is switched off.
50
+ */
51
+ assigned: AssignedBand[];
52
+ /** Everything to do. */
53
+ actions: IrEditorActions;
54
+ }
55
+
56
+ /**
57
+ * Hold one viewer's state.
58
+ * @param options - What it opens on.
59
+ * @returns The state, what follows from it, and everything to do.
60
+ */
61
+ export function useIrEditor(options: UseIrEditorOptions = {}): IrEditorApi {
62
+ const { onChange, ...initial } = options;
63
+
64
+ const [state, dispatch] = useReducer(irReducer, initial, createIrState);
65
+ const actions = useMemo(() => createIrActions(dispatch), [dispatch]);
66
+
67
+ const { spectra } = state.data;
68
+ const { selectedId } = state.view;
69
+ const { pickBands: picking, picking: pickingOptions } = state.settings;
70
+ const { assignmentTolerance } = state.settings;
71
+
72
+ const visibleSpectra = useMemo(() => {
73
+ const visible: IrSpectrum[] = [];
74
+ for (const spectrum of spectra) {
75
+ if (spectrum.visible) visible.push(spectrum);
76
+ }
77
+ return visible;
78
+ }, [spectra]);
79
+
80
+ const selectedSpectrum = useMemo(() => {
81
+ if (selectedId === null) return null;
82
+ for (const spectrum of spectra) {
83
+ if (spectrum.id === selectedId) return spectrum;
84
+ }
85
+ return null;
86
+ }, [spectra, selectedId]);
87
+
88
+ const bands = useMemo(
89
+ () =>
90
+ selectedSpectrum === null || !picking
91
+ ? []
92
+ : pickBands(selectedSpectrum, pickingOptions),
93
+ [selectedSpectrum, picking, pickingOptions],
94
+ );
95
+
96
+ // Assigning is a walk of thirty ranges per band, which is nothing beside the
97
+ // picking — so it is a memo of its own, and moving the tolerance does not
98
+ // re-pick.
99
+ const assigned = useMemo(
100
+ () => assignBands(bands, { tolerance: assignmentTolerance }),
101
+ [bands, assignmentTolerance],
102
+ );
103
+
104
+ // What was reported last, so a host passing a fresh callback on every render
105
+ // is not told about spectra that did not change. The identities are compared
106
+ // rather than the array: every edit replaces it, including the ones that only
107
+ // change how a spectrum is drawn.
108
+ const reported = useRef(spectra);
109
+ useEffect(() => {
110
+ if (sameSpectra(reported.current, spectra)) return;
111
+ reported.current = spectra;
112
+ onChange?.(spectra);
113
+ }, [spectra, onChange]);
114
+
115
+ return useMemo(
116
+ () => ({ state, visibleSpectra, selectedSpectrum, assigned, actions }),
117
+ [state, visibleSpectra, selectedSpectrum, assigned, actions],
118
+ );
119
+ }
120
+
121
+ /**
122
+ * Whether two lists hold the same spectra, by identity and in order.
123
+ * @param current - What was reported last.
124
+ * @param next - What is open now.
125
+ * @returns Whether the report can be skipped.
126
+ */
127
+ function sameSpectra(
128
+ current: readonly IrSpectrum[],
129
+ next: readonly IrSpectrum[],
130
+ ): boolean {
131
+ if (current === next) return true;
132
+ if (current.length !== next.length) return false;
133
+ for (let index = 0; index < current.length; index++) {
134
+ if ((current[index] as IrSpectrum).id !== (next[index] as IrSpectrum).id) {
135
+ return false;
136
+ }
137
+ }
138
+ return true;
139
+ }
@@ -0,0 +1,109 @@
1
+ /**
2
+ * What an infrared chart reads under the pointer, and which band it is asking
3
+ * about.
4
+ *
5
+ * Following the pointer at all is `useChartPointer` in the shared chart.
6
+ * What it *reads* there is the part that is about infrared, and is the whole of
7
+ * this file — the wavenumber, the value in whichever axis is drawn, and the band
8
+ * within reach.
9
+ */
10
+
11
+ import type { RefObject } from 'react';
12
+ import { useCallback, useMemo } from 'react';
13
+
14
+ import type { PlotRect } from '../../chart/core/chartGeometry.ts';
15
+ import type { ChartScale } from '../../chart/core/chartScale.ts';
16
+ import { chartValue } from '../../chart/core/chartScale.ts';
17
+ import type { ChartPoint } from '../../chart/core/svgPoint.ts';
18
+ import type { ChartPointer } from '../../chart/ui/useChartPointer.ts';
19
+ import { useChartPointer } from '../../chart/ui/useChartPointer.ts';
20
+ import type { IrBand } from '../core/irBand.ts';
21
+ import { sameIrBand } from '../core/irBand.ts';
22
+ import type { IrMode } from '../core/irSpectrum.ts';
23
+ import { nearestBandAt } from '../core/nearestBand.ts';
24
+
25
+ /** What the axes say under the pointer, which is what a readout prints. */
26
+ export interface IrReadout {
27
+ /** What the wavenumber axis reads there, in cm⁻¹. */
28
+ wavenumber: number;
29
+ /** What the value axis reads there, in whichever mode is drawn. */
30
+ value: number;
31
+ /** Which axis that value is in, so a readout can label it. */
32
+ mode: IrMode;
33
+ /** The band within reach of the pointer, `null` when none is. */
34
+ band: IrBand | null;
35
+ }
36
+
37
+ export interface IrPointerOptions {
38
+ /** The SVG the chart is drawn on, as it was handed to its `ref`. */
39
+ svgRef: RefObject<SVGSVGElement | null>;
40
+ /** Where the plot sits inside that SVG. */
41
+ plot: PlotRect;
42
+ /** The wavenumber axis as it is currently zoomed, running right to left. */
43
+ xScale: ChartScale;
44
+ /** The value axis as it is currently zoomed. */
45
+ yScale: ChartScale;
46
+ /** Which value axis is being drawn. */
47
+ mode: IrMode;
48
+ /** The bands of every drawn spectrum, for the one under the pointer. */
49
+ bands: readonly IrBand[];
50
+ /**
51
+ * Told which band the pointer has come to rest on, and told `null` when it
52
+ * leaves one — called only when the answer changes, so it is safe to hang a
53
+ * highlight that redraws half the page on it.
54
+ * @default undefined
55
+ */
56
+ onBand?: (band: IrBand | null) => void;
57
+ }
58
+
59
+ /**
60
+ * Follow the pointer over an infrared chart.
61
+ * @param options - The chart, its axes and the bands it is showing.
62
+ * @returns Where the pointer is and what it reads, both `null` while it is
63
+ * anywhere but over the plot.
64
+ */
65
+ export function useIrPointer(
66
+ options: IrPointerOptions,
67
+ ): ChartPointer<IrReadout> {
68
+ const { svgRef, plot, xScale, yScale, mode, bands, onBand } = options;
69
+
70
+ const read = useCallback(
71
+ (point: ChartPoint): IrReadout => ({
72
+ wavenumber: chartValue(xScale, point.x),
73
+ value: chartValue(yScale, point.y),
74
+ mode,
75
+ band: nearestBandAt(bands, xScale, point.x),
76
+ }),
77
+ [xScale, yScale, mode, bands],
78
+ );
79
+
80
+ const onReadout = useMemo(
81
+ () =>
82
+ onBand === undefined
83
+ ? undefined
84
+ : (readout: IrReadout | null) => onBand(readout?.band ?? null),
85
+ [onBand],
86
+ );
87
+
88
+ return useChartPointer({
89
+ svgRef,
90
+ plot,
91
+ read,
92
+ sameReadout: sameIrReadout,
93
+ onReadout,
94
+ });
95
+ }
96
+
97
+ /**
98
+ * Whether two readings are about the same band.
99
+ *
100
+ * The band alone, and never the wavenumber under the crosshair: that fractional
101
+ * value changes on every pixel the pointer moves, and comparing it would report a
102
+ * new answer for every tremor of a hand resting on one band.
103
+ * @param current - What was last read.
104
+ * @param next - What has just been read.
105
+ * @returns Whether both are about the same band.
106
+ */
107
+ export function sameIrReadout(current: IrReadout, next: IrReadout): boolean {
108
+ return sameIrBand(current.band, next.band);
109
+ }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * The keys, heard on the viewer's own root rather than on the document.
3
+ *
4
+ * On its own root and with `stopPropagation`, which is the deliberate half of a
5
+ * decision the repo has already taken once: two viewers on one page must not both
6
+ * answer `f`, and a page that holds this beside a glycan editor must not have its
7
+ * own keys eaten. So the viewer hears a key only while it holds the caret — the
8
+ * root carries `tabIndex={-1}` so a click anywhere in it does — and a key it
9
+ * acted on goes no further.
10
+ */
11
+
12
+ import type { RefObject } from 'react';
13
+ import { useEffect, useLayoutEffect, useRef } from 'react';
14
+
15
+ import { isEditingField } from '../../panel/core/isEditingField.ts';
16
+ import type {
17
+ IrCommand,
18
+ IrCommandHandlers,
19
+ IrCommandId,
20
+ } from '../core/irCommands.ts';
21
+ import { irCommands } from '../core/irCommands.ts';
22
+
23
+ /**
24
+ * Fire the viewer's commands from the keyboard.
25
+ *
26
+ * The handlers are read live through a ref rather than closed over, so the
27
+ * listener is attached once for the life of the viewer instead of being torn down
28
+ * and rebuilt on every render — and the chart re-renders on every move of the
29
+ * pointer across it.
30
+ * @param root - The viewer's root, as it was handed to its `ref`.
31
+ * @param handlers - What each command does.
32
+ */
33
+ export function useIrShortcuts(
34
+ root: RefObject<HTMLElement | null> | HTMLElement | null,
35
+ handlers: IrCommandHandlers,
36
+ ): void {
37
+ const latest = useRef(handlers);
38
+
39
+ useLayoutEffect(() => {
40
+ latest.current = handlers;
41
+ });
42
+
43
+ const element = root === null || root instanceof HTMLElement ? root : null;
44
+
45
+ useEffect(() => {
46
+ if (element === null) return;
47
+
48
+ function onKeyDown(event: KeyboardEvent): void {
49
+ // A key pressed with a modifier belongs to the browser or to the page:
50
+ // Ctrl+F is a search, and a viewer that swallowed it to fit its chart
51
+ // would be a viewer people stop typing in.
52
+ if (event.ctrlKey || event.metaKey || event.altKey) return;
53
+ // Never while a name is being typed into the spectra panel.
54
+ if (isEditingField(event.target)) return;
55
+
56
+ const id = commandFor(event.key);
57
+ if (id === undefined) return;
58
+ const handler = latest.current[id];
59
+ if (handler === undefined) return;
60
+
61
+ event.preventDefault();
62
+ // So the same key does not also reach a viewer mounted beside this one.
63
+ event.stopPropagation();
64
+ handler();
65
+ }
66
+
67
+ element.addEventListener('keydown', onKeyDown);
68
+ return () => {
69
+ element.removeEventListener('keydown', onKeyDown);
70
+ };
71
+ }, [element]);
72
+ }
73
+
74
+ /**
75
+ * Which command a key runs, if any.
76
+ *
77
+ * Built once from the command table rather than looked up by walking it, and
78
+ * compared case-insensitively so a capital arriving from a held shift still
79
+ * reaches the command a lowercase key names.
80
+ * @param key - The `event.key` that arrived.
81
+ * @returns The command, or `undefined` when the key names none.
82
+ */
83
+ function commandFor(key: string): IrCommandId | undefined {
84
+ return KEYS.get(key.toLowerCase());
85
+ }
86
+
87
+ /** Every key the viewer answers to, against the command it runs. */
88
+ const KEYS = new Map<string, IrCommandId>(
89
+ Object.entries(irCommands as Record<string, IrCommand>).flatMap(
90
+ ([id, command]) =>
91
+ (command.shortcut?.keys ?? []).map(
92
+ (key) => [key.toLowerCase(), id as IrCommandId] as const,
93
+ ),
94
+ ),
95
+ );
@@ -0,0 +1,86 @@
1
+ /**
2
+ * The generic zoom, told what an infrared window is fitted to and how its value
3
+ * axis behaves.
4
+ *
5
+ * Every gesture is `useChartZoom` in the shared chart and none of it is
6
+ * written here. What is about infrared is the three things handed in: the fit,
7
+ * which has to refit when the mode changes because the value axis is replaced
8
+ * rather than nudged; the y axis rules, which are where percent transmittance
9
+ * says that its baseline is 100 and not zero; and which gestures the mode
10
+ * answers at all, which is where it says that a rectangle is the only drag worth
11
+ * making on it and that the wheel belongs to the page.
12
+ */
13
+
14
+ import type { RefObject } from 'react';
15
+ import { useMemo } from 'react';
16
+
17
+ import type { ZoomDragMode } from '../../chart/core/chartDomain.ts';
18
+ import type { PlotRect } from '../../chart/core/chartGeometry.ts';
19
+ import type { ChartZoom } from '../../chart/ui/useChartZoom.ts';
20
+ import { useChartZoom } from '../../chart/ui/useChartZoom.ts';
21
+ import { fittedTo, fullDomain } from '../core/irDomain.ts';
22
+ import { yAxisRules, zoomGestures } from '../core/irMode.ts';
23
+ import type { IrDomain, IrMode, IrSpectrum } from '../core/irSpectrum.ts';
24
+
25
+ export interface IrZoomOptions {
26
+ /** Everything the chart holds, which is what the window is fitted to. */
27
+ spectra: readonly IrSpectrum[];
28
+ /** Which value axis is being drawn. */
29
+ mode: IrMode;
30
+ /** The SVG the gestures are made on, as it was handed to its `ref`. */
31
+ svgRef: RefObject<SVGSVGElement | null>;
32
+ /** Where the plot sits inside that SVG, which the axes are laid over. */
33
+ plot: PlotRect;
34
+ /**
35
+ * The window a host is imposing, `null` while it imposes none. Handed straight
36
+ * through; `useChartZoom` documents what imposing one does.
37
+ * @default null
38
+ */
39
+ domain?: IrDomain | null;
40
+ /**
41
+ * What a drag asks for **where the mode leaves the choice open** — the
42
+ * wavenumber axis, or the rectangle swept out. Percent transmittance takes the
43
+ * rectangle whatever this says; `zoomGestures` is where that is decided.
44
+ * @default 'xAxis'
45
+ */
46
+ drag?: ZoomDragMode;
47
+ }
48
+
49
+ /**
50
+ * Zoom an infrared chart by dragging it, and — reading absorbance — by the wheel.
51
+ *
52
+ * A double click always fits everything again, in either mode: it is the way
53
+ * back from a zoom, and a chart that offers a gesture has to offer the way out
54
+ * of it.
55
+ * @param options - The chart, what it holds and which axis it is read in.
56
+ * @returns The window and the gestures that move it.
57
+ */
58
+ export function useIrZoom(options: IrZoomOptions): ChartZoom {
59
+ const {
60
+ spectra,
61
+ mode,
62
+ svgRef,
63
+ plot,
64
+ domain = null,
65
+ drag = 'xAxis',
66
+ } = options;
67
+
68
+ const fitted = useMemo(() => fullDomain(spectra, mode), [spectra, mode]);
69
+ const fitKey = useMemo(() => fittedTo(spectra, mode), [spectra, mode]);
70
+ const yAxis = useMemo(() => yAxisRules(mode), [mode]);
71
+ const gestures = useMemo(() => zoomGestures(mode, drag), [mode, drag]);
72
+
73
+ // `reverseX` is not decoration: the hook measures every gesture by inverting a
74
+ // pixel through the scale it builds, so it has to build the same reversed one
75
+ // the chart draws with.
76
+ return useChartZoom({
77
+ fitted,
78
+ fitKey,
79
+ svgRef,
80
+ plot,
81
+ yAxis,
82
+ domain,
83
+ gestures,
84
+ reverseX: true,
85
+ });
86
+ }
package/src/ir.ts ADDED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Displaying and assigning infrared spectra: the chart, the band table and the
3
+ * whole editor.
4
+ *
5
+ * A door of its own, and not part of `react-cheminfo/core` or
6
+ * `react-cheminfo/ui`, because reading a spectrum drags the formats it may
7
+ * arrive in — `ir-spectrum` for the band correlations, `convert-to-jcamp` for
8
+ * writing them back out, and a JCAMP or SPC reader fetched only once the bytes
9
+ * turn out to need it. A site with no spectra to look at installs none of it.
10
+ */
11
+
12
+ export * from './ir/core/index.ts';
13
+ export * from './ir/ui/index.ts';
@@ -0,0 +1,11 @@
1
+ /** What a paragraph inside a dialog section looks like. */
2
+ export const paragraphStyle = { margin: 0 } as const;
3
+
4
+ /** What a list of things a panel holds looks like. */
5
+ export const listStyle = {
6
+ margin: 0,
7
+ paddingLeft: 18,
8
+ display: 'flex',
9
+ flexDirection: 'column',
10
+ gap: 4,
11
+ } as const;