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,152 @@
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
+ import { useEffect, useLayoutEffect, useRef, useState } from 'react';
18
+ import { svgPointAt } from "../core/svgPoint.js";
19
+ /**
20
+ * Follow the pointer over a chart.
21
+ *
22
+ * The listeners are attached to the element rather than returned as props, so
23
+ * that a chart already spreading another hook's `onPointerMove` onto its SVG
24
+ * does not have to merge two handlers into one — and so that the options are
25
+ * read live, at the moment the pointer moves, rather than closed over when the
26
+ * listener was attached.
27
+ *
28
+ * The pointer leaving is heard as `pointerout` and not as the `pointerleave`
29
+ * that reads so much more naturally, because a chart with a control laid over
30
+ * it — a legend whose rows answer a hover — has two writers of one highlight
31
+ * and they must be sequenced. React synthesises the overlay's `pointerenter`
32
+ * from the *earlier* `pointerout` and dispatches it at the root, so a browser
33
+ * fires `pointerout` on the SVG, then React's `onPointerEnter` on the row, then
34
+ * `pointerleave` on the SVG: listening for the leave puts this hook's "nothing
35
+ * is under the pointer" **after** the row's "this trace is being read", and
36
+ * wipes it. Heard as `pointerout`, the report lands first and the row has the
37
+ * last word. The containment test is what `pointerleave` was giving for free.
38
+ * @param options - The chart, and how to read a point on it.
39
+ * @returns Where the pointer is and what it reads, both `null` while it is
40
+ * anywhere but over the plot.
41
+ */
42
+ export function useChartPointer(options) {
43
+ const { svgRef } = options;
44
+ const [pointer, setPointer] = useState(POINTER_AWAY);
45
+ const latest = useRef(options);
46
+ const reported = useRef(null);
47
+ useLayoutEffect(() => {
48
+ latest.current = options;
49
+ });
50
+ useEffect(() => {
51
+ const svg = svgRef.current;
52
+ if (svg === null)
53
+ return;
54
+ function show(next) {
55
+ const { sameReadout, onReadout } = latest.current;
56
+ setPointer((current) => nextChartPointer(current, next, sameReadout));
57
+ if (sameReading(reported.current, next.readout, sameReadout))
58
+ return;
59
+ reported.current = next.readout;
60
+ onReadout?.(next.readout);
61
+ }
62
+ function move(event) {
63
+ const { plot, read } = latest.current;
64
+ const point = svgPointAt(svg, event.clientX, event.clientY);
65
+ show(point === null || !isInsidePlot(plot, point)
66
+ ? POINTER_AWAY
67
+ : { position: point, readout: read(point) });
68
+ }
69
+ function out(event) {
70
+ if (leftChart(svg, event.relatedTarget))
71
+ show(POINTER_AWAY);
72
+ }
73
+ svg.addEventListener('pointermove', move);
74
+ svg.addEventListener('pointerout', out);
75
+ return () => {
76
+ svg.removeEventListener('pointermove', move);
77
+ svg.removeEventListener('pointerout', out);
78
+ };
79
+ }, [svgRef]);
80
+ return pointer;
81
+ }
82
+ /**
83
+ * Whether a `pointerout` means the pointer has left the chart.
84
+ *
85
+ * It also fires on the way *into* a child of the SVG — a trace, a label, the
86
+ * rectangle behind a legend — which is not leaving the chart at all, and is the
87
+ * one thing `pointerleave` was giving for free.
88
+ * @param svg - The chart, `null` before it is on screen.
89
+ * @param related - What the pointer moved onto, `null` when it left the window
90
+ * altogether.
91
+ * @returns Whether the chart no longer has the pointer.
92
+ */
93
+ export function leftChart(svg, related) {
94
+ if (svg === null)
95
+ return true;
96
+ return !(related instanceof Node) || !svg.contains(related);
97
+ }
98
+ /**
99
+ * Whether two readings — either of which may be absent — say the same thing.
100
+ * @param current - What was last read, `null` while the pointer was away.
101
+ * @param next - What has just been read, `null` when it has left the plot.
102
+ * @param sameReadout - The viewer's own comparison.
103
+ * @returns Whether the report can be skipped.
104
+ */
105
+ export function sameReading(current, next, sameReadout) {
106
+ if (current === next)
107
+ return true;
108
+ if (current === null || next === null)
109
+ return false;
110
+ return sameReadout(current, next);
111
+ }
112
+ /**
113
+ * What to hold, given where the pointer has just been seen.
114
+ *
115
+ * The answer already held comes back whenever it still stands, so the whole
116
+ * chart is left alone while a hand rests on a feature — `pointermove` fires on
117
+ * every tremor, and several of those land on the very same user-unit position.
118
+ * @param current - What is held.
119
+ * @param next - What has just been read.
120
+ * @param sameReadout - The viewer's own comparison, asked only once the pointer
121
+ * turns out not to have moved.
122
+ * @returns `current` itself when it already says it, `next` otherwise.
123
+ */
124
+ export function nextChartPointer(current, next, sameReadout) {
125
+ if (current === next)
126
+ return current;
127
+ if (current.position === null || next.position === null) {
128
+ return current.position === next.position ? current : next;
129
+ }
130
+ if (current.position.x !== next.position.x ||
131
+ current.position.y !== next.position.y) {
132
+ return next;
133
+ }
134
+ return sameReading(current.readout, next.readout, sameReadout)
135
+ ? current
136
+ : next;
137
+ }
138
+ /**
139
+ * Whether a point is over the data rather than over an axis.
140
+ * @param plot - Where the plot sits inside the SVG.
141
+ * @param point - The point to test, in user units.
142
+ * @returns Whether it is inside the plot, edges included.
143
+ */
144
+ export function isInsidePlot(plot, point) {
145
+ return (point.x >= plot.left &&
146
+ point.x <= plot.right &&
147
+ point.y >= plot.top &&
148
+ point.y <= plot.bottom);
149
+ }
150
+ /** What is held while the pointer is anywhere but over the plot. */
151
+ const POINTER_AWAY = { position: null, readout: null };
152
+ //# sourceMappingURL=useChartPointer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChartPointer.js","sourceRoot":"","sources":["../../../src/chart/ui/useChartPointer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
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
+ import type { ChartSize } from '../core/chartGeometry.ts';
16
+ /** The `ref` to put on the wrapper, and how big that wrapper is. */
17
+ export type ChartSizeHandle<T extends Element> = [
18
+ ref: (element: T | null) => void,
19
+ size: ChartSize
20
+ ];
21
+ /**
22
+ * Follow the size of the element a chart is drawn in.
23
+ *
24
+ * The `ref` never changes between renders, so React attaches it once per
25
+ * element rather than detaching and re-attaching it — and a detach here is not
26
+ * free, since it is what tears the observer down.
27
+ * @returns The `ref`, and the size — `0 × 0` until the element is on screen,
28
+ * which every first render sees.
29
+ */
30
+ export declare function useChartSize<T extends Element = HTMLDivElement>(): ChartSizeHandle<T>;
31
+ /**
32
+ * The size to hold, given what the element has just been measured at.
33
+ *
34
+ * The one already held comes back when the numbers have not moved, so a
35
+ * resize that changes nothing — a splitter dragged and let go where it was, a
36
+ * panel folded and unfolded at the same width — costs a comparison rather than
37
+ * a render of the whole chart, which rebuilds every scale and re-lays every
38
+ * label out.
39
+ *
40
+ * A measurement that is not a size is read as nothing at all: a negative width
41
+ * is impossible, and a `NaN` one is what an element that is not laid out gives.
42
+ * Either would travel into `plotRect` and out the far side as an infinity.
43
+ * @param current - The size held so far.
44
+ * @param width - What the element has just been measured at, horizontally.
45
+ * @param height - What it has just been measured at, vertically.
46
+ * @returns `current` itself when nothing moved, the new size otherwise.
47
+ */
48
+ export declare function nextChartSize(current: ChartSize, width: number, height: number): ChartSize;
49
+ //# sourceMappingURL=useChartSize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChartSize.d.ts","sourceRoot":"","sources":["../../../src/chart/ui/useChartSize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,oEAAoE;AACpE,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,OAAO,IAAI;IAC/C,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI;IAChC,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,CAAC,SAAS,OAAO,GAAG,cAAc,KAC/B,eAAe,CAAC,CAAC,CAAC,CAsBtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,SAAS,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,SAAS,CAOX"}
@@ -0,0 +1,91 @@
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
+ import { useCallback, useRef, useState } from 'react';
16
+ /**
17
+ * Follow the size of the element a chart is drawn in.
18
+ *
19
+ * The `ref` never changes between renders, so React attaches it once per
20
+ * element rather than detaching and re-attaching it — and a detach here is not
21
+ * free, since it is what tears the observer down.
22
+ * @returns The `ref`, and the size — `0 × 0` until the element is on screen,
23
+ * which every first render sees.
24
+ */
25
+ export function useChartSize() {
26
+ const observer = useRef(null);
27
+ const [size, setSize] = useState(NO_SIZE);
28
+ const measure = useCallback((element) => {
29
+ // Torn down here rather than from a cleanup returned to React: only React
30
+ // 19 runs one, where React 18 calls the ref with `null` instead — so
31
+ // detaching on `null` is what disconnects the observer under both.
32
+ observer.current?.disconnect();
33
+ observer.current = null;
34
+ if (element === null)
35
+ return;
36
+ read(element, setSize);
37
+ // Absent outside a browser, where nothing is on screen to be resized.
38
+ if (typeof ResizeObserver === 'undefined')
39
+ return;
40
+ observer.current = new ResizeObserver(() => {
41
+ read(element, setSize);
42
+ });
43
+ observer.current.observe(element);
44
+ }, []);
45
+ return [measure, size];
46
+ }
47
+ /**
48
+ * The size to hold, given what the element has just been measured at.
49
+ *
50
+ * The one already held comes back when the numbers have not moved, so a
51
+ * resize that changes nothing — a splitter dragged and let go where it was, a
52
+ * panel folded and unfolded at the same width — costs a comparison rather than
53
+ * a render of the whole chart, which rebuilds every scale and re-lays every
54
+ * label out.
55
+ *
56
+ * A measurement that is not a size is read as nothing at all: a negative width
57
+ * is impossible, and a `NaN` one is what an element that is not laid out gives.
58
+ * Either would travel into `plotRect` and out the far side as an infinity.
59
+ * @param current - The size held so far.
60
+ * @param width - What the element has just been measured at, horizontally.
61
+ * @param height - What it has just been measured at, vertically.
62
+ * @returns `current` itself when nothing moved, the new size otherwise.
63
+ */
64
+ export function nextChartSize(current, width, height) {
65
+ const nextWidth = usableSide(width);
66
+ const nextHeight = usableSide(height);
67
+ if (current.width === nextWidth && current.height === nextHeight) {
68
+ return current;
69
+ }
70
+ return { width: nextWidth, height: nextHeight };
71
+ }
72
+ /** What a chart is given before its element has ever been laid out. */
73
+ const NO_SIZE = { width: 0, height: 0 };
74
+ /**
75
+ * Measure an element and hold what it says.
76
+ * @param element - The wrapper the chart is drawn in.
77
+ * @param setSize - Where the measurement goes.
78
+ */
79
+ function read(element, setSize) {
80
+ const { width, height } = element.getBoundingClientRect();
81
+ setSize((current) => nextChartSize(current, width, height));
82
+ }
83
+ /**
84
+ * One side of a measurement, as a size rather than as a number.
85
+ * @param value - What the element was measured at.
86
+ * @returns The side, `0` for anything that is not a length.
87
+ */
88
+ function usableSide(value) {
89
+ return Number.isFinite(value) && value > 0 ? value : 0;
90
+ }
91
+ //# sourceMappingURL=useChartSize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChartSize.js","sourceRoot":"","sources":["../../../src/chart/ui/useChartSize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAUtD;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY;IAG1B,MAAM,QAAQ,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACrD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAY,OAAO,CAAC,CAAC;IAErD,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,OAAiB,EAAE,EAAE;QAChD,0EAA0E;QAC1E,qEAAqE;QACrE,mEAAmE;QACnE,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;QAC/B,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QACxB,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO;QAE7B,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvB,sEAAsE;QACtE,IAAI,OAAO,cAAc,KAAK,WAAW;YAAE,OAAO;QAClD,QAAQ,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE;YACzC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAkB,EAClB,KAAa,EACb,MAAc;IAEd,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACjE,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAClD,CAAC;AAED,uEAAuE;AACvE,MAAM,OAAO,GAAc,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAEnD;;;;GAIG;AACH,SAAS,IAAI,CACX,OAAgB,EAChB,OAA4C;IAE5C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAC1D,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,147 @@
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
+ import type { ChartDomain } from '../core/chartDomain.ts';
18
+ import type { PlotRect } from '../core/chartGeometry.ts';
19
+ import type { ChartScale } from '../core/chartScale.ts';
20
+ /** The fit, the window a host imposes, and the box both are drawn into. */
21
+ export interface ChartWindowOptions {
22
+ /**
23
+ * The window that shows everything currently drawn, as the viewer fits it.
24
+ * This is what a double click goes back to.
25
+ */
26
+ fitted: ChartDomain;
27
+ /**
28
+ * What that fit was made *to*, as one string two renders can compare.
29
+ *
30
+ * The window is put back to the fit whenever this changes and never otherwise,
31
+ * so it must name the data and not its extents: a spectrum switched from one
32
+ * unit to another, or from its profile to its sticks, moves the fitted extents
33
+ * by a hair, and refitting on a hair throws away the zoom somebody set.
34
+ */
35
+ fitKey: string;
36
+ /**
37
+ * What the **value axis alone** was fitted to, for a chart whose height is
38
+ * fitted to something that changes under a window the reader is keeping.
39
+ *
40
+ * A loading spectrum is the case it was written for. The reader zooms onto a
41
+ * few masses and then steps through the components, and the m/z window is
42
+ * where they are looking rather than a fact about the component being read —
43
+ * so it stays. The loading axis is fitted to the component's own scale, and
44
+ * cannot: drawn through the last component's window, a diffuse component is a
45
+ * flat line along the middle and a concentrated one is cut off at the top.
46
+ * @default `fitKey`, so the value axis moves only when the whole fit does
47
+ */
48
+ yFitKey?: string;
49
+ /** Where the plot sits inside the SVG, which the axes are laid over. */
50
+ plot: PlotRect;
51
+ /**
52
+ * The window a host is imposing, `null` while it imposes none.
53
+ *
54
+ * It is handed *in* rather than merely shown beside the chart's own, so that
55
+ * every gesture is measured against what is actually on screen. A peak table
56
+ * that frames a value, a handle that zooms to one: both put a window on the
57
+ * chart that the chart did not arrive at, and a drag worked out against the
58
+ * window the chart last held instead would zoom to somewhere else entirely.
59
+ * It is taken up when it *changes*, not held over the chart's own — see the
60
+ * hook itself for why that distinction is the difference between a chart that
61
+ * zooms and one that zooms once.
62
+ * @default null
63
+ */
64
+ domain?: ChartDomain | null;
65
+ /**
66
+ * Whether the horizontal axis is drawn right to left, as an infrared
67
+ * spectrum's wavenumbers are.
68
+ *
69
+ * It has to be said **here**, and this is the one option a viewer cannot get
70
+ * away with handling on its own: a chart that drew a reversed axis while the
71
+ * gestures were measured through an ascending one would zoom to the mirror
72
+ * image of whatever was dragged over. The scales are handed back for exactly
73
+ * that reason — draw with those and the two cannot disagree.
74
+ * @default false
75
+ */
76
+ reverseX?: boolean;
77
+ }
78
+ /** The window, how it maps to pixels, and the two ways it moves. */
79
+ export interface ChartWindow {
80
+ /** What the chart is showing. */
81
+ domain: ChartDomain;
82
+ /** The horizontal axis, already accounting for a reversed one. */
83
+ xScale: ChartScale;
84
+ /** The vertical axis, which runs backwards because SVG counts downwards. */
85
+ yScale: ChartScale;
86
+ /** Show a window a gesture arrived at. */
87
+ show: (domain: ChartDomain) => void;
88
+ /** Put the window back to everything that is drawn. */
89
+ reset: () => void;
90
+ }
91
+ /**
92
+ * Hold the window a chart shows, and map it to the plot.
93
+ *
94
+ * The window is put back to what fits whenever the chart is handed **different
95
+ * data** — a spectrum loaded, one closed, the chart reflected about zero — and
96
+ * is otherwise left exactly where it was. That distinction is the whole of the
97
+ * behaviour, and `fitKey` is where it is drawn: the same spectra drawn
98
+ * differently is the same data, and a chart that refitted on it would throw away
99
+ * the window somebody had zoomed to for a change of a fraction of a percent in
100
+ * the extents.
101
+ *
102
+ * The value axis can be refitted on its own, by `yFitKey`, for the one chart
103
+ * where the two halves of the window answer to different things: a component's
104
+ * loadings are drawn on the component's own scale, while the masses on screen
105
+ * are where the reader chose to look and have nothing to do with which
106
+ * component is being read. Everywhere else it is the whole fit that moves, so
107
+ * it defaults to `fitKey` and nothing has to be said.
108
+ *
109
+ * A window a host imposes is **taken up as it changes**, and is not held over
110
+ * the window kept here. A host is told every window the chart arrives at and is
111
+ * expected to hand that same window back, so what it imposes is, in the ordinary
112
+ * case, the answer to the *last* gesture. Held over the top, that answer would
113
+ * be the answer to the next one as well — the chart would zoom once, report it,
114
+ * and then stand still, with every later drag and turn of the wheel worked out
115
+ * and thrown away.
116
+ *
117
+ * Handing back `null` where a window was is how a host asks for the fit again —
118
+ * the only thing it is ever told is a window, so that is the one way it has of
119
+ * saying it. That is what "zoom to fit" pressed on a toolbar beside the chart
120
+ * comes down to.
121
+ *
122
+ * New data refits the **value axis** of whatever a host is imposing, and leaves
123
+ * the horizontal half of it alone. A host that stores every window it is told
124
+ * and hands the same one back is imposing one at every moment after the first
125
+ * gesture, so a refit that waited for it to stop would never happen at all: a
126
+ * chart reflected about zero would draw its mirrored half below the foot of the
127
+ * plot, where the clip path swallows it. But the horizontal axis is where the
128
+ * reader chose to look, and by the time data arrives with a window still
129
+ * imposed the host has already decided the two belong together — every route in
130
+ * gives its own window up when what arrived does not belong in it, and there is
131
+ * then nothing imposed here to keep. What is left is another scan of the run
132
+ * being stepped through, or another pixel of the section being compared, and
133
+ * refitting those out of the window they are being compared in is the one thing
134
+ * the gesture that added them was not asking for. A host imposing a *different*
135
+ * window in the same render still wins outright, since it is asking for that
136
+ * window of the data just handed over.
137
+ *
138
+ * The imposed window is compared by value rather than by identity, so a host
139
+ * that rebuilds an equal window on every render neither fights the gestures nor
140
+ * renders forever. Both comparisons are made while rendering rather than in an
141
+ * effect: an effect would draw the stale window for one frame, and setting state
142
+ * from one is what `react-hooks/set-state-in-effect` forbids.
143
+ * @param options - The fit, the plot, and the window a host imposes.
144
+ * @returns The window, its two scales, and the two ways it is moved.
145
+ */
146
+ export declare function useChartWindow(options: ChartWindowOptions): ChartWindow;
147
+ //# sourceMappingURL=useChartWindow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChartWindow.d.ts","sourceRoot":"","sources":["../../../src/chart/ui/useChartWindow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,2EAA2E;AAC3E,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,MAAM,EAAE,WAAW,CAAC;IACpB;;;;;;;OAOG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,IAAI,EAAE,QAAQ,CAAC;IACf;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,oEAAoE;AACpE,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,MAAM,EAAE,WAAW,CAAC;IACpB,kEAAkE;IAClE,MAAM,EAAE,UAAU,CAAC;IACnB,4EAA4E;IAC5E,MAAM,EAAE,UAAU,CAAC;IACnB,0CAA0C;IAC1C,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IACpC,uDAAuD;IACvD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAwEvE"}
@@ -0,0 +1,135 @@
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
+ import { useCallback, useMemo, useState } from 'react';
18
+ import { sameChartDomain } from "../core/chartDomain.js";
19
+ import { chartScale } from "../core/chartScale.js";
20
+ /**
21
+ * Hold the window a chart shows, and map it to the plot.
22
+ *
23
+ * The window is put back to what fits whenever the chart is handed **different
24
+ * data** — a spectrum loaded, one closed, the chart reflected about zero — and
25
+ * is otherwise left exactly where it was. That distinction is the whole of the
26
+ * behaviour, and `fitKey` is where it is drawn: the same spectra drawn
27
+ * differently is the same data, and a chart that refitted on it would throw away
28
+ * the window somebody had zoomed to for a change of a fraction of a percent in
29
+ * the extents.
30
+ *
31
+ * The value axis can be refitted on its own, by `yFitKey`, for the one chart
32
+ * where the two halves of the window answer to different things: a component's
33
+ * loadings are drawn on the component's own scale, while the masses on screen
34
+ * are where the reader chose to look and have nothing to do with which
35
+ * component is being read. Everywhere else it is the whole fit that moves, so
36
+ * it defaults to `fitKey` and nothing has to be said.
37
+ *
38
+ * A window a host imposes is **taken up as it changes**, and is not held over
39
+ * the window kept here. A host is told every window the chart arrives at and is
40
+ * expected to hand that same window back, so what it imposes is, in the ordinary
41
+ * case, the answer to the *last* gesture. Held over the top, that answer would
42
+ * be the answer to the next one as well — the chart would zoom once, report it,
43
+ * and then stand still, with every later drag and turn of the wheel worked out
44
+ * and thrown away.
45
+ *
46
+ * Handing back `null` where a window was is how a host asks for the fit again —
47
+ * the only thing it is ever told is a window, so that is the one way it has of
48
+ * saying it. That is what "zoom to fit" pressed on a toolbar beside the chart
49
+ * comes down to.
50
+ *
51
+ * New data refits the **value axis** of whatever a host is imposing, and leaves
52
+ * the horizontal half of it alone. A host that stores every window it is told
53
+ * and hands the same one back is imposing one at every moment after the first
54
+ * gesture, so a refit that waited for it to stop would never happen at all: a
55
+ * chart reflected about zero would draw its mirrored half below the foot of the
56
+ * plot, where the clip path swallows it. But the horizontal axis is where the
57
+ * reader chose to look, and by the time data arrives with a window still
58
+ * imposed the host has already decided the two belong together — every route in
59
+ * gives its own window up when what arrived does not belong in it, and there is
60
+ * then nothing imposed here to keep. What is left is another scan of the run
61
+ * being stepped through, or another pixel of the section being compared, and
62
+ * refitting those out of the window they are being compared in is the one thing
63
+ * the gesture that added them was not asking for. A host imposing a *different*
64
+ * window in the same render still wins outright, since it is asking for that
65
+ * window of the data just handed over.
66
+ *
67
+ * The imposed window is compared by value rather than by identity, so a host
68
+ * that rebuilds an equal window on every render neither fights the gestures nor
69
+ * renders forever. Both comparisons are made while rendering rather than in an
70
+ * effect: an effect would draw the stale window for one frame, and setting state
71
+ * from one is what `react-hooks/set-state-in-effect` forbids.
72
+ * @param options - The fit, the plot, and the window a host imposes.
73
+ * @returns The window, its two scales, and the two ways it is moved.
74
+ */
75
+ export function useChartWindow(options) {
76
+ const { fitted, fitKey, yFitKey = fitKey, plot, domain: imposed = null, reverseX = false, } = options;
77
+ // What the chart shows, and the one thing every gesture moves.
78
+ const [held, setHeld] = useState(imposed ?? fitted);
79
+ const [fittedFor, setFittedFor] = useState(fitKey);
80
+ if (fittedFor !== fitKey) {
81
+ setFittedFor(fitKey);
82
+ // The horizontal half of a window a host is still imposing survives the
83
+ // refit; only the value axis is refitted. A host that wanted the whole
84
+ // window given up has already given it up — every route in clears its own
85
+ // window when the data that arrived does not belong in it, and then there
86
+ // is nothing imposed here to keep. What is left is the case where it does
87
+ // belong: another scan of the run being stepped through, another pixel of
88
+ // the section being compared. Refitting x there throws away the very
89
+ // window the reader is comparing *in*, which is the whole point of the
90
+ // gesture that added it.
91
+ //
92
+ // The value axis is refitted all the same, and must be: a chart reflected
93
+ // about zero, or one a brighter trace has just joined, is drawn against a
94
+ // height that has genuinely changed, and keeping the old one hides the new
95
+ // data below the foot of the plot or off the top of it.
96
+ setHeld((current) => imposed === null ? fitted : { x: current.x, y: fitted.y });
97
+ }
98
+ const [yFittedFor, setYFittedFor] = useState(yFitKey);
99
+ if (yFittedFor !== yFitKey) {
100
+ setYFittedFor(yFitKey);
101
+ // Mapped over whatever the refit above may just have set, rather than over
102
+ // the window this render read, so that both keys changing at once is the
103
+ // whole fit and not the last window's x with a new height on it.
104
+ setHeld((current) => ({ x: current.x, y: fitted.y }));
105
+ }
106
+ const [imposedShown, setImposedShown] = useState(imposed);
107
+ if (!sameImposedDomain(imposedShown, imposed)) {
108
+ setImposedShown(imposed);
109
+ setHeld(imposed ?? fitted);
110
+ }
111
+ const domain = held;
112
+ // Reversed by handing the range over backwards, which is the whole of drawing
113
+ // an axis right to left.
114
+ const xScale = useMemo(() => reverseX
115
+ ? chartScale(domain.x[0], domain.x[1], plot.right, plot.left)
116
+ : chartScale(domain.x[0], domain.x[1], plot.left, plot.right), [domain.x, plot.left, plot.right, reverseX]);
117
+ // Backwards, since SVG counts pixels downwards while a value counts up.
118
+ const yScale = useMemo(() => chartScale(domain.y[0], domain.y[1], plot.bottom, plot.top), [domain.y, plot.bottom, plot.top]);
119
+ const reset = useCallback(() => {
120
+ setHeld(fitted);
121
+ }, [fitted]);
122
+ return { domain, xScale, yScale, show: setHeld, reset };
123
+ }
124
+ /**
125
+ * Whether a host is imposing the same window it was imposing before.
126
+ * @param current - The window it imposed last, `null` when it imposed none.
127
+ * @param next - The window it imposes now, `null` for none.
128
+ * @returns Whether both say the same thing.
129
+ */
130
+ function sameImposedDomain(current, next) {
131
+ if (current === null || next === null)
132
+ return current === next;
133
+ return sameChartDomain(current, next);
134
+ }
135
+ //# sourceMappingURL=useChartWindow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChartWindow.js","sourceRoot":"","sources":["../../../src/chart/ui/useChartWindow.ts"],"names":[],"mappings":"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"}