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,223 @@
1
+ /**
2
+ * Where the pointer is over a chart, and what that place means.
3
+ *
4
+ * What it *means* is the one thing this hook does not decide. A mass spectrum
5
+ * reads an m/z, an intensity and the peak within reach; an infrared spectrum
6
+ * reads a wavenumber, an absorbance and the band it falls in. Both are the same
7
+ * mechanism — place the pointer in user units, refuse the margins, and report
8
+ * only when the answer changed — so the mechanism is here and the reading is
9
+ * handed in.
10
+ *
11
+ * Every value is compared before it is stored or reported. A pointer resting on
12
+ * one feature fires `pointermove` on every sub-pixel tremor of a hand, and a
13
+ * fresh answer each time would re-render the panel beside the chart — and, where
14
+ * that panel is a linked viewer that reports its own hovers back, would
15
+ * ping-pong between the two until the tab stops answering.
16
+ */
17
+
18
+ import type { RefObject } from 'react';
19
+ import { useEffect, useLayoutEffect, useRef, useState } from 'react';
20
+
21
+ import type { PlotRect } from '../core/chartGeometry.ts';
22
+ import type { ChartPoint } from '../core/svgPoint.ts';
23
+ import { svgPointAt } from '../core/svgPoint.ts';
24
+
25
+ /** Where the pointer is, and what that place means. */
26
+ export interface ChartPointer<TReadout> {
27
+ /** Its position in user units, `null` whenever it is off the plot. */
28
+ position: ChartPoint | null;
29
+ /** What the chart reads under it, `null` whenever it is off the plot. */
30
+ readout: TReadout | null;
31
+ }
32
+
33
+ export interface ChartPointerOptions<TReadout> {
34
+ /** The SVG the chart is drawn on, as it was handed to its `ref`. */
35
+ svgRef: RefObject<SVGSVGElement | null>;
36
+ /**
37
+ * Where the plot sits inside that SVG. The pointer is only followed inside
38
+ * it: the margins carry the axis labels, and a crosshair drawn across them
39
+ * claims to read a value off a place where none is drawn.
40
+ */
41
+ plot: PlotRect;
42
+ /**
43
+ * What the chart reads at a point. Called on every move the pointer makes
44
+ * inside the plot, and read live rather than closed over, so it may capture
45
+ * the scales as they are currently zoomed.
46
+ */
47
+ read: (point: ChartPoint) => TReadout;
48
+ /**
49
+ * Whether two readings say the same thing, which is what suppresses the
50
+ * report of a hand resting still.
51
+ *
52
+ * A viewer normally compares less than the whole reading: the pointer's own
53
+ * position has already been compared by the time this is asked, so what is
54
+ * left is whichever *feature* the reading is about — the peak, the band — and
55
+ * not the fractional value under the crosshair, which changes on every pixel.
56
+ */
57
+ sameReadout: (current: TReadout, next: TReadout) => boolean;
58
+ /**
59
+ * Told what the chart reads under the pointer, and told `null` when it leaves
60
+ * the plot — called only when `sameReadout` says the answer changed, so it is
61
+ * safe to hang a highlight that redraws half the page on it.
62
+ * @default undefined
63
+ */
64
+ onReadout?: (readout: TReadout | null) => void;
65
+ }
66
+
67
+ /**
68
+ * Follow the pointer over a chart.
69
+ *
70
+ * The listeners are attached to the element rather than returned as props, so
71
+ * that a chart already spreading another hook's `onPointerMove` onto its SVG
72
+ * does not have to merge two handlers into one — and so that the options are
73
+ * read live, at the moment the pointer moves, rather than closed over when the
74
+ * listener was attached.
75
+ *
76
+ * The pointer leaving is heard as `pointerout` and not as the `pointerleave`
77
+ * that reads so much more naturally, because a chart with a control laid over
78
+ * it — a legend whose rows answer a hover — has two writers of one highlight
79
+ * and they must be sequenced. React synthesises the overlay's `pointerenter`
80
+ * from the *earlier* `pointerout` and dispatches it at the root, so a browser
81
+ * fires `pointerout` on the SVG, then React's `onPointerEnter` on the row, then
82
+ * `pointerleave` on the SVG: listening for the leave puts this hook's "nothing
83
+ * is under the pointer" **after** the row's "this trace is being read", and
84
+ * wipes it. Heard as `pointerout`, the report lands first and the row has the
85
+ * last word. The containment test is what `pointerleave` was giving for free.
86
+ * @param options - The chart, and how to read a point on it.
87
+ * @returns Where the pointer is and what it reads, both `null` while it is
88
+ * anywhere but over the plot.
89
+ */
90
+ export function useChartPointer<TReadout>(
91
+ options: ChartPointerOptions<TReadout>,
92
+ ): ChartPointer<TReadout> {
93
+ const { svgRef } = options;
94
+ const [pointer, setPointer] = useState<ChartPointer<TReadout>>(POINTER_AWAY);
95
+ const latest = useRef(options);
96
+ const reported = useRef<TReadout | null>(null);
97
+
98
+ useLayoutEffect(() => {
99
+ latest.current = options;
100
+ });
101
+
102
+ useEffect(() => {
103
+ const svg = svgRef.current;
104
+ if (svg === null) return;
105
+
106
+ function show(next: ChartPointer<TReadout>): void {
107
+ const { sameReadout, onReadout } = latest.current;
108
+ setPointer((current) => nextChartPointer(current, next, sameReadout));
109
+ if (sameReading(reported.current, next.readout, sameReadout)) return;
110
+ reported.current = next.readout;
111
+ onReadout?.(next.readout);
112
+ }
113
+
114
+ function move(event: PointerEvent): void {
115
+ const { plot, read } = latest.current;
116
+ const point = svgPointAt(svg, event.clientX, event.clientY);
117
+ show(
118
+ point === null || !isInsidePlot(plot, point)
119
+ ? POINTER_AWAY
120
+ : { position: point, readout: read(point) },
121
+ );
122
+ }
123
+
124
+ function out(event: PointerEvent): void {
125
+ if (leftChart(svg, event.relatedTarget)) show(POINTER_AWAY);
126
+ }
127
+
128
+ svg.addEventListener('pointermove', move);
129
+ svg.addEventListener('pointerout', out);
130
+ return () => {
131
+ svg.removeEventListener('pointermove', move);
132
+ svg.removeEventListener('pointerout', out);
133
+ };
134
+ }, [svgRef]);
135
+
136
+ return pointer;
137
+ }
138
+
139
+ /**
140
+ * Whether a `pointerout` means the pointer has left the chart.
141
+ *
142
+ * It also fires on the way *into* a child of the SVG — a trace, a label, the
143
+ * rectangle behind a legend — which is not leaving the chart at all, and is the
144
+ * one thing `pointerleave` was giving for free.
145
+ * @param svg - The chart, `null` before it is on screen.
146
+ * @param related - What the pointer moved onto, `null` when it left the window
147
+ * altogether.
148
+ * @returns Whether the chart no longer has the pointer.
149
+ */
150
+ export function leftChart(
151
+ svg: Element | null,
152
+ related: EventTarget | null,
153
+ ): boolean {
154
+ if (svg === null) return true;
155
+ return !(related instanceof Node) || !svg.contains(related);
156
+ }
157
+
158
+ /**
159
+ * Whether two readings — either of which may be absent — say the same thing.
160
+ * @param current - What was last read, `null` while the pointer was away.
161
+ * @param next - What has just been read, `null` when it has left the plot.
162
+ * @param sameReadout - The viewer's own comparison.
163
+ * @returns Whether the report can be skipped.
164
+ */
165
+ export function sameReading<TReadout>(
166
+ current: TReadout | null,
167
+ next: TReadout | null,
168
+ sameReadout: (current: TReadout, next: TReadout) => boolean,
169
+ ): boolean {
170
+ if (current === next) return true;
171
+ if (current === null || next === null) return false;
172
+ return sameReadout(current, next);
173
+ }
174
+
175
+ /**
176
+ * What to hold, given where the pointer has just been seen.
177
+ *
178
+ * The answer already held comes back whenever it still stands, so the whole
179
+ * chart is left alone while a hand rests on a feature — `pointermove` fires on
180
+ * every tremor, and several of those land on the very same user-unit position.
181
+ * @param current - What is held.
182
+ * @param next - What has just been read.
183
+ * @param sameReadout - The viewer's own comparison, asked only once the pointer
184
+ * turns out not to have moved.
185
+ * @returns `current` itself when it already says it, `next` otherwise.
186
+ */
187
+ export function nextChartPointer<TReadout>(
188
+ current: ChartPointer<TReadout>,
189
+ next: ChartPointer<TReadout>,
190
+ sameReadout: (current: TReadout, next: TReadout) => boolean,
191
+ ): ChartPointer<TReadout> {
192
+ if (current === next) return current;
193
+ if (current.position === null || next.position === null) {
194
+ return current.position === next.position ? current : next;
195
+ }
196
+ if (
197
+ current.position.x !== next.position.x ||
198
+ current.position.y !== next.position.y
199
+ ) {
200
+ return next;
201
+ }
202
+ return sameReading(current.readout, next.readout, sameReadout)
203
+ ? current
204
+ : next;
205
+ }
206
+
207
+ /**
208
+ * Whether a point is over the data rather than over an axis.
209
+ * @param plot - Where the plot sits inside the SVG.
210
+ * @param point - The point to test, in user units.
211
+ * @returns Whether it is inside the plot, edges included.
212
+ */
213
+ export function isInsidePlot(plot: PlotRect, point: ChartPoint): boolean {
214
+ return (
215
+ point.x >= plot.left &&
216
+ point.x <= plot.right &&
217
+ point.y >= plot.top &&
218
+ point.y <= plot.bottom
219
+ );
220
+ }
221
+
222
+ /** What is held while the pointer is anywhere but over the plot. */
223
+ const POINTER_AWAY: ChartPointer<never> = { position: null, readout: null };
@@ -0,0 +1,115 @@
1
+ /**
2
+ * How big the box a chart was handed is, followed for as long as it is on
3
+ * screen.
4
+ *
5
+ * The element is measured from the `ref` rather than from an effect, so the
6
+ * observer is re-attached every time the element goes away and comes back —
7
+ * which is the whole point of doing it here. A chart living in a folded
8
+ * accordion panel is unmounted while the panel is shut; an observer bound once
9
+ * at mount would be watching an element nobody kept, so the chart returns
10
+ * measuring nothing, builds its scales on a plot of `MINIMUM_PLOT_SIDE`, and
11
+ * stays that way until the window itself happens to be resized. Measuring in
12
+ * the callback also means the size is known in the same commit the element
13
+ * appears in, so nothing is ever painted at a size that is about to change.
14
+ */
15
+
16
+ import type { Dispatch, SetStateAction } from 'react';
17
+ import { useCallback, useRef, useState } from 'react';
18
+
19
+ import type { ChartSize } from '../core/chartGeometry.ts';
20
+
21
+ /** The `ref` to put on the wrapper, and how big that wrapper is. */
22
+ export type ChartSizeHandle<T extends Element> = [
23
+ ref: (element: T | null) => void,
24
+ size: ChartSize,
25
+ ];
26
+
27
+ /**
28
+ * Follow the size of the element a chart is drawn in.
29
+ *
30
+ * The `ref` never changes between renders, so React attaches it once per
31
+ * element rather than detaching and re-attaching it — and a detach here is not
32
+ * free, since it is what tears the observer down.
33
+ * @returns The `ref`, and the size — `0 × 0` until the element is on screen,
34
+ * which every first render sees.
35
+ */
36
+ export function useChartSize<
37
+ T extends Element = HTMLDivElement,
38
+ >(): ChartSizeHandle<T> {
39
+ const observer = useRef<ResizeObserver | null>(null);
40
+ const [size, setSize] = useState<ChartSize>(NO_SIZE);
41
+
42
+ const measure = useCallback((element: T | null) => {
43
+ // Torn down here rather than from a cleanup returned to React: only React
44
+ // 19 runs one, where React 18 calls the ref with `null` instead — so
45
+ // detaching on `null` is what disconnects the observer under both.
46
+ observer.current?.disconnect();
47
+ observer.current = null;
48
+ if (element === null) return;
49
+
50
+ read(element, setSize);
51
+ // Absent outside a browser, where nothing is on screen to be resized.
52
+ if (typeof ResizeObserver === 'undefined') return;
53
+ observer.current = new ResizeObserver(() => {
54
+ read(element, setSize);
55
+ });
56
+ observer.current.observe(element);
57
+ }, []);
58
+
59
+ return [measure, size];
60
+ }
61
+
62
+ /**
63
+ * The size to hold, given what the element has just been measured at.
64
+ *
65
+ * The one already held comes back when the numbers have not moved, so a
66
+ * resize that changes nothing — a splitter dragged and let go where it was, a
67
+ * panel folded and unfolded at the same width — costs a comparison rather than
68
+ * a render of the whole chart, which rebuilds every scale and re-lays every
69
+ * label out.
70
+ *
71
+ * A measurement that is not a size is read as nothing at all: a negative width
72
+ * is impossible, and a `NaN` one is what an element that is not laid out gives.
73
+ * Either would travel into `plotRect` and out the far side as an infinity.
74
+ * @param current - The size held so far.
75
+ * @param width - What the element has just been measured at, horizontally.
76
+ * @param height - What it has just been measured at, vertically.
77
+ * @returns `current` itself when nothing moved, the new size otherwise.
78
+ */
79
+ export function nextChartSize(
80
+ current: ChartSize,
81
+ width: number,
82
+ height: number,
83
+ ): ChartSize {
84
+ const nextWidth = usableSide(width);
85
+ const nextHeight = usableSide(height);
86
+ if (current.width === nextWidth && current.height === nextHeight) {
87
+ return current;
88
+ }
89
+ return { width: nextWidth, height: nextHeight };
90
+ }
91
+
92
+ /** What a chart is given before its element has ever been laid out. */
93
+ const NO_SIZE: ChartSize = { width: 0, height: 0 };
94
+
95
+ /**
96
+ * Measure an element and hold what it says.
97
+ * @param element - The wrapper the chart is drawn in.
98
+ * @param setSize - Where the measurement goes.
99
+ */
100
+ function read(
101
+ element: Element,
102
+ setSize: Dispatch<SetStateAction<ChartSize>>,
103
+ ): void {
104
+ const { width, height } = element.getBoundingClientRect();
105
+ setSize((current) => nextChartSize(current, width, height));
106
+ }
107
+
108
+ /**
109
+ * One side of a measurement, as a size rather than as a number.
110
+ * @param value - What the element was measured at.
111
+ * @returns The side, `0` for anything that is not a length.
112
+ */
113
+ function usableSide(value: number): number {
114
+ return Number.isFinite(value) && value > 0 ? value : 0;
115
+ }
@@ -0,0 +1,240 @@
1
+ /**
2
+ * The window a chart is looking through, and the two scales it is read by.
3
+ *
4
+ * Three things can decide what is on screen — the fit the data asks for, the
5
+ * window a gesture arrived at, and a window a host imposes — and the whole of
6
+ * the policy that settles between them is here, away from the gestures, because
7
+ * it is the half that has nothing to do with a pointer. A chart put back to its
8
+ * fit by a toolbar button and one put back by a double click are the same event
9
+ * to this hook.
10
+ *
11
+ * The scales come out of the same place for a reason that shipped broken once:
12
+ * every gesture is measured by inverting a pixel, so a chart drawing a reversed
13
+ * axis while the gestures were measured through an ascending one zoomed to the
14
+ * mirror image of whatever was dragged over. Held here, beside the window they
15
+ * are built from, there is only ever one mapping to disagree with.
16
+ */
17
+
18
+ import { useCallback, useMemo, useState } from 'react';
19
+
20
+ import type { ChartDomain } from '../core/chartDomain.ts';
21
+ import { sameChartDomain } from '../core/chartDomain.ts';
22
+ import type { PlotRect } from '../core/chartGeometry.ts';
23
+ import type { ChartScale } from '../core/chartScale.ts';
24
+ import { chartScale } from '../core/chartScale.ts';
25
+
26
+ /** The fit, the window a host imposes, and the box both are drawn into. */
27
+ export interface ChartWindowOptions {
28
+ /**
29
+ * The window that shows everything currently drawn, as the viewer fits it.
30
+ * This is what a double click goes back to.
31
+ */
32
+ fitted: ChartDomain;
33
+ /**
34
+ * What that fit was made *to*, as one string two renders can compare.
35
+ *
36
+ * The window is put back to the fit whenever this changes and never otherwise,
37
+ * so it must name the data and not its extents: a spectrum switched from one
38
+ * unit to another, or from its profile to its sticks, moves the fitted extents
39
+ * by a hair, and refitting on a hair throws away the zoom somebody set.
40
+ */
41
+ fitKey: string;
42
+ /**
43
+ * What the **value axis alone** was fitted to, for a chart whose height is
44
+ * fitted to something that changes under a window the reader is keeping.
45
+ *
46
+ * A loading spectrum is the case it was written for. The reader zooms onto a
47
+ * few masses and then steps through the components, and the m/z window is
48
+ * where they are looking rather than a fact about the component being read —
49
+ * so it stays. The loading axis is fitted to the component's own scale, and
50
+ * cannot: drawn through the last component's window, a diffuse component is a
51
+ * flat line along the middle and a concentrated one is cut off at the top.
52
+ * @default `fitKey`, so the value axis moves only when the whole fit does
53
+ */
54
+ yFitKey?: string;
55
+ /** Where the plot sits inside the SVG, which the axes are laid over. */
56
+ plot: PlotRect;
57
+ /**
58
+ * The window a host is imposing, `null` while it imposes none.
59
+ *
60
+ * It is handed *in* rather than merely shown beside the chart's own, so that
61
+ * every gesture is measured against what is actually on screen. A peak table
62
+ * that frames a value, a handle that zooms to one: both put a window on the
63
+ * chart that the chart did not arrive at, and a drag worked out against the
64
+ * window the chart last held instead would zoom to somewhere else entirely.
65
+ * It is taken up when it *changes*, not held over the chart's own — see the
66
+ * hook itself for why that distinction is the difference between a chart that
67
+ * zooms and one that zooms once.
68
+ * @default null
69
+ */
70
+ domain?: ChartDomain | null;
71
+ /**
72
+ * Whether the horizontal axis is drawn right to left, as an infrared
73
+ * spectrum's wavenumbers are.
74
+ *
75
+ * It has to be said **here**, and this is the one option a viewer cannot get
76
+ * away with handling on its own: a chart that drew a reversed axis while the
77
+ * gestures were measured through an ascending one would zoom to the mirror
78
+ * image of whatever was dragged over. The scales are handed back for exactly
79
+ * that reason — draw with those and the two cannot disagree.
80
+ * @default false
81
+ */
82
+ reverseX?: boolean;
83
+ }
84
+
85
+ /** The window, how it maps to pixels, and the two ways it moves. */
86
+ export interface ChartWindow {
87
+ /** What the chart is showing. */
88
+ domain: ChartDomain;
89
+ /** The horizontal axis, already accounting for a reversed one. */
90
+ xScale: ChartScale;
91
+ /** The vertical axis, which runs backwards because SVG counts downwards. */
92
+ yScale: ChartScale;
93
+ /** Show a window a gesture arrived at. */
94
+ show: (domain: ChartDomain) => void;
95
+ /** Put the window back to everything that is drawn. */
96
+ reset: () => void;
97
+ }
98
+
99
+ /**
100
+ * Hold the window a chart shows, and map it to the plot.
101
+ *
102
+ * The window is put back to what fits whenever the chart is handed **different
103
+ * data** — a spectrum loaded, one closed, the chart reflected about zero — and
104
+ * is otherwise left exactly where it was. That distinction is the whole of the
105
+ * behaviour, and `fitKey` is where it is drawn: the same spectra drawn
106
+ * differently is the same data, and a chart that refitted on it would throw away
107
+ * the window somebody had zoomed to for a change of a fraction of a percent in
108
+ * the extents.
109
+ *
110
+ * The value axis can be refitted on its own, by `yFitKey`, for the one chart
111
+ * where the two halves of the window answer to different things: a component's
112
+ * loadings are drawn on the component's own scale, while the masses on screen
113
+ * are where the reader chose to look and have nothing to do with which
114
+ * component is being read. Everywhere else it is the whole fit that moves, so
115
+ * it defaults to `fitKey` and nothing has to be said.
116
+ *
117
+ * A window a host imposes is **taken up as it changes**, and is not held over
118
+ * the window kept here. A host is told every window the chart arrives at and is
119
+ * expected to hand that same window back, so what it imposes is, in the ordinary
120
+ * case, the answer to the *last* gesture. Held over the top, that answer would
121
+ * be the answer to the next one as well — the chart would zoom once, report it,
122
+ * and then stand still, with every later drag and turn of the wheel worked out
123
+ * and thrown away.
124
+ *
125
+ * Handing back `null` where a window was is how a host asks for the fit again —
126
+ * the only thing it is ever told is a window, so that is the one way it has of
127
+ * saying it. That is what "zoom to fit" pressed on a toolbar beside the chart
128
+ * comes down to.
129
+ *
130
+ * New data refits the **value axis** of whatever a host is imposing, and leaves
131
+ * the horizontal half of it alone. A host that stores every window it is told
132
+ * and hands the same one back is imposing one at every moment after the first
133
+ * gesture, so a refit that waited for it to stop would never happen at all: a
134
+ * chart reflected about zero would draw its mirrored half below the foot of the
135
+ * plot, where the clip path swallows it. But the horizontal axis is where the
136
+ * reader chose to look, and by the time data arrives with a window still
137
+ * imposed the host has already decided the two belong together — every route in
138
+ * gives its own window up when what arrived does not belong in it, and there is
139
+ * then nothing imposed here to keep. What is left is another scan of the run
140
+ * being stepped through, or another pixel of the section being compared, and
141
+ * refitting those out of the window they are being compared in is the one thing
142
+ * the gesture that added them was not asking for. A host imposing a *different*
143
+ * window in the same render still wins outright, since it is asking for that
144
+ * window of the data just handed over.
145
+ *
146
+ * The imposed window is compared by value rather than by identity, so a host
147
+ * that rebuilds an equal window on every render neither fights the gestures nor
148
+ * renders forever. Both comparisons are made while rendering rather than in an
149
+ * effect: an effect would draw the stale window for one frame, and setting state
150
+ * from one is what `react-hooks/set-state-in-effect` forbids.
151
+ * @param options - The fit, the plot, and the window a host imposes.
152
+ * @returns The window, its two scales, and the two ways it is moved.
153
+ */
154
+ export function useChartWindow(options: ChartWindowOptions): ChartWindow {
155
+ const {
156
+ fitted,
157
+ fitKey,
158
+ yFitKey = fitKey,
159
+ plot,
160
+ domain: imposed = null,
161
+ reverseX = false,
162
+ } = options;
163
+
164
+ // What the chart shows, and the one thing every gesture moves.
165
+ const [held, setHeld] = useState<ChartDomain>(imposed ?? fitted);
166
+
167
+ const [fittedFor, setFittedFor] = useState(fitKey);
168
+ if (fittedFor !== fitKey) {
169
+ setFittedFor(fitKey);
170
+ // The horizontal half of a window a host is still imposing survives the
171
+ // refit; only the value axis is refitted. A host that wanted the whole
172
+ // window given up has already given it up — every route in clears its own
173
+ // window when the data that arrived does not belong in it, and then there
174
+ // is nothing imposed here to keep. What is left is the case where it does
175
+ // belong: another scan of the run being stepped through, another pixel of
176
+ // the section being compared. Refitting x there throws away the very
177
+ // window the reader is comparing *in*, which is the whole point of the
178
+ // gesture that added it.
179
+ //
180
+ // The value axis is refitted all the same, and must be: a chart reflected
181
+ // about zero, or one a brighter trace has just joined, is drawn against a
182
+ // height that has genuinely changed, and keeping the old one hides the new
183
+ // data below the foot of the plot or off the top of it.
184
+ setHeld((current) =>
185
+ imposed === null ? fitted : { x: current.x, y: fitted.y },
186
+ );
187
+ }
188
+
189
+ const [yFittedFor, setYFittedFor] = useState(yFitKey);
190
+ if (yFittedFor !== yFitKey) {
191
+ setYFittedFor(yFitKey);
192
+ // Mapped over whatever the refit above may just have set, rather than over
193
+ // the window this render read, so that both keys changing at once is the
194
+ // whole fit and not the last window's x with a new height on it.
195
+ setHeld((current) => ({ x: current.x, y: fitted.y }));
196
+ }
197
+
198
+ const [imposedShown, setImposedShown] = useState(imposed);
199
+ if (!sameImposedDomain(imposedShown, imposed)) {
200
+ setImposedShown(imposed);
201
+ setHeld(imposed ?? fitted);
202
+ }
203
+
204
+ const domain = held;
205
+
206
+ // Reversed by handing the range over backwards, which is the whole of drawing
207
+ // an axis right to left.
208
+ const xScale = useMemo(
209
+ () =>
210
+ reverseX
211
+ ? chartScale(domain.x[0], domain.x[1], plot.right, plot.left)
212
+ : chartScale(domain.x[0], domain.x[1], plot.left, plot.right),
213
+ [domain.x, plot.left, plot.right, reverseX],
214
+ );
215
+ // Backwards, since SVG counts pixels downwards while a value counts up.
216
+ const yScale = useMemo(
217
+ () => chartScale(domain.y[0], domain.y[1], plot.bottom, plot.top),
218
+ [domain.y, plot.bottom, plot.top],
219
+ );
220
+
221
+ const reset = useCallback(() => {
222
+ setHeld(fitted);
223
+ }, [fitted]);
224
+
225
+ return { domain, xScale, yScale, show: setHeld, reset };
226
+ }
227
+
228
+ /**
229
+ * Whether a host is imposing the same window it was imposing before.
230
+ * @param current - The window it imposed last, `null` when it imposed none.
231
+ * @param next - The window it imposes now, `null` for none.
232
+ * @returns Whether both say the same thing.
233
+ */
234
+ function sameImposedDomain(
235
+ current: ChartDomain | null,
236
+ next: ChartDomain | null,
237
+ ): boolean {
238
+ if (current === null || next === null) return current === next;
239
+ return sameChartDomain(current, next);
240
+ }